前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >检测 CSS 中的 JavaScript 支持

检测 CSS 中的 JavaScript 支持

作者头像
chuckQu
发布2024-05-28 09:02:02
830
发布2024-05-28 09:02:02
举报
文章被收录于专栏:前端F2E前端F2E

最近,我惊喜地发现了一个CSS媒体特性——scripting,它能够在所有现代浏览器中使用。这意味着,我们可以根据用户浏览器是否支持JavaScript来提供不同的CSS规则,从而减少未样式化内容的闪烁或不受欢迎的布局偏移。

使用方法

使用这个特性,我们可以按以下方式渐进式增强样式:

代码语言:javascript
复制
@media (scripting: enabled) {
  .my-element {
    /* 如果JS可用,增强样式 */
  }
}

或者,我们可以优雅地回退到一些备选样式:

代码语言:javascript
复制
@media (scripting: none) {
  .my-element {
    /* 如果JS不支持,使用备选样式 */
  }
}

还有一个initial-only值,适用于在页面加载期间启用脚本但在之后不启用的情况。CSS媒体查询第5级W3C工作草案[1]中提到了一些它可能有用的场景。

例如,打印页面,或者在服务器上渲染页面并发送给用户的预渲染网络代理。

我个人不太能想象自己会经常使用initial-only,尽管我很想找到更多实际应用中的具体例子。

特性出现之前

在这项特性出现之前,检测JavaScript支持的一种方法是通过在html标签上设置一个自定义选择器——常见的做法是添加一个no-js类名。如果JavaScript得到支持并启用,它会在渲染页面内容之前移除该选择器。当JavaScript被禁用时,我们可以提供适应体验的备选样式。

代码语言:javascript
复制
<html class="no-js">
  <!-- 页面内容 -->
</html>

.no-js .my-element {
  /* 当JS被禁用时的样式 */
}

组合查询

下面是一个示例,注意到媒体查询被结合起来检查脚本和减少运动的条件。

代码语言:javascript
复制
@media (scripting: enabled) and (prefers-reduced-motion: no-preference) {
  /* JS可用且运动OK */
}

@media (scripting: none), (prefers-reduced-motion) {
  /* JS已禁用或减少运动已启用 */
}

每个条件当然可以有独家样式,如果预期的结果需要的话,但在规则集有重叠的地方,将它们结合起来也很好。

问题

更新于2024年4月21日 - 在发布这篇文章后,一些反馈浮现出来,解释了这个媒体特性在哪些方面意外地失败了。

  1. 当使用像NoScript或uBlock Origin这样的浏览器扩展来禁用页面脚本时,它的表现并不像预期的那样。即使扩展将JavaScript关闭了,scripting: enabled仍然匹配。
  2. 如果脚本被阻止或无法加载,需要通过JavaScript来处理回退。在上面的演示中,回退需要接入演示的scripting: none媒体查询规则集。

小心那些陷阱

尽管scripting媒体特性非常有用,但上述问题提醒我们,在依赖它时需要谨慎。例如,如果一个脚本由于某种原因没有加载,你可能需要一个备用计划来确保内容的可访问性和页面的可用性。

现实世界的应用

在现实世界的网页设计中,这意味着我们需要为那些可能由于技术或个人偏好而禁用JavaScript的用户考虑。通过使用scripting媒体查询,我们可以确保所有用户都能获得清晰、优雅的体验,无论他们是否选择使用JavaScript。

结语

总的来说,scripting媒体查询是一个强大的工具,可以帮助我们为支持JavaScript和不支持JavaScript的环境提供适当的样式。它让我们能够更好地控制页面加载时的样式应用,减少布局偏移,并且提供更加平滑和可预测的用户体验。

本文译自:https://ryanmulligan.dev/blog/detect-js-support-in-css/

Reference

[1]

CSS媒体查询第5级W3C工作草案: https://www.w3.org/TR/mediaqueries-5/#scripting

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端F2E 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用方法
  • 特性出现之前
  • 组合查询
  • 问题
    • 小心那些陷阱
      • 现实世界的应用
      • 结语
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档