用canvas做一个DVD待机动画的实现代码


Posted in HTML / CSS onApril 12, 2019

免责声明

不是打算教 canvas,只是觉得好玩就简单看了一下。

意思就是做得略粗糙,别喷我。。

用canvas做一个DVD待机动画的实现代码

效果

帧数略低,实际当然流畅得多。

用canvas做一个DVD待机动画的实现代码 

实现 HTML

<!DOCTYPE html>
<head>
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <style>
    * {margin: 0;padding: 0;}
    body {background-color: lightblue;}
    #canvas {background-color: black;width: 100vw;}
  </style>
</head>
<body>
  <canvas id="canvas"></canvas>
  <script>/* 见下 */</script>
</body>

JS

window.onload = function () {
  let
    // 画布
    ctx = document.getElementById('canvas').getContext('2d'),
    // 画布大小
    canvas_width = document.getElementById('canvas').width,
    canvas_height = document.getElementById('canvas').height,
    // DVD 图标的文本颜色、字体、背景色
    text_color = ['green', 'blue', 'purple', 'yellow', 'white', 'yellow', 'white'],
    text_font = 'italic bold 50px yahei',
    background_color = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet'],
    // 背景矩形的尺寸
    background_width = 110,
    background_height = 50,
    // 向矩形添加文本时,高度有点偏差
    fix_height = 7,
    // 速度,每次重绘移动 0.5 px
    speed_x = 0.5,
    speed_y = 0.5,
    // 移动方向,初始为 'r-b' 右下
    direction = 'r-b',
    // 图标 x 和 y 坐标,初始为 0
    position_x = 0,
    position_y = 0,
    // 碰撞次数,用来计算背景和文本颜色
    count = 0

  dvd()

  function dvd() {
    // 移动方向
    switch (direction) {
      // 右下
      case 'r-b':
        position_x += speed_x
        position_y += speed_y
        break
      // 右上
      case 'r-t':
        position_x += speed_x
        position_y -= speed_y
        break
      // 左下
      case 'l-b':
        position_x -= speed_x
        position_y += speed_y
        break
      // 左上
      case 'l-t':
        position_x -= speed_x
        position_y -= speed_y
        break
    }
    // 清空画布
    ctx.clearRect(0, 0, canvas_width, canvas_height)
    // 重绘
    ctx.fillRect(position_x, position_y, background_width, background_height)
    // 碰撞检测
    // 底
    if (position_y + background_height >= canvas_height) {
      direction = direction.replace('b', 't')
      // 碰撞次数统计
      count += 1
    }
    // 右
    if (position_x + background_width >= canvas_width) {
      direction = direction.replace('r', 'l')
      count += 1
    }
    // 左
    if (position_x < 0) {
      direction = direction.replace('l', 'r')
      count += 1
    }
    // 上
    if (position_y < 0) {
      direction = direction.replace('t', 'b')
      count += 1
    }
    // 文本
    ctx.font = text_font
    ctx.fillStyle = text_color[count % 7]
    ctx.fillText("DVD", position_x, position_y + background_height - fix_height)
    // 背景色
    ctx.fillStyle = background_color[count % 7]
    // 开始动画
    window.requestAnimationFrame(dvd)
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3动画:5种预载动画效果实例
Apr 05 HTML / CSS
浅谈css3新单位vw、vh、vmin、vmax的使用详解
Dec 01 HTML / CSS
html5定制表单_动力节点Java学院整理
Jul 11 HTML / CSS
HTML5 新事件 小结
Jul 16 HTML / CSS
Bootstrap 学习分享
Nov 12 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
May 12 HTML / CSS
HTML5 Canvas中绘制椭圆的4种方法
Apr 24 HTML / CSS
HTML5 Video标签的属性、方法和事件汇总介绍
Apr 24 HTML / CSS
Canvas中设置width与height的问题浅析
Nov 01 HTML / CSS
AmazeUI 模态窗口的实现代码
Aug 18 HTML / CSS
用position:sticky完美解决小程序吸顶问题的实现方法
Apr 24 HTML / CSS
CSS作用域(样式分割)的使用汇总
Nov 07 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
Apr 09 #HTML / CSS
html5唤醒APP小记
Mar 27 #HTML / CSS
html5录音功能实战示例
Mar 25 #HTML / CSS
浅析HTML5中的download属性使用
Mar 13 #HTML / CSS
手把手教你实现一个canvas智绘画板的方法
Mar 04 #HTML / CSS
详解h5页面在不同ios设备上的问题总结
Mar 01 #HTML / CSS
小程序瀑布流解决左右两边高度差距过大的问题
Feb 20 #HTML / CSS
You might like
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
php中get_object_vars()方法用法实例
2015/02/08 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
php获取远程文件内容的函数
2015/11/02 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
Django框架模板用法入门教程
2019/11/04 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
七年级英语教学反思
2014/01/15 职场文书
访谈节目策划方案
2014/05/15 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
法人代表证明书格式
2014/10/01 职场文书
技术员个人工作总结
2015/03/03 职场文书
第二次离婚起诉书
2015/05/18 职场文书
《叶问2》观后感
2015/06/15 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
《颐和园》教学反思
2016/02/19 职场文书
ant design charts 获取后端接口数据展示
2022/05/25 Javascript