新鮮出爐的less與sass較量

来源:http://www.cnblogs.com/waj6511988/archive/2017/04/28/6782640.html
-Advertisement-
Play Games

最近接觸了Bootstrap,涉及到了LESS,CSS的預處理器使用最廣泛的就是LESS和Sass,都是努力把CSS武裝成為開發語言,讓它從簡單的描述性語言過渡到具有程式式特性的語言,主要的特性就是:變數、Mixins、嵌套、繼承等。就像教程里說的:CSS的預處理器就是讓CSS從設計師的工具,變為開 ...


 

     最近接觸了Bootstrap,涉及到了LESS,CSS的預處理器使用最廣泛的就是LESS和Sass,都是努力把CSS武裝成為開發語言,讓它從簡單的描述性語言過渡到具有程式式特性的語言,主要的特性就是:變數、Mixins、嵌套、繼承等。就像教程里說的:CSS的預處理器就是讓CSS從設計師的工具,變為開發人員的工具。但是看完之後覺得,作為對CSS研究尚不透徹的前端小生,我最好還是不要高攀,況且在我目前的項目中拿LESS來寫CSS有點兒殺雞用牛刀的感覺。但回過頭來說,技不壓身。。。bulabulabula~~好了,且正題,摘了一篇非常不錯的乾貨,分享給大家:非常明晰地介紹一下LESS和Sass的基本特性他們的區別。

事實證明,LESS——以及Sass——功能比這個要多太多。LESS和Sass在語法上有些共性,比如下麵這些:

● 混入(Mixins)——class中的class;

● 參數混入——可以傳遞參數的class,就像函數一樣;

● 嵌套規則——Class中嵌套class,從而減少重覆的代碼;

● 運算——CSS中用上數學;

● 顏色功能——可以編輯顏色;

● 名字空間(namespace)——分組樣式,從而可以被調用;

● 作用域——局部修改樣式;

● JavaScript 賦值——在CSS中使用JavaScript表達式賦值。

LESS和Sass的主要不同就是他們的實現方式,LESSS是基於JavaScript,所以,是在客戶端處理的。

另一方面,Sass是基於Ruby的,然後是在伺服器端處理的。很多開發者不會選擇LESS因為JavaScript引擎需要額外的時間來處理代碼然後輸出修改過的CSS到瀏覽器。關於這個有很多種方式,我選擇的是只在開發環節使用LESS。一旦我完成了開發,我就複製然後粘貼LESS輸出的到一個壓縮器,然後到一個單獨的CSS文件來替代LESS文件。另一個選擇是使用koala來編譯和壓縮你的LESS文件。兩個選擇都將最小化你的樣式輸出,從而避免由於用戶的瀏覽器不支持JavaScript而可能引起的任何問題。

LESS Is More

介紹

在你的項目中引入LESS很簡單:

1.下載less.js;

2.創建一個文件來放你的樣式,比如style.less;

3.添加以下代碼到你的HTML的<head>中:

<link rel="stylesheet/less" type="text/css" href="styles.less">
<script src="less.js" type="text/javascript"></script>

註意link的rel屬性。你需要在屬性值的最後面使用/less以使LESS起作用。然後在link後面引入scirpt也是必須的。如果你在用HTML5語法——為什麼不用呢?——你可以省去type=”text/css”和type=”text/javascript”。

變數

如果你是個開發者,變數應該是你最好的朋友。如果你要重覆的使用一個信息(本例中就是color),將它設置為一個變數就可以。這樣,你就可以保證自己的一致性並可能減少滾動代碼來查找顏色值、複製、粘貼等繁瑣的工作了。你甚至可以加或者減一些你需要渲染的HEX值到這些顏色上面。看下例子:

 @blue: #00c;
 @light_blue: @blue + #333;
 @dark_blue: @blue - #333;

關於變數在LESS和Sass中的唯一區別就是,LESS用@,Sass用$。同時還有一些作用域上的差別,我後面會提到。

混入(mixin)

偶爾,我們會創建一些會在樣式表中重覆使用的樣式規則。沒有人會阻止你在一個HTML的元素中使用多個class,但是你可以用LESS,在樣式表中完成。為了描述這一點,我寫了一點兒例子:

.border {
    border-top: 1px dotted #333;
}
article.post {
    background: #eee;
    .border;
}
ul.menu {
    background: #ccc;
    .border;
}

