高手是如何写出让人看不懂的选择器?

news/2024/7/19 16:40:33 标签: css, html, svg, js, less
htmledit_views">
js_content">

本文的标题是如何写出让别人看不懂的选择器,但是本意不是希望大家去写如此复杂的选择,一些复杂(怪异)的选择器在一些特定场景下也许有着妙用,又或者写出这种选择器是基于当时的特殊背景。

通过这些案例,我们窥见一些 CSS 选择器的有意思之处。从中得到一些有益经验。

五花八门的伪类叠加

首先来看第一类,在单个选择器中,叠加各种伪元素。

像是这个:

a:not(main *:not(:is(h2, h3) > *)) {
  color: red;
}

这个选择器不认真看个一分钟根本不知道它到底是个啥。(认真看也不一定知道...)

它混入了比较新的两个伪类选择器

  • :not():用来匹配不符合一组选择器的元素。由于它的作用是防止特定的元素被选中,它也被称为反选伪类(negation pseudo-class)

  • :is():将选择器列表作为参数,并选择该列表中任意一个选择器可以选择的元素。

当然,对于它的拆解:

  1. a:not(main *):选择不是 <main> 标签下的所有 a 标签

  2. main *:not(:is(h2, h3) > *):选择 <main> 标签下所有不是 <h2><h3> 子元素的元素

所以合起来就是:选择所有不是 <main> 标签下的 <a> 标签以及所有 <main> 下面不是 <h2><h3> 下的子 <a> 以外的所有 <a> 标签。

假设有如下 HTML

<main>
    <a href="">main>a</a>
    <h1><a href="">main>h1>a</a></h1>
    <h2><a href="">main>h2>a</a></h2>
    <h2><p><a href="">main>h2>p>a</a></p></h2>
    <h3><a href="">main>h3>a</a></h3>
</main>
<h1><a href="">h1>a</a></h1>
<h2><a href="">h2>a</a></h2>
<h3><a href="">h3>a</a></h3>
<a href="">a</a>

结果如下:

对于这个 CSS 选择器,是可以通过正常写法还原的,只是代码量稍微多一点点,正常而言,还是不建议写这么复杂的选择器。

这里仅仅是一个例子,多层不同的伪类嵌套,对于代码可读性是灾难性的。

神奇的特殊字符

好了,某天你又碰到了这样一个选择器:

#~!@$%^&*()_+-=,./ ;:?><\[]{}|`# {
    color: red;
}

Oh My God。我想你的第一反应一定是这个选择器真能生效?

不好意思,它还真能生效,CSS 中的 CSS 类名中允许使用除 NUL 之外的任何字符。

感兴趣可以看看这个:Which characters are valid in CSS class names/selectors?[1]

所以,上述的选择器,是可以匹配这样的标签的:

<div id="~!@$%^&*()_+-=,./ ;:?><[]{}|`#">Lorem</div>

所以,不是特别皮糙肉厚,极不建议大家在 CSS 类名中掺入除了 -以及 _ 以外的其他特殊字符。

自身的多重重叠

下面这个选择器,也有点意思,特殊关头倒是可以写写。像是这样一个选择器:

div.g-text-color.g-text-color.g-text-color.g-text-color.g-text-color {
    color: red;
}

为什么会出现这种选择器呢?大部分情况是为了提升优先级。

我们都知道,CSS 不同选择器之间是存在优先级高低的。

有这样一种场景举个例子,有的时候,我们在业务中引入了组件库,使用了它的一个按钮,但是又想改变其中的某些样式。给它加了一个类名,在对应类名新增了覆盖样式后发现没有生效。

原因就在于定义样式的选择器优先级不够高

这个时候,我们就可以通过自己叠加自己的方式,提升选择器的权重。

div.g-text-color.g-text-color.g-text-color 的权重,就会比 div.g-text-color.g-text-color 更高。所以某些极端情况下,就出现了上述的选择器。

当然,正常情况下,也是不推荐写这种让人头大的选择的。

总结一下

坑爹的选择器还有很多,本文仅仅是举了冰山一角。从如何写出让别人看不懂的选择器中,我们能知道 CSS 选择器是存在非常多细节的。知道那些不好的,能帮助我们更好的写出漂亮且正确的选择器。

好了,本文到此结束,希望对你有帮助 :)

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

参考资料

[1]

Which characters are valid in CSS class names/selectors?: https://stackoverflow.com/questions/448981/which-characters-are-valid-in-html" title=css>css-class-names-selectors/449000#449000

如果觉得这篇文章还不错,来个【转发、收藏、在看】三连吧,让更多的人也看到~


http://www.niftyadmin.cn/n/1251183.html

相关文章

花2个月备战字节,3轮技术面,总包50w,定级2-1!

收到一位刚入职字节的前端朋友投稿——以下内容来自其亲身经历&#xff0c;双非普本拿到 字节50W Offer &#xff0c;感谢他的走心分享&#xff08;文末送肝货&#xff09;。个人情况&#xff1a;本硕都是计算机&#xff08;普通二本&#xff09;&#xff0c;2020届&#xff0c…

git暂存区工作区撤销和删除

1、撤掉 a、如果还没 git add file &#xff0c;使用该指令进行撤销&#xff1a; git checkout -- fileName b、如果已经git add file &#xff0c; 但是没有 git commit -m "" 分两步操作&#xff1a; b-1、git reset HEAD readme.txt b-2、git stat…

可能是史上最全 Vue 前端代码风格指南

作者&#xff1a;卡喵妹https://juejin.cn/post/6987349513836953607一、命名规范市面上常用的命名规范&#xff1a;camelCase&#xff08;小驼峰式命名法 —— 首字母小写&#xff09;PascalCase&#xff08;大驼峰式命名法 —— 首字母大写&#xff09;kebab-case&#xff08…

使用WebMvcConfigurer配置SpringMVC

Spring的WebMvcConfigurer接口提供了很多方法让我们来定制SpringMVC的配置。而且Spring还提供了WebMvcConfigurerAdapter让我们更加优化的去进行配置。我们的配置类可以直接继承WebMvcConfigurerAdapter来进行配置。 configurePathMatch&#xff1a;匹配路由请求规则 setUseS…

commons configuration管理项目的配置文件

Commons Configutation   commons configuration可以很方便的访问配置文件和xml文件中的的内容。Commons Configuration 是为了提供对属性文件、XML文件、JNDI资源、来自JDBC Datasource数据的访问。 官方文档&#xff1a;http://commons.apache.org/proper/commons-config…

2021, 九款值得推荐的VUE3 UI框架

本文推荐几个比较流行的VUE3 UI框架&#xff0c;同时提供出色的开发人员体验&#xff0c;合理利用&#xff0c;又或者学习借鉴都是不错的选择&#xff0c;排名不分先后。Ant Design Vue官方网站&#xff1a;https://2x.antdv.com/components/overview/Ant Design Vue 是一个非常…

windows10上面安装mysql

首先去下载mysql 可到官网下载&#xff0c;地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 1、首先解压文件包&#xff0c;我这解压到E:\install_work\mysql目录下&#xff1a; 2、发现mysql根目录下没有data目录和my.ini文件&#xff0c;不要紧&#xff0c;初始化…

前端经典面试题60道,附答案!

今天分享一篇比较全的面试题&#xff0c;包含 JS、CSS、React、网络、浏览器、程序题等。……(以下所有答案仅供参考)简答题1、什么是防抖和节流&#xff1f;有什么区别&#xff1f;如何实现&#xff1f;参考答案防抖触发高频事件后n秒内函数只会执行一次&#xff0c;如果n秒内…