现在对自定义 css 属性的支持变得越来越普遍,我想到使用它们来简化基于滚动的动画的创建。在 Javascript 中,我使用 style.setProperty('--customProperty', value) 在用户滚动时调整特定元素的自定义属性。
它在 Chrome、Firefox 和 Safari 10 中运行良好。
但是,在 Safari 9.1(确实支持自定义属性)中,我只能设置一次属性。设置后,它不会更新为新值。
我已经在 CodePen 中得到了这一切:https ://codepen.io/kirkhadden/pen/JJbXmE/
// Have we scrolled since the last frame?
if (position != wrapper[0].scrollpos) {
// Keeps updating accurately every frame:
window.log.text(position);
// Only happens on the first frame:
wrapper[0].style.setProperty('--scrollpos', position+'px', '');
wrapper[0].scrollpos = position;
} else { // No Change
return false;
}
我找不到任何信息,甚至没有提到这种行为。我已经在 Safari 中测试了 style.setProperty() 的其他更简单的用法,并且我继续发现一旦设置了属性,即使我尝试先删除该属性,Safari 也不会更新相同的属性。
这是 Safari 9.1 中的错误吗?有解决办法吗?还有另一种使用javascript设置css变量的方法吗?
更新
因此,我可以使用 jQuery 的 .attr() 方法来设置属性,而不是 style.setProperty。这并不理想,因为这会覆盖任何其他样式属性,但它适用于此。
更大的问题是,这整个解决方案是基于在我所有的动画元素上设置普通 css 动画的想法,但是将播放状态设置为“暂停”,然后使用 javascript 根据滚动位置来操作动画延迟. 这使我可以利用继承来以最少的 DOM 操作为许多事物设置动画。
再次,Safari 9.1 是障碍,因为看起来不像 Chrome 或 Firefox,如果播放状态是“暂停”,Safari 根本不会启动动画,并忽略动画延迟。