最近工做有一個需求是將一個界面改成響應式佈局,因爲UI尚未給設計,因而本身先查了一下資料作了一個demo。其實實現響應式佈局的方式有不少,利用media實現就是其中一種,可是他也有一些缺點,好比說要對特別的屏幕單獨定製樣式代碼。在個人代碼裏面我把屏幕分爲了三種,表明爲iPhone、iPad、PC三種,分別對應着三種不一樣的樣式。css
目前能夠實現:html
- 根據界面大小自動調整佈局
- 界面寬度小到必定程度時會隱藏header,將其放到側拉欄中
效果圖以下(代碼會在下面所有放上來):bootstrap
media簡單來講就是一種查詢工具,加入說你想知道打開你網頁的屏幕寬度是768px的時候才使用這個樣式,這個時候你就能夠這樣寫:工具
@media screen and (max-width:768px){ body{ background-color: black } }
這個代碼的效果就是當前界面的寬度小於768px的時候,將網頁背景變成黑色。screen
是用於電腦屏幕、平板電腦、智能手機等。對於@media的更多媒體類型以下:佈局
值 | 描述 |
---|---|
all | 用於全部設備 |
用於打印機或打印預覽 | |
screen | 用於電腦屏幕、平板電腦、智能手機等 |
speech | 用於屏幕閱讀器等發聲設備 |
在作響應式佈局的時候我主要用到max-width
和min-width
兩種屬性,min-width
的做用於max-width
的做用相反。flex
<link rel="stylesheet" href="./index.css"> <link rel="stylesheet" href="./index_ipad.css" media="screen and (max-width:1200px)"> <link rel="stylesheet" href="./index_mobile.css" media="screen and (max-width:768px)">
由個人代碼能夠得知我將頁面分爲三種大小,分別爲(1200, +∞),(768, 1200),(0, 768),這個分類我是參照bootstrap來分的。ui
首先引入index.css,這也是你的電腦打開時的默認樣式,當你的電腦寬度逐漸減少時,就會開始應用index_ipad.css這個樣式文件,在這個文件中並非將index.css的樣式代碼所有重寫了一遍,而是把須要更改樣式的代碼作了編寫。設計
舉個例子,好比說我index.css中有四個方塊,默認佈局是float佈局,所有排在一行,可是當頁面寬度變爲ipad大小是頁面方塊就會變成兩行,原理是改一下方塊的寬度。具體實現代碼以下:code
/* index.css */ .board { display: flex; align-items: center; justify-content: center; height: 200px; float: left; width: 25%; color: white } .first { background-color: #F44336 } .second { background-color: #E91E63 } .third { background-color: #9C27B0 } .fourth { background-color: #009688 }
/* index_ipad.css */ .first, .second, .third, .fourth { width: 50%; }
側拉欄的原理其實並不難,就是先寫一個div,保持與header元素相同,而後再設置其left屬性,使其隱藏,經過js操做其left,將其顯示出來。htm
<div class="nav"> <ul> <li> <a>第一個</a> </li> <li> <a>第二個</a> </li> <li> <a>第三個</a> </li> </ul> </div>
.nav { position: absolute; z-index: 11; left: -10rem; top: 0; width: 10rem; height: 100%; background: #607D8B; }
window.onload = function() { let btn = document.getElementsByClassName('menu')[0] let nav = document.getElementsByClassName('nav')[0] // 改變側拉欄狀態 btn.addEventListener('click', function() { nav.style.left = nav.style.left == '-10rem' || nav.style.left.length == 0 ? 0 : '-10rem'; }, false); }
<!-- index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>響應式佈局</title> <link rel="stylesheet" href="./index.css"> <link rel="stylesheet" href="./index_ipad.css" media="screen and (max-width:1200px)"> <link rel="stylesheet" href="./index_mobile.css" media="screen and (max-width:768px)"> <script src="./index.js"></script> </head> <body> <div class="nav"> <ul> <li> <a>第一個</a> </li> <li> <a>第二個</a> </li> <li> <a>第三個</a> </li> </ul> </div> <nav> <img src="./img/菜單.png" alt="菜單" class="menu"> <a href="#">第一個</a> <a href="#">第二個</a> <a href="#">第三個</a> </nav> <div> <div class="board first"> 第一個 </div> <div class="board second"> 第二個 </div> <div class="board third"> 第三個 </div> <div class="board fourth"> 第四個 </div> </div> </body> </html>
/* index.css */ .board { display: flex; align-items: center; justify-content: center; height: 200px; float: left; width: 25%; color: white } .first { background-color: #F44336 } .second { background-color: #E91E63 } .third { background-color: #9C27B0 } .fourth { background-color: #009688 } nav { background-color: #607D8B; text-align: right; height: 5vh; display: flex; align-items: center; justify-content: right } a { text-decoration-line: none; color: white; margin-right: 3% } .menu { width: 1.5rem; margin-left: 0px; display: none; cursor: pointer; } ul, li { list-style: none; padding: 0; margin: 0; } .nav { position: absolute; z-index: 11; left: -10rem; top: 0; width: 10rem; height: 100%; background: #607D8B; } .nav { transition: left linear .1s; } .nav a { display: block; padding: 1em 0; border-bottom: 1px solid #888; font-size: 16px; color: #eee; text-align: center; } .nav li { cursor: pointer; }
/* index_mobile.css */ .first, .second, .third, .fourth { float: none; width: 100%; } .menu { display: block; margin-right: 2%; } a { display: none }
/* index_ipad.css */ .first, .second, .third, .fourth { width: 50%; } .menu { display: block; margin-right: 2%; } a { display: none }
//index.js window.onload = function() { let btn = document.getElementsByClassName('menu')[0] let nav = document.getElementsByClassName('nav')[0] btn.addEventListener('click', function() { nav.style.left = nav.style.left == '-10rem' || nav.style.left.length == 0 ? 0 : '-10rem'; }, false); }