【问题标题】:HTML 5 Canvas, interact with HTML tags behind it?HTML 5 Canvas,与它背后的 HTML 标签交互?
【发布时间】:2014-03-14 05:31:23
【问题描述】:

好的,所以我的网站顶部有一个 HTML 5 画布元素来覆盖雪效果。

我使用这个 CSS 来获得网站其余部分之上的雪花效果:

#snow {
    width: 100%;
    position: absolute;
    top: 0;
    left: 0;
    pointer-events: none;
}

我想做的是让雪与页面上的元素进行交互。例如如果它碰到<p> 标签,它将停止。因此,雪在页面上的元素上逐渐堆积。

我该怎么做呢?如何使用 Javascript 获取不同层上元素的位置?

【问题讨论】:

  • planetminecraft 网站顶部的雪具有特殊编码的徽标形状,因此雪会避开它,它不会与元素交互。
  • @Xymotech 好的,感谢您提供的信息。

标签: javascript html canvas html5-canvas element


【解决方案1】:

原理相当简单。

  • 收集您想要与之交互的元素
  • 提取每个代表每个元素绝对位置的客户端矩形
  • 滚动等更新

DEMO

在这个演示中,代表 DOM 元素的红色方块是在画布上绘制的,不是由 CSS 设置的。这是为了说明原理。你可以用代码做的是使用这些矩形作为碰撞对象而不是雪。

获取我们想要交互的元素:

var elements = document.querySelectorAll('p'); /// all "P" elements

现在遍历集合并从每个集合中获取绝对边界矩形:

function getRects() {
    
    for(var i = 0; i < elements.length; i++) {

        /// get rect for this element
        rect = elements[i].getBoundingClientRect();
        
        /// use it for something, or store in an array etc.
        ctx.strokeRect(rect.left,
                       rect.top,
                       rect.width,
                       rect.height);
    }
}

(抱歉,没有雪地演示,但您应该可以使用它来实现您的要求)。

【讨论】:

  • 感谢您的帮助。我试过了,效果很好。 :-)
  • @hipkiss 我敢肯定还有其他方法,更好或更坏。您可以通过渲染位置来制作“假”集合动画,大约。或者准确地说,到 bg 图像,然后在元素所在的顶部边缘区域随机增加“雪”。这在很大程度上取决于您的页面、布局、外观等。要采用不同的分辨率和位置,它将很难避免在调整大小、滚动等时动态读取位置,但我认为您也可以使用近似值,甚至随机累积(只要通过调整大小等方式保持种子区域)。
  • @K3N 道歉。我的用例要简单得多。我希望能够在允许用户在其上绘图的画布下方正常浏览网页。在我有之间切换,但在两者之间切换,以便在浏览网站时保持绘图(在同一页面上,我知道它会在新页面上清除画布),这是困难的一点。还没想好。
  • @hipkiss 您可以查看单页应用程序 (SPA) 或查看 CSS 页面转换是否有用(在每个页面之间的 localStorage 中存储动画数据)。
  • @K3N 这不能解决在页面上存在注释时即使是 SPA 也无法导航的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 2016-09-14
  • 1970-01-01
相关资源
最近更新 更多