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

简介: 高手是如何写出让别人看不懂的选择器

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


通过这些案例,我们窥见一些 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>
HTML 复制 全屏


结果如下:

0729c56d5e804c37b5e1938460ef94c0_tplv-k3u1fbpfcp-zoom-1.png


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


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


神奇的特殊字符



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


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


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

3c0bbf227b1c45abbd784c6d5d78b586_tplv-k3u1fbpfcp-zoom-1.png


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


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


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

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


5544cd45b97742a8a2c0b5d2a18baf30_tplv-k3u1fbpfcp-zoom-1.png当然,既然如此,我们还可以写出这样的选择器:


<div id="💉💧🐂🍺">真滴牛啤</div>
#💉💧🐂🍺 {
    padding: 10px;
    color: red;
}


emmm,没错,这也是可以生效的:


f2345b548bab40219aa2e35b011fd67d_tplv-k3u1fbpfcp-zoom-1.png


所以,不是特别皮糙肉厚,极不建议大家在 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 选择器是存在非常多细节的。知道那些不好的,能帮助我们更好的写出漂亮且正确的选择器。

目录
相关文章
|
9月前
|
SQL 人工智能 Java
程序员:你见过哪些要命的奇葩代码?
程序员:你见过哪些要命的奇葩代码?
82 0
|
11月前
|
前端开发 JavaScript
用Transition组件犯迷糊?看我这篇给你安排的明明白白的
transition组件作为Vue的内置组件,可以用来实现组件的过渡效果。在Vue中,过渡效果是通过CSS来实现的,所以过渡不是如何使用组件,而是如何写CSS。
86 0
用Transition组件犯迷糊?看我这篇给你安排的明明白白的
|
11月前
|
数据库
我又写了一堆烂代码
“我又写了一堆烂代码!” 这句话我经常对自己说,目的是为了督促自己不断地思考所写的代码是否足够可靠。
40 0
|
11月前
|
存储 自然语言处理 JavaScript
产品让我限制一下输入框字数,结果我搞了3天没搞明白
作为一名新人er,看到自己的文章列表空空如也总觉得不是那么回事。但是想动手写点什么吧,脑子里实在又憋不出什么料。写一篇正儿八经的技术文章真的是好难好麻烦,尤其是看了首页推荐的大佬文章,更是觉得自己那点东西就别拿出去丢人了。有充分借口的日子总是短暂而且美好。这不,就在不久前的一次组会上,老大们又提起了”写点什么“的事儿,并且一再强调,不需要写出个什么宏文出来,写点什么都行。你看这台阶都给到这了,不下
|
程序员
笑出腹肌!有些程序员真会玩代码注释
笑出腹肌!有些程序员真会玩代码注释
65 0
笑出腹肌!有些程序员真会玩代码注释
|
JavaScript 前端开发
不看后悔系列!原来代码还可以这么写!
不看后悔系列!原来代码还可以这么写!
|
Python
又烧脑又炫技还没什么用,在代码里面打印自身
又烧脑又炫技还没什么用,在代码里面打印自身
162 0
又烧脑又炫技还没什么用,在代码里面打印自身
|
开发者 Python
一日一技:8行炫技代码,知识点多得不得了
一日一技:8行炫技代码,知识点多得不得了
251 0
一日一技:8行炫技代码,知识点多得不得了
|
数据库
【硬着头皮】 比较两个数大小,麻烦写得整洁点
【硬着头皮】 比较两个数大小,麻烦写得整洁点
【硬着头皮】 比较两个数大小,麻烦写得整洁点
|
JSON Java 测试技术
如何写出让人抓狂的代码?
如何写出让人抓狂的代码?
如何写出让人抓狂的代码?