咱們的眼睛在看東西時會天然地遵循必定的模式。一般從左上開始,而後從左到右,再從上到下。css
不少網頁都是基於網格設計的,這說明網頁是按列來佈局的。html
響應式網格視圖一般是 12 列,寬度爲100%,在瀏覽器窗口大小調整時會自動伸縮。web
爲何是12列呢,由於12能夠被二、三、四、6整除,能二、三、四、6等分。瀏覽器
CSS.css
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
* {
border: 1px solid red !important;
}
.row{
width:100%;
display: flex;
flex-wrap: wrap;
text-align: center;
}
.col-1{
width:8.3%;
}
.col-2{
width:16.6%;
}
.col-3{
width:25%;
padding: 0.5%;
}
.col-4{
width:33.33%;
}
.col-5{
width:41.66%;
}
.col-6{
width:50%;
}
.col-7{
width:58.33%;
}
.col-8{
width:66.66%;
}
.col-9{
width:75%;
padding: 0.5%;
}
.col-10{
width:83.33%;
}
.col-11{
width:91.66%;
}
.col-12{
width:100%;
}
Html.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1.0">
<title>Title</title>
<link rel="stylesheet" type="text/css" href="CSS.css">
</head>
<body>
<div class="row">
<div class="col-6">6 Columns</div>
<div class="col-6">6 Columns</div>
</div>
<div class="row">
<div class="col-3">3 Columns</div>
<div class="col-3">3 Columns</div>
<div class="col-3">3 Columns</div>
<div class="col-3">3 Columns</div>
</div>
<div class="row">
<div class="col-4">4 Columns</div>
<div class="col-4">4 Columns</div>
<div class="col-4">4 Columns</div>
</div>
</body>
</html>
效果:
viewport 是用戶網頁的可視區域。服務器
手機瀏覽器是把頁面放在一個虛擬的"窗口"(viewport)中,一般這個虛擬的"窗口"(viewport)比屏幕寬,這樣就不用把每一個網頁擠到很小的窗口中(這樣會破壞沒有針對手機瀏覽器優化的網頁的佈局),用戶能夠經過平移和縮放來看網頁的不一樣部分。svg
一個經常使用的針對移動網頁優化過的頁面的 viewport meta 標籤大體以下:佈局
<meta name="viewport" content="width=device-width, initial-scale=1.0">flex
若是不加initial-scale=1.0,有的瀏覽器會在切換到橫屏模式時,仍就保持以前的頁面寬度,並且他們還會使內容只是進行縮放,而沒法自動調整佈局優化
使用 @media 查詢,你能夠針對不一樣的媒體類型定義不一樣的樣式。spa
若是瀏覽器窗口小於 500px, 背景將變爲淺藍色:
@media only screen and (max-width: 500px) {
body {
background-color: lightblue;
}
}
以前咱們使用行和列來製做網頁,它是響應式的,但在小屏幕上並不能友好的展現。
媒體查詢能夠幫咱們解決這個問題。咱們能夠在設計稿的中間添加斷點,不一樣的斷點有不一樣的效果。
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1.0">
<title>Title</title>
<link rel="stylesheet" type="text/css" href="CSS.css">
</head>
<body>
<div class="row">
<div class="box-darkBlue"></div>
<div class="box-blue"></div>
<div class="box-green"></div>
</div>
</body>
</html>
css:
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
html,body{
margin: 0;
padding: 0;
}
.row{
display: flex;
flex-wrap: wrap;
}
div{
width: 100%;
min-height: 150px;
}
.box-darkBlue{
background-color: darkblue;
}
.box-blue{
background-color: blue;
}
.box-green{
background-color: green;
}
@media only screen and (min-width: 500px){
.box-darkBlue{
width: 25%;}
.box-blue{
width: 75%;}
}
@media only screen and (min-width: 850px){
.box-darkBlue,.box-green{
width: 25%;
}
.box-blue{
width: 50%;
}
}
與掉落列模型很是類似,但更像網格系統。
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1.0">
<title>Title</title>
<link rel="stylesheet" type="text/css" href="CSS.css">
</head>
<body>
<div class="row">
<div class="box-darkBlue"></div>
<div class="box-blue"></div>
<div class="box-green"></div>
<div class="box-red"></div>
<div class="box-orange"></div>
</div>
</body>
</html>
css:
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
html,body{
margin: 0;
padding: 0;
}
.row{
display: flex;
flex-wrap: wrap;
}
div{
width: 100%;
min-height: 150px;
}
.box-darkBlue{
background-color: darkblue;
}
.box-blue{
background-color: blue;
}
.box-green{
background-color: green;
}
.box-red{
background-color:red;
}
.box-orange{
background-color: orange;
}
@media only screen and (min-width: 500px) {
.box-blue, .box-green {
width: 50%;
}
}
@media only screen and (min-width: 650px){
.box-darkBlue,.box-blue{
width: 50%;
}
.box-green,.box-red,.box-orange{
width: 33.333333%;
}
}
@media only screen and (min-width: 850px){
.row{
width: 800px;
margin-left: auto;
margin-right: auto;
}
}
活動佈局應該是最靈活的響應式模型了,它的佈局方式並非單純的重排到其餘列的下列,咱們能夠利用css順序屬性。
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1.0">
<title>Title</title>
<link rel="stylesheet" type="text/css" href="CSS.css">
</head>
<body>
<div class="row">
<div class="box-darkBlue"></div>
<div class="row2">
<div class="box-blue"></div>
<div class="box-green"></div>
</div>
<div class="box-red"></div>
</div>
</body>
</html>
css:
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
html,body{
margin: 0;
padding: 0;
}
.row{
display: flex;
flex-wrap: wrap;
}
div{
width: 100%;
min-height: 150px;
}
.box-darkBlue{
background-color: darkblue;
}
.box-blue{
background-color: blue;
}
.box-green{
background-color: green;
}
.box-red{
background-color:red;
}
.box-orange{
background-color: orange;
}
@media only screen and (min-width: 500px) {
.box-darkBlue{
width: 50%;
}
.row2{
width: 50%;
}
}
@media only screen and (min-width: 850px){
.box-red{
width: 25%;
order: -1;
}
.row2{
width: 50%;
}
.box-darkBlue{
width: 25%;
order: 1;
}
}
在畫布溢出模型中,內容並非豎直堆放的,而是將不經常使用的內容,好比導航欄或者應用菜單,放在屏幕之外,只有當屏幕足夠大的時候,才顯示出來。
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1.0">
<title>Title</title>
<link rel="stylesheet" type="text/css" href="CSS.css">
</head>
<body>
<nav id="drawer" class="dark-blue">
</nav>
<main clss="light-blue">
<a id="menu">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M2 6h20v3H2zm0 5h20v3H2zm0 5h20v3H2z"></path>
</svg>
</a>
</main>
<script> /* * 單擊菜單圖標時打開抽屜. */
var menu = document.querySelector('#menu');
var main = document.querySelector('main');
var drawer = document.querySelector('#drawer');
menu.addEventListener('click', function(e) {
drawer.classList.toggle('open');
e.stopPropagation(); });
main.addEventListener('click', function() {
drawer.classList.remove('open'); });
</script>
</body>
</html>
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
html,body,main{
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
nav,main{
padding: 1em;
}
.dark-blue{
background-color: darkblue;
}
main{
background-color: lightblue;
}
a#menu svg{
width: 40px;
fill: #000;
}
nav{
width: 300px;
height: 100%;
position: absolute;
transform:translate(-300px.0);
-webkit-transform: translate(-300px, 0);
transition: transform 0.3s ease;
}
nav.open{
transform: translate(0,0);
-webkit-transform: translate(0, 0);
}
/* 若是有足夠的空間(>600 px),咱們老是把抽屜打開。*/
@media (min-width: 600px) {
/* 咱們打開抽屜. */
nav{
position:relative;
-webkit-transform: translate(0, 0);
transform: translate(0, 0);
}
/* 咱們在父服務器上使用 Flexbox. */
body {
display: -webkit-flex;
display: flex;
-webkit-flex-flow: row nowrap;
flex-flow: row nowrap;
}
main {
width: auto;
/* flex-grow 主要內容填充全部可用空間。 */
flex-grow: 1;
}
main > #menu:after {
content: '若是寬度超過 600px,抽屜就會保持打開狀態。';
}
未改進
body {
margin: 0;
}
img {
float: left;
改進:
body {
margin: 0;
}
img {
float: left;
margin-right: 10px;
width: calc((100% - 20px)/3);
}
img:last-of-type{
margin-right: 0;
}
當你設置行內元素height:100%時,你必須使body、框內元素的height爲100%,多麼麻煩。
你能夠直接設置 100vh,1個vh表明着1%的視圖高度。
同理,1vw是1%的視圖寬度。
高度和寬度能夠設置 vmin單位使視圖區域最小化,vmax使視圖區域最大化。