假设您想在鼠标悬停在元素上时移动元素的 background-position
,为设计增添一些趣味。您有一个这样的元素
<div class="module" id="module"></div>
您可以在上面添加一个背景
.module {
background-image: url(big-image.jpg);
}
您可以使用以下 JavaScript 代码调整 background-position
const el = document.querySelector("#module");
el.addEventListener("mousemove", (e) => {
el.style.backgroundPositionX = -e.offsetX + "px";
el.style.backgroundPositionY = -e.offsetY + "px";
});
查看 CodePen 上 Chris Coyier 的 使用鼠标移动背景 示例 (@chriscoyier)。
或者,您可以在 JavaScript 中更新 CSS 自定义属性
const el = document.querySelector("#module");
el.addEventListener("mousemove", (e) => {
el.style.setProperty('--x', -e.offsetX + "px");
el.style.setProperty('--y', -e.offsetY + "px");
});
.module {
--x: 0px;
--y: 0px;
background-image: url(large-image.jpg);
background-position: var(--x) var(--y);
}
查看 CodePen 上 Chris Coyier 的 使用鼠标移动背景 示例 (@chriscoyier)。
以下示例直接在 JavaScript 中移动背景,但应用了过渡效果,因此它会滑动到新位置,而不是在您第一次进入时跳动
查看 CodePen 上 Chris Coyier 的 可移动背景广告 示例 (@chriscoyier)。
或者,您可以移动一个实际的元素(而不是 background-position
)。如果您要在滑动元素上添加一些内容或交互性,可以这样做。以下示例也是设置 CSS 自定义属性,但通过 CSS translate()
和 calc()
实际上移动了元素,从而调节了速度。
查看 CodePen 上 Chris Coyier 的 Hotjar 移动热图广告 示例 (@chriscoyier)。
我相信还有很多其他方法可以实现这一点——移动 SVG 视窗、控制画布的脚本、WebGL……谁知道呢!如果您有一些更巧妙的方法来处理这个问题,请在评论中分享链接。
对移动友好的解决方案感兴趣。
喜欢使用加速度计?http://www.albertosarullo.com/blog/javascript-accelerometer-demo-source
我可能应该做一个也适用于
touchmove
事件的版本。欢迎贡献代码!是的,希望有触控友好的解决方案。使用加速度计似乎对仅仅想点击和拖动的可怜用户来说,会带来太多试错。
这对于性能来说如何?这是否需要合理的去抖动?
也许吧?但我担心去抖动会导致卡顿。我想知道是否有一些方法可以在
requestAnimationFrame
或其他地方只更新值。在我的电脑上,我并没有看到任何迟缓,但我认为普遍的良好建议是,快速触发的 DOM 事件(例如mousemove
)应该进行某种性能处理。几年前,我看到 PC Gamer 做过类似的事情。我决定尝试只使用 CSS 使图像看起来像在移动,并使用 JS
作为创建空元素网格的便利方法,而不是硬编码它们
我调整了“明显”背景图像的边距,但也可以使用笔来调整背景图像的背景位置。创建的空元素越多,动画看起来就越流畅。
嗨,Chris,我想在鼠标悬停在图像上时构建图像缩放功能,并在侧边栏显示缩放后的版本。就像电商网站上的功能一样。您有什么建议吗?
最后一个示例在 Windows 上的 Chrome 中不起作用