惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
博客园_首页
S
SegmentFault 最新的问题
罗磊的独立博客
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
D
Docker
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
V
V2EX
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
腾讯CDC
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
Vercel News
Vercel News
H
Help Net Security
博客园 - Franky
D
DataBreaches.Net
aimingoo的专栏
aimingoo的专栏

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
CSS :not伪类可能错误的认识 « 张鑫旭-鑫空间-鑫生活
张鑫旭,zhangxinxu · 2019-07-28 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=8808
本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可以联系授权。

一、特别的你,特别的0优先级

不敢相信 CSS :not伪类常见错误认知之一就是搞不清楚其优先级。

如果对所有CSS伪类的优先级(也就是我们常说的选择器权重)进行分类,你会发现总共只有两个级别,0级和10

① 0级指没有优先级,1级是标签选择器,10级是类选择器,属性选择器,100级是ID选择器。

伪类,伪类,既然带有“类”字,自然其优先级好类选择器一致。

但是,其中有个特殊,那就是逻辑伪类的优先级都是0。例如::not():is():where()等。

逻辑伪类整个选择器语句的优先级是由括号里面内容决定的,不同的逻辑伪类规则不一样,其中:not()伪类的本身没有优先级,最终优先级是由括号里面的选择器决定的。

例如:

:not(.disabled) {}    /* 优先级等同于.disabled选择器 */
:not(a) {}    /* 优先级等同于a选择器 */

二、生的早,不支持复杂选择器

:not()逻辑伪类出身很早,早到IE9浏览器都支持,不像现在的新出来的逻辑选择器,:not()伪类括号里面并不支持复杂的选择器(虽然新的规范已经让支持了,目前还没有浏览器跟进)。

例如,:not()伪类括号里面不能多个选择器:

:not(.disabled, .read-only) {}    /* 无效,不支持 */

需要写作:

:not(.disabled), :not(.read-only) {}

例如,:not()伪类括号里面不支持选择器级联:

:not(a.disabled) {}    /* 无效,不支持 */

需要写作:

:not(a):not(.disabled) {}

三、容易搞不清楚的否定逻辑关系

这是本文的重点。

1. 连续否定的逻辑错误

例如,如果我们想要匹配既不包含.disabled类名,又不包含.read-only类名的<input>元素,我们的选择器该如何书写,很多人会使用下面的CSS代码:

input:not(.disabled),
input:not(.read-only) {}

乍一看好像没问题,实际上,上面的书写是大大的错误。

逗号分隔的选择器,表示的是“或”的关系,而不是“与”的关系。因此input:not(.disabled), input:not(.read-only)表示的含义是:不包含.disabled类名的<input>元素,或者不包含.read-only类名的<input>元素。

最后导致的结果是.disabled类名和.read-only类名元素都会匹配。

例如:

<!-- 均会匹配 -->
<input class="disabled">
<input class="read-only">

因为<input class="disabled">虽然不会匹配input:not(.disabled),但是会匹配input:not(.read-only),导致出现了不希望出现的匹配效果。

这里,正确的书写方法应该是:

/* 正确的书写 */
input:not(.disabled):not(.read-only) {}

2. 全局否定的逻辑错误

例如我们希望除了<article>标签下的<p>元素的margin值都是0,我们代码该怎么写。

很多人会这样书写:

:not(article) p {
    margin: 0;
}

看上去没有问题,实际上问题非常严重,:not(article) p实际语义是,如果<p>元素的祖先元素的标签名不是article,则margin值是0

其中就包括这样的场景:

<article>
    <section>
        <p>margin此时也是0!<p>
    </section>
</article>

此时,虽然<p>元素在<article>元素内,但是,由于同时也在<section>元素内,于是匹配了:not(article) p这个选择器,导致出现意料之外的样式表现。

正确的书写应该是:

p {
    margin: 0;
}
article p {
    margin: 1em 0;
}

咦?不能使用:not伪类实现吗?对的,在这种场景下,:not伪类是无解的。

除非强制层级元素,也就是<p>元素是<article>的相邻子元素元素,此时我们可以使用下面CSS满足我们需求,不过限制很大,建议还是使用传统重置策略:

:not(article) > p {
    margin: 0;
}

四、最后小结一下下

:not伪类是目前唯一一个可以大规模放心使用的逻辑伪类,非常有用,优点也很突出,大家可以多用用。

但是,其中也不乏一些会让人踩坑的地方,本文就介绍这几个大家可能会理解错误或使用错误的地方,至于其优点在那里,限于不是本文重点,以后有机会在详细介绍,总之,好用,大家要多用用。

好了,就说这么多。

小朋友又生病了,连续去了3天医院了,待会儿还要去医院挂水,不扯了,感谢阅读,欢迎分享。

本文为原创文章,欢迎分享,勿全文转载,如果内容你实在喜欢,可以加入收藏夹,永不过期,而且还会及时更新知识点以及修正错误,阅读体验也更好。
本文地址:https://www.zhangxinxu.com/wordpress/?p=8808

(本篇完)