Less中extend是编译期选择器合并而非运行时继承,不支持伪类目标、参数或变量访问,适用于语义稳定的原子类;误用会导致循环警告、调试困难及IE8兼容问题。
Less中
不是CSS继承,别当伪类用
Less的
本质是编译期选择器合并,不是运行时样式继承。它不会生成父元素样式,也不会影响DOM结构或层叠顺序——只在编译后把匹配的选择器“抄一份”过去。常见错误是写成
,结果编译报错:
是伪类,不能被
目标直接匹配(目标必须是纯类名、ID或属性选择器)。正确做法是让被继承的基类本身包含状态:
,再用
。
什么时候该用
而不是
选
的核心条件就一个:需要复用**选择器本身**,而不仅是样式声明。比如你有一套全局禁用规则
,想让
和
都挂上同一组禁用样式,且希望最终CSS里只出现一次
的定义——这时
能压缩体积;但如果你要传参数(如
)、做逻辑判断或生成多套变体,就必须用
。
不支持参数,也不支持嵌套作用域内的变量访问。
适合
:统一状态类(
、
)、布局工具类(
)
适合
:带颜色/尺寸的组件变体、响应式断点封装、浏览器前缀补全
混用风险:
可能触发Less 4.0+的循环检测警告,实际不循环也会误报
的语法细节和兼容性坑
Less 3.5+开始支持
关键字,但默认只匹配顶层选择器。例如
不会生效,因为
含组合符;必须写成
才能命中后代中的
。另外,
对注释、空行敏感:如果被扩展的选择器前面有注释或空行,Less可能找不到它——建议基类集中放在文件开头,不加空行分隔。IE8及以下不支持CSS中多个逗号分隔的选择器共用同一套样式(这是
编译后的产物),所以用了
的项目基本放弃IE8支持。
必须加
才能跨层级匹配:
不能扩展动态生成的选择器,如
这种变量拼接形式
Webpack + less-loader 7.x 默认开启
,可能导致
解析异常,建议显式设为
编译后CSS体积和维护成本的真实权衡
确实能减少重复CSS,但代价是选择器耦合度升高。比如
,一旦
定义改了,所有用到它的
都会被动更新——这在大型项目里反而难追溯。更隐蔽的问题是调试:Chrome DevTools里看到
的样式来自
,但点击跳转却定位不到源码(因为Less里没直接写
)。所以真正省代码的地方,其实是那些极少改动、语义稳定的原子类;高频迭代的业务组件,老老实实用
更可控。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
前端免费学习笔记(深入)
”;
复杂点在于:
的“复用”是静态的,它不关心上下文。当你以为在复用样式,其实是在复用选择器路径——这点稍不注意,就变成维护负担。
extendextend.btn:hover:extend(.btn):hoverextend.btn { &:hover { ... } }.special-btn:extend(.btn)extendmixinextend.disabled.form-input.disabled.btn.disabled.disabledextend@colormixinextendextend.hidden.sr-only.clearfixmixin.a:extend(.b) { .c:extend(.b) }extendall.nav-item:extend(.nav > li).nav > li.nav-item:extend(.nav > li all)liextendextendextendall.sub-item:extend(.menu li all).@{name}math=alwaysextendmath=strictextend.card:extend(.shadow-sm, .rounded).shadow-smextend.card.shadow-sm.shadow-smmixinextend