在Sass中,你要在樣式規則前面添加@mixin聲明,規定它是個嵌套。然後,通過@include來調用它:

@mixin border {
    border-top: 1px dotted #333;
}
article.post {
    background: #eee;
    @include border;
}
ul.menu {
    background: #ccc;
    @include border;
}

 參數混入

就像在CSS中有函數功能一樣,這些對於那些在現在的CSS工作中多餘的工作非常有用。最好和最有用的例子就是我們正在經歷的從CSS2到CSS3過渡過程中的很多瀏覽器私有首碼。Nettuts+有一篇Jeffrey Way寫的很贊的視頻和文章,內容是包含著由有用的參數組成的文件,他們涵蓋了大部分使用各個瀏覽器私有首碼的CSS3屬性。例如,在他們的格式中,一個簡單的處理圓角的mixin是這樣的:

.border-radius( @radius: 3px ) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}

 在這個例子中,.border-radius有個預設的3px的圓角,但是你可以使用你需要的任何值。.border-radius(10px)將會生成半徑為10px的圓角。

Sass中的語法很像LESS,只是使用$聲明變數,然後使用前面提到的@mixin和@include來調用。

選擇器繼承

這個東西LESS並沒有提供。通過這個功能,你可以將一個選擇器附加到已經預先定義的選擇器上,而無需再使用逗號將兩者分開的寫法了:

.menu {
    border: 1px solid #ddd;
}
.footer {
    @extend .menu;
} 

/* 上面的寫法規則和下麵的效果是一樣的: */
.menu, .footer {
    border: 1px solid #ddd;
}

嵌套規則

在css中嵌套class和ID是避免你的樣式干擾或者被別的樣式干擾的唯一方法了。但是這可能會很凌亂。使用一個類似於#site-body .post .post-header h2 的選擇器毫無吸引力而且會占用大量不必要的空格。使用LESS,你可以嵌套id、class以及標簽。對於前面提到的例子,你可以這樣寫:

#site-body { …
    .post { …
        .post-header { …
            h2 { … }
            a { …
                &amp;:visited { … }
                &amp;:hover { … }
            }
        }
    }
}

上面的代碼最終和上面的例子(那一長串的選擇器)的效果一樣,但是要更容易閱讀和理解的多,而且它占用很少的空間。你也可以通過&來引用元素樣式到他們的偽元素上,該功能類似於JavaScript中的this。

運算

這可能是你所期望的:使用數字或者變數在你的樣式表中實現數學運算!

@base_margin: 10px;
@double_margin: @base_margin * 2;
@full_page: 960px;
@half_page: @full_page / 2;
@quarter_page: (@full_page / 2) / 2;

聲明下,我也意識到我可以除以4來獲得@quarter_page變數,但是這裡我只是想要演示下圓括弧組成“運算順序”在這裡也是可以用的。在使用簡寫的規則中,小括弧也是必須的,比如 border: (@width / 2) solid #000。

Sass在數字上比LESS更專業。它已經可以換算單位了。Sass可以處理無法識別的度量單位並將其輸出。這個特性很明顯是一個對未來的嘗試——證明W3C作出的一些改變。

/* Sass */
2in + 3cm + 2pc = 3.514in
/* LESS */
2in + 3cm + 2pc = Error

Color函數

在文章開頭,我提到了LESS如何幫我在編碼過程中處理圍繞著一個調色板。對此貢獻最大的一部分就是顏色函數。加入你用一個標準的藍色貫穿到你的樣式中,然後你想要在表單中用這個藍色來做一個漸變的按鈕。你可以打開Photoshop或者其它的編輯器來獲取一個比藍色較淺的或者較暗的HEX色值來作為漸變色。或者,你可以只是使用LESS中的顏色函數。

@blue: #369;

.submit {
    padding: 5px 10px;
    border: 1px solid @blue;
    background: -moz-linear-gradient(top, lighten(@blue, 10%), @blue 100%); /*Moz*/
    background: -webkit-gradient(linear, center top, center bottom, from(lighten(@blue,10%)), color-stop(100%, @blue)); /*Webkit*/
    background: -o-linear-gradient(top, lighten(@blue, 10%) 0%, @blue 100%);/*Opera*/
    background: -ms-linear-gradient(top, lighten(@blue, 10%) 0%, @blue 100%); /*IE 10+*/
    background: linear-gradient(top, lighten(@blue, 10%) 0%, @blue 100%); /*W3C*/
    color: #fff;
    text-shadow: 0 -1px 1px rgba(0,0,0,0.4);
}

