共计 2411 个字符,预计需要花费 7 分钟才能阅读完成。
不晓得各位同学有没有感觉当初 css 在前端圈子里越来越不受“待见”了。
起因可能有下:
- 难以模块化,不可保护,没啥能够深入研究的
- 面试根本也不会问啊
- 局部公司还有 css 工程师,前端不须要关怀
- 。。。
然而作为从看张鑫旭大佬的文章才一步步开启我的前端之路的开发 er,我可不能“忘了本”。犹记得才刚刚转行那会面试的时候会问我“你感觉本人 css 和 js 哪个更善于?”,我都会不犹豫的说“css”。
平时用 BEM 规定写款式的同学可能常常会遇到上面这样的(相似)场景,标签列表中会有失常状态和选中状态。故事的开始就是起于这样一段 html 代码:
<!-- 第 1 种组织模式,集体比拟偏向这种 -->
<!-- tag 外面的子节点变多的时候不须要给每一个子节点都增加 --active 的修饰符 -->
<div class="tag tag--active">
<img src=""class="tag__img" />
<span class="tag__text">222</span>
</div>
<!-- 第 2 种组织模式 -->
<!-- 可能更合乎 bem 的 思维(缩小款式嵌套)-->
<div class="tag">
<img src=""class="tag__img--active" />
<span class="tag__text--active">222</span>
</div>
针对第一种 html 的构造,如何通过父级选择器 & 更优雅的写出款式。当初咱们就从 & 的根底用法一步步说起。
为了不便咱们应用命令行测试,请全局装置 less
npm install less -g // 以后版本:3.11.3
上面的例子都是基于常见的通过 BEM 写款式的业务场景。
置信看完这篇文章的同学再用 BEM 规定写款式的时候代码肯定会土气的一批。
根本用法
&
运算符示意一个嵌套规定的父选择器
下面是 less 官网对于 & 的定义(请肯定要粗浅领会),上面咱们通过例子来逐渐感触。
.header {
&__text {
color: #000;
&--active {color: #fff;}
}
&:before {
content: '';
display: block;
}
&.test3 {font-size: 12px;}
}
通过 lessc 编译后:
.header__text {color: #000;}
.header__text--active {color: #fff;}
.header:before {
content: '';
display: block;
}
.header.test3 {font-size: 12px;}
能够看到,& 援用了间隔他 最近的残缺的父级 。
为什么强调是残缺的父级呢,.header__text--active
而不是 .text--active
就是最好的证实。可能很多同学对于 & 的用法也就到这里就完结了(包含我本人以及身边很多工作好多年的共事,没错,我用上面的例子给他们做了测试,哈哈哈哈),如果你对“工程卓越”有谋求的话请持续往下看。
高阶用法
对于开篇提到的那个 html 构造,如何优雅的写 active 状态的款式笼罩,也有相当一段长的工夫困扰着我,甚至写了一段时间这样的代码:
.tag {
&__img {
width: 100px;
height: 100px;
}
&__text {
font-size: 14px;
color: #fff;
}
&--active {
.tag__img {background: #000;}
.tag__text {color: #000;}
}
}
几乎是丑到家了。实际上各位同学如果真的能了解父级选择器,认真思考一下同时摈弃你的惯性思维,就能写出上面的代码:
.tag {
&__img {
width: 100px;
height: 100px;
}
&__text {
font-size: 14px;
color: #fff;
}
&--active &__img {background: #000;}
&--active &__text {color: #000;}
}
通过 lessc 命令看看最终转成啥样:
.tag__img {
width: 100px;
height: 100px;
}
.tag__text {
font-size: 14px;
color: #fff;
}
.tag.tag--active .tag__img {background: #000;}
.tag.tag--active .tag__text {color: #000;}
请大家好好消化,其实 &
就是代替父级的存在。
在下面场景的根底上,咱们再思考下另一个相似的状况:
<div class="tag active">
<img src=""class="tag__img" />
<span class="tag__text">222</span>
</div>
和下面不同的是,咱们应用 active 来代替 tag–active。这在理论开发的场景中是很常见的。active 作为一个全局定义好的通用选中状态,利用到业务场景中。那么当初如何再去笼罩 tag__text 的款式呢?
.tag {
&__img {
width: 100px;
height: 100px;
}
&__text {
font-size: 14px;
color: #fff;
}
.active & {
&__text {#000;}
}
}
通过 lessc 命令看看最终转成啥样:
.tag__img {
width: 100px;
height: 100px;
}
.tag__text {
font-size: 14px;
color: #fff;
}
.active .tag__text {color: #000;}
胜利的将 active 状态下的 tag__text 的文字色彩改成了彩色。
这里咱们留神到 &
放到了类名前面,请大家再次领会一下。
其实 &
的地位放在哪里都是能够当作父级来应用的,应用的次数也没有限度,能够应用两个甚至更多。
完结
文章到这里就完结了,心愿看完的同学能减少对于 &
的意识,更重要的是能重拾起来对于款式的“工程卓越”的谋求。
最初,以此文留念本人刚开始学习前端的日子。