在用户提交操作之前,向其提供操作预览会很有帮助。兴趣调用器是一项实验性 Web 平台功能,提供了一种基于声明的方式,用于在兴趣来源(即按钮或链接)与兴趣目标之间创建兴趣关系。建立声明式关系后,开发者可以使用 CSS 和 JavaScript,通过多种方法来响应兴趣和兴趣丧失。对于此应用场景,我们可以利用 interest 和 loseinterest 事件来预览兴趣定位目标的各种效果。
如何实现
通过在按钮或链接(即兴趣来源)上设置 interestfor 属性,可以创建兴趣关系。该属性接受对另一个元素(即兴趣目标)的 ID 引用。兴趣调用方或来源只能有一个兴趣目标,但一个兴趣目标可以有多个兴趣调用方。
<!-- MANDATORY: interest relationships must be established with the `interestfor` attribute on a button or a link -->
<button interestfor="interestingElement" data-effect="A">Some effect</button>
<button interestfor="interestingElement" data-effect="B">Some other effect</button>
<div id="interestingElement">Something interesting</div>
对于此应用场景,我们可以利用 interest 和 loseinterest 事件来预览兴趣定位的各种效果。这两个事件都是 InterestEvent,具有 source 属性,该属性是兴趣的来源(即具有 interestfor 属性的元素)。
interestingElement.addEventListener("interest", event => {
// Apply the preview based on `event.source`
event.target.dataset.preview = event.source.dataset.effect;
});
interestingElement.addEventListener("loseinterest", event => {
// Unapply the preview
delete event.target.dataset.preview;
});
您可以使用 CSS 分别通过 :interest-source 和 :interest-target 伪选择器选择活跃的兴趣来源和目标。
/* Styles to apply when the effect is being previewed */
:interest-source {}
:interest-target {}
兴趣调用器(即具有 interestfor 属性的元素)的开始和结束延迟时间可以使用 interest-delay-start 和 interest-delay-end CSS 属性或简写 interest-delay 属性进行设置。
[interestfor] {
interest-delay-start: 0.2s;
interest-delay-end: 0.1s;
}
后备策略
兴趣调用器的回退和浏览器支持
必须使用 NPM 中的 interestfor polyfill 软件包有条件地对兴趣调用器进行 polyfill。建议捆绑 polyfill,而不是使用 CDN。
强制要求:通过检查 HTMLButtonElement.prototype 上的 interestForElement 属性来检测功能,并且仅在缺少原生支持时加载 polyfill。
<script type="module">
if (!HTMLButtonElement.prototype.hasOwnProperty("interestForElement")) {
// CDN link only used for example, prefer bundling.
await import("https://unpkg.com/interestfor@latest");
}
</script>
CSS Polyfill 注意事项
使用 polyfill 时,CSS API 会略有变化,以弥补原生伪类和属性支持的不足:
- 伪类:polyfill 无法定义真正的
:interest-source和:interest-target伪类,因此它会改为应用.interest-source和.interest-target类。强制性:将它们与:is()结合使用,以同时支持原生状态和 polyfill 状态。
/* Styles to apply when the effect is being previewed */
:is(:interest-source, .interest-source) { /* ... */ }
:is(:interest-target, .interest-target) { /* ... */ }
- CSS 属性:对于
interest-delay、interest-delay-start和interest-delay-end,polyfill 需要使用 CSS 变量,因为它无法在所有浏览器中直接读取自定义属性。
/* Adjust the start and end delay for interest invokers */
[interestfor] {
--interest-delay-start: 0.2s;
interest-delay-start: var(--interest-delay-start);
--interest-delay-end: 0.1s;
interest-delay-end: var(--interest-delay-end);
}