Skip to content

Less - 混合守卫

LESS 中的混入守卫(Mixin Guards)提供了一种控制何时应用混入(mixin)的方式,类似于编程语言中的条件语句(如 if/else)。它们允许混入根据表达式评估结果为 true 来有条件地渲染。守卫是附加到混入声明的一个条件,紧跟在 when 关键字后面,用圆括号括起来。一个混入可以有多个守卫,用逗号分隔(逻辑或),或者用 and 关键字组合(逻辑与)。这使得您的样式能够实现强大的、基于表达式的逻辑。

守卫对于创建灵活且可重用的混入至关重要,这些混入可以适应不同的输入或上下文。通过将决策逻辑直接整合到混入的定义中,它们有助于避免创建多个略有不同的混入。

守卫条件的主要特性和类型包括:

类别描述与示例
1比较运算符
守卫经常使用比较运算符来评估表达式。包括:=(等于),>(大于),>=(大于或等于),<(小于),<=(小于或等于)。这些运算符可用于比较数字、字符串、关键字和其他 Less 数据类型。
2逻辑运算符
多个条件可以使用逻辑运算符组合:and(两个条件都必须为 true),or(至少一个条件必须为 true,通常通过定义多个同名但带有不同守卫的混入或使用逗号分隔的守卫来实现),以及 not(对条件取反)。
3类型检查函数
LESS 提供了内置函数来检查值的类型,这在守卫中非常有用。例如:iscolor()、isnumber()、isstring()、iskeyword()、isurl()、ispixel()、ispercentage()、isem()、isunit()。
4default() 函数
default() 函数用作备选方案。一个带有 default() 守卫的混入只有在没有其他同名(且参数个数匹配,即 Arity 匹配)的混入通过其守卫匹配成功时才会被匹配。这在特定条件未满足时提供默认样式非常有用。

以下示例演示了如何使用混入守卫根据颜色的亮度应用不同的字体大小:

假设我们有以下 HTML 结构:

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mixin Guards Example</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<h2>Example of Mixin Guards</h2>
<p class="light-theme-text">Text for light themes (e.g., light background).</p>
<p class="dark-theme-text">Text for dark themes (e.g., dark background).</p>
</body>
</html>

现在,我们创建 style.less 文件:

// 根据背景颜色亮度设置字体属性的混入
.text-style(@bg-color) when (lightness(@bg-color) >= 50%) {
// 如果背景是浅色,则应用此样式
color: #333; // 浅色背景使用深色文本
font-size: 16px;
}
.text-style(@bg-color) when (lightness(@bg-color) < 50%) {
// 如果背景是深色,则应用此样式
color: #f0f0f0; // 深色背景使用浅色文本
font-size: 18px;
}
// 一个可供两者使用的通用混入,或者一个默认混入
.text-style(@bg-color) when (default()) {
// 如果上面的守卫覆盖了 @bg-color 的所有使用情况,这个默认混入可能不会被命中
// 或者,如果结构不同(例如,由带有守卫的混入调用一个通用混入),它也可以用于应用通用样式,无论哪个特定守卫匹配成功。
// 对于这个特定的示例,我们将确保在没有亮度条件匹配时设置一个基本颜色。
// 然而,对于亮度值,对于一个有效的颜色,上面两个守卫中总会有一个匹配成功。
// 让我们使用不同的参数来完善它,以便更清晰地展示默认情况。
}
// 示例用法:
.light-theme-text {
background-color: #ffffff; // 浅色
.text-style(#ffffff);
padding: 10px;
}
.dark-theme-text {
background-color: #222222; // 深色
.text-style(#222222);
padding: 10px;
}

要将 style.less 编译为 style.css,您可以使用 Node.js/npm 通过 Less 编译器进行。首先,请确保您已安装 Node.js 和 npm。然后,全局安装 Less 或将其作为项目依赖安装:

npm install -g less # For global installation
# or for a project: npm install less --save-dev

然后,编译文件:

lessc style.less style.css

执行上述命令将创建包含以下内容的 style.css 文件:

.light-theme-text {
background-color: #ffffff;
color: #333;
font-size: 16px;
padding: 10px;
}
.dark-theme-text {
background-color: #222222;
color: #f0f0f0;
font-size: 18px;
padding: 10px;
}

当您在浏览器中打开 mixin-guard.html(或等效的 HTML 文件)时:

  • 由于其背景色(#ffffff)的亮度大于或等于 50%,<p class="light-theme-text"> 元素内的文本将呈现深色(#333)并具有 16px 的字体大小。
  • 由于其背景色(#222222)的亮度小于 50%,<p class="dark-theme-text"> 元素内的文本将呈现浅色(#f0f0f0)并具有 18px 的字体大小。

这演示了混入守卫如何实现条件性的 CSS 生成,从而创建更具动态性且更易于维护的样式表。

对于更高级的守卫场景,可以考虑使用 and 组合条件,或者使用 isnumber() 或 iscolor() 等类型检查函数来使您的混入更加健壮。更多详细信息,请参阅官方 Less 文档关于混入守卫的部分。