DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> CSS入門知識 >> CSS詳解 >> 深入解析CSS的Sass框架中混合宏的使用
深入解析CSS的Sass框架中混合宏的使用
編輯:CSS詳解     
這篇文章主要介紹了CSS的Sass框架中混合宏的使用,文中對混合宏所支持的參數特別是Null參數有較為詳細的講解,需要的朋友可以參考下

我所探討的焦點在 map 這種數據類型上,特別是使用 @content,@at-root 和 unique-id() 等指令合並 maps 所實現的奇妙方法。其中之一就是混合宏的設計模式,這一設計模式通過使用 @extend 指令和占位符選擇器來解決 Sass 的一些實際問題:

由於常在代碼開始部分引入占位符擴展,所以就應該將其置於代碼頂部而不受其他因素所影響;
優先使用 @include 還是 @extend?這裡給出的答案是 @include。
自意識混合宏的核心是通過創建或擴展占位符選擇器,動態地生成相關樣式。當它第一次被傳參調用後,就會有一個 map 變量記錄下相關的參數。隨後,當再次使用相同的參數調用時,就會執行擴展同一占位符的操作,而不是生成重復代碼。

在下面的代碼中,有一些混合宏的參數是相同的,有一些參數是獨有或特定的。那麼在最終生成的 CSS 中,就會發現,具有相同參數的部分會使用擴展的方式,即合並選擇器的方式;具有獨特或特定參數的部分,則仍然會生成獨立的選擇器樣式。

SCSS 源代碼和測試數據:

CSS Code復制內容到剪貼板
  1. // 自意識混合宏示例
  2. // 定義全局 map,保存混合宏的相關信息
  3. $my-mixin-info: ();
  4. // 使用任意形式的參數定義混合宏
  5. @mixin my-mixin($pos1, $pos2, $map: (), $rest…) {
  6. // 根據需要,捕獲部分或全部參數
  7. $my-args: ($pos1, $pos2, $map);
  8. // 在全局 map 中通過 key($my-args) 查找這些參數
  9. $id: map-get($my-mixin-info, $my-args);
  10. // 如果找到了 id
  11. @if $id {
  12. // 擴展該 id
  13. @extend %#{$id};
  14. // 生成任意特定的樣式
  15. specific: inspect($rest);
  16. }
  17. // 否則
  18. @else {
  19. // 新建一個 id
  20. $id: unique-id();
  21. // 將該 id 整合入混合宏的 map 中
  22. $my-mixin-info: map-merge($my-mixin-info, ($my-args: $id)) !global;
  23. // 在樣式頂層生成占位符
  24. @at-root {
  25. %#{$id} {
  26. // 生成共有樣式
  27. common: inspect($my-args);
  28. }
  29. }
  30. // 擴展該占位符
  31. @extend %#{$id};
  32. // 生成任意特定的樣式
  33. specific: inspect($rest);
  34. }
  35. }
  36. .test {
  37. @include my-mixin(1, 2, (), 4, 5);
  38. }
  39. .test2 {
  40. @include my-mixin(1, 2);
  41. }
  42. .test3 {
  43. @include my-mixin(1, 2, (), 6, 7);
  44. }

生成的 CSS 代碼:

CSS Code復制內容到剪貼板
  1. .test {
  2. specific: 4, 5;
  3. }
  4. .test, .test2, .test3 {
  5. common: 1, 2, ();
  6. }
  7. .test2 {
  8. specific: ();
  9. }
  10. .test3 {
  11. specific: 6, 7;
  12. }

混合宏靈活傳參的秘技——Null

在 Sass 混合宏中,我們可以向其傳遞參數列表,便於快速地配置相關屬性。就比如下面的這個混合宏,其中就包含了四個參數,用於定義元素的 display,padding 和 margin。

CSS Code復制內容到剪貼板
  1. @mixin display ($disp, $padding, $l-margin, $r-margin) {
  2. display: $disp;
  3. padding: $padding;
  4. margin-left: $l-margin;
  5. margin-right: $r-margin;
  6. }

當我們調用這個混合宏時,必須為每個參數傳遞一個合理的值,否則就會出現錯誤提示。

這往往強迫開發者為非必須的變量傳值,甚至重置非必要的初始值。那麼,怎樣才能避免必須為每一個變量傳值呢?

混合宏中的可選參數

如果我們為參數提供默認值,那麼這個參數就成為了可選參數:

@mixin display ($disp, $padding:0, $l-margin:0, $r-margin:0) {

}
如此一來,再次調用該混合宏時,$padding,$l-margin 和 r-margin 參數就成為了可選參數。但是,此時又會造成另一種問題:使用默認參數的混合宏有時生成的樣式並不是精簡的,和開發者的想法相比會有一些冗余,甚至是大量的重復性代碼。

Null

好消息是,Sass 支持 null,這有助於大大改善混合宏中可選參數的使用體驗。

通過使用 null,就可以排除掉某些樣式,不會生成到最終的 CSS 樣式中,除非我們調用混合宏時為其賦值。讓我們使用 null 作為默認值來重寫上面的混合宏:

CSS Code復制內容到剪貼板
  1. @mixin display (
  2. $disp,
  3. $padding: null,
  4. $r-margin: null,
  5. $l-margin: null) {
  6. display: $disp;
  7. padding: $padding;
  8. margin-left: $l-margin;
  9. margin-right: $r-margin;
  10. }

這種使用方式太完美了!我們現在仍然可以定義任意的可選參數,而又不會生成冗余的 CSS 代碼。如果你傳遞給混合宏兩個參數,那麼它就只會生成相應的 CSS 樣式。

CSS Code復制內容到剪貼板
  1. .nav__item {
  2. @include display(inline-block, $l-margin: 20px);
  3. }

運算中的 null

一定要牢記,在運算中使用 null 將會拋出錯誤。舉例如下:

CSS Code復制內容到剪貼板
  1. @mixin display (
  2. $disp,
  3. $padding: null,
  4. $l-margin: null) {
  5. display: $disp;
  6. padding: $padding;
  7. margin-left: $l-margin;
  8. margin-bottom: $l-margin * 2;
  9. }
  10. .nav__link {
  11. @include display(inline-block, 10px);
  12. }

這將返回一條錯誤提示:Invalid null Operation: “null times 2“。原因就是因為 $l-margin 未定義,繼而無法進行一切數值運算。

由此可見,Sass 的 null 對混合宏的冗余輸出具有強大的療效。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved