• 74行代码实现浪漫的红心下落的动画效果



    七夕节快到了,让我们使用 74 行的纯 HTML/JavaScript 代码,实现一个浪漫的红心下落的动画效果吧。

    将下列代码粘贴到一个空白的 html 文件里,用浏览器本地打开即可。

    1. <canvas>canvas>
    2. <script>
    3. var c = document.getElementsByTagName('canvas')[0];
    4. var b = document.body;
    5. var a = c.getContext('2d');
    6. function d(b, c, d, e) {
    7. a.fillStyle = b;
    8. a.beginPath();
    9. a.arc(c, d, e, 0, 2 * m.PI, !0);
    10. a.fill();
    11. a.fillRect(c, d, 1, 1)
    12. }
    13. m = Math;
    14. r = m.random;
    15. g = Date;
    16. l = +(new g);
    17. e = document;
    18. q = e.createElement("canvas");
    19. w = e.createElement("canvas");
    20. o = {};
    21. h = 100;
    22. H = 200;
    23. v = window;
    24. t = c.width = v.innerWidth;
    25. u = c.height = v.innerHeight - 5;
    26. b.setAttribute("style", "margin:0;background:#000");
    27. k = a;
    28. q.width = q.height = h;
    29. w.width = 1e3;
    30. w.height = H;
    31. for (j = 0; ++j < H; ) {
    32. for (i = 0; 1e3 > ++i; )
    33. a = q.getContext("2d"),
    34. z = .5 - i / h,
    35. f = j / h - .5 + .4 * m.sqrt(m.abs(z)),
    36. f = z * z + 2 * f * f,
    37. .23 > f && d(.16 < f ? "#F00" : "#F88", i, j, 0),
    38. a = w.getContext("2d"),
    39. d(j > 5e-4 * i * i - .3 * i + h ? "#343" : j > 4e-4 * i * i - .9 * i + 500 ? "#232" : "#000", i, j, 0);
    40. o[j] = {
    41. x: r() * t,
    42. y: -h - r() * u,
    43. b: 51 - j / 4,
    44. a: 25 + .4 * j
    45. };
    46. o[H + j] = {
    47. x: r() * t,
    48. y: r() * u - H,
    49. a: 3 * r() + 1,
    50. c: j
    51. }
    52. }
    53. a = k;
    54. v.setInterval(function() {
    55. n = +(new g);
    56. a.clearRect(0, 0, t, u);
    57. d("#FFA", H, 250, 150);
    58. d("#000", 270, 320, h);
    59. a.drawImage(w, 0, u - H, t, H);
    60. for (i = 0; ++i < H; )
    61. f = (n - l) / h,
    62. s = o[H + i],
    63. d("#FFA", s.x, s.y, m.floor(m.max(s.a + m.sin(s.c++ / 10) - .5, 1))),
    64. z = o[i],
    65. a.drawImage(q, z.x += -.1 / (z.b / h) * f, z.y += (5 - z.b / 10) * f, z.a, z.a),
    66. z.y > u && (z.y = -h),
    67. z.x < -H && (z.x = t);
    68. l = n
    69. }, 60)
    70. //L<3
    71. script>
    72. html>

    效果如下:
     

    下面是具体的代码解析。

    首先在 html 里定义 `canvas` 标签,这是 HTML5 在网页上绘制通信的接口元素。`canvas` 本身没有图形绘制功能,因此我们必须首先用 `document.getElementsByTagName` 拿到这个元素的实例,然后通过 JavaScript 来操纵它绘图。

    var a = c.getContext('2d');


     

    getContext("2d") 返回的对象是内建的 HTML5 对象,类型为 `CanvasRenderingContext2D`,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。

    接下来的这个函数,封装了一个使用 `CanvasRenderingContext2D` 对象进行的画图操作。

    - a.fillStyle = b 将绘制的图形进行染色,颜色值通过参数 b 传入。

    - a.beginPath:  每当开始一个新的图形绘制时,需要调用 Canvas 2D API 这个方法,相当于现实生活中会话的落笔动作。

    例子:

    1. var canvas = document.getElementById("canvas");
    2. var ctx = canvas.getContext("2d");
    3. // First path
    4. ctx.beginPath();
    5. ctx.strokeStyle = 'blue';
    6. ctx.moveTo(20,20);
    7. ctx.lineTo(200,20);
    8. ctx.stroke();


    - a.arc: 这是Canvas 2D API 绘制圆弧路径的方法。

    语法:void ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);

    圆弧路径的圆心在 (x, y) 位置,半径通过参数 raduis 指定,根据anticlockwise 布尔值(默认为顺时针)指定的方向从 startAngle 开始绘制,到 endAngle 结束。

    因此,这个高亮方法,在函数 d 的 输入参数 c 和 d 指定的坐标为圆形,以 e 为半径,顺时针方向绘制一个圆形( 2 * m.PI 代表 360 度) 。!0 即 true.

    - a.fill: 填充上一行通过 a.arc 绘制的圆形区域。

    - a.fillRect(c, d, 1, 1):fillRect()方法绘制一个填充了内容的矩形,这个矩形的开始点(左上点)在参数 c 和 d 指定的位置。它的宽度和高度都为 1,填充样式由当前的 fillStyle 决定。

    每隔 60 毫秒,调用 `drawImage` 绘制图形。其中输入参数 w 代表绘制到上下文的元素。

    在本例中,w 存储的是通过 document.createElement("canvas") 动态创建的 canvas 元素。

  • 相关阅读:
    jupyter notebook代码自动换行,超过一行长度自动换行,不用左右滑动
    另一种降维算法:UMAP(主要是和t-SNE进行对比)
    kubelet节点压力驱逐
    受邀参加中日韩创新人才主题交流研讨会
    探索区块链世界:赋能创新,揭示区块链媒体发稿的影响力-世媒讯
    172版本关闭背钻后自动添加反盘和禁布的功能
    vue:项目开发:在请求拦截器中处理loading加载 && 请求头(headers)的检验配置 && 接口文档出现的特殊符号处理的方式
    Unity 文字显示动画(2)
    面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
    Vue 的生命周期
  • 原文地址:https://blog.csdn.net/i042416/article/details/126157708