響應式布局系統,在現在流行的 CSS 框架中已經非常常見了。它主要由容器類和約定一行列數的柵格系統組成,組成了一個框架的骨架。
在流行的前端框架 Bootstrap 和 Bulma CSS 中,就有體現。像 Bootstrap 的 .container 、 .row 、 .col ;還有 Bulma CSS 的 .container 、 columns 、 column 都是表示這類布局系統。雖然名稱不一樣,但原理都是相同的。
隨著 Flex 布局的普及,幾乎現代的柵格系統的實現都選擇使用這一靈活的布局方式。
現在就來看一下,怎樣實現一個最小的 CSS 響應式布局系統吧。
首先從容器說起。
為了保證實現代碼的簡潔,本文將使用 SCSS 來寫。如果你對 SCSS 還不熟悉,沒有關系,行文中會對使用到的知識點做介紹。
容器
容器主要用來包裹網頁的主要內容,常見效果就是將內容居中地顯示在屏幕中間。
我們使用 .container 來約定容器。
首先,容器是水平居中的,這一塊樣式較為容易:
.container { margin-left: auto; margin-right: auto;}
所謂的響應式容器,就是根據不同的斷點(breakpoints),也就是當前的視口寬度,來決定容器使用的 max-width 值。
這里我們借鑒了 Bootstrap 中對斷點的定義,根據視口寬度,分為以下幾類設備:
[0, 576px)[576px, 768px)[768px, 992px)[992px, 1200px)[1200px, +∞)
針對斷點定義,聲明一個變量 $breakpoints :
$breakpoints: ( // Extra small screen / phone xs: 0, // Small screen / phone sm: 576px, // Medium screen / tablet md: 768px, // Large screen / desktop lg: 992px, // Extra large screen / wide desktop xl: 1200px);
$breakpoints 稱為“列表”,是 SCSS 提供給我們的數據結構。由一個個 key: value 鍵值對組成。上例中的 key 表示的是設備有效范圍的起始點。
不同的設備下,容器有不同的 max-width 值。所以,這里我們再聲明一個表示容器寬度的變量 $container-max-widths :
$container-max-widths: ( xs: none, sm: 540px, md: 720px, lg: 960px, xl: 1140px);
這里的 $container-max-widths 也是個列表,這里的 key 表示某個設備下容器的最大寬度。比如,在超大屏設備下,容器的最大寬度是 1140px ,而在平常手機下,不設置容器的最大寬度,為默認值 none 。
有了實現的思路,接下來就著手實現。
我們就可以借助媒體查詢指令 @media ,依據視口寬度的范圍,給予 .container 不同的 max-width 值。
@each $device, $breakpoint in $breakpoints { @media only screen and (min-width: $breakpoint) { .container { max-width: map-get($container-max-widths, $device); } }}
7 行代碼搞定!
下面解釋下上面的代碼。
我們對列表遍歷,使用的是 @each...in 語法,每一次遍歷取出對應的 key、value,得到當前的 $device 、 $breakpoint 。 map-get 是 SCSS 提供的用來操作列表的方法:根據 key 取出 value。比如,當 $device 值為 xs 的時候, map-get($container-max-widths, $device) 對應值為 none ;當 $device 值為 sm 的時候, map-get($container-max-widths, $device) 對應值為 540px ,以此類推。
@media only screen and (min-width: $breakpoint) { ... }
中包含的代碼,表示從當前設備斷點開始處,應用的 CSS 樣式。 當我們同時按照從小到大的順序設置兩個斷點的媒體查詢時,后者會覆蓋前者的樣式 ,這是實現不同視口下,具有不同寬度容器的核心原理。
接下來,將得到的寬度值賦給容器的 max-width 屬性就可以了。
到現在為止,我們就寫出了一個響應式容器了,我們總攬下代碼:
$breakpoints: ( // Extra small screen / phone xs: 0, // Small screen / phone sm: 576px, // Medium screen / tablet md: 768px, // Large screen / desktop lg: 992px, // Extra large screen / wide desktop xl: 1200px);$container-max-widths: ( xs: none, sm: 540px, md: 720px, lg: 960px, xl: 1140px);.container { margin-left: auto; margin-right: auto;}@each $device, $breakpoint in $breakpoints { @media only screen and (min-width: $breakpoint) { .container { max-width: map-get($container-max-widths, $device); } }}
點擊這里,查看效果。
下面再來介紹 12 列柵格布局。
12 列柵格布局
先使用 Flex 布局,寫一個最簡的等寬布局。
.row { display: flex; .col { flex-grow: 1; flex-basis: 0; }}
沒錯,這就是使用 Flex 布局實現一個等寬布局的所有代碼了。如果不考慮中間的空白行,只需要 7 行代碼。
這里的原理是,我們將所有 Flex 項目的 flex-basis 設置為 0 了,就是說這些 Flex 項目在 grow 或 shrink 之前都沒有寬度,是一樣長的。這樣最終計算出來的主軸空間會平均地分配給了每個 Flex 項目,這樣它們就等寬了。
到這里,我們所寫的這個簡易柵格布局有兩個局限:
1.不能布局非等寬項目。
2.不支持換行。
換行的話很好弄,為 Flex 容器加個 flex-wrap: wrap 就可以了。那怎樣處理“非等寬項目”排列布局呢。
為了能實現非等寬項目的布局,我們的思路是: 禁用 Flex 項目的伸縮特性,使用百分比 width 指定寬度 。
首先,禁用 Flex 項目的伸縮特性,使用到的屬性如下:
flex-shrink: 0;flex-grow: 0;flex-basis: 0;
這三個屬性等價的快捷寫法是:
flex: none;
然后就是使用百分比 width 指定寬度了。
我們實現的是一行最多 12 列的柵格布局。也就是說把一行劃分成 12 列,每一列的寬度大約占總寬度的 8.33% 。我們用 .is-列數 指定一個項目占據的列數:
.is-1
.is-2
.is-3
.is-4
.is-5
.is-6
.is-7
.is-8
.is-9
.is-10
.is-11
.is-12
根據這個規律,我們可以很容易地寫出柵格布局代碼:
$columns: 12;.row { display: flex; .col { flex-grow: 1; flex-basis: 0; @for $i from 1 through 12 { &.is-#{$i} { flex: none; width: percentage($i / 12); } } }}
這里我們使用 @for 指令的 @for $var from <start> through <end>
語法,從 1 遞增到 12,定義了 .is-* 這一系列類名,原理就是我們說過的禁用了 Flex 項目的伸縮特性,指定給它百分比寬度。怎么樣,很簡單吧。
接下來再加上折行( .row.is-multiline
)和 Flex 項目偏移( .is-offset-*
)的支持。
我們總攬下代碼:
$columns: 12;.row { display: flex; &.is-multiline { flex-wrap: wrap; } .col { flex-grow: 1; flex-basis: 0; @for $i from 1 through 12 { &.is-#{$i} { flex: none; width: percentage($i / 12); } &.is-offset-#{$i} { margin-left: percentage($i / 12); } } }}
.is-multiline 是跟隨 .row 一起使用的,得到的就是 flex-wrap: wrap 的效果;項目偏移則借助 margin-left
屬性實現。
到這里,我們的 12 列柵格布局就寫完了 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
毛片精品免费在线观看| 91在线观看免费高清| 国产精品揄拍一区二区| 精品久久久久久久久久| 欧美精品九九久久| www.欧美免费| 国产在线视频欧美| 蜜臀久久99精品久久久久久宅男| 日本高清不卡在线| 91在线中文字幕| 色综合天天狠天天透天天伊人| 色婷婷av一区二区三区久久| 91sao在线观看国产| 国产成人+综合亚洲+天堂| 午夜精品久久久久久久99黑人| 久久全球大尺度高清视频| 亚洲18私人小影院| 久久久久久中文字幕| 亚洲欧洲国产伦综合| 国产精品观看在线亚洲人成网| 欧美亚洲成人免费| 亚洲精品日韩欧美| 国内精品久久久久影院优| 黑人巨大精品欧美一区二区一视频| 日韩一区二区精品视频| 久久国产精品偷| 在线看日韩欧美| 这里只有精品久久| 欧美视频在线免费| 国产午夜精品麻豆| 欧美国产日韩在线| 国产免费一区二区三区在线观看| 欧美在线性爱视频| 福利视频一区二区| 国产欧美日韩中文字幕| 久久久精品国产| 国产精品极品美女粉嫩高清在线| 成人免费福利视频| 亚洲人午夜精品免费| 麻豆国产va免费精品高清在线| 中文字幕亚洲激情| 欧美性猛xxx| 日韩欧美国产网站| 热久久美女精品天天吊色| 在线亚洲国产精品网| 久久综合久久美利坚合众国| 久久久亚洲福利精品午夜| 国产99视频精品免视看7| 欧美极品少妇xxxxⅹ喷水| 国产日产欧美精品| 精品亚洲男同gayvideo网站| 欧美久久久精品| 欧美激情视频网站| 亚洲free嫩bbb| 91精品啪在线观看麻豆免费| 欧美性高潮床叫视频| 国产精品久久久久久久久久99| 亚洲国产精品福利| 欧美wwwxxxx| 国产精品户外野外| 亚洲欧美日韩一区二区三区在线| 亚洲女成人图区| 久久久久国色av免费观看性色| 成人情趣片在线观看免费| 亚洲欧美综合另类中字| 91精品久久久久久久| 亚洲欧洲视频在线| 国产欧美日韩亚洲精品| 成人精品一区二区三区电影黑人| 97在线精品国自产拍中文| 亚洲伊人久久大香线蕉av| 亚洲国产日韩一区| 成人黄色大片在线免费观看| 亚洲成人激情图| 精品毛片三在线观看| 亚洲女人天堂av| 国产精品入口福利| 亚洲国产日韩欧美在线动漫| 精品自在线视频| 这里只有精品视频在线| 国产视频久久久久| 狠狠躁18三区二区一区| 日韩极品精品视频免费观看| 亚洲视频欧洲视频| 亚洲精品理论电影| 亚洲精品中文字幕女同| 91精品视频专区| 精品久久久久久久久久久久久| 欧美日韩亚洲网| 亚洲欧美在线磁力| 欧美理论电影网| 欧洲亚洲女同hd| 亚洲一级黄色片| 欧美日韩激情美女| 欧美激情欧美激情| 久久91亚洲精品中文字幕奶水| 欧美中文字幕精品| 成人97在线观看视频| 97香蕉久久夜色精品国产| 不卡在线观看电视剧完整版| 91精品视频免费看| 日韩高清免费观看| 亚洲欧美精品中文字幕在线| 亚洲女同性videos| 成人激情视频免费在线| 亚洲国产精品字幕| 色先锋资源久久综合5566| 欧美怡红院视频一区二区三区| 欧美激情免费视频| 欧美超级免费视 在线| 中文字幕精品久久| 久久久最新网址| 伊人久久久久久久久久| 成人女保姆的销魂服务| 欧美大片免费观看| 亚洲日本成人网| 欧美日韩精品国产| 国产欧美一区二区三区久久人妖| 亚洲电影免费观看高清| 日韩av影院在线观看| 精品久久久国产| 国产亚洲欧洲高清| 亚洲乱码一区av黑人高潮| 隔壁老王国产在线精品| 久久97久久97精品免视看| 久久久免费精品| 成人黄色短视频在线观看| 午夜精品久久久久久99热| 91沈先生作品| 成人av在线天堂| 亚洲理论片在线观看| 国产精品高清在线| 欧美日韩国产精品一区二区不卡中文| 91久久久久久国产精品| 26uuu另类亚洲欧美日本老年| 欧美成人精品在线播放| 欧美日韩在线第一页| 亚洲第一av网站| 国产精品免费在线免费| 欧美电影免费播放| 成人妇女免费播放久久久| 欧美精品电影在线| 国产伦精品一区二区三区精品视频| 国产精品99免视看9| 精品欧美国产一区二区三区| 国产日本欧美在线观看| 国产欧美一区二区白浆黑人| 久久6精品影院| 欧美日韩亚洲精品一区二区三区| 国产日本欧美一区二区三区在线| 国产精品久久久久国产a级| 欧美巨大黑人极品精男| 久久成人精品一区二区三区| 成人性生交大片免费看小说| 色综合久久88色综合天天看泰| 国产一区二区三区毛片| 在线电影中文日韩| 亚洲成人激情小说| 一个人看的www欧美| 日韩欧美在线免费| 亚洲伊人成综合成人网| 91精品在线看| 国产成人免费91av在线| 一本大道亚洲视频|