搜尋

Less 教學:邏輯、迴圈、函式

這篇教學會介紹 Less 進階的功能,例如邏輯、迴圈和一些特殊函式,這些功能主要針對大型或複雜的 CSS 架構,在簡單的小型專案通常派不上用場,但如果熟悉相關用法,就能大幅簡化或加速開發流程。

快速導覽:

CSS 教學 - Less 教學:邏輯、迴圈、函式

Less 邏輯判斷式 ( when )

Less 的邏輯判斷式主要有「when」和「if」兩種,when 判斷式撰寫在「選擇器後方」,寫法為 when(判斷條件),當判斷條件結果為 True 時就會轉換這組樣式,下方範例會判斷變數 @a 是否大於 0,如果大於 0 才會轉換這組樣式。

/********** Less 寫法 **********/
@a: 1;
.apple when(@a>0){
  color: red;
}
.oxxo when(@a<0){
  color: red;        /* 不會轉換這組樣式,因為 @a 為 1 */
}


/********** 轉換成 CSS **********/
.apple {color: red;}

Less 邏輯判斷式也適用具有「參數」的 Mixins 混合效果,下方範例會判斷變數 @a 是否大於 0,如果大於 0 才會混合並轉換這組樣式。

更多參考:Less Mixins 混合

/********** Less 寫法 **********/
.apple(@a) when(@a>0){
  color: red;
  font-size: 20px;
  background: pink;
}
.oxxo {
  @a: 1;
  .apple(@a);
}
.banana {
  @a: 2;
  .apple(@a);
}
.coconut {
  @a: 0;
  .apple(@a);
}

/********** 轉換成 CSS **********/
.oxxo {
  color: red;
  font-size: 20px;
  background: pink;
}
.banana {
  color: red;
  font-size: 20px;
  background: pink;
}

Less 邏輯判斷式 ( if )

Less 的 if 邏輯判斷式為 Less 的「函式」,撰寫在「樣式中」,寫法為 if(條件判斷, True 行為, False 行為),當判斷條件結果為 True 時就會轉換這組樣式,下方範例會判斷變數 @a 是否大於 0,如果大於 0 就會使用紅色,不然就使用藍色。

/********** Less 寫法 **********/
@a: 1;
.oxxo {
  color: if(@a>0, red, blue);
}
.apple {
  color: if(@a<0, red, blue);
}


/********** 轉換成 CSS **********/
.oxxo {color: red;}
.apple {color: blue;}

Less 迴圈 ( 遞迴混合 )

Less 本身並沒有「迴圈」的機制,但在混合時可以透過「遞迴」的做法 ( 混合的對象中混合了自己本身 ),產生類似迴圈的效果,下方範例會透過遞迴的方式,產生五個 width 樣式屬性。

/********** Less 寫法 **********/
.loop(@counter) when (@counter > 0) {
  .loop((@counter - 1));    // 再次呼叫自己
  width: (10px * @counter); // 根據變數產生對應屬性值
}
div {
  .loop(5);
}


/********** 轉換成 CSS **********/
div {
  width: 10px;
  width: 20px;
  width: 30px;
  width: 40px;
  width: 50px;
}

上述的寫法並沒有意義,因為在同一個選擇器中並不會撰寫一堆相同的樣式,所以 Less 遞迴常見於將「類似名稱的選擇器」產生「對應內容」,下方範例會重複執行 .oxxo 四次,每次產生一個 column-* 的選擇器,並根據算式產生樣式內容。

/********** Less 寫法 **********/
.oxxo(4);
.oxxo(@n, @i: 1) when (@i =< @n) {
  .column-@{i} {
    width: (@i * 100% / @n);
  }
  .oxxo(@n, (@i + 1));
}


/********** 轉換成 CSS **********/
.column-1 {width: 25%;}
.column-2 {width: 50%;}
.column-3 {width: 75%;}
.column-4 {width: 100%;}

Less 迴圈 ( each + range )

延續上方的範例,如果不想要透過計算的方式進行迴圈,也可以使用 Less 的 eachrange 函式,做出更類似程式的迴圈語法,快速產生具有規律的系列數字,range 函式的寫法如下:

  • range(起始值, 結束值, 間距)
  • range(結束值, 間距),起始值為 0。
  • range(結束值),起始值為 0,間距為 1。

下方範例會展示這三種不同寫法產生的結果。

/********** Less 寫法 **********/
@a: range(10);
@b: range(5, 10);
@c: range(1, 10, 2);
.oxxo::before {
  content: "@{a}";
}
.apple::before {
  content: "@{b}";
}
.banana::before {
  content: "@{c}";
}


/********** 轉換成 CSS **********/
.oxxo::before {
  content: "1 2 3 4 5 6 7 8 9 10";  /* range(10) */
}
.apple::before {
  content: "5 6 7 8 9 10";  /* range(5, 10) */
}
.banana::before {
  content: "1 3 5 7 9";     /* range(1, 10, 2) */
}

