LESS语言功能的深入指南。 请参阅 概述 快速总结Less。
变量
控制单个位置中常用的值。
概述
一 , .link链接 { 颜色 : #4280亿卡 ; } .widget(小部件) { 颜色 : #飞行频率 ; 背景 : #4280亿卡 ; }
//变量
@链接颜色: #4280亿卡 ; //海蓝色
@链接颜色: 使变暗 ( @链接颜色 , 10% ); //用法
一 , .link链接 { 颜色 : @链接颜色 ; } 一 :悬停 { 颜色 : @链接-颜色 ; } .widget(小部件) { 颜色 : #飞行频率 ; 背景 : @链接颜色 ; }
变量插值
选择器
//变量
@我的选择器: 横幅; //用法
.@{my-selector} { 字体加粗 :粗体; 线路高度 : 40像素 ; 边缘 : 0 自动; }
.横幅 { 字体加粗 :粗体; 线路高度 : 40像素 ; 边缘 : 0 自动; }
URL
//变量
@图像: “../img” ; //用法
身体 { 颜色 : #444 ; 背景 :url( “@{images}/white-sand.png” ); }
导入对账单
//变量
@主题: “../../src/themes” ; //用法
@导入 “@{themes}/tidal-wave.less” ;
属性
@属性: 颜色; .小部件 { @{属性} : #0参见 ; 背景-@{property} : #999 ; }
.widget(小部件) { 颜色 : #0参见 ; 背景色 : #999 ; }
变量
@主要: 绿色; @次要: 蓝色; .节 { @颜色: 初级; .元素 { 颜色 : @@颜色 ; } }
.节 .元素 { 颜色 :绿色; }
懒惰的评估
变量在使用之前不必声明。
.懒惰的eval { 宽度 : @无功功率,无功功率 ; } @var(变量): @一个 ; @答: 9% ;
.lazy-val型 { 宽度 : @无功功率,无功功率 ; @答: 9% ; } @var(变量): @一个 ; @答: 100% ;
.lazy-val型 { 宽度 : 9% ; }
@var(变量): 0 ; .class类 { @var(变量): 1 ; .黄铜 { @变量: 2 ; 三 : @无功功率,无功功率 ; @var(变量): 三 ; } 一 : @无功功率,无功功率 ; }
.class类 { 一 : 1 ; } .class类 .黄铜 { 三 : 三 ; }
.标头 { --颜色 :白色; 颜色 : 无功功率,无功功率 (--颜色); //这个颜色是黑色的
--颜色 :黑色; }
属性作为变量 (新增!)
.widget(小部件) { 颜色 : #efefef公司 ; 背景色 :$color; }
.widget(小部件) { 颜色 : #efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef ; 背景色 : #efefef公司 ; }
.块 { 颜色 :红色; .内部 { 背景色 :$color; } 颜色 :蓝色; }
.块 { 颜色 :红色; 颜色 :蓝色; } .块 .内部 { 背景色 :蓝色; }
默认变量
//图书馆
@基色: 绿色; @深色: 使变暗 ( @基色 , 10% ); //图书馆的使用
@导入 “库.less” ; @基色: 红色;
父选择器
使用引用父选择器
&
一 { 颜色 :蓝色; & :悬停 { 颜色 :绿色; } }
一 { 颜色 :蓝色; } 一 :悬停 { 颜色 :绿色; }
.按钮 { & -好的 { 背景-图像 :url( “ok.png” ); } & -取消 { 背景-图像 :url( “取消.png” ); } & -自定义 { 背景-图像 :url( “自定义.png” ); } }
.按钮-确定 { 背景-图像 :url( “ok.png” ); } .按钮-取消 { 背景-图像 :url( “取消.png” ); } .按钮-自定义 { 背景-图像 :url( “自定义.png” ); }
多个 &
.链接 { & + & { 颜色 :红色; } & & { 颜色 :绿色; } & & { 颜色 :蓝色; } & , & 1.n.(ish)人名;(英)伊什 { 颜色 :青色; } }
.link链接 + .link链接 { 颜色 :红色; } .link链接 .link链接 { 颜色 :绿色; } .link链接 .link链接 { 颜色 :蓝色; } .link链接 , .linkish链接 { 颜色 :青色; }
千美元 { .父级 { & > & { 颜色 :红色; } & & { 颜色 :绿色; } & & { 颜色 :蓝色; } & , & 1.n.(ish)人名;(英)伊什 { 颜色 :青色; } } }
千美元 .父级 > 千美元 .父级 { 颜色 :红色; } 千美元 .父级 千美元 .父级 { 颜色 :绿色; } 千美元 .父级 千美元 .父级 { 颜色 :蓝色; } 千美元 .父级 , 千美元 .带父母色彩 { 颜色 :青色; }
更改选择器顺序
.标题 { .菜单 { 边界半径 : 5像素 ; .no-订单半径 & { 背景-图像 :url( '图像/button-background.png' ); } } }
.标头 .菜单 { 边界半径 : 5像素 ; } .no-订单半径 .标头 .菜单 { 背景-图像 :url( '图像/button-background.png' ); }
组合爆炸
第页 , 一 , ul公司 , 锂 { 边界顶部 : 2像素 星罗棋布的 #366 ; & + & { 边界顶部 : 0 ; } }
第页 , 一 , ul公司 , 锂 { 边界顶部 : 2像素 星罗棋布的 #366 ; } 第页 + 第页 , 第页 + 一 , 第页 + ul公司 , 第页 + 锂 , 一 + 第页 , 一 + 一 , 一 + ul公司 , 一 + 锂 , ul公司 + 第页 , ul公司 + 一 , ul公司 + ul公司 , ul公司 + 锂 , 锂 + 第页 , 锂 + 一 , 锂 + ul公司 , 锂 + 锂 { 边界顶部 : 0 ; }
@导入At-Rules
从其他样式表导入样式
.foo文件 { 背景 : #900 ; } @导入 “this-is有效。less” ;
文件扩展名
如果文件具有 .css文件 扩展,它将被视为CSS和 @导入 语句左为-is(请参见 内联选项 以下)。 如果有 任何其他扩展 它将被视为Less并进口。 如果没有分机, 更少 将追加,并将其作为导入的Less文件包含。
@导入 “foo” ; //foo.less已导入
@导入 “foo.less” ; //foo.less已导入
@导入 “foo.php” ; //foo.php作为Less文件导入
@进口 “foo.css” ; //语句留在原处,as-is
导入选项
Less为CSS提供了几个扩展
@导入 CSS at-rule提供了更大的灵活性,可以处理外部文件。
参考 :使用Less文件但不输出 内联 :在输出中包含源文件,但不处理它 较少的 :将文件视为Less文件,无论文件扩展名是什么 css公司 :将文件视为CSS文件,无论文件扩展名是什么 一旦 :仅包含该文件一次(这是默认行为) 倍数 :多次包含文件 可选择的 :找不到文件时继续编译
每个关键字不止一个
@导入 如果允许,则必须使用逗号分隔关键字:
参考
参考示例
.navbar(导航栏) :扩展 ( .navbar(导航栏) 全部的 ) {}
内联
较少的
@导入 (减去) “foo.css” ;
css公司
@导入 (css) “foo.less” ;
@导入 “foo.less” ;
一旦
@导入 (一次) “foo.less” ; @导入 (一次) “foo.less” ; //此语句将被忽略
倍数
//文件:foo.less
.a个 { 颜色 :绿色; } //文件:main.less
@导入 (多个) “foo.less” ; @导入 (多个) “foo.less” ;
.a个 { 颜色 :绿色; } .a个 { 颜色 :绿色; }
可选择的
延伸
Extend是一个Less伪类,它将放置在其上的选择器与匹配其引用的选择器合并。
导航 ul公司 { & :扩展 ( .内联 ); 背景 :蓝色; }
导航 ul公司 { & :扩展 ( .内联 ); 背景 :蓝色; } .内联 { 颜色 :红色; }
导航 ul公司 { 背景 :蓝色; } .内联 , 导航 ul公司 { 颜色 :红色; }
扩展语法
.a个 :扩展 ( .b类 ) {} //上面的块与下面的块执行相同的操作
.a个 { & :扩展 ( .b类 ); }
.c类 :扩展 ( .d日 全部的 ) { //扩展“.d”的所有实例,例如“.x.d”或“.d.x” } .c类 :扩展 ( .d日 ) { //仅扩展选择器输出为“.d”的实例 }
.电子 :扩展 ( .f型 ) {} .电子 :扩展 ( .克 ) {} //上面和下面做同样的事情
.电子 :扩展 ( .f型 , .克 ) {}
延伸附加到选择器
在选择器之后延伸: pre:悬停:扩展(div pre) . 选择器和扩展之间允许有空格: pre:悬停:扩展(div pre) . 允许多个扩展: pre:hover:extend(div pre):扩展(.bucket-tr) -注意,这与 pre:悬停:扩展(div pre,.bucket tr) 这是不允许的: pre:hover:extend(div-pre).nth-child(奇数) 。Extend必须是最后一个。
.大直径 , .大银行 :扩展 ( .袋子 ), .大杯 :扩展 ( .铲斗 ) { //车身 }
扩展内部规则集
之前 :悬停 , .some-类 { & :扩展 ( 分区 之前 ); }
之前 :悬停 :扩展 ( 分区 之前 ), .some-类 :扩展 ( 分区 之前 ) {}
扩展嵌套选择器
.铲斗 { 信托收据 { //带有目标选择器的嵌套规则集
颜色 :蓝色; } } .some-类 :扩展 ( .铲斗 信托收据 ) {} //已识别嵌套规则集
.铲斗 信托收据 , .一些课程 { 颜色 :蓝色; }
.铲斗 { 信托收据 & { //带有目标选择器的嵌套规则集
颜色 :蓝色; } } .some-类 :扩展 ( 信托收据 .铲斗 ) {} //已识别嵌套规则集
信托收据 .铲斗 , .some-类 { 颜色 :蓝色; }
使用Extend精确匹配
.a个 .class类 , .class类 .a个 , .class类 > .a个 { 颜色 :蓝色; } .测试 :扩展 ( .class类 ) {} //这与上面的任何选择器都不匹配
* .class类 { 颜色 :蓝色; } .noStar(无星) :扩展 ( .class类 ) {} //这与*.class选择器不匹配
* .class类 { 颜色 :蓝色; }
链接 :悬停 :已访问 { 颜色 :蓝色; } .选择器 :扩展 ( 链接 :已访问 :悬停 ) {}
链接 :悬停 :已访问 { 颜色 :蓝色; }
第n个表达式
:第n个子级 ( 1 n个+ 三 ) { 颜色 :蓝色; } .child(儿童) :扩展 ( :第n个子级 (n)+ 三 )) {}
:第n个子级 ( 1 n个+ 三 ) { 颜色 :蓝色; }
[标题=标识符] { 颜色 :蓝色; } [title=“标识符”] { 颜色 :蓝色; } [标题=“标识符”] { 颜色 :蓝色; } .no报价 :扩展 ( [标题=标识符] ) {} .单引号 :扩展 ( [title=“标识符”] ) {} .双引号 :扩展 ( [标题=“标识符”] ) {}
[标题=标识符] , .no报价 , .单引号 , .双引号 { 颜色 :蓝色; } [title=“标识符”] , .no报价 , .单引号 , .双引号 { 颜色 :蓝色; } [标题=“标识符”] , .no报价 , .single报价 , .双引号 { 颜色 :蓝色; }
扩展“全部”
.a个 .b类 .测试 , .测试 .c类 { 颜色 :橙色; } .测试 { & :悬停 { 颜色 :绿色; } } .更换 :扩展 ( .测试 全部的 ) {}
.a个 .b类 .测试 , .测试 .c类 , .a个 .b类 .更换 , .更换 .c类 { 颜色 :橙色; } .测试 :悬停 , .更换 :悬停 { 颜色 :绿色; }
带延伸的选择器插值
Extend是 不 能够将选择器与变量匹配。 如果选择器包含变量,extend将忽略它。
@变量: .铲斗; @{变量} { //插值选择器
颜色 :蓝色; } .一些课程 :扩展 ( .铲斗 ) {} //什么都不做,找不到匹配项
.铲斗 { 颜色 :蓝色; } .some-类 :扩展 ( @{变量} ) {} //插值选择器不匹配任何内容
@变量: .铲斗;
.铲斗 { 颜色 :蓝色; }
.铲斗 { 颜色 :蓝色; } @{变量} :扩展 ( .铲斗 ) {} @变量: .选择器;
.铲斗 , .选择器 { 颜色 :蓝色; }
范围界定/内部扩展@媒体
@媒体 打印{ .screen类 :扩展 ( .选择器 ) {} //在介质内部扩展
.选择器 { //这将是匹配的-它在同一媒体中
颜色 :黑色; } } .选择器 { //样式表顶部的规则集-extend忽略它
颜色 :红色; } @媒体 屏幕{ .选择器 { //另一媒体内的规则集-extend忽略它
颜色 :蓝色; } }
@媒体 打印{ .选择器 , .screenClass(屏幕类) { /*扩展了同一媒体中的规则集*/
颜色 :黑色; } } .选择器 { /*忽略了样式表顶部的规则集*/
颜色 :红色; } @媒体 屏幕{ .选择器 { /*忽略了另一个媒体中的规则集*/
颜色 :蓝色; } }
@媒体 屏幕{ .screen类 :扩展 ( .选择器 ) {} //在介质内部扩展
@媒体 (最小宽度: 1023像素 ) { .选择器 { //嵌套媒体内的规则集-extend忽略它
颜色 :蓝色; } } }
@媒体 屏幕和(最小宽度: 1023像素 ) { .选择器 { /*忽略了另一个嵌套媒体中的规则集*/
颜色 :蓝色; } }
@媒体 屏幕{ .选择器 { /*嵌套媒体内部的规则集-顶级扩展有效*/
颜色 :蓝色; } @媒体 (最小宽度: 1023像素 ) { .选择器 { /*嵌套媒体内部的规则集-顶级扩展有效*/
颜色 :蓝色; } } } .top级别 :扩展 ( .选择器 ) {} /*顶级扩展匹配所有内容*/
@媒体 屏幕{ .选择器 , .top级别 { /*媒体内的规则集已扩展*/
颜色 :蓝色; } } @媒体 屏幕和(最小宽度: 1023像素 ) { .选择器 , .top级别 { /*嵌套媒体内的规则集已扩展*/
颜色 :蓝色; } }
重复检测
.alert-info(警报信息) , .widget(小部件) { /*声明*/ } .警报 :扩展 ( .alert-info(警报信息) , .widget(小部件) ) {}
.alert-info(警报信息) , .widget(小部件) , .警报 , .警报 { /*声明*/ }
扩展的用例
经典用例
.动物 { 背景色 :黑色; 颜色 :白色; }
< 一 班 = “动物熊” > 熊 </ 一 >
.动物 { 背景色 :黑色; 颜色 :白色; } .熊 { 背景色 :棕色; }
< 一 班 = “熊” > 熊 </ 一 >
.动物 { 背景色 :黑色; 颜色 :白色; } .熊 { & :扩展 ( .动物 ); 背景色 :棕色; }
减小CSS大小
.my-inline-block(.my-inline块) () { 显示 :内联块; 字体大小 : 0 ; } .事物1 { .my-inline-block(.my-inline块) ; } .事物2 { .my-inline-block(.my-inline块) ; }
.事物1 { 显示 :内联块; 字体大小 : 0 ; } .事物2 { 显示 :内联块; 字体大小 : 0 ; }
.my-inline-block(.my-inline块) { 显示 :内联块; 字体大小 : 0 ; } .事物1 { & :扩展 ( .我的内联块 ); } .事物2 { & :扩展 ( .my-inline-block(.my-inline块) ); }
.my-inline-block(.my-inline块) , .事物1 , .事物2 { 显示 :内联块; 字体大小 : 0 ; }
组合样式/A更高级的混音
锂 .list(列表) > 一 { //列表样式 } 按钮 .list样式 { & :扩展 ( 锂 .list(列表) > 一 ); //使用相同的列表样式 }
合并属性
合并属性
逗号
用逗号附加属性值
.混合蛋白 () { 盒子阴影 +:插图 0 0 10像素 #555 ; } .my类 { .混合蛋白 (); 盒子阴影 +: 0 0 20像素 黑色; }
.my类 { 盒子阴影 :插入 0 0 10像素 #555 , 0 0 20像素 黑色; }
空间
用空格附加属性值
.混合蛋白 () { 转型 +_: 规模 ( 2 ); } .my类 { .混合蛋白 (); 转型 +_: 旋转 ( 15度 ); }
.my类 { 转型 : 规模 ( 2 ) 旋转 ( 15度 ); }
混合物
现有样式的“混合”属性
.a个 , #b条 { 颜色 :红色; } .mixin类 { .a个 (); } .mixin-id文件 { #b条 (); }
.a个 , #b条 { 颜色 :红色; } .mixin类 { 颜色 :红色; } .mixin-id文件 { 颜色 :红色; }
.a个 (); .a个 ; //目前有效,但已弃用; 不使用
.a个 (); //括号前的空格也已弃用
带括号的混音
.my-mixin(我的名字) { 颜色 :黑色; } .my-other-mixin(我的另一半) () { 背景 :白色; } .class类 { .my-mixin(我的名字) (); .my-other-mixin(我的另一半) (); }
.my-mixin(我的名字) { 颜色 :黑色; } .class类 { 颜色 :黑色; 背景 :白色; }
混音器中的选择器
.my-hover-mixin () { & :悬停 { 边境 : 1像素 固体红; } } 按钮 { .my-hover-mixin (); }
按钮 :悬停 { 边境 : 1像素 固体红; }
命名空间
#外部 () { .内部 { 颜色 :红色; } } .c类 { #外部 .内部 (); }
#外部 > .内部 (); //已弃用
#外部 .内部 (); //已弃用
#外部 .内部 (); //首选
#my-library公司 { .my-mixin(我的名字) () { 颜色 :黑色; } } //可以这样使用
.class类 { #my-library公司 .my-mixin(我的名字) (); }
受保护的命名空间
#命名空间 什么时候 ( @模式 =巨大){ .混合蛋白 () { /* */ } } #命名空间 { .混合蛋白 () 什么时候 ( @模式 =巨大){ /* */ } }
#sp_1型 什么时候 ( 违约 ()) { #sp_2类 什么时候 ( 违约 ()) { .混合蛋白 () 什么时候 不 ( 违约 ()) { /* */ } } }
这个 ! 重要的
关键字
.foo文件 ( @背景 : #f5f5f5型 , @颜色 : #900 ) { 背景 : @背景 ; 颜色 : @颜色 ; } .不重要 { .foo文件 (); } .重要 { .foo文件 () ! 重要; }
.不重要 { 背景 : #f5f5f5型 ; 颜色 : #900 ; } .重要 { 背景 : #f5f5f5型 ! 重要; 颜色 : #900 ! 重要; }
参数化混合
如何将参数传递给mixin
.边界半径 ( @半径 ) { -网络工具包-订单-半径 : @半径 ; -莫氏边界半径 : @半径 ; 边界半径 : @半径 ; }
#收割台 { .边界半径 ( 4像素 ); } .按钮 { .边界半径 ( 6像素 ); }
.边界半径 ( @半径 : 5像素 ) { -网络工具包-订单-半径 : @半径 ; -莫氏边界半径 : @半径 ; 边界半径 : @半径 ; }
#收割台 { .边界半径 (); }
.wrap(包裹) () { 文本换行 :包裹; 空白 :-moz-预包装; 空白 :预包装; 文字包装 :断字; } 之前 { .wrap(包裹) () }
之前 { 文本换行 :包裹; 空白 :-moz-预包装; 空白 :预包装; 文字包装 :断字; }
参数分隔符
两个参数,每个参数包含逗号分隔的列表: .name(1、2、3;something,else) 三个参数,每个参数包含一个数字: .名称(1,2,3) 使用伪分号创建一个mixin调用,其中一个参数包含逗号分隔的css列表: .名称(1,2,3;) . 注意:如果后面的分号看起来很奇怪,您可能会选择: .name(~(1,2,3)) 编写以逗号分隔的默认值的方法: @参数值:红色、蓝色。 名称(@param1:@param-values) . .name(@param1:红色,蓝色;) .name(@param1:~(红色,蓝色))
混合料过载
.混合蛋白 ( @颜色 ) { 颜色-1 : @颜色 ; } .混合蛋白 ( @颜色 , @填充 : 2 ) { 颜色-2 : @颜色 ; 衬垫-2 : @填充 ; } .混合蛋白 ( @颜色 , @填充 , @保证金 : 2 ) { 颜色-3 : @颜色 ; 填充-3 : @填充 ; 边缘 : @保证金 @保证金 @保证金 @保证金 ; } .一些 .选择器 分区 { .混合蛋白 ( #008000 ); }
.一些 .选择器 分区 { 颜色-1 : #008000 ; 颜色-2 : #008000 ; 填充-2 : 2 ; }
命名的参数
.混合蛋白 ( @颜色 :黑色; @保证金 : 10像素 ; @填充 : 20像素 ) { 颜色 : @颜色 ; 边缘 : @保证金 ; 衬垫 : @填充 ; } .类别1 { .混合蛋白 ( @保证金 : 20像素 ; @颜色 : #33acfe型 ); } .第2类 { .混合蛋白 ( #efca44型 ; @填充 : 40像素 ); }
.类别1 { 颜色 : #33acfe型 ; 边缘 : 20像素 ; 衬垫 : 20像素 ; } .第2类 { 颜色 : #efca44型 ; 边缘 : 10像素 ; 衬垫 : 40像素 ; }
这个 @参数
变量
.box阴影 ( @x个 : 0 , @年 : 0 , @模糊 : 1像素 , @颜色 : #000 ) { -webkit-box阴影 : @参数 ; -moz-box-阴影 : @参数 ; 盒子阴影 : @参数 ; } .大块 { .box阴影 ( 2像素 , 5像素 ); }
.大块 { -webkit-box阴影 : 2像素 5像素 1像素 #000 ; -moz-box-阴影 : 2像素 5像素 1像素 #000 ; 盒子阴影 : 2像素 5像素 1像素 #000 ; }
高级参数和 @休息
变量
.混合蛋白 (...) { //匹配0-N个参数
.混合蛋白 () { //正好匹配0个参数
.混合蛋白 ( @一个 : 1 ) { //匹配0-1个参数
.混合蛋白 ( @一个 : 1 , ...) { //匹配0-N个参数
.混合蛋白 ( @一个 , ...) { //匹配1-N个参数
.混合蛋白 ( @一个 , @休息 ...) { //@rest绑定到@a之后的参数
//@arguments已绑定到所有参数 }
图案匹配
.混合蛋白 ( @秒 , @颜色 ) { ... } .class类 { .混合蛋白 ( @交换机 , #888 ); }
.混合蛋白 (深色, @颜色 ) { 颜色 : 使变暗 ( @颜色 , 10% ); } .混合蛋白 (光线, @颜色 ) { 颜色 : 减轻 ( @颜色 , 10% ); } .混合蛋白 ( @_ , @颜色 ) { 显示 :块; }
@开关: 光照; .class类 { .混合蛋白 ( @交换机 , #888 ); }
.class类 { 颜色 : #a2a2a2型 ; 显示 :块; }
第一个mixin定义不匹配,因为它需要 黑暗的 作为第一个参数。 第二个mixin定义匹配,因为它需要 光 . 第三个mixin定义匹配,因为它需要任何值。
.混合蛋白 ( @一个 ) { 颜色 : @一个 ; } .混合蛋白 ( @一个 , @b条 ) { 颜色 : 褪色 ( @一个 , @b条 ); }
将Mixin用作函数
从mixin调用中选择属性和变量
属性/值访问器
平均值 ( @x个 , @年 ) { @结果: (( @x个 + @年 ) / 2 ); } 分区 { //调用mixin并查找其“@result”值
衬垫 : . 平均的 ( 16像素 , 50像素 )[ @结果 ]; }
分区 { 衬垫 : 33像素 ; }
覆盖mixin值
//无图书馆
#图书馆 () { .混合蛋白 () { 支柱 :foo; } } //自定义.less
@导入 “库” ; #图书馆 () { .混合蛋白 () { 支柱 :巴; } } .box文件 { my值 :#library.mixin[prop]; }
.box文件 { my值 :巴; }
未命名查找
平均值 ( @x个 , @年 ) { @结果: (( @x个 + @年 ) / 2 ); } 分区 { //调用mixin并查找其最终值
衬垫 : . 平均的 ( 16像素 , 50像素 )[]; }
分区 { 衬垫 : 33像素 ; }
@医生: { 价值 :foo; } .box文件{ my值 : @医生 []; }
.box文件 { my值 :foo; }
将mixin和变量解锁到调用程序范围
.混合蛋白 () { @宽度: 100% ; @高度: 200像素 ; } .调用方 { .混合蛋白 (); 宽度 : @宽度 ; 高度 : @高度 ; }
.调用方 { 宽度 : 100% ; 高度 : 200像素 ; }
.混合蛋白 () { @大小: in-mixin; @仅在混合中定义: in-mixin; } .class类 { 边缘 : @尺寸 @仅在混合中定义 ; .混合蛋白 (); } @大小: 全局定义值; //调用方父作用域-无保护
.class类 { 边缘 :in-mixin-in-mijin; }
.解锁 ( @价值 ) { //外混合蛋白
.do有事 () { //嵌套mixin
宣言 : @价值 ; } } #命名空间 { .解锁 ( 5 ); //解锁doSomething mixin
.do有事 (); //嵌套的mixin已复制到此处,并且可用 }
#命名空间 { 宣言 : 5 ; }
递归混合
创建循环
.循环 ( @计数器 ) 什么时候 ( @计数器 > 0 ) { .循环 (( @计数器 - 1 )); //下一次迭代
宽度 : ( 10像素 * @计数器 ); //每个迭代的代码 } 分区 { .循环 ( 5 ); //启动循环 }
分区 { 宽度 : 10像素 ; 宽度 : 20像素 ; 宽度 : 30像素 ; 宽度 : 40像素 ; 宽度 : 50像素 ; }
.生成列 ( 4 ); .生成列 ( @n个 , @我 : 1 ) 什么时候 ( @我 =< @n个 ) { .column-@{i} { 宽度 : ( @我 * 100% / @n个 ); } .生成列 ( @n个 , ( @我 + 1 )); }
.第1列 { 宽度 : 25% ; } .第2列 { 宽度 : 50% ; } .第3列 { 宽度 : 75% ; } .第4列 { 宽度 : 100% ; }
混合料防护装置
.混合蛋白 ( @一个 ) 什么时候 ( 轻盈 ( @一个 ) >= 50% ) { 背景色 :黑色; } .混合蛋白 ( @一个 ) 什么时候 ( 轻盈 ( @一个 ) < 50% ) { 背景色 :白色; } .混合蛋白 ( @一个 ) { 颜色 : @一个 ; }
.类别1 { .混合蛋白 ( #ddd(ddd) ) } .第2类 { .混合蛋白 ( #555 ) }
.类别1 { 背景色 :黑色; 颜色 : #ddd(ddd) ; } .第2类 { 背景色 :白色; 颜色 : #555 ; }
保护比较运算符
.真相 ( @一个 ) 什么时候 ( @一个 ) { ... } .真相 ( @一个 ) 什么时候 ( @一个 =真){…}
.class类 { .真相 ( 40 ); //与上述任何定义都不匹配。 }
@媒体 :移动; .混合蛋白 ( @一个 ) 什么时候 ( @媒体 =移动){…} .混合蛋白 ( @一个 ) 什么时候 ( @媒体 =桌面){…} 最大值 ( @一个 ; @b条 ) 什么时候 ( @一个 > @b条 ) { 宽度 : @一个 } 最大值 ( @一个 ; @b条 ) 什么时候 ( @一个 < @b ) { 宽度 : @b条 }
保护逻辑运算符
.混合蛋白 ( @一个 ) 什么时候 ( isnumber号 ( @一个 )) 和 ( @一个 > 0 ) { ... }
.混合蛋白 ( @一个 ) 什么时候 ( @一个 > 10 ), ( @一个 < - 10 ) { ... }
.混合蛋白 ( @b条 ) 什么时候 不 ( @b条 > 0 ) { ... }
类型检查功能
.混合蛋白 ( @一个 ; @b条 : 0 ) 什么时候 ( 是数字 ( @b条 )) { ... } .混合蛋白 ( @一个 ; @b条 :黑色) 什么时候 ( 呈黄色 ( @b条 )) { ... }
呈黄色 isnumber号 发出字符串 iskeyword isurl公司
ispixel(像素) 百分比 国际标准化组织 is单位
混叠混合物
将mixin调用分配给变量
#主题 .深色 .navbar(导航栏) { .颜色 (轻){ 初级的 :紫色; } .颜色 (深色){ 初级的 :黑色; 第二的 :灰色; } } .navbar(导航栏) { @颜色: #主题.dark.navbar。 颜色 (深色); 背景 : @颜色 [主要]; 边境 : 1像素 固体 @颜色 【次要】; }
.navbar(导航栏) { 背景 :黑色; 边境 : 1像素 纯灰色; }
变量调用
#图书馆 () { .颜色 () { 背景 :绿色; } } .box文件 { @别名: #库。 颜色 (); @别名 (); }
.box文件 { 背景 :绿色; }
#图书馆 () { .颜色 () { 背景 :绿色; } } .box文件 { @别名: #图书馆颜色; @别名 (); //错误:无法计算变量调用@alias }
.box文件 { @别名: #图书馆颜色; @{别名} { 一 :b; } }
.box文件 #图书馆 .颜色 { 一 :b; }
分离的规则集
将规则集分配给变量
//声明分离的规则集
@分离的规则集: { 背景 :红色;}; //在3.5.0中,分号是可选的+
//使用分离的规则集
.顶部 { @分离的规则集 (); }
.顶部 { 背景 :红色; }
.desktop和old-ie ( @规则 ) { @媒体 屏幕和(最小宽度: 1200像素 ) { @规则 (); } html格式 .lt-ie9型 & { @规则 (); } } 收割台 { 背景色 :蓝色; .desktop和old-ie ({ 背景色 :红色; }); }
收割台 { 背景色 :蓝色; } @媒体 屏幕和(最小宽度: 1200像素 ) { 收割台 { 背景色 :红色; } } html格式 .lt-ie9 收割台 { 背景色 :红色; }
@我的规则集: { .my选择器 { 背景色 :黑色; } };
@我的规则集: { .my选择器 { @媒体 电视{ 背景色 :黑色; } } }; @媒体 (方向:纵向){ @我的规则集 (); }
@媒体 (方向:纵向)和电视{ .my选择器 { 背景色 :黑色; } }
//使用mixin分离的规则集
@分离的规则集: { .混合蛋白 () { 颜色 :蓝色; } }; //调用分离的规则集
.调用方 { @分离的规则集 (); .混合蛋白 (); }
.调用方 { 颜色 :蓝色; }
@分离的规则集: { @颜色: 蓝色; //这个变量是私有的 }; .调用方 { 颜色 : @颜色 ; //语法错误 }
范围界定
定义和调用方范围可见性
@分离的规则集: { 调用者变量 : @调用者变量 ; //此处未定义变量
调用者-混合 (); //这里未定义mixin }; 选择器 { //使用分离的规则集
@分离的规则集 (); //定义分离规则集中所需的变量和mixin
@调用者变量: 价值; 调用者-混合 () { 变量 :声明; } }
选择器 { 调用者变量 :值; 变量 :声明; }
@变量: 全球的; @分离的规则集: { //将使用全局变量,因为它是可访问的
//从detached-ruleset定义
变量 : @变量 ; }; 选择器 { @分离的规则集 (); @变量: 价值; //调用程序中定义的变量-将被忽略 }
选择器 { 变量 :全局; }
引用 不会 修改分离的规则集范围
@分离-1: { 作用域分离 : @一个 @两个 ; }; .一个 { @一个: 可见; 二 { @分离-2: @分离-1 ; //复制/重命名规则集
@两个: 可见; //规则集无法看到此变量 } } .使用位置 { .一个 > .2个 (); @分离-2 (); }
错误1:32未声明变量“@one”。
解锁 威尔 修改分离的规则集范围
#空间 { .导入程序-1 () { @分离: { 作用域分离 : @变量 ; }; //定义分离的规则集 } } 导入程序-2 () { @变量: 价值; //未锁定的分离规则集可以看到此变量
#空间 > .导入程序-1 (); //解锁/导入分离的规则集 } .使用地点 { 导入程序-2 (); //第二次解锁/导入分离的规则集
@分离的,分离的 (); }
.使用位置 { 作用域分离 :值; }
属性/变量访问器
(查找值)
@配置: { 选项1 :true; 选项2 :假; } . 混合蛋白 ()何时( @配置 [option1]=真){ 挑选出来的 :值; } .box文件{ .混合蛋白 (); }
.box文件 { 挑选出来的 :值; }
@配置: { @颜色: { 初级的 :蓝色; } } .box文件{ 颜色 : @配置 [ @颜色 ][主要]; }
查找中的变量
@配置: { @深色: { 初级的 :深蓝色; } @灯光 : { 初级的 :浅蓝色; } } .box文件{ @查找: 黑暗; 颜色 : @配置 [ @@查找 ]【初级】; }
.box文件 { 颜色 :深蓝色; }
地图
使用规则集和混合作为值的映射
@尺寸: { 可移动的 : 320像素 ; 平板电脑 : 768像素 ; 桌面 : 1024像素 ; } .导航栏{ 显示 :块; @媒体 (最小宽度: @尺寸 [平板电脑]){ 显示 :内联块; } }
.navbar(导航栏) { 显示 :块; } @媒体 (最小宽度: 768像素 ) { .navbar(导航栏) { 显示 :内联块; } }
#图书馆 () { .颜色 () { 初级的 :绿色; 第二的 :蓝色; } } #图书馆 () { .颜色 () { 初级的 :灰色;} } .按钮 { 颜色 :#library.colors[primary]; 边界颜色 :#library.colors[secondary]; }
.按钮 { 颜色 :灰色; 边界颜色 :蓝色; }
.按钮 { @颜色: #库。 颜色 (); 颜色 : @颜色 【初级】; 边界颜色 : @颜色 [次要]; }
@配置: { @选项: { 上图书馆 :正确 } } &何时( @配置 [ @选项 ][library-on]=真){ .生产-规则集 { 支柱 :val; } }
在查找中使用变量
.食物 () { @甜点: 冰淇淋; } @键到查找: 甜点; .午餐 { 对待 :.食物[ @@键到查找 ]; }
.午餐 { 对待 :冰淇淋; }
范围
Less的一些额外范围界定功能
混音范围功能
#纳秒 { @答: 一个; .混合蛋白-1 () { 支柱 : @一个 ; } } .规则 { #纳秒 .混合蛋白-1 (); } /*输出: .规则{ 道具:一个; } */
弃用的mixin范围功能
#1.(弃用)混音可以访问调用者范围。
#纳秒 { .混合蛋白-1 () { 支柱 : @一个 ; } } .规则 { @答: 一个; #纳秒 .混合蛋白-1 (); } /*输出: .规则{ 道具:一个; } */
这在大多数其他语言中并不常见。 在查看mixin将产生什么输出的定义时,这一点并不明显。
#纳秒 { .混合蛋白-1 ( @一个 ) { 支柱 : @一个 ; } } .规则 { #纳秒 .混合蛋白-1 ( @一个 :一); }
#2.(弃用)调用者范围可以访问mixin中的变量
#纳秒 { .混合蛋白-1 () { @答: 一个; @b: 二; } } .规则 { @b: 三个; #纳秒 .混合蛋白-1 (); 螺旋桨-1 : @一个 ; 项目-2 : @b条 ; } /*输出: .规则{ prop-1:一个; prop-2:三个; } */
调用方作用域中较高的变量可以被重写。 这也不是一种典型的语言行为。 它不同于分离规则集的行为。
#纳秒 { .混合蛋白-1 () { @答: 一个; @b: 二; } } .规则 { @返回: #纳秒。 混合蛋白-1 (); 螺旋桨-1 : @收益 [ @一个 ]; 项目-2 : @收益 [ @b ]; } /*输出: .规则{ prop-1:一个; prop-2:两个; } */
#3.(弃用)调用方作用域可以从mixin访问mixin
#纳秒 { .混合蛋白-1 () { 螺旋桨-1 :一个; 项目-2 :两个; } } .规则 { #纳秒 (); .混合蛋白-1 (); .混合蛋白-1 () { 螺旋桨-3 :三个; } } /*输出: .规则{ prop-1:一; prop-2:两个; prop-3:三个; } */
#纳秒 { .混合蛋白-1 () { 螺旋桨-1 :一个; 项目-2 :两个; } } .规则 { .混合蛋白-1 () { 螺旋桨-3 :三个; } #纳秒 .混合蛋白-1 (); .混合蛋白-1 (); } /*输出: .规则{ prop-1:一个; prop-2:两个; 丙-3:三; } */
提示和技巧
& { //变量
@高度: 100像素 ; @宽度: 20像素 ; //不要在此范围上定义任何prop:value(因为这样做会生成(错误)输出)。
.测试 { 高度 : @高度 ; 宽度 : @宽度 ; } } .休息 { 高度 : @高度 ; //名称错误:变量@height未定义 }
.some-模块 { @高度: 200像素 ; @宽度: 200像素 ; 水平对齐 :左; 线路高度 : @高度 ; //200像素
& { //覆盖原始值
@高度: 100像素 ; @宽度: 自动; .some-模块_element { 高度 : @高度 ; //100像素
宽度 : @宽度 ; //200像素 } .some-模块_element .text格式 { 线路高度 : ( @高度 / 2 ); //50像素 } } & { //覆盖原始值
@高度: 50像素 ; .some-模块_另一个元素 { 高度 : @高度 ; //50像素
宽度 : @宽度 ; //200像素 } .some-模块_其他元素 .text格式 { 线路高度 : ( @高度 / 2 ); //25像素 } } }
CSS防护装置
“if”在选择器周围
.my可选样式 () 什么时候 ( @my-option(我的选项) =真){ 按钮 { 颜色 :白色; } } .my可选样式 ();
按钮 什么时候 ( @my-option(我的选项) =真){ 颜色 :白色; }
& 什么时候 ( @my-option(我的选项) =真){ 按钮 { 颜色 :白色; } 一 { 颜色 :蓝色; } }
@医生: 如果 ( @my-option(我的选项) =真{ 按钮 { 颜色 :白色; } 一个{ 颜色 :蓝色; } }); @医生 ();
@插件At-Rules
导入JavaScript插件以添加Less.js函数和功能
编写第一个插件
@插件 “我的plugin” ; //如果没有扩展名,则自动附加.js
寄存器插件({ 安装 : 功能 ( less、pluginManager、函数 ) { 函数.add( “圆周率” , 功能 ( ) { 返回 数学 .PI; }); } })
模块 .exports={ 安装 : 功能 ( less、pluginManager、函数 ) { 函数.add( “圆周率” , 功能 ( ) { 返回 数学 .PI; }); } };
//我的plugin.js
安装 : 功能 ( less、pluginManager、函数 ) { 函数.add( “圆周率” , 功能 ( ) { 返回 数学 .PI; }); } //等
@插件 “我的plugin” ; .给我看圆周率 { 价值 : 圆周率 (); }
.show-me-pi显示 { 价值 : 3.141592653589793 ; }
函数.add( “圆周率” , 功能 ( ) { 返回 新的 树。 尺寸( 数学 π); });
@插件 “我的plugin” ; .show-me-pi显示 { 价值 : 圆周率 () * 2 ; }
插件范围
//lib1.js文件
// ... 函数.add( “foo” , 功能 ( ) { 返回 “foo” ; }); // ...
//lib2.js文件
// ... 函数.add( “foo” , 功能 ( ) { 返回 “酒吧” ; }); // ...
.el-1型 { @插件 “lib1” ; 价值 : foo公司 (); } .el-2型 { @插件 “lib2” ; 价值 : foo公司 (); }
.el-1型 { 价值 :foo; } .el-2型 { 价值 :巴; }
.el型 { @插件 “lib1” ; } @值: foo公司 ();
.块 { 颜色 :蓝色; 我的功能规则 (); }
Null函数
无功功率,无功功率 集合=[]; 函数.add( “存储” , 功能 ( val值 ) { collection.push(val); //我把这个存起来以后用
返回 假 ; });
@插件 “集合” ; @var(变量): 32 ; 商店 ( @无功功率,无功功率 );
函数.add( '检索' , 功能 ( val值 ) { 返回 新的 树。 价值(集合); });
.get-my-values { @插件 “集合” ; 值 : 检索 (); }
Less.js插件对象
{ /*在插件之后立即调用 *第一次导入,仅一次*/
安装 : 功能 ( less、pluginManager、函数 ) { }, /*为@plugin的每个实例调用*/
使用 : 功能 ( 上下文 ) { }, /*为@plugin的每个实例调用, *评估规则时。 *只是在评估生命周期的后期*/
评估 : 功能 ( 上下文 ) { }, /*将任意字符串传递给插件 *例如@plugin(args)“file”; *不会为您分析此字符串, *所以它可以包含(几乎)任何东西*/
设置选项 : 功能 ( 参数字符串 ) { }, /*设置最小Less兼容字符串 *您还可以使用数组,如[3,0]中所示*/
最小版本 : [ '3.0' ], /*仅用于lessc,用于解释 *终端中的选项*/
打印使用 : 功能 ( ) { }, }
后处理器: https://github.com/less/less-plugin-clean-css 访问者: https://github.com/less/less-plugin-inline-urls 文件管理器: https://github.com/less/less-plugin-npm-import