lighten函數很明顯就是用百分比值來減輕顏色,在這個例子中,它將減輕這個基礎的藍色的10%。這種方法可以讓我們變化的元素或者其它任何元素的顏色值——只是簡單的改變基礎顏色而已。這對於主題(模板)來說非常有用。而且,如果你使用參數功能,像上面提到的,你還可以更簡單的應用到一些瀏覽器私有首碼的聲明中,比如:.linear-gradient(lighten(@blue), @blue, 100%);。

嗯,最終的效果的確很贊:

很贊的漸變的、基於變數的”Submit”按鈕

還有很多其它的色彩函數,比如變暗或者調整顏色的飽和度,甚至你可以旋轉色盤來使用其它顏色。我建議親自嘗試下你能想出的(用法)。

Sass貌似有更多的選項——但我並不需要這麼多。我個人最常用的還是lighten和darken。如果你想瞭解更多,可以看一下這篇很詳細的介紹

條件語句與控制

這是一個的確很贊的東東,也是另一個LESS不支持的功能。使用 Sass,你可以使用if { } else { } 條件語句,以及for { }迴圈。它甚至支持 and、 or和 not,以及 <、 >、 <=、 >= 和 == 等操作符。

/* Sample Sass "if" statement */
@if lightness($color) &gt; 30% {
    background-color: #000;
} @else {
    background-color: #fff;
}
/* Sample Sass "for" loop */

@for $i from 1px to 10px {
    .border-#{i} {
    border: $i solid blue;
    }
}

 名字空間(Namespaces)

名字空間可以用於組織我們的CSS到另一個檔次,我們可以將一些公用的樣式分組,然後在用的時候直接使用。例如,如果我們創建了一個名為default的樣式分組,我們就可以在用到的時候直接從該組中調用。

#defaults {
    .nav_list () {
        list-style: none;
        margin: 0; padding: 0;
    }
    .button () { … }
    .quote () { … }
}

然後,在我們的代碼中,如果我們正好在一個nav元素中使用了ul元素,我們就會想到我們需要default樣式。那麼我們就可以簡單的調用它,它也會被直接應用。

       nav ul {     #defaults &gt; .nav_list;       }

作用域

作用域是編程中的標配,LESS中也是。如果你在你樣式表的root級聲明一個變數,它在整個文檔中都是可以用的。然而,如果你在一個選擇器,比如id或者class中,重新定義了這個變數,那麼,它就只能在這個選擇器中可用了——當然是重新定義後的新值。

@color: #00c; /* 藍色 */
#header {
    @color: #c00; /* red */
    border: 1px solid @color; /* 紅色邊框 */
}
#footer {
    border: 1px solid @color; /* 藍色邊框 */
}

因為我們在#header中重新定義了color變數,變數的值將會是不同的而且只會在該選擇器中有效。它之前或者之後的所有地方,如果沒有被重新定義,都會保持那個原始的值。

作用域在Sass中稍有不同。在上面的代碼中,當@color變數變為紅色後,代碼中,此處之後的該變數的值,將會被重寫(成為紅色)。

註釋

這一部分比較基礎。LESS中允許兩種註釋寫法。標準的CSS註釋,/* comment */,是有效的,而且能夠通過處理並正確輸出。當行註釋,// comment,同樣可以用但是不能夠通過處理也不能被輸出,然後,結果是,“無聲的”。

導入

導入也相當符合標準。標準的 @import: ‘classes.less’; 處理的很好。然而,如果你想要導入其它的LESS文件,那麼文件的擴展名是可選的,所以 @import ‘classes’; 也是可行的。如果你想要導入一些無需LESS處理的內容,你可以使用 .css 擴展 (比如, @import: ‘reset.css’;)。

字元串插入

字元串也是可以用於變數中的,然後通過@{name}來調用。

@base_url : 'http://www.qianduan.net'; background-image: url("@{base_url}/images/background.png");

轉義(Escaping)