通常使用 range 會搭配 each 一同使用each 表示分別執行每次的內容,每次執行的結果都會放入一個名為 value 的變數裡,使用 Less 變數讀取的方式就能操作,下方會呈現兩種不同的 each 寫法,一種放在選擇器裡就能重複產生樣式,另一種放在選擇器外層會重複產生選擇器。

/********** Less 寫法 **********/
.apple::before {
  each(range(4), {
  content: @value;       /* 數字 */
  });
}
.apple::after {
  each(range(4), {
  content: "@{value}";   /* 字串,有引號 */
  });
}
each(range(4), {
  .oxxo-@{value}::before {
  content: @value;       /* 數字 */
  }
  .oxxo-@{value}::after {
  content: "@{value}";   /* 字串,有引號 */
  }
});


/********** 轉換成 CSS **********/
.apple::before {
  content: 1;
  content: 2;
  content: 3;
  content: 4;
}
.apple::after {
  content: "1";
  content: "2";
  content: "3";
  content: "4";
}
.oxxo-1::before {content: 1;}
.oxxo-1::after {content: "1";}
.oxxo-2::before { content: 2;}
.oxxo-2::after {content: "2";}
.oxxo-3::before {content: 3;}
.oxxo-3::after {content: "3";}
.oxxo-4::before {content: 4;}
.oxxo-4::after {content: "4";}

Less 常用函式

Less 除了基本的巢狀結構、變數、Extend 或 Mixins 混合等功能,還額外提供了許多好用的函式,下方會列出一些常用的函式,完整函式可以參考 Less 官方網站「Less Functions」。

小結

這篇教學所介紹的 Less 邏輯判斷、迴圈和常用函式,都是在大型專案中會看見的技巧和用法,如果運用得當,就能開發得更為快速,也更容易管理相關的樣式檔案。

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則 CSS 常用樣式屬性

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 使用巢狀結構語法 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

全域關鍵字與文字數值 長度與角度單位 位置名稱與時間單位 特殊樣式屬性 ( all、appearance)

規則與定義

變數 ( Variables ) 媒體查詢 ( @media ) 容器查詢 ( @container ) 自訂屬性值 ( @property ) 匯入樣式 ( @import ) 分層優先順序 ( @layer ) 定義字型 ( @font-face ) 計數規則 ( @counter-style ) 列印網頁 ( @page )

函式類型

數學計算 文字與清單計數 形狀與線段 路徑 ( path ) 生成內容與引號

顏色與濾鏡

顏色單位 色彩模型 漸層色 影像濾鏡 ( filter ) 背景濾鏡 ( backdrop-filter ) 混合模式 ( mix-blend-mode )

文字與段落

設定字型 ( font-family ) 使用外部字型 文字尺寸 文字樣式 ( 常用 ) 文字樣式 ( 其他實用 ) 文字樣式 ( 特殊用途 ) 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 文字自動分欄 使用 Icon Font ( 圖示文字 ) 製作自己的 Icon Font

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬度與高度 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 ( border-radius ) 影像邊框 ( border-image ) 輪廓 ( outline ) 內容溢出與裁切 ( overflow ) 內容範圍 ( contain ) 可見性與透明度

背景與陰影

背景顏色 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 ( shape-* ) 定位 ( position ) 邏輯屬性 ( logical properties ) 水平置中技巧 垂直置中技巧

Flex 彈性排版

Flexbox 彈性盒子 Flex 對齊方式 Flex 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 自訂動畫路徑 ( offset ) 動畫觸發事件 多重動畫的權重與順序 動畫進度控制 ( timeline )

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask ) 物件填滿方式與定位 轉換函式 ( transform ) 平移、旋轉與縮放 3D 轉換與透視

視窗與使用者行為

捲軸樣式 ( scrollbar ) 拉霸、滑桿樣式 ( slider ) 滑鼠游標圖示 ( cursor ) 滑鼠事件 ( pointer-events ) 使用者選取 ( user-select ) 捲動行為 ( scroll、overscroll ) 列印換頁 ( break-* )

CSS 預處理器

認識 CSS 預處理器 Less ( 安裝、開始使用 ) Less ( 巢狀結構、選擇器 ) Less ( 變數、import ) Less ( Extend、Mixin ) Less ( 邏輯、迴圈、函式 )

範例效果

CSS 圓餅圖 CSS 跑馬燈 Google 載入動畫 漸層色的轉場與動畫 電子時鐘數字 不規則形狀動畫 彈跳的正方形動畫 3D 正多面體 超連結底線動畫效果 噁心黏黏球效果 漸層色製作星空背景 CSS 視差滾動效果 捲軸控制放射形選單 捲軸改變文字背景色 CSS 頁面捲動進度條 CSS 水波效果 圓點載入動畫 ( 陰影動畫 )