普通css中使用@media 去處理響應式網站開發估計大部分人都遇到過,但是在css預處理如此流行的今天,我們應該學會更敏捷的開發模式,更好的讓他們發揮最大的效率。響應式開發大同小異但是具體處理方案還是很多的,這裡我分享一個比較規範,用起來也比較舒服的scss處理的媒體查詢方案。
具體方案大概是這樣:
先定義一些斷點(也就是我們要界別的裝置尺寸)
// _config.scss
$breakpoints: (
'xs': 'only screen and ( min-width: 480px)',
'sm': 'only screen and ( min-width: 768px)',
'md': 'only screen and ( min-width: 992px)',
'lg': 'only screen and ( min-width: 1200px)',
) !default;複製程式碼
然後定義mixin:
// _mixins.scss
@mixin respond-to($breakpoint) {
$query: map-get($breakpoints, $breakpoint);
// 這裡是scss error提示估計大部分人(包括我)都沒怎麼使用過
@if not $query {
@error 'No value found for `#{$breakpoint}`. Please make sure it is
defined in `$breakpoints` map.';
}
// 具體斷點解釋在這裡,作者比較嚴謹,校驗了$query合法性
@media #{if(type-of($query) == 'string', unquote($query), inspect($query))}
{
@content;
}
}複製程式碼
這裡解釋一些出現的一些scss函式
字串函式顧名思意是用來處理字串的函式。Sass 的字串函式主要包括兩個函式:
unquote($query):刪除字串中的引號;
quote($query):給字串新增引號。
inspect($query) Maps不能轉換為純CSS。作為變數的值或引數傳遞給CSS函式將會導致錯誤。
使用inspect($query) 函式以產生輸出字串複製程式碼
使用的時候這樣寫:
// _component.scss
.element {
color: #000;
@include respond-to(sm) {
color: #333;
}
}複製程式碼
最後編譯完成輸出結構是
.element {
color: #000;
}
@media (min-width: 768px) {
.element {
color: #333;
}
}複製程式碼
這樣當需求更改,導致媒體查詢數值變化的時候,我們只需要改$breakpoints中的值,而不必查詢、替換。並且使用@include可以使我們的程式碼維護容易。
那麼如果我需要定義移動端retina螢幕使用二倍的背景圖,需要怎麼做?
新增加一個斷點,然後使用即可。
$breakpoints: (
...
'xs-retina' : ( max-width: 768px) and (-webkit-min-device-pixel-ratio: 2),
);複製程式碼
這時候就出現小問題了,如果頁面很複雜,需要新增很多斷點,那麼可能會出現組合爆炸,造成$brekpoints的子項很多很多,除了會影響sass編譯速度之外,維護起來也會更加麻煩。
Sass媒體查詢應該是這樣
動態,可定義,可以隨意增加斷點
簡潔,自然的語法,可以使用 <=,>=, >,< 符號(←_←)比如
@include media(">minWidth")
可以自由組合,臨時定義斷點,可以組合多個斷點,也可以臨時自定義斷點,比如
@include media(">tablet", "<1280px")
如果你覺得感興趣,可以嘗試下Eduardo Bouças和Hugo Giraudel的開源作品@include-media
原文地址:www.v5ant.com/details/PYQ…
?歡迎其他同學分享你們專案中的響應式方案。