使用 CSS 預處理器語言的一個主要原因是想使用 Sass 獲得一個更好的結構體系。比如說你想寫更干凈的、高效的和面向對象的 CSS。Sass 中的插值(Interpolation)就是重要的一部分。讓我們看一下下面的例子:
$properties: (margin, padding); @mixin set-value($side, $value) { @each $prop in $properties { #{$prop}-#{$side}: $value; } } .login-box { @include set-value(top, 14px); }
@each...in...語句會在《Sass進級篇》中 1-6 @each循環 中講解。
它可以讓變量和屬性工作的很完美,上面的代碼編譯成 CSS:
.login-box { margin-top: 14px; padding-top: 14px; }
這是 Sass 插值中一個簡單的實例。當你想設置屬性值的時候你可以使用字符串插入進來。另一個有用的用法是構建一個選擇器??梢赃@樣使用:
@mixin generate-sizes($class, $small, $medium, $big) { .#{$class}-small { font-size: $small; } .#{$class}-medium { font-size: $medium; } .#{$class}-big { font-size: $big; } } @include generate-sizes("header-text", 12px, 20px, 40px);
編譯出來的 CSS:
.header-text-small { font-size: 12px; } .header-text-medium { font-size: 20px; } .header-text-big { font-size: 40px; }
一旦你發現這一點,你就會想到超級酷的 mixins,用來生成代碼或者生成另一個 mixins。然而,這并不完全是可能的。第一個限制,這可能會很刪除用于 Sass 變量的插值。
$margin-big: 40px; $margin-medium: 20px; $margin-small: 12px; @mixin set-value($size) { margin-top: $margin-#{$size}; } .login-box { @include set-value(big); }
上面的 Sass 代碼編譯出來,你會得到下面的信息:
error style.scss (Line 5: Undefined variable: “$margin-".)
所以,#{}語法并不是隨處可用,你也不能在 mixin 中調用:
@mixin updated-status { margin-top: 20px; background: #F00; } $flag: "status"; .navigation { @include updated-#{$flag}; }
上面的代碼在編譯成 CSS 時同樣會報錯:
error style.scss (Line 7: Invalid CSS after "...nclude updated-": expected "}", was "#{$flag};")
幸運的是,可以使用 @extend 中使用插值。例如:
%updated-status { margin-top: 20px; background: #F00; } .selected-status { font-weight: bold; } $flag: "status"; .navigation { @extend %updated-#{$flag}; @extend .selected-#{$flag}; }
上面的 Sass 代碼是可以運行的,因為他給了我們力量,可以動態的插入 .class 和 %placeholder。當然他們不能接受像 mixin 這樣的參數,上面的代碼編譯出來的 CSS:
.navigation { margin-top: 20px; background: #F00; } .selected-status, .navigation { font-weight: bold; }
在 Sass 的社區正在積極討論插值的局限性,誰又知道呢,也許我們很快將能夠使用這些技術也說不定呢。
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報