因為有機會參與一個項目的早期設(shè)計,因此搭建的時候不可避免的遇到了如何滿足響應(yīng)式的問題。翻閱了《響應(yīng)式Web設(shè)計:HTML5和CSS3實踐》和《Implementing Responsive Design》并記錄了篇筆記,以供參考,另一本書的筆記以及在項目開發(fā)中的一些心得后續(xù)會補上,因為筆記在不斷更新和完善中,如果有紕漏還請幫忙指正。
筆記參考自《響應(yīng)式Web設(shè)計:HTML5和CSS3實踐》,2013年出版內(nèi)容說不上最新。如下是全書的章的目錄:
- 第 1 章,HTML5、CSS3 及響應(yīng)式設(shè)計入門
- 第 2 章,媒體查詢
- 第 3 章,擁抱流式布局
- 第 4 章,響應(yīng)式設(shè)計中的 HTML5
- 第 5 章,CSS3
- 第 6 章,用 CSS3 創(chuàng)造令人驚艷的美
- 第 7 章,CSS3 的過渡、變形和動畫
- 第 8 章,用 HTML5 和 CSS3 征服表單
- 第 9 章,解決跨瀏覽器問題
第1章 HTML5、CSS3 及響應(yīng)式設(shè)計入門
一些要點:
人們通過手機瀏覽網(wǎng)頁的比率在上升。手機瀏覽器瀏覽網(wǎng)頁時,會讓網(wǎng)頁縮小至可視區(qū)域(“視口”),使用者可以對感興趣的內(nèi)容再單獨放大。但是反復(fù)縮小、放大、點錯位置終究不是友好的做法。
預(yù)算充足的情況下,我們可以單獨開發(fā)“手機版”網(wǎng)站,可以在其中增強一些功能,譬如根據(jù)當(dāng)前GPS來挖掘出有價值數(shù)據(jù)。多數(shù)時候,根據(jù)視口大小來匹配不同的視覺效果還是優(yōu)先選擇。
響應(yīng)式設(shè)計的概念最早提出是指將彈性網(wǎng)格布局、彈性圖片、媒體和媒體查詢結(jié)合起來的網(wǎng)頁開發(fā)技巧的結(jié)合。和以往的做法不同,我們推薦首先對小屏幕進(jìn)行設(shè)計,然后逐漸增強針對大屏幕的設(shè)計和內(nèi)容。
全方位的測試響應(yīng)式網(wǎng)站,只需要改變?yōu)g覽器窗口大小就能完成大多數(shù)測試。當(dāng)然你可以下載瀏覽器的插件來做到這些,比如Chrome上可以用WindowResizer插件。
-
一些響應(yīng)式開發(fā)的站點
使用HTML5和CSS3能使前端的效果實現(xiàn)變得簡單很多,但是也面臨著瀏覽器不支持的問題。我們可以用一些現(xiàn)代化的工具(庫)來修補它們。
重申一點,預(yù)算允許條件下完全定制的移動Web開發(fā)比響應(yīng)式網(wǎng)站開發(fā)更合適,但預(yù)算有限的前提下響應(yīng)式Web設(shè)計較之標(biāo)準(zhǔn)的固定寬度設(shè)計,總是能夠提供更好的用戶體驗。
第2章 媒體查詢:支持不同的視口
關(guān)于媒體查詢
- 開始使用媒體查詢吧,它已經(jīng)被如此廣泛地使用和被瀏覽器所支持。
- 有了媒體查詢,我們就能對設(shè)備特性(如視口寬度)設(shè)置特定的CSS樣式。
- 媒體查詢的語法(可以拷貝如下代碼到任意CSS的文件后面,然后預(yù)覽相關(guān)網(wǎng)頁的效果)。
body {
background-color: grey;
}
@media screen and (max-width: 960px) {
body {
background-color: red;
}
}
@media screen and (max-width: 768px) {
body {
background-color: orange;
}
}
@media screen and (max-width: 550px) {
body {
background-color: yellow;
}
}
@media screen and (max-width: 320px) {
body {
background-color: green;
}
}
-
在CSS2中可以通過制定<link>標(biāo)簽的media屬性來為樣式表指定的設(shè)備類型(如顯示屏或者打印機)。
<link rel="stylesheet" type="text/css" media="screen" href="screen-styles.css">
-
媒體查詢則不僅是針對設(shè)備類型,還能根據(jù)設(shè)備的特性來應(yīng)用樣式,如下例為檢測一塊縱向放置的顯示屏。
<link rel="stylesheet" media="screen and (orientation: portrait)" href="portrait- screen.css" />
-
你甚至可以在檢測中加上not來顛倒上例中的查詢條件。
<link rel="stylesheet" media="not screen and (orientation: portrait)" href="portrait- screen.css" />
-
也可以將多個表達(dá)式組合在一起,如下為增加了視口寬度大于800的顯示屏。
<link rel="stylesheet" media="screen and (orientation: portrait) and (min-width: 800px)" href="800wide-portrait-screen.css" />
-
更進(jìn)一步還可以寫一個媒體查詢列表,相互之間用逗號隔開,任何一個條件滿足就加載文件。
<link rel="stylesheet" media="screen and (orientation: portrait) and (min-width: 800px), projection" href="800wide-portrait-screen.css" />
-
除了在<head></head>中鏈接CSS文件時候使用媒體查詢,我們也可以在CSS文件中使用媒體查詢。
@media screen and (max-device-width: 400px) { h1 { color: green } }
-
還可以在CSS中使用@import指令引入其他的樣式表,謹(jǐn)慎使用這種方式,因為它會增加HTTP的請求從而導(dǎo)致網(wǎng)頁加載速度變慢。
@import url("phone.css") screen and (max-width:360px);
-
媒體查詢能使用的特性
媒體查詢中最常用的兩個特性是視口寬度width和屏幕寬度device-width,除此以外還有orientation、aspect-ratio等特性可以檢測到。這些特性幾乎都可以結(jié)合max和min結(jié)合來創(chuàng)建一個使用范圍。如下phone.css只有在視口寬度在200到300之間才會被引入:
@import url("phone.css") screen and (min-width:200px) and (max-width:360px);
-
如何用媒體查詢來改造我們的設(shè)計
CSS名為層疊樣式表,意為后面的樣式會覆蓋前面的相同的樣式,因此我們的做法是在前面設(shè)置通用的樣式,然后用媒體查詢來進(jìn)一步重寫相應(yīng)部分。
-
加載媒體查詢的最佳方法
瀏覽器雖然能忽略與自身不匹配的樣式文件,但卻不一定不下載這些文件。因此,你將樣式文件拆分到不用的樣式文件沒有太大好處(個人喜好或者方便代碼組織的目的除外),這會增加頁面請求HTTP的數(shù)量。因此建議用如下的方式在已有的樣式表中追加媒體查詢樣式。
@media screen and (max-width: 768px) {/*樣式*/}
我們的第一個響應(yīng)式設(shè)計
不管如何開始動手做一個響應(yīng)式設(shè)計的頁面吧。這個網(wǎng)站的主題是關(guān)于電影,該書作者的初衷是這樣的“我打算自己弄一個And the winner isn't的網(wǎng)站,褒獎哪些本應(yīng)該獲獎的電影,批評那些不應(yīng)該獲獎的電影。這里還能視頻剪輯、經(jīng)典語錄、電影海報,以及證明我沒錯的在線調(diào)查”。
1. 從固定寬度設(shè)計開始
雖然理論上是從移動(小屏幕)的體驗出發(fā)開始設(shè)計,但現(xiàn)實中更多的還是將桌面版網(wǎng)頁設(shè)計改成響應(yīng)式的。既然目前和將來相當(dāng)一段時間內(nèi)我們都是這么做,我們還是從固定寬度開始。如下是一個固寬度的界面原型,包含了頭部、導(dǎo)航、邊欄、內(nèi)容區(qū)和頁腳。
在此我們先測驗一下HTML4標(biāo)簽來測驗我們的媒體查詢技巧。如下為HTML4便攜的沒有實際內(nèi)容的基本頁面結(jié)構(gòu)。
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>And the winner isn't</title>
<link href="css/main.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="wrapper">
<!-- the header and navigation -->
<div id="header">
<div id="navigation">
<ul>
<li><a href="#">navigation1</a></li>
<li><a href="#">navigation2</a></li>
</ul>
</div>
</div>
<!-- the sidebar -->
<div id="sidebar">
<p>here is the sidebar</p>
</div>
<!-- the content -->
<div id="content">
<p>here is the content</p>
</div>
<!-- the footer -->
<div id="footer">
<p>Here is the footer</p>
</div>
</div>
</body>
</html>
然后我們?yōu)楦鱾€模塊加入了一些基本的樣式。
css/main.css
#wrapper {
margin-right: auto;
margin-left: auto;
width: 960px;
}
#header {
margin-right: 10px;
margin-left: 10px;
width: 940px;
background-color: #779307;
}
#navigation ul li {
display: inline-block;
}
#sidebar {
margin-right: 10px;
margin-left: 10px;
float: left;
background-color: #fe9c00;
width: 220px;
}
#content {
margin-right: 10px;
float: right;
margin-left: 10px;
width: 700px;
background-color: #dedede;
}
#footer {
margin-right: 10px;
margin-left: 10px;
clear: both;
background-color: #663300;
width: 940px;
}
在一個視口大于960的瀏覽器中,頁面的瀏覽效果如下。
2. 響應(yīng)式設(shè)計中圖片應(yīng)該盡可能保持精簡
為了更好的體現(xiàn)固定寬度的設(shè)計在視口大小變化時的存在的問題,作者對網(wǎng)頁內(nèi)容進(jìn)行了美化。遺憾的是作者并沒有將它放置到Github上,得要我們自己到 andthewinnerisnt 上把網(wǎng)頁內(nèi)容保存,然后將還未講解到的特性等刪除,以方便按順序來閱讀和增強代碼。這里可能需要稍微花費一點時間,因為很多寫法都已經(jīng)是優(yōu)化后的了。為了繼續(xù)前進(jìn),簡單整理后頁面效果如下(跟作者網(wǎng)站沒太大區(qū)別):
有兩點是需要了解的。
-
使用到的圖片應(yīng)該盡可能小。
不論是否是響應(yīng)式Web設(shè)計,都應(yīng)該盡可能減少圖片的大小,頭部和底部的小彩旗就是通過背景圖片的repeat-x來呈現(xiàn)的。
-
關(guān)于重置樣式。
各種瀏覽器渲染HTML時會有各種默認(rèn)樣式,為了統(tǒng)一表現(xiàn)我們通常會導(dǎo)入重置樣式在主樣式文件的開頭。對于HTML5,normalize.css就是不錯的選擇。
你可以網(wǎng)頁窗口拉伸到小于960像素,會看到內(nèi)容被截斷了。同樣你可以在手機上訪問,想像一下網(wǎng)頁內(nèi)容在手機上會被截斷成什么樣(開發(fā)過程中你可以起個server讓后通過手機訪問頁面; 但是如前面章節(jié)提到的,可以簡單地用Chrome的插件(個人因為在公司所有的Chrome插件都被禁用了,所以干脆使用Chrome自帶的模擬器來模擬,但是這個模擬器并不好用,頁面上進(jìn)行了分辨率設(shè)置以后要反復(fù)toggle幾次emulate mobile選項才生效。嗯,如果有條件不嫌麻煩就整個真正的移動設(shè)備模擬器吧)。如下圖,在Chrome的進(jìn)行如下設(shè)置。
你會發(fā)現(xiàn)獲取得到的效果居然還不錯,那是因為瀏覽器默認(rèn)在一定分辨率下渲染頁面,然后將網(wǎng)頁內(nèi)容縮小到了?與視口大小匹配。下一節(jié)會介紹如何阻止瀏覽器自動調(diào)整頁面大小。
3. 阻止移動瀏覽器自動調(diào)整大小
IOS和Android的瀏覽器都是基于WebKit核心,這兩種瀏覽器以及其他很多瀏覽器都支持用viewport meta來覆蓋默認(rèn)的畫布縮放設(shè)置。
下面是一個將畫布大小放大到實際尺寸兩倍的示例:
<meta name="viewport" content="initial-scale=2.0,width=device-width, maximum-scale=3, minimum-scale= 0.5" />
在模擬器中加載該頁面可以看到如下效果,夸張的效果已經(jīng)說明了問題。initial-scale=2.0的意思是將頁面放大n(n=2.0)倍。device-width同時告訴瀏覽器寬度應(yīng)該等于設(shè)備寬度。maximum-scale和minimum-scale還可以用來控制頁面的可縮放范圍。
你甚至可以禁止用戶縮放,不過因為縮放是一個很重要的輔助功能,在實踐中很少使用。
meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
下面是我們最終使用的meta標(biāo)簽。
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
關(guān)于initial-scale要特別說明下,width=device-width設(shè)置以后瀏覽器的寬度跟媒體視口一致,經(jīng)過了initial-scale=1.0的設(shè)定以后,呈現(xiàn)的內(nèi)容大小就是設(shè)定的原始內(nèi)容大小,而不要瀏覽器替你收縮(這是我們進(jìn)行包含了移動端響應(yīng)式設(shè)計的前置條件)。
拋出另一個問題,在模擬器中當(dāng)我們設(shè)置initial-scale2.0的時候,inspect element內(nèi)容區(qū)域比如#header大小仍舊是960px,為什么不是960*2。只需要假定我們使用了一個類放大鏡的之類的東西導(dǎo)致看到的內(nèi)容變大了。
4. 針對不同的視口寬度修正設(shè)計
我們首先為豎屏的iPad3/4增加媒體查詢,同樣因為Chrome模擬器不支持豎屏設(shè)置,我們就手動設(shè)置好了。如下為模擬器設(shè)置和沒有進(jìn)行媒體查詢的效果。
然后我們可以增加媒體查詢和樣式設(shè)置,可以看看效果。
@media screen and (max-width: 768px) {
#wrapper {
width: 768px;
}
#header, #footer, #navigation {
width: 748px;
}
}
顯示還是有一些問題,我們可以繼續(xù)優(yōu)化,如下應(yīng)用以后sidebar和content都填滿了寬度。
@media screen and (max-width: 768px) {
#wrapper {
width: 768px;
}
#header,#footer,#navigation {
width: 748px;
}
#content,#sidebar {
padding-right: 10px;
padding-left: 10px;
width: 728px;
}
}
5. 響應(yīng)式設(shè)計中內(nèi)容始終優(yōu)先
一個設(shè)計原則是,盡可能在多平臺多視口下保留盡可能多的內(nèi)容,而不是使用display:none等類似的方法來隱藏部分內(nèi)容。同時你要意識到內(nèi)容順序的重要性,目前頁面中側(cè)邊欄和主內(nèi)容區(qū)的順序決定了側(cè)邊欄會顯示在主內(nèi)容區(qū)前面,在窄視口設(shè)備下,用戶先看到主內(nèi)容再看到側(cè)邊欄顯然更加合理。因此我們將#content和#siderbar進(jìn)行互換。雖然標(biāo)簽換了位置,但頁面在大視口下沒有變化,但是在iPad上變成了首先顯示主內(nèi)容區(qū),下面才是側(cè)邊欄。
在調(diào)整好標(biāo)簽位置以后,我們還可以追加一些樣式,使在iPad上的顯示更加美觀。
@media screen and (max-width: 768px) {
#wrapper,#header,#footer,#navigation {
width: 768px;
margin: 0px;
}
#logo {
text-align:center;
}
#navigation {
text-align: center;
background-image: none;
border-top-color: #bfbfbf;
border-top-style: double;
border-top-width: 4px;
padding-top: 20px;
}
#navigation ul li a {
background-color: #dedede;
line-height: 60px;
font-size: 40px;
}
#content, #sidebar {
margin-top: 20px;
padding-right: 10px;
padding-left: 10px;
width: 728px;
}
.oscarMain {
margin-right: 30px;
margin-top: 0px;
width: 150px;
height: 394px;
}
#sidebar {
border-right: none;
border-top: 2px solid #e8e8e8;
padding-top: 20px;
margin-bottom: 20px;
}
.sideBlock {
width: 46%;
float: left;
}
.overHyped {
margin-top: 0px;
margin-left: 50px;
}
}
6. 媒體查詢只是響應(yīng)式開發(fā)的必要條件之一
盡管我們針對iPad上做了媒體查詢和樣式設(shè)置,網(wǎng)站在低分辨率上的iPhone的視口上顯示的仍舊很糟糕。我們雖然使用媒體查詢對視口寬度小于768像素應(yīng)用了樣式,但是介于768到960像素之間的設(shè)備,則沒有對應(yīng)的媒體查詢代碼,內(nèi)容因此會被剪切掉。
目前的情形是,我們針對特定的斷點設(shè)置了媒體查詢?nèi)缓笫共季职l(fā)生變化,但是捕捉到下一個視口斷點之前,頁面靜止不變。我們需要更好的策略,能夠在斷點導(dǎo)致的效果突變之前保持伸縮。如何做到這點,正是下一章的內(nèi)容:將呆板的固定布局修改成靈活的流動布局。
第3章 擁抱流式布局
1. 為什么固定布局經(jīng)不起考驗
我們使用固定布局,當(dāng)不同的視口出現(xiàn)的時候,你可以單獨增加媒體檢測,但未來會有更多大小不一的視口出現(xiàn)。
2. 為什么響應(yīng)式布局需要百分比設(shè)計
使用百分比布局創(chuàng)建流動的彈性界面,同時使用媒體查詢來限制元素的變動訪問,將這兩者組合一起構(gòu)成了響應(yīng)式設(shè)計的核心,基于此可以真正創(chuàng)造出真正完美的設(shè)計。
3. 將網(wǎng)頁從固定布局修改為百分比布局
在可預(yù)見的未來,我們的網(wǎng)頁制作都是基于設(shè)計圖的度量元素的大小、外邊距來寫CSS代碼。我們該如何將固定尺寸轉(zhuǎn)換為相對尺寸呢?
3.1 需要牢記的公式
目標(biāo)元素寬度 / 上下文元素寬度 = 百分比寬度
3.2 設(shè)置百分比元素的上下文
在我們的例子中,#wrapper是內(nèi)容區(qū)、側(cè)邊欄、頁腳設(shè)定寬度的上下文,我們需要給他們設(shè)定百分比值。當(dāng)然你也可以給#wrapper設(shè)定一個百分比,對于#wrapper而言,百分比是相對于視口尺寸而言的。
我們先來看看頭部,#header(目標(biāo)元素)寬度為940像素,#wrapper(上下文元素)寬度為940像素。按照計算公司得到的結(jié)果是0.979166667,設(shè)置到CSS中是:
width: 97.9166667%; /* 940 ÷ 960 */
同樣的設(shè)置可以被應(yīng)用到#navigation和#footer中。
再來看#content和#sidebar,比如我自己改寫的例子中#content的寬度為666像素,#siderbar為220個像素,計算得到百分比分別為:666/960*100=69.375%和(220-2)/960*100%=22.708333333333332%(2像素為border-right的值)。
接下來繼續(xù)使用,將頁面各處10像素的內(nèi)邊距、外邊距也替換為等價的百分比,所有這些間距都是基于960像素的上下文,替換成對應(yīng)的百分比就是:1.0416667%(10/960)。
3.3 必須時刻牢記上下文
一個需要注意的問題是百分比設(shè)置的上下文,在該書的例子中的導(dǎo)航欄中有ul>li>a的結(jié)構(gòu),我們給a設(shè)定了margin-right:25px來控制導(dǎo)航元素之間的間距。但是使用上述的公式將固定限速設(shè)置為百分比后發(fā)現(xiàn)并不起作用。因沒有為li設(shè)定寬度,子節(jié)點a找不到上下文的寬度。對此解決辦法有很多,其中一種是直接將margi-right屬性設(shè)置到li上來,以為內(nèi)ul是有設(shè)置寬度的。
3.4 用em換成px
最初設(shè)計師們使用em是因為在老版本的Internet Explorer無法縮放像素單位的文字。但現(xiàn)代瀏覽器早就支持了,那么用em替代px還有什么優(yōu)越性呢。有兩點理由:
(1)那:wq些使用Internet Explorer的用戶也能夠縮放文字
(2)這樣做使設(shè)計師們的工作變得更加簡單
em的實際大小是相對于上下文字體大小而言的,如果我們給body標(biāo)簽設(shè)置的文字大小是100%,給其他的文字都使用相對單位em,那么這些字體都會受到body上的初始聲明的影響。這樣做的好處是,如果完成了所有文字排版以后客戶提出希望把字體整體調(diào)大一些,那么我們只需要修改body的文字大小其他所有文字都會相應(yīng)變化。
同樣,目標(biāo)元素尺寸 / 上下文元素尺寸 = 百分比尺寸
這個公式也適用于將文字的像素單位轉(zhuǎn)換為相對單位。現(xiàn)代瀏覽器的默認(rèn)字體大小都是16像素(作者疏漏了還是過時了明明是14好么),因此一開始給body標(biāo)簽應(yīng)用如下任何一條規(guī)則都是一樣的效果:
font-size: 16px;
font-size: 100%;
font-size: 1em;
舉一個例子,我們?yōu)闉榫W(wǎng)站標(biāo)題設(shè)置了如下樣式:
#logo {
display: block;
padding-top: 75px;
color: #0d0c0c;
text-transform: uppercase;
font-family: Arial, "Lucida Grande", Verdana, sans-serif font-size: 48px;
}
#logo span {
color: #dfdada;
}
因為48/16=3,我們可以對字體大小進(jìn)行改動:
font-size: 3em; /* 48 ÷ 16 = 3*/
如果應(yīng)用這個規(guī)則除了毛病,通常是目標(biāo)元素的上下文發(fā)生了變化,以頁面中的標(biāo)簽為例:
<h1>Every year <span>when I watch the Oscars I'm annoyed...</span></h1>
修改后的相對單位樣式如下:
#content h1 {
font-family: Arial, Helvetica, Verdana, sans-serif; text-transform: uppercase;
font-size: 4.3125em; /* 69 ÷ 16 */
}
#content h1 span {
display: block;
line-height: 1.052631579em; /* 40 ÷ 38 */
color: #757474;
font-size: .550724638em; /* 38 ÷ 69 */
}
可以看到,span的元素大小是相對于其父元素的文字的大小,而它的行高是相對于文字本身的大小。
3.5 彈性圖片
現(xiàn)代瀏覽器下要實現(xiàn)圖片隨著流動布局相應(yīng)縮放大小只需要在CSS中做如下聲明:
img {
max-width: 100%;
}
也可以把這個技術(shù)應(yīng)用到其他多媒體標(biāo)簽上:
img,object,video,embed {
max-width: 100%;
}
但我們也面臨著一個問題,不論多大的視口都要下載同一張圖片(當(dāng)然是一張為了兼容大視口的大圖片)未免有些浪費寬帶。
讓圖片隨視口縮放
將奧斯卡圖像的固定寬高刪掉,并設(shè)置一個百分比,然后可以拉伸頁面試一把效果。
.oscarMain {
float: left;
margin-top: -28px;
width: 28.9398281%; /* 202 ÷ 698 */
}
給彈性圖片設(shè)置閾值
當(dāng)我們把窗口超過一定分辨率時,圖片也被拉拉大了,我們可以追加一個特定樣式來為圖片設(shè)定閾值。
.oscarMain {
float: left;
margin-top: -28px;
width: 28.9398281%; /* 698 ÷ 202 */
max-width: 202px;
}
超級全能的max-width屬性
另一種限制頁面無限擴展的方法是給最外層的#wrapper增加max-width屬性(有使用過Bootstrap的應(yīng)該不會陌生),如下所示:
#wrapper {
margin-right: auto;
margin-left: auto;
width: 96%; /* Holding outermost DIV */
max-width: 1414px;
}
這意味著也頁面會縮放至視的96%,但絕不會超過1414像素寬。
3.6 為不同的屏幕尺寸提供不同的圖片
跟目前工作關(guān)聯(lián)不大,暫且跳過。
作者推薦了Matt Wilco的做法,大致思路是由服務(wù)器端去生成各種尺寸的圖片,并且根據(jù)客戶端發(fā)送過來的關(guān)于resolution大小的信息來決定返回什么尺寸的圖片。
3.7 流動布局和媒體查詢的默契配合
本章前面,我們的導(dǎo)航鏈接在特定的視口寬度下會折成兩行,我們可以使用媒體查詢來修正這個問題。
@media screen and (min-width: 1001px) and (max-width: 1080px) {
#navigation ul li a { font-size: 1.4em; }
}
@media screen and (min-width: 805px) and (max-width: 1000px) {
#navigation ul li a { font-size: 1.25em; }
}
@media screen and (min-width: 769px) and (max-width: 804px) {
#navigation ul li a { font-size: 1.1em; }
}
媒體查詢約束流動布局的變動范圍,而流動布局則簡化了從一組媒體查詢樣式過渡到另一組的過渡過程。
3.8 CSS網(wǎng)格系統(tǒng)
該章節(jié)介紹了比較流行的幾種網(wǎng)格系統(tǒng),并用其中一種實現(xiàn)了我們之前所繪的頁面。因為閱讀這本書的時候,Bootstrap已經(jīng)大行其道并前端開發(fā)者所熟知了,就不贅述該書的示例了。但是有一點要注意,Bootstrap這樣的網(wǎng)格系統(tǒng)為我們提供了通過比如cols-md-*等樣式提供了寬度、字體大小等的預(yù)設(shè),但在要求嚴(yán)格按照設(shè)計實現(xiàn)界面的情況下,我們還是要自己來設(shè)置它們。
第4章 響應(yīng)式設(shè)計中的HTML5
本章概覽式地介紹了一些HTML5相關(guān)知識,更多偏向概念和引導(dǎo)性,操作性不強。
大多數(shù)網(wǎng)站可以采用HTML5來編寫。
polyfill腳本:通常指的是一段能給老版本瀏覽帶來新特性的JavaScript代碼。
Modernizr是一個很常用的相對polyfill更加增強了的腳本庫。
時間緊迫可以考慮使用HTML5樣板文件。里面包含了基本樣式normalize.css、polyfill和一些必要的工具如Modernizr。
前端開發(fā)工具基本都包含了迅速生成基本文件的功能,這里只稍微對比一下兩個lang和charset的含義:lang="en"指的是語言,比如中文、英文;<meta charset="UTF-8">指的是字符集,可用的類型可就多了只對中文這種語言就有很多種字符集可用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
</body>
</html>
HTML5的標(biāo)簽是可以簡略地書寫的,并且一些不符合XHTML1.0的寫法也不會有任何問題,但我們還是推薦盡可能標(biāo)準(zhǔn)的方式來書寫HTML代碼,并且盡可能找到一個平衡:類似于<link>的type屬性可以省略,但標(biāo)簽要記得閉合并且給屬性加上引號。
有一些標(biāo)簽在HTML5中被廢棄了,你也許很多都沒有用到過,但是記住要盡可能采用CSS的方式來實現(xiàn)效果,而不是之前的在標(biāo)簽上加屬性的方式。
-
HTML5增加了一些全新的語義化元素,為什么語義化很重要,因為在以前的做法中我們通過給div家id和class能夠讓其他人在閱讀代碼的時候很好地理解代碼,但是對機器而言就不那么簡單了。HTMl5旨在用全新的語義化標(biāo)簽來解決這個問題。如下是一些語義化標(biāo)簽的列表(不打算詳細(xì)記錄,那樣也沒有意義):
- section
- nav
- article
- aside
- hgroup
- header
- footer
- address
HTML5的很多容器都有自己獨立的大綱結(jié)構(gòu),這意味著你不用總是去想現(xiàn)在是幾級標(biāo)題,不同父級容器會給不同的標(biāo)題相應(yīng)的大小樣式,你只需要在容器中任意使用就好。
有一些網(wǎng)頁工具可以用來測試生成的網(wǎng)頁的大綱結(jié)構(gòu)(個人認(rèn)為對于排版不佳、長久未讀的代碼還是有些幫助的)。
可以嘗試著把之前自己構(gòu)建的網(wǎng)頁的元素替換成header、nav、footer,然后修改對應(yīng)的css中的選擇器。
HTMl5中的文本語義級元素如b, em, i以前會是用來添加文本樣式的并且不推薦為了做樣式而使用它們,但是現(xiàn)在通常有了新的語義可以自己查詢看,不贅述。
遵循WAI-ARIA是指無障礙網(wǎng)頁應(yīng)用技術(shù),來讓殘障人士能夠訪問網(wǎng)頁中的動態(tài)內(nèi)容,實現(xiàn)這些技術(shù)包含的內(nèi)容有很多,這里只簡單提一下會用到的一些,比如地標(biāo)角色landmark role(也就是在很多頁面中看到的role="navigation/application/banner/form"等)可以讓屏幕閱讀器在不同的頁面區(qū)塊之間輕松跳轉(zhuǎn)。
Apple公司拒絕在IOS設(shè)備上支持Flash的時候極大的促進(jìn)了HTMl5的發(fā)展。
-
使用HTML5方法為頁面添加視頻或者音頻
- 因為早起瀏覽器內(nèi)置視頻格式的爭議,目前很多瀏覽器支持的不同的格式的視頻或音頻,為了解決這個問題我們可能會為這個視頻或音頻創(chuàng)建多個版本,并都嵌套在video標(biāo)簽中。
- 為了給IE8以及更低版本的瀏覽器提供備用方案,你可能還需要追加一個Flash甚至媒體文件的下載鏈接。
- audio和video的標(biāo)簽用法基本一致。
-
響應(yīng)式視頻
- 給視頻設(shè)置固定寬高,當(dāng)頁面被拉伸的時候,似乎就不怎么響應(yīng)式了,你可以就本書的例子或者W3C上找一個例子試一試。通過給視頻設(shè)置max-width: 100%的方法能夠解決這個問題(本書前面章節(jié)針對圖片有提到過這個解決方案)。
-
離線Web應(yīng)用
- 對于一些應(yīng)用需要在離線狀態(tài)下能夠正常使用。比如一個筆記應(yīng)用,當(dāng)用戶的手機網(wǎng)絡(luò)斷開時,可能正在編輯一篇筆記,通過使用Web離線功能他就能夠繼續(xù)編輯筆記,等到網(wǎng)絡(luò)連接上的時候再把內(nèi)容同步到網(wǎng)絡(luò)上。
- HTML5離線應(yīng)用的運行機制是:為每個需要離線使用的網(wǎng)頁都制定一個.mainfest文件,這個文件羅列了該網(wǎng)頁離線使用時所需要的的所有資源文件。支持離線Web應(yīng)用的瀏覽器會自動讀取.mainfest文件,下載所羅列的資源列表并緩存至本地以備網(wǎng)絡(luò)斷開時使用。
第6章 用CSS3創(chuàng)造令人驚艷的美
一點小感受:總覺得自發(fā)的細(xì)致閱讀一本書是很沒有動力來源和成效的事情,因為沒有應(yīng)用到具體項目中,你不會想深究。目前所看的這些章節(jié)除了前三章外即時如此,其實只需要有個概念在腦袋中,真的用到的時候有搜索引擎在手然后就行了。急切想翻閱完畢要開始看Linux相關(guān)的書籍了~ 以下為第6章簡略筆記:
- 使用CSS3可以替代圖片減少http請求。
- 需要添加瀏覽器私有前綴來保證最大的瀏覽器兼容性,或者使用一些JavaScript,它會自動為CSS3追加瀏覽器私有前綴。
6.1 文字陰影
-
text-shadow: 1px 1px #cccccc;
參數(shù)分別表示右側(cè)陰影大小,下側(cè)陰影大小,模糊距離)。 - 顏色可以使用hex、hsl、rgb顏色。
- 大小可以使用px、em、rem。
- 還可以用逗號分隔的方式使用多重文字陰影。
6.2 盒陰影
- 盒陰影的語法和文字陰影完全一樣。
- 可以將text-shadow后的第一個參數(shù)指定為inset來設(shè)置內(nèi)陰影。
- 同樣可以設(shè)置多重陰影。
6.3 背景漸變
- 線性背景漸變,方法為設(shè)定起點、過渡點、終點的顏色方案。
- 徑向背景漸變,可以設(shè)置發(fā)散形式的漸變,可選擇的類型(圓、橢圓等)很多,能做出很酷炫的效果。
- 重復(fù)漸變。
6.4 背景漸變圖案
- 有一些家伙用CSS的背景技術(shù)制作了一些圖案能夠在背景中漸變,沒有美工或者帶寬有限減少用大圖的時候,或許是個選擇。
6.5 CSS3的響應(yīng)性
- 針對上述學(xué)習(xí)的特性,務(wù)必記得針對不同的視口做不同的聲明。
- 為了瀏覽器兼容性,書寫CSS3需要私有前綴,還有一種快速編寫CSS3的方法,就是使用CSS預(yù)處理器,比如最流行的SASS和LESS(聞名已久未曾用過)。
6.6 組合使用CSS3屬性
略(結(jié)合該書開篇的案例來操作一把上面的新屬性)。
6.7 多重背景圖片
- 在CSS3中我們可以使用多重背景,各自有個子的大小和位置,相互之間用逗號隔開就行。
6.8 更多CSS特性
- 上面是介紹的只是CSS3的一小部分但屬于最常用的。
6.9 可縮放圖標(biāo):響應(yīng)式設(shè)計中的完美選擇
- @font-face圖標(biāo)就是將字符做成圖標(biāo)的特定字體,以往我們的需要使用很多的圖標(biāo)圖片,或者組合成一張很大的圖,現(xiàn)在只需要用一種字體就涵蓋所有需要的圖標(biāo)。比較流行的比如font-awesome就是這樣的原理(哦,原來如此~)。
第7章 CSS3過渡、變形和動畫
7.1 什么是CSS3過渡以及如何使用它
一個超鏈接默認(rèn)設(shè)置了一個樣式,當(dāng)鼠標(biāo)hover上去的時候可能會應(yīng)用到另外一個樣式,這就是一個過渡。過渡可以針對屬性來過渡,比如當(dāng)hover發(fā)生時候過渡。
-
過渡涉及四個屬性:
- transition-property 要過渡的屬性名稱,比如background-color或all
- transition-duration 定義過渡效果持續(xù)的時間
- transition-timing-function 定義過渡期間速度如何變化
- transition-delay 可選,定義過渡開始前的延遲事件
-
單獨使用各種過渡屬性創(chuàng)建效果的語法如下:
#content a { transition-property: all; transition-duration: 1s; transition-timing-function: ease; transition-delay: 0s; }
-
簡寫語法如下
transition: all 1s ease 0s;
-
也可以在不同的時間段內(nèi)過渡不同的屬性
#content a { /* other setting */ transition-property: border, color, text-shadow; transition-duration: 2s, 3s, 8s; }
過渡調(diào)速函數(shù),不太理解可以參考這里
7.2 CSS3中的2D變形
- 有兩種可用的CSS3變形:2D變形和3D變形。其中2D變形實現(xiàn)更廣泛,它允許我們使用如下變形:
- scale:用來縮放大小
- translate:在屏幕內(nèi)移動元素
- rotate:按照一定的角度旋轉(zhuǎn)元素
- skew:按照X和Y軸對元素進(jìn)行斜切
- matrix:將上述若干變形效果組合成單個聲明,并允許你用像素精度來控制變形效果
- 實際項目中可以使用傻瓜矩陣變形工具來完成這樣的事情。
- transform-origin可以用來修改變形效果的起點。
7.3 嘗試CSS3的3D形變
- CSS3的3D形變能創(chuàng)造非常酷的效果,但相對2D的瀏覽器支持性要差一些。
7.4 CSS3動畫效果
如下是一個給h5加上陰影動畫的例子,最開始定義一個關(guān)鍵幀的名字,以及在動畫進(jìn)行到多少的時候的效果,然后在元素h5應(yīng)用。當(dāng)然如果想要在特定瀏覽器上執(zhí)行,得要給 @keyframes
和 animation
都加上私有前綴。
@keyframes warning {
from {
text-shadow: 0px 0px 4px #000000;
}
50% {
text-shadow: 0 0 40px #000000;
}
to {
text-shadow: 0 0 4px #000000;
}
}
.back h5 {
font-size: 4em;
color: #f2050b;
text-align: center;
animation: warning 1.5s infinite ease-in;
}
動畫可以采用的參數(shù)有七個可以獨立設(shè)置的屬性值,除了像下面這樣列出來你也可以像上例那樣寫縮寫。
animation-name: warning;
animation-duration: 1.5s;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
animation-play-state: running;
animation-delay: 0s;
animation-fill-mode: none;
CSS3過渡讓效果的初始按照可定義的速度進(jìn)行,形變使使得元素大小、偏移等值脫離初始,動畫則定義了一個變化的過程,三者結(jié)合起來能產(chǎn)生非常豐富的效果。 該書示例有結(jié)合示例進(jìn)行演示,在此跳過,有興趣可以自己參考~
7.5 本章小結(jié)
本章學(xué)習(xí)了CSS3過渡、形變和動畫的內(nèi)容,學(xué)習(xí)這些新特性的最終目的是使用CSS3來替代JavaScript制作一些優(yōu)雅降級的增強效果,從而使代碼更簡潔和豐富。下一章將開始學(xué)習(xí)表單中HTML5和CSS3的應(yīng)用。
第8章 用HTML5和CSS3征服表單
8.1 HTML5表單
HTML5表單不僅包含了一些新的視覺元素,還具備了基本的客戶端驗證的功能,而過去這些一般都需要依賴JavaScript。如下列舉了這些新的表單特性:
8.1.1 一個示例表單構(gòu)建
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<!-- 首先定義了一個id為redemption的表單 -->
<form id="redemption" method="post">
<!-- hgroup中的h1和h2用于顯示標(biāo)題和說明文字 -->
<hgroup>
<h1>Oscar Redemption</h1>
<h2>Here's your chance to set the record straight: tell us what
year the wrong film got nominated, and which film <b>should</b>
have received a nod...</h2>
</hgroup>
</form>
<fieldset>
<legend>About the offending film (part 1 of 3)</legend>
<div>
<label for="film">The film in question?</label>
<input id="film" name="film" type="text" placeholder="e.g. King 3
Kong" required aria-required="true" >
</div>
</fieldset>
</body>
</html>
因為書中的例子其實并沒有提供連貫的例子,如下只貼出一些片段用于粘貼在上面的表單示例中方便查看效果。
8.1.2 placeholder
占位符是HTML5表單中非常頻繁被使用的一個屬性,輸入框獲取焦點后會自動消失。
8.1.3 required
為確保表單必須輸入值,可以添加required屬性,當(dāng)輸入不符合條件時候瀏覽器會給出提示,并且表單默認(rèn)不會提交。注:aria-required是為了方便屏幕閱讀器用戶,第四章有介紹過WAI-ARIA。
8.1.4 autofocus
autofocus可以讓表單加載完成時就有一個表單域被默認(rèn)自動聚焦。
<fieldset>
<legend>autofocus example</legend>
<div>
<label for="search">Search the site...</label>
<input id="search" name="search" type="search" placeholder="Wyatt Earp"
autofocus>
</div>
</fieldset>
8.1.5 autocomplete
很多瀏覽器提供了自動完成功能來幫助用戶完成輸入,但是通常會關(guān)閉這個功能,因為它不僅能保護(hù)敏感數(shù)據(jù)(例如銀行卡賬戶),還可以讓用戶用心填寫表單而不是隨便輸入一個值(使用者可能通過自動完成來選擇曾填寫過的假的電話號碼)。
下面的代碼是一個禁止自動完成的表單項:
<fieldset>
<legend>autocomplete example</legend>
<div>
<label for="tel">Telephone (so we can berate you if you're wrong)</label>
<input id="tel" name="tel" type="tel" placeholder="1-234-546758" autocomplete="off" required aria-required="true" >
</div>
</fieldset>
也可以給表單本身設(shè)置屬性來禁止整個表單的自動完成功能:
<form id="redemption" method="post" autocomplete="off">
autofus可以讓表單加載完成時就有一個表單被默認(rèn)自動聚焦。
8.1.6 list及對應(yīng)的detail元素
<fieldset>
<legend>list example</legend>
<div>
<label for="awardWon">Award Won</label>
<input id="awardWon" name="awardWon" type="text" list="awards">
<datalist id="awards">
<select>
<option value="Best Picture"></option>
<option value="Best Director"></option>
<option value="Best Adapted Screenplay"></option>
<option value="Best Original Screenplay"></option>
</select>
</datalist>
</div>
</fieldset>
使用了list屬性的輸入框看起來就是一個普通的文本輸入框,list屬性的值就是datalist元素的id,開始輸入時會顯示一個數(shù)據(jù)選擇框。注:使用select包裹option是為了便于老版本瀏覽器的降級。
8.1.7 HTML5的新輸入類型
- 郵箱地址
<input type="email" />
- 數(shù)字
<input type="number"/>
- URL地址
<input type="url"/>
- 電話號碼
< input type="tel"/>
- 搜索輸入框
<inputtype="search"/>
和普通文本框表現(xiàn)一樣只是個別瀏覽器渲染上有細(xì)微差別 - 正則表達(dá)式
<input pattern="([a-zA-Z])"/>
- 顏色選擇器
<input type="color"
目前很少瀏覽器支持該特性(@13年) - 滑動條
<input type="range" min="1" max = "10" />
8.1.8 日期和時間輸入類型
如下多種的日期時間輸入類型提供了不同的度量單位,輸出結(jié)果值會略有不同:
- date
- month
- week
- time
- datetime和datetime-local
8.2 如何給不支持新特性的瀏覽器打補丁
盡管說了很多HTML5表單的新特新,但實際使用的時候 (1)支持表單新特性的瀏覽器在具體實現(xiàn)上有所不同(2)對完全不不支持新特的瀏覽器如何處理。
第四章提過一個Modernizr的JavaScript框用于向缺少HTML5/CSS3特性支持的瀏覽器打補丁,Webshims Lib就是構(gòu)建于Modernizr和jQuery之上的。
它利用了Modernizr的加載功能,只加載實際所需要的補丁。
通過打補丁不僅使老版本的瀏覽器受益,很多新的劉瀏覽器也沒有完全實現(xiàn)HTML5的表單特性,網(wǎng)頁中引入Webshims Lib可以修補這些瀏覽器的缺陷。
Webshims Lib的使用很簡單:
- 下載Webshims Lib包,解壓
- 從包解壓出來的文件夾中導(dǎo)入依賴的jQuery、Modernizr、polyfiller文件
- 執(zhí)行javascript:
$.webshims.polyfill()
來初始化腳本用于加載所需的補丁
8.3 使用CSS3美化HTML5表單
作者使用第七章介紹的CSS3知識,用類似圓角、陰影等屬性稍微潤色了下表單,此處略過。除了之前學(xué)習(xí)的CSS3屬性外,CSS3還專門提供了一些針對表單的偽類選擇器:
- input:required
- input:focus:invalid
- input:focus:valid
可以通過這些偽類來書寫一些樣式規(guī)則,從而增強表單的用戶體驗。
8.4 小結(jié)
本章學(xué)習(xí)了如何使用一堆新的HTML5表單屬性,從而讓表單更加好用。并且我們介紹了如何使用工具來進(jìn)行JavaScript對象檢測有條件地加載JavaScript補丁腳本,從而保證這些在新舊瀏覽器上都能提供類似的用戶體驗。