前端時間學習了 Sass,像 Sass 這樣的預處理器優勢在於:變量及 Mixin 能夠減小 css 中的重複問題;嵌套使父子關係更加清晰;繼承能夠避免代碼重複問題;便捷的函數功能和自定義函數等等。javascript
可是呢,偶然間看到這篇文章,why-i-stopped-using-sass,做者說明了再也不使用 Sass 的緣由,好奇心使我點了進去,並進行了渣翻。文中做者說明了用 Sass 解決了哪些問題,爲何後來不用 Sass,下文會詳細闡述。css
本文從一篇博文出發,轉述文章做者的觀點,最後再加上一點個人理解。html
背景:文章做者堅持每一年最少重建一次網站,在最近的重建中,他一開始沒有想要將Sass代碼移除,但越是看本身的Sass代碼,越是產生了懷疑,Sass 的使用是在爲網站增色呢仍是在徒增沒必要要的複雜度和依賴。CSS 發展了不少年,起初用 Sass 解決的問題,如今看來都不是問題了。前端
文章做者經常使用Sass解決佈局、變量、排版
的問題。java
使用 Sass 以前瀏覽器
.col-span-3 {
float: left;
width: 24%;
margin-left: 1%;
}
.col-span-4 {
float: left;
width: 32.3%;
margin-left: 1%;
}
.col-span-5 {
float: left;
width: 40.6%;
margin-left: 1%;
}
複製代碼
使用 Sass 的 mixinsass
定義 mixinide
@mixin grid($colSpan, $gridColumns: 12, $margin: 1%,) {
$unitWidth: $gridColumns / $colSpan;
float:left;
width: (100 - $unitWidth * $margin) / $unitWidth;
margin: 0 $margin/2;
}
複製代碼
使用 mixin函數
.sidebar {
@include grid(3);
}
.main-content {
@include grid(9);
}
@media only screen and (max-width: 480px) {
.sidebar {
@include grid(12);
}
.main-content {
@include grid(12);
}
}
複製代碼
CSS Grid佈局
CSS Grid 的引入使得佈局變得簡單,再也不須要使用上面的方式構建網格系統。
如下的代碼實現了根據內容的最大最小寬度適配變化的響應式佈局,而不是根據預設的設備大小。
.project {
display: grid;
grid-template-columns: repeat( auto-fill, minmax(12em, 1fr) );
grid-gap: 1em;
}
複製代碼
用 Grid CSS 作佈局的侷限性在於瀏覽器兼容。Grid 目前支持大部分的現代瀏覽器 和IE10+,auto-fill 和 auto-fit 屬性兼容性更低,能夠經過 @supports 判斷兼容。
**變量是可變化的值,對 CSS 來講變量是使用到才知道值是什麼。**做者大部分項目遵循 ITCSS 標準,將全局變量放在 setting 文件中。一般全局變量有字體,顏色,媒體查詢。
/* COLORS */
$colors: (
"black": #2a2a2a,
"white": #fff,
"grey-light": #ccc7c3,
"grey-dark": #2a2a2a,
"accent": #ffa600,
"off-white": #f3f3f3,
"sky-blue": #ccf2ff
);
/* BREAKPOINTS */
$breakpoints: (
"break-mobile": 290px,
"break-phablet": 480px,
"break-tablet": 768px,
"break-desktop": 1020px,
"break-wide": 1280px
);
/* TYPOGRAPHY */
$font-stack: (
decorative: #{'oswald', Helvetica, sans-serif},
general: #{'Helvetica Neue', Helvetica, Arial, sans-serif}
);
複製代碼
這樣使用變量使網站大幅改動變得快速簡單。
使用 Sass 以前
.button {
background-color: #4CAF50; /* Green */
}
.button:hover {
background-color: #3F8C42; /* Dark Green */
}
.button:active {
background-color: #266528; /* Darker Green */
}
複製代碼
使用 Sass 以後
$button-colour: #4CAF50;
.button {
background-color: $button-colour;
}
.button:hover {
background-color: darken($button-colour, 20%);
}
.button:active {
background-color: darken($button-colour, 50%);
}
複製代碼
CSS 變量
CSS 自定義變量不只能夠替換預處理器變量,還能夠動態更新(JS)。CSS變量教程
CSS 變量甚至能夠像 Sass 對顏色進行操做,可是這種操做仍處於草案階段,暫時能夠用不一樣顏色代替。
:root {
--button-color: #4CAF50;
}
.button:hover {
color: color-mod(var(--button-color) tint(50%));
}
複製代碼
以前的代碼中,做者使用Sass作響應式排版和間距,使用相似下面代碼的 mixin:
@mixin typography($size) {
font-size: $size;
@include mq(break-desktop) {
font-size: $size * 1.2;
}
}
複製代碼
現在可使用**原生 CSS 中的 calc 和視口單位(viewport units)**來實現這些計算。
:root {
--font-size: calc(18px + 0.25vw)
}
body {
font-size: var(--font-size);
}
複製代碼
CSS 正在朝着內容主導的方向發展,Grid/flexbox/大小調整屬性(min-content/max-content/fit-content)還有之後的 SubGrid/Layout Model Level 2等。這些都讓原生 CSS 更具吸引力。
以上是譯文內容,做者使用原生 CSS 實現了原來用 Sass 實現的功能,更加簡潔方便,惟一的侷限性是兼容性問題,但這點將來終會解決,同時 CSS 也正在產生更多使用的特性,使其更具吸引力。
我認爲 Sass 存在它自身的優點,好比 mixin、繼承、佔位符等用於減小重複樣式代碼,使樣式間關係清晰;靈活的變量插值(相比較CSS變量只能做爲屬性值或變量值使用);數據類型多樣;邏輯控制(判斷、循環等);功能函數和自定義函數等等,但Sass的使用須要 Ruby 的依賴,且須要編譯後成 css 後使用,確實會給項目增添依賴。
做者用到的 CSS 原生方法,簡潔方便,但部分存在兼容性的問題,目前還沒有解決,使用時須要進行兼容性判斷。
Sass 等 CSS 預處理和 CSS 原生各有利弊,二者都在不斷髮展,瞭解各自的特性,才能在具體的應用場景中更好的使用。