如何检测浏览器是否支持某个伪类

如何检测浏览器是否支持某个 CSS 伪类(例如 :focus-within

错误方法

@supports (div:focus-within) {}
CSS.supports('div:focus-within`);

此法检测的是浏览器是否支持一个名为 div 的属性,且值可以为 focus-within,当然不支持。。。

正确方法

function supportsPseudoClass(clazz) {
  const style = document.createElement('style');
  style.innerHTML = clazz + '{}';
  document.head.appendChild(style); // required, or style.sheet === null
  const result = style.sheet.cssRules.length === 1;
  style.remove(); // document.head.removeChild(style);
  return result;
}

supportsPseudoClass(':focus-within'); // => true

原理:如果 CSS 解析器不认识某个伪类,CSS 会认为其整条规则都不合法,并将其忽略。style.sheet.cssRules 只会存放解析成功的规则,所以如果浏览器不认识这个伪类,就不会把这条规则存入 cssRules

同理,如果用到伪类的 polyfill,一定不能将 polyfill 生成的类名和原始伪类连用。例如:

#div:focus-within, #div.focus-within {
}

如果浏览器不认识 :focus-within,CSS 解析器会把整条规则全部忽略掉,起不到 polyfill 的效果。#div:focus-within, #div.focus-within 是一条选择器

可以这么写(scss):

@mixin div {
}

#div:focus-within {
  @include div;
}
#div.focus-within {
  @include div;
}

下一篇文章预计讲讲 :focus-within 的用处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值