可能偶爾會需要引入一個CSS中非法或者LESS無法識別的值。通常是一些IE的hack。要避免拋出異常並破壞LESS,你將需要避開它們。

.class {
    filter: ~"progid:DXImageTransform.Microsoft.Alpha(opacity=20)";

}
/*實際上將會輸出下麵的代碼: */
.class {
    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);

}

 JavaScript 賦值

  這是LESS中我最中意的部分:在樣式表中使用Javascript——相當精彩。你可以使用表達式,也可以參考環境方向來使用反單引號。

@string: `'howdy'.toUpperCase()`; /* @string 變成 'HOWDY' */
/* 你也可以使用前面提到的插值: */
@string: 'howdy';
@var: ~`'@{string}'.topUpperCase()`; /* 變為 'HOWDY' */
/* 獲取文檔的信息 */
@height = `document.body.clientHeight`;

 輸出格式

  然而LESS並沒有輸出設置,而Sass提供4中輸出選項:nested, compact, compressed 和 expanded。

結束語

   這兩個方法有很多共同點。對寫代碼的設計師來說,它們都是很酷的工具,它們也可以幫助開發者更有效和快速的工作。如果你是koala或HTML的粉絲,那麼Sass會是你的好助手。對我來說,一個PHP和JavaScript極客,我傾向於LESS,因為它便於引入和能夠使用JavaScript的表達式以及文檔屬性。我懷疑我甚至接近真正理解在樣式表中編程的可能行了,但是我仍堅持嘗試。如果你在工作中有用到它們中的一個,或者兩個都用,我很樂意聽到關於它的更多內容,並看到你的成果。當然,技巧、訣竅、更正一直是很歡迎的。

   
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 程式優化是用於消除程式中大量的if else這種判斷語句 ...
  • 歷時兩個多月的時間,終於把effective c++又複習了一遍,比較慢,看的是英文版,之前看的時候做過一些筆記,但不夠詳細,這次筆者是從頭到尾的翻譯了一遍,加了一些標題,先記錄到word裡面,然後發佈到博客園上。這麼做是為了方便查閱,複習C++,同時練習英文,希望這些帖子也能夠對大家有所幫助。 有 ...
  • 什麼是觀察者模式 舉個例子來簡單說明下這個模式:假如現在你在一家報社訂閱了報紙,每當有新的期刊,那麼他們就會把報紙送到你家,如果你什麼時候不想看這一期刊的時候,你就可以取消訂閱,那麼這時候他們就不會將報紙送到你家了。這其實就是利用了觀察者模式,先給出兩個基本概念:主題,就相當於被觀察的對象,這裡指的 ...
  • 每天一個設計模式 -9 裝飾者模式 一、現實 使用繼承不總能夠實現最有彈性和最好維護的設計。 利用組合和委托可以在運行時具有繼承行為的效果。 利用繼承設計子類的行為,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行為。 利用組合的做法擴展對象的行為,就可以在運行時動態地進行擴展。 二、認識裝飾 ...
  • 一、 基本概述 問題:假設有一個控制器,該控制器上有7個可編程的插槽,每個都可以指定到一個不同的家電裝置,每個插槽都有對應的開關按鈕。這個遙控器還具備一個整體的撤銷按鈕。廠家已經提供了控制家電基本處理類。希望你能夠創建一組控制遙控器的API,讓每個插槽都能夠控制一個或一組裝置。(如下圖,廠商類) 分 ...
  • java 企業網站源碼 前後臺都有 靜態模版引擎, 代碼生成器大大提高開發效率 前臺: 支持兩套模版, 可以在後臺切換 系統介紹: 1.網站後臺採用主流的 SSM 框架 jsp JSTL,網站後臺採用freemaker靜態化模版引擎生成html 2.因為是生成的html,所以訪問速度快,輕便,對服務 ...
  • 1..net ajax顯示後臺返回值 <script> $(document).ready(function () { $("#btn").click(function () { //var data = new string(); $.ajax({ type: "POST", //要用post方式 ...
  • 註意 轉載須保留原文鏈接(http://www.cnblogs.com/wzhiq896/p/6783296.html ) 作者:wangwen896 整理 1、分類 2、註釋方式 3、簡單指令 4、變數命名 5、NaN和isNaN 6、轉義字元 7、邏輯短路、邏輯中斷 8、優先順序 9、類型轉換(t ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...