做爲前端界的三大基石,css是每個前端開發人員必需要會的,css做爲一門標記語言,給人的第一印象就是簡單易懂,沒有什麼邏輯性,和編程語言差距較大,短板很是明顯,當有新的屬性出來時個瀏覽器也不能同時兼容,爲了解決css這個短板,涌現出了一些預處理語言,他們讓css能夠使用變量,循環,集成,自定義方法等,讓其邏輯性大大加加強。css
如今主要流行的有sass、less、stylus 三種html
sass、less、stylus其實都差很少,在基本功能上也是大同小異,選擇less是比較適合初學者的,相比sass和stylus,less能讓你更快上手,less保留了全部css的功能個,學習成本低,另外less能夠在編輯器裏直接編譯,在電腦上安裝less後只需下載個小插件就能夠使用,vscode使用Easy Less擴展就能夠直接使用less。前端
less定義變量的形式 @變量名:值,這樣就能夠定義一個變量。使用起來很是簡單,好比咱們能夠定義一個頁面的主色調@bgc,這樣在反覆用到給顏色的地方咱們就能夠直接使用,注意在css屬性中使用變量的時候須要把變量名用大括號包起來,這樣才能正確編譯。編程
/**
*@param: bgc 主色調
*@param: fsz 字體大小
*/
@bgc: RGB(88,190,203);
@fsz: 100px;
@wd: width;
@imgurl:"../img/";
html
{
font-size: @fsz;
}
.wrap
{
@{wd}: 7.5rem; //屬性中使用變量
height: .89rem;
background-color: @bgc;
bckground-image: url("@{imgurl}/pic.jpg");//url中使用變量
}
//編譯成css
html {
font-size: 100px;
}
.wrap {
width: 7.5rem;
height: .89rem;
background-color: #58becb;
}
複製代碼
變量的做用域,當變量被屢次定義時,以最後一次定義爲準,且從當前做用域向上搜尋瀏覽器
//栗子
@bgc: #333;
.wrap
{
@bgc: #339;
.article
{
color: @bgc;
}
}
//編譯css
.wrap .article {
color: #339;
}
//變量是延遲加載的,不必定要在使用以前定義
@bgc: #333;
.wrap
{
.article
{
color: @bgc;
}
@bgc: #339;
}
//同樣的結果
.wrap .article {
color: #339;
}
複製代碼
混合的概念也很簡單.sass
//好比你寫一個border,而後在別的地方應引用它,less管這個叫混合
.border
{
border: 1px solid #eee;
}
.tab
{
width: .2rem;
height: .1rem;
.border;
}
//編譯成css就變成了
.border {
border: 1px solid #eee;
}
.tab {
width: .2rem;
height: .1rem;
border-top: 1px solid #333;
border-bottom: 1px solid #eee;
border: 1px solid #eee;
}
複製代碼
固然也有更多好玩的用法,舉個栗子,這個和函數同樣,括號內定義參數,同時能夠給參數指定默認值,使用的時候也很簡單,直接在須要的地方調用就好,好比想給box加個1px,顏色是#eee的上邊框直接寫.border(top);就完成任務。(不多寫文章寫的不太好,畢竟叫less入門)less
.border(@direction,@num:1px,@color:#eee)
{
border-@{direction} : @num solid @color;
}
.box
{
width: 100px;
height: 50px;
.border(top);
}
複製代碼
less支持用import引入文件,也就相對有了模塊化的寫法,好比編寫一個head.less,只要在須要該樣式的less文件寫上import 「head.less」,在編譯出的css文件裏就有了head.less裏的樣式。編程語言
//global.less
@charset "utf-8";
*,
::before,
::after{
padding: 0;
margin: 0;
box-sizing: border-box;
}
body{
color: #333;
font-family: "PingFang-SC-Medium" ,"sans-serif";
background: rgba(0,0,0,0);;
}
//style.less
@charset "utf-8";
@import "global.less";
//style.less編譯出來後
@charset "utf-8";
*,
::before,
::after {
padding: 0;
margin: 0;
box-sizing: border-box;
}
body {
color: #333;
font-family: "PingFang-SC-Medium", "sans-serif";
background: rgba(0, 0, 0, 0);
}
複製代碼
less提供了when這個關鍵字功能,when很好理解就是一個判斷條件,只有當when的條件達到時纔會執行,廢話少說直接上代碼。編輯器
咱們定義一個.area方法,width大於100px的時候加一個radius,小於等於一百的時候不加,注意這時候調用的時候會將100px轉化位數值和100比較,用的是unit函數,後面咱們會學到。模塊化
.area(@width) when (@width > 100)
{
width: @width;
height: 100px;
background: #ff6600;
border-radius: 3px;
}
.area(@width) when(@width < = 100)
{
width: @width;
height: 100px;
background: #ff6600;
}
.box
{
.area(200px);
}
//編譯後
.base-area {
height: 100px;
background: #ff6600;
}
複製代碼
這裏咱們還能夠使用嵌套來對代碼進行優化
.base-area
{
width: @width;
height: 100px;
}
.area(@width) when (@width > 100)
{
.base-area;
border-radius: 3px;
}
.area(@width) when(@width < = 100)
{
.base-area;
}
.box
{
.area(200px);
background: #ff6600;
}
複製代碼
less的loop是用when來實現的,下面咱們就寫一個簡單的例子
.fn( @i ) when ( @i < 10 )
{
width: unit( @i , px );
.fn(( @i + 1 ));
}
.loopWidth
{
.fn(1);
}
//編譯
.loopWidth {
width: 1px;
width: 2px;
width: 3px;
width: 4px;
width: 5px;
width: 6px;
width: 7px;
width: 8px;
width: 9px;
}
複製代碼
經過簡單例子大概就能明白less中的loop了,下面簡單寫一個日常能用到的,好比給list的item添加不一樣的背景圖片
@imgurl: "../img";
.bg-loop(@n,@i:1) when (@i < @n)
{
.list
{
.item-@{i}
{
background-image: url("@{imgurl}/icon-@{i}.jpg");
}
}
.bg-loop(@n,(@i+1));
}
.bg-loop(4);
//編譯
.list .item-1 {
background-image: url("../img/icon-1.jpg");
}
.list .item-2 {
background-image: url("../img/icon-2.jpg");
}
.list .item-3 {
background-image: url("../img/icon-3.jpg");
}
複製代碼
舉一個寫三角形的列子,less提供@_來匹配共同的一些操做.
.triangle(top,@width:100px,@color:#333)
{
border-width: @width;
border-color: @color transparent transparent transparent;
border-style: solid dashed dashed dashed;
}
.triangle(right,@width:100px,@color:#333)
{
border-width: @width;
border-color: transparent @color transparent transparent;
border-style: dashed solid dashed dashed;
}
.triangle(bottom,@width:100px,@color:#333)
{
border-width: @width;
border-color: transparent transparent @color transparent;
border-style: dashed dashed solid dashed;
}
.triangle(left,@width:100px,@color:#333)
{
border-width: @width;
border-color: transparent transparent transparent @color;
border-style: dashed dashed dashed solid ;
}
.triangle(@_,@width:100px,@color:#333)
{
height: 0;
width: 0;
overflow: hidden;
}
.target
{
.triangle(top);
}
//css
.target {
border-width: 100px;
border-color: #333 transparent transparent transparent;
border-style: solid dashed dashed dashed;
height: 0;
width: 0;
overflow: hidden;
}
複製代碼
arguments包含了全部參數
.border(@w:1px,@s:solid,@c:#eee)
{
border:@arguments;
}
.arg{
.border;
}
//css
.arg {
border: 1px solid #eee;
}
複製代碼
有時候一些計算須要到客戶端才進行,好比使用calc,在less轉css中會被提早計算,這時候就須要避免編譯,格式是 ~‘避免編譯的內容’
.inner
{
width: 100px;
height: ~'calc(1000/2)';
}
複製代碼
### !important less裏也能夠用!important,這個不建議用
.box{
width: 200px;
height: 200px;
background: #333;
}
.inner
{
.box !important;
}
//css
.inner {
width: 200px !important;
height: 200px !important;
background: #333 !important;
}
複製代碼
一些經常使用的函數:
lighten 提升亮度 darken 下降亮度
@bgc:#ff6600;
.box
{
width: 100px;
height: 100px;
background:@bgc;
}
.box-1
{
width: 100px;
height: 100px;
background: lighten(@bgc,20%); //亮度提升百分之二十
}
.box-2
{
width: 100px;
height: 100px;
background: darken(@bgc,20%);//亮度減小百分之二十
}
複製代碼
saturate 提升飽和度 desaturate 下降飽和度
@bgc: skyblue;
.box
{
width: 100px;
height: 100px;
background:@bgc;
}
.box-1
{
width: 100px;
height: 100px;
background: saturate(@bgc,100%); //飽和度提升百分之一百
}
.box-2
{
width: 100px;
height: 100px;
background: desaturate(@bgc,100%);//飽和度減小百分之一百
}
複製代碼
percentage 轉換百分比 unit 單位聯合 ceil 向上取整 floor 向下取整 round 四捨五入 abs 絕對值
@h:100px;
.box{
width: percentage(.1);
height: round(4.5);
padding: ceil(4.1);
border-width: abs(-100);
margin: floor(4.9);
font-size: unit(100,px);
line-height: unit(@h);
}
//css
.box {
width: 10%;
height: 5;
padding: 5;
border-width: 100;
margin: 4;
font-size: 100px;
line-height: 100;
}
複製代碼
less的基本知識都大概介紹了,第一次寫這樣的博文感受有點吃力,感受全程在貼代碼,不奢求有人看了,主要記錄下知識點以便本身回頭查閱,漫漫前端路繼續加油。