一直以来用的都是scss
,最近开发Ant Design Pro需要使用less
,记录学习笔记
变量
声明
在Less
里用@
开头声明变量
@width: 10px;
@height: @width + 10px;
#header {
width: @width;
height: @height;
}
输出
#header {
width: 10px;
height: 20px;
}
变量插值 Variable Interpolation
// Variables
@my-selector: banner;
@property: color;
// Usage
.@{my-selector} {
@{property}: #0ee;
background-@{property}: #999;
}
输出
.banner {
color: #0ee;
background-color: #999;
}
将属性作为变量
也就是说可以使用$prop
的形式,来引用
.widget {
color: #efefef;
background-color: $color;
}
输出
.widget {
color: #efefef;
background-color: #efefef;
}
默认变量
// library
@base-color: green;
@dark-color: darken(@base-color, 10%);
// use of library
@import "library.less";
@base-color: red;
根据Less
的 Lazy Loading,我们声明的变量可以覆盖之前的,并且library
中的@dark-color
变成了深红色,因为@base-color
已经是红色的了
父级选择器
常规用法
a {
color: blue;
&:hover {
color: green;
}
}
输出
a {
color: blue;
}
a:hover {
color: green;
}
类名组合
.button {
&-ok {
background-image: url("ok.png");
}
}
输出
.button-ok {
background-image: url("ok.png");
}
多次使用&
.link {
& + & {
color: red;
}
& & {
color: green;
}
&& {
color: blue;
}
&, &ish {
color: cyan;
}
}
输出
.link + .link {
color: red;
}
.link .link {
color: green;
}
.link.link {
color: blue;
}
.link, .linkish {
color: cyan;
}
更改选择器顺序
.header {
.menu {
border-radius: 5px;
.no-borderradius & {
background-image: url('images/button-background.png');
}
}
}
输出
.header .menu {
border-radius: 5px;
}
.no-borderradius .header .menu {
background-image: url('images/button-background.png');
}
继承 Extend
Extend
是Less
中的一个伪类
nav ul {
&:extend(.inline);
background: blue;
}
.inline {
color: red;
}
// 这种方式也是相同的效果
nav ul:extend(.inline) {
background: blue;
}
输出
nav ul {
background: blue;
}
.inline,
nav ul {
color: red;
}
也就是让当前的nav ul
也有了.inline
的color:red
属性
可以使用逗号来继承多个类
.e:extend(.f, .g) {}
all关键字
不带all
关键字的继承
.a{
color:red;
.b{
font-size:24px;
}
}
.d{
&:extend(.b);
}
输出
.a {
color: red;
}
.a .b {
font-size: 24px;
}
可以看到结果最后是没有继承.b
的,如果添加了all
关键字,就会带上选择器层级一起继承
.a{
color:red;
.b{
font-size:24px;
}
}
.d{
&:extend(.b all); // all 关键字
}
输出
.a {
color: red;
}
.a .b,
.a .d {
font-size: 24px;
}
合并 Merge
合并可以将多个属性值合并在一起
在属性名后加上+
,属性值会以逗号分隔合并
.mixin() {
box-shadow+: inset 0 0 10px #555;
}
.myclass {
.mixin();
box-shadow+: 0 0 20px black;
}
输出
.myclass {
box-shadow: inset 0 0 10px #555, 0 0 20px black;
}
在属性名后加上+_
,属性值会以空格合并
.mixin() {
transform+_: scale(2);
}
.myclass {
.mixin();
transform+_: rotate(15deg);
}
输出
.myclass {
transform: scale(2) rotate(15deg);
}
混入 Mixins
从已经存在的styles
中混入
如果不希望创建的mixin
转译为CSS
,可以在名字后面加上空格
.my-mixin {
color: black;
}
.my-other-mixin() {
background: white;
}
.class {
.my-mixin();
.my-other-mixin();
}
输出
.my-mixin {
color: black;
}
.class {
color: black;
background: white;
}
Mixins
不仅可以包含属性,还可以包含选择器
.my-hover-mixin() {
&:hover {
border: 1px solid red;
}
}
button {
.my-hover-mixin();
}
输出
button:hover {
border: 1px solid red;
}
可以从多层级的选择器中只继承一个
#my-library {
background:red;
.my-mixin {
color: black;
}
}
.class {
// 只想继承color
#my-library.my-mixin();
}
输出
#my-library {
background: red;
}
#my-library .my-mixin {
color: black;
}
.class {
color: black;
}
带参数的Mixins
这里就稍微复杂一点
.mixin(@color) {
color-1: @color;
}
// 带默认参数
.mixin(@color; @padding: 2) {
color-2: @color;
padding-2: @padding;
}
.mixin(@color; @padding; @margin: 2) {
color-3: @color;
padding-3: @padding;
margin: @margin @margin @margin @margin;
}
.some .selector div {
.mixin(#008000);
}
具有相同名字的mixin
是合法的,同时匹配所有符合条件的mixin
所以输出为
.some .selector div {
color-1: #008000;
color-2: #008000;
padding-2: 2;
}
只传入了一个参数,匹配1个参数的mixin
和1个参数1个含默认值的参数的mixin
命名参数
.mixin(@color: black; @margin: 10px; @padding: 20px) {
color: @color;
margin: @margin;
padding: @padding;
}
.class1 {
.mixin(@margin: 20px; @color: #33acfe);
}
.class2 {
.mixin(#efca44; @padding: 40px);
}
传参时可以对参数命名代表要传入的参数
输出
.class1 {
color: #33acfe;
margin: 20px;
padding: 20px;
}
.class2 {
color: #efca44;
margin: 10px;
padding: 40px;
}
@arguments变量
@arguments
变量表示了传入的所有参数
.box-shadow(@x: 0; @y: 0; @blur: 1px; @color: #000) {
box-shadow: @arguments;
}
.big-block {
.box-shadow(2px; 5px);
}
输出
.big-block {
box-shadow: 2px 5px 1px #000;
}
将Mixins当作函数使用
可以从mixin
的调用中获取属性和值
.average(@x, @y) {
@result: ((@x + @y) / 2);
}
#library() {
.mixin() {
prop: foo;
}
}
div {
// 调用.average并从中获取@result的值
padding: .average(16px, 50px)[@result];
my-value: #library.mixin[prop];
}
输出
div {
padding: 33px;
my-value: foo;
}
如果[]
内不写值,则会取最后一个属性的值
.average(@x, @y) {
@result: ((@x + @y) / 2);
@result1: ((@x + @y) / 10);
}
div {
// call a mixin and look up its final value
padding: .average(16px, 50px)[];
}
输出
div {
padding: 6.6px;
}
递归/循环 Mixins
递归
.loop(@counter) when (@counter > 0) {
.loop((@counter - 1)); // 下一次迭代
width: (10px * @counter); // 每次迭代的代码
}
div {
.loop(5); // 递归5次
}
输出
div {
width: 10px;
width: 20px;
width: 30px;
width: 40px;
width: 50px;
}
属性/变量 访问符
@config: {
@colors: {
primary: blue;
}
}
.box {
color: @config[@colors][primary];
}
输出
.box {
color: blue;
}
u1s1,快看吐了
为什么写一个CSS都已经复杂到了可以写递归的地步呢?
平时用预处理器,也就是嵌个套,用一下Mixins
的功能,学了这么多功能也不一定用得上,难道以后除了看JS
源码,连CSS
的源码也要看了😂