如何有效地实现这种效果?

柠檬

我正在测试像素跟随鼠标的效果。http://dukevin.com/pixel

但是我当前的实现非常耗费资源。创建填充页面的div并查询它们以更改颜色。

有没有一种方法可以在不占用大量资源的情况下产生类似的效果?我的想法是在鼠标移动时动态生成div,并在淡出时将其删除。

$(document).ready(function(){
    var body = $('body');
    for(var i = 0; i < Math.floor($(window).width()/30)*Math.floor($(window).height()/30) ; i++)
        body.append("<div class=box></div>");
});

var colors = ["#f00","#c00","#d00","#e00"];
$(document).on('mouseenter', '.box', function (event) {
    $(this).css({
        backgroundColor: colors[Math.floor(Math.random() * colors.length)],
        opacity: 1
    });
}).on('mouseleave', '.box', function (event) {
    $(this).css('opacity', 0);
});
body {
    width: 100%;
    margin: 0;
    padding: 0;
    line-height: 0px;
    background-color: #333;
}
.box {
    display: inline-block;
    vertical-align:top;
    z-index: -1;
    width: 30px;
    height: 30px;
    transition: all 2s ease;
}
.box:hover {
    transition: all 0s ease;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

谢谢

<3

单击Run code snippet下面的,然后在黑色区域中拖动鼠标。

总而言之,这是非常有效的。创建像素后,会将其添加到pixels阵列。在中loopupdate(delta)在每个像素上调用函数,true如果像素的alpha值在之上则返回函数0像素的alpha降到零以下后,将其删除。

这仅使用:

  • 1个HTML元素
  • 2个事件监听器

var canvas    = document.querySelector("canvas");
var ctx       = canvas.getContext("2d");
var pixelSize = 20; // px, 20px squares
var speed     = 33; // ms, (1000ms / 33ms = ~30fps)
var ttl       = 2000.0; // ms, (pixel fade out time)

// Pixel constructor
function Pixel(x, y, size, rgba) {
  
  if (!(this instanceof Pixel)) {
    return new Pixel(x, y, size, rgba);
  }
  
  // pixel update function; called once per tick
  function update(delta) {
    // decrease the alpha of this pixel by delta/ttl;
    rgba.a = (rgba.a - (delta/ttl)).toFixed(2);
    // redraw this pixel
    ctx.clearRect(x, y, size, size);
    ctx.fillStyle = rgbaStr(rgba);
    ctx.fillRect(x, y, size, size);
    // return true if pixel alpha is still above 0
    // return false when this pixel is no longer visible (garbage collect)
    return rgba.a > 0;
  }
  
  // export the update function
  this.update = update;
}

// rgba helper
function rgba(r, g, b, a) {
    return {r:r, g:g, b:b, a:a};
}

// convert rgba to CSS string
function rgbaStr(rgba) {
    var args = [rgba.r, rgba.g, rgba.b, rgba.a];
    return "rgba(" + args.join(",") + ")";
}

// all "active" pixels
var pixels = [];

// Pixel factory function
function createPixel(x, y, size, rgba) {
  // create pixel
  var pixel = new Pixel(
    Math.round(x / size) * size, // snap to grid
    Math.round(y / size) * size, // snap to grid
    size,                        // pixel/grid size
    rgba                         // rgba color
  );
  // add pixel to array
  pixels.push(pixel);
  // return constructed pixel      
  return pixel;
}

// the loop
function loop(now) {
    // calculate delta
    var delta = Date.now() - now;
    // loop through each pixel
    pixels.forEach(function(pixel, idx) {
        // if pixel is faded out completely...
        if (!pixel.update(delta)) {
           // delete the pixel
           pixels.splice(idx, 1); 
        }
    });
    // loop again (based on speed)
    setTimeout(loop.bind(null, Date.now()), speed);
}

// size canvas to full size of window
function resizeCanvas(event) {
  ctx.canvas.width = window.innerWidth;
  ctx.canvas.height = window.innerHeight;
}

// setup
function init() {
  // set canvas size
  resizeCanvas();

  // resize canvas size whenever window is resized
  window.addEventListener("resize", resizeCanvas);
  
  // create pixels on mousemove
  canvas.addEventListener("mousemove", function(event) {
    createPixel(
      event.clientX,  // mouse x position
      event.clientY,  // mouse y position
      pixelSize,      // the pixelSize defined above
      rgba(255,0,0,1) // start at 100% red
    );
  });
  
  // start the loop
  loop(Date.now());
}

// start everything
init();
html, body {
    width: 100%;
    height: 100%;
    margin: 0;
}

body {
    background-color: black;
    color: white;
}
<canvas></canvas>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何有效地实现这种效果?

来自分类Dev

如何有效地改善这种有缺陷的双向链表插入实现?

来自分类Dev

如何有效地改善这种有缺陷的双向链表插入实现?

来自分类Dev

如何有效地实现这些JavaScript函数

来自分类Dev

如何有效地语法

来自分类Dev

如何有效地将这种数据结构发送到CUDA?

来自分类Dev

在React-Native中可以更有效地实现这种网格布局吗?

来自分类Dev

在ListView UWP中有效地实现搜索

来自分类Dev

如何有效地实现json tcp服务器并防止套接字泛滥?

来自分类Dev

如何在Matlab中有效地实现序数参数的优化

来自分类Dev

如何有效地在Java中实现此Scala操作

来自分类Dev

如何在R中有效地实现合并

来自分类Dev

如何实现超时/等待NSStream有效地使方法同步

来自分类Dev

如何有效地使用Redis实现嵌套评论系统

来自分类Dev

如何使用leanback库在android TV中有效地实现大型单个列表

来自分类Dev

如何在内核中有效地实现异步I / O

来自分类Dev

如何实现超时/等待NSStream有效地使方法同步

来自分类Dev

如何有效地实现Eratosphenes方法以生成素数?

来自分类Dev

如何在线程安全的C库中有效地实现句柄

来自分类Dev

如何使用leanback库在Android TV中有效地实现大型单个列表

来自分类Dev

如何有效地进行数据整理以实现excel流程的自动化?

来自分类Dev

WPF如何有效地检测用户活动

来自分类Dev

如何有效地检查位掩码?

来自分类Dev

如何有效地测试此Django模型?

来自分类Dev

如何有效地计算对数回报

来自分类Dev

如何有效地显示熊猫的日期范围?

来自分类Dev

如何有效地随机播放位?

来自分类Dev

如何更有效地使用find命令?

来自分类Dev

如何有效地把握Pygame的关键?

Related 相关文章

  1. 1

    如何有效地实现这种效果?

  2. 2

    如何有效地改善这种有缺陷的双向链表插入实现?

  3. 3

    如何有效地改善这种有缺陷的双向链表插入实现?

  4. 4

    如何有效地实现这些JavaScript函数

  5. 5

    如何有效地语法

  6. 6

    如何有效地将这种数据结构发送到CUDA?

  7. 7

    在React-Native中可以更有效地实现这种网格布局吗?

  8. 8

    在ListView UWP中有效地实现搜索

  9. 9

    如何有效地实现json tcp服务器并防止套接字泛滥?

  10. 10

    如何在Matlab中有效地实现序数参数的优化

  11. 11

    如何有效地在Java中实现此Scala操作

  12. 12

    如何在R中有效地实现合并

  13. 13

    如何实现超时/等待NSStream有效地使方法同步

  14. 14

    如何有效地使用Redis实现嵌套评论系统

  15. 15

    如何使用leanback库在android TV中有效地实现大型单个列表

  16. 16

    如何在内核中有效地实现异步I / O

  17. 17

    如何实现超时/等待NSStream有效地使方法同步

  18. 18

    如何有效地实现Eratosphenes方法以生成素数?

  19. 19

    如何在线程安全的C库中有效地实现句柄

  20. 20

    如何使用leanback库在Android TV中有效地实现大型单个列表

  21. 21

    如何有效地进行数据整理以实现excel流程的自动化?

  22. 22

    WPF如何有效地检测用户活动

  23. 23

    如何有效地检查位掩码?

  24. 24

    如何有效地测试此Django模型?

  25. 25

    如何有效地计算对数回报

  26. 26

    如何有效地显示熊猫的日期范围?

  27. 27

    如何有效地随机播放位?

  28. 28

    如何更有效地使用find命令?

  29. 29

    如何有效地把握Pygame的关键?

热门标签

归档