做爲CSS的擴展,Less不只向後兼容CSS,並且它使用現有的CSS語法添加額外特性。這使得學習變得容易,若是有疑惑,您能夠回到普通的CSScss
控制在多個地方使用同一個值
// 變量 @link-color: #428bca; // 海藍 @link-color-hover: darken(@link-color, 10%); // Usage a, .link { color: @link-color; } a:hover { color: @link-color-hover; } .widget { color: #fff; background: @link-color; }
=>html
a, .link { color: #428bca; } a:hover { color: #3071a9; } .widget { color: #fff; background: #428bca; }
注意,變量其實是「常量」,由於它們只能定義一次less
// Variables @my-selector: banner; @images: "../img"; @themes: "../../src/themes"; @fnord: "I am fnord."; @var: "fnord"; @import "@{themes}/tidal-wave.less"; .@{my-selector} { font-weight: bold; line-height: 40px; margin: 0 auto; } body { color: #444; background: url("@{images}/white-sand.png"); } img::after { content: @@var; }
=>函數
@import "../../src/themes/tidal-wave.less"; .banner { font-weight: bold; line-height: 40px; margin: 0 auto; } body { color: #444; background: url("../img/white-sand.png"); } img::after { content: "I am fnord."; }
extend屬於 less 的僞類, 它擴展匹配傳入的選擇器的樣式, 區別於混合 mixin
nav ul { &:extend(.inline); background: blue; } .inline { color: red; }
=>學習
nav ul { background: blue; } .inline, nav ul { color: red; }
.a:extend(.b) {} // 等同於 .a { &:extend(.b); }
.c:extend(.d all) { // 擴展包括 .d 的全部實例, eg. .d x 和 x .d } .c:extend(.d) { // 僅擴展 .d }
// 擴展多個 .e:extend(.f) {} .e:extend(.g) {} // 等同於 .e:extend(.f, .g) {}
Extend沒法將選擇器與變量匹配。若是selector包含變量,則extend將忽略它url
@variable: .bucket; @{variable} { color: blue; } .some-class:extend(.bucket) {} // 匹配失敗
沒有重複檢測spa
.alert-info, .widget { } .alert:extend(.alert-info, .widget) { }
=>code
.alert-info, .widget, .alert, .alert { }
// 一個動物樣式 .animal { background-color: black; color: white; }
但願擁有一個覆蓋背景顏色的動物子類型htm
一種方法更改HTML繼承
<a class="animal bear">Bear</a>
.animal { background-color: black; color: white; } .bear { background-color: brown; }
一種方法經過擴展簡化html<a class="bear">Bear</a>
.animal { background-color: black; color: white; } .bear { &:extend(.animal); background-color: brown; }
=>
.animal, .bear { background-color: black; color: white; } .bear { background-color: brown; }
Mixins將全部屬性複製到選擇器中,這可能致使沒必要要的重複。
所以,可使用extends將選擇器移動到但願使用的屬性,從而減小生成的css
// mixin 示例 .my-inline-block() { display: inline-block; font-size: 0; } .thing1 { .my-inline-block; } .thing2 { .my-inline-block; }
=>
.thing1 { display: inline-block; font-size: 0; } .thing2 { display: inline-block; font-size: 0; }
// extend 示例 .my-inline-block { display: inline-block; font-size: 0; } .thing1 { &:extend(.my-inline-block); } .thing2 { &:extend(.my-inline-block); }
=>
.my-inline-block, .thing1, .thing2 { display: inline-block; font-size: 0; }
.a, #b { color: red; } .mixin-class { .a(); } .mixin-id { #b(); // 括號無關緊要 }
=>
.a, #b { color: red; } .mixin-class { color: red; } .mixin-id { color: red; }
.my-mixin { color: black; } // 在它後面添加括號就不會輸出 .my-other-mixin() { background: white; } .class { .my-mixin; .my-other-mixin; }
=>
.my-mixin { color: black; } .class { color: black; background: white; }
.my-hover-mixin() { &:hover { border: 1px solid red; } } button { .my-hover-mixin(); }
=>
button:hover { border: 1px solid red; }
#outer { .inner { color: red; } } .c { #outer > .inner; // #outer .inner; // #outer > .inner(); // #outer.inner; // #outer.inner(); // 等效 }
=>
#outer .inner { color: red; } .c { color: red; }
// 僅在保護條件返回true時才使用由其定義的mixins #namespace when (@mode=huge) { .mixin() { /* */ } } // == #namespace { .mixin() when (@mode=huge) { /* */ } }
!important在mixin調用以後使用關鍵字將其繼承的全部屬性標記爲!important
.foo (@bg: #f5f5f5, @color: #900) { background: @bg; color: @color; } .unimportant { .foo(); } .important { .foo() !important; }
=>
.unimportant { background: #f5f5f5; color: #900; } .important { background: #f5f5f5 !important; color: #900 !important; }
.border-radius(@radius) { border-radius: @radius; } #header { .border-radius(4px); } .button { .border-radius(6px); }
=>
#header { border-radius: 4px; } .button { border-radius: 6px; }
// 單個參數 .mixin(@color) { color-1: @color; } // 分號分隔參數, 也能夠是逗號, @padding 默認值爲2 .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); }
=>
.some .selector div { color-1: #008000; color-2: #008000; padding-2: 2; }
.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; }
.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; }
.mixin() { @width: 100%; @height: 200px; } .average(@x, @y) { @average: ((@x + @y) / 2); } div { .average(16px, 50px); padding: @average; } .caller { .mixin(); width: @width; height: @height; }
=>
.caller { width: 100%; height: 200px; } div { padding: 33px; }
a { color: blue; &:hover { color: green; } } .button { &-ok { background-image: url("ok.png"); } &-cancel { background-image: url("cancel.png"); } &-custom { background-image: url("custom.png"); } } .link { & + & { color: red; } & & { color: green; } && { color: blue; } &, &ish { color: cyan; } } p, a, ul, li { border-top: 2px dotted #366; & + & { border-top: 0; } }
=>
a { color: blue; } a:hover { color: green; } .button-ok { background-image: url("ok.png"); } .button-cancel { background-image: url("cancel.png"); } .button-custom { background-image: url("custom.png"); } .link + .link { color: red; } .link .link { color: green; } .link.link { color: blue; } .link, .linkish { color: cyan; } p, a, ul, li { border-top: 2px dotted #366; } p + p, p + a, p + ul, p + li, a + p, a + a, a + ul, a + li, ul + p, ul + a, ul + ul, ul + li, li + p, li + a, li + ul, li + li { border-top: 0; }
請注意,&
表明全部父選擇器(不單單是最近的祖先)