課堂交流區css
如圖所示,一個水平排列的列表,每項高度都未知,但要求底部對齊,有哪些方法能夠解決呢?html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>水平列表的底部對齊</title> <style type="text/css"> html, body { height: 100%; width: 100%; } .parent { display: flex; align-items:flex-end; height: 30%; width: 50%; margin: auto; } .children { float: left; width: 25%; margin-bottom: 10px; } #item_1 { height: 50%; background-color: #006899; } #item_2 { height: 33%; background-color: #9f0000; } #item_3 { height: 17%; background-color: #00970a; } #item_4 { height: 40%; background-color: #009999; } </style> </head> <body> <div class="parent"> <div class="children" id="item_1"></div> <div class="children" id="item_2"></div> <div class="children" id="item_3"></div> <div class="children" id="item_4"></div> </div> </body> </html>
一個幻燈片效果如圖:css3
已知結構以下:express
<div class="slide">瀏覽器
<!-- 圖片省略 -->架構
<!-- 如下是指示器 -->編輯器
<div class="pointer"><i></i><i></i><i></i></div>ide
</div>模塊化
要求以下:幻燈(slide)寬高未知,指示器(pointer)在底部且水平居中,距離底部10px,指示器中的圓直徑爲10px,個數未知,背景爲黑色,間距爲5px,請完成CSS。工具
.slide { display: flex; align-items:flex-end; height: 200px; width: 400px; margin: auto; margin-top: 200px; background-color: #9dc3e6; } .pointer { margin-left: 50%; transform: translateX(-50%); text-align: center; margin-bottom: 10px; } .pointer i { display: inline-block; width: 10px; height: 10px; margin-left: 5px; border-style: solid; background-color: black; border-radius: 50%; }
瀏覽網頁使用的設備屏幕大小迥異,如何保證頁面在不一樣設備上都正常顯示呢?
-- 解決方法:響應式
優勢:無需爲不一樣設備編寫對應的頁面 --> 下降開發成本、維護成本
缺點:頁面中某些部分在某些設備上會被隱藏(資源加載了,可是隻是用CSS隱藏了)
爲何在手機端的頁面會很小呢?
全部的移動端的頁面都引入了viewport視窗
剛開始全部的元素都是加載到一個比較大的viewport視窗中,
以後經過某種比例等比縮小到屏幕的顯示區域,
所以文字圖片都顯得很小
viewport:
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"/>
width設置爲設備寬度
initial-scale爲0時,初始化不會進行等比縮小
user-scalable爲no時,用戶沒法手動縮放
響應式佈局:針對不一樣設備(電腦、pad、手機)
1. 最基本要求:少用定寬屬性,使用自適應(都是定寬則會出現水平滾動條)
2. 若是左邊的菜單是定寬,右邊的主內容爲自適應,在電腦和pad端均可行,可是在手機端會出現主內容寬度過窄
想要實現菜單和主內容在手機端佈局成上下排列(即佈局方式改變了)-- 媒體查詢 @media
@media screen and (max-width:320px) { /*screen表示在顯示設備中 max-width:viewport視窗的最大寬度 在顯示設備中且視窗<=320px時, 該CSS生效*/ } @media screen and (min-width:769px) { /* 在顯示設備中且視窗>=769px時,該CSS生效*/ } @media screen and (min-width:769px) and (max-width:1000px) { /* 寬度區間[769, 1000]內 */ }
實例:
實現不一樣寬度設備對應不一樣佈局:
<style type="text/css"> .left { float: left; width: 100px; margin-right: 20px; background-color: red; } .right { overflow: hidden; background-color: blue; } @media screen and (max-width: 769px) { .left { float: none; width: auto; margin-right: 0; margin-bottom: 20px; } } </style> <div class="parent"> <div class="left"> <p>left</p> </div> <div class="right"> <p>right</p> <p>right</p> </div> </div>
寬度大時:
寬度小時:
課堂交流區 實例1:
高清屏的背景圖片適配
當咱們把一個圖標作成CSS中的背景圖,在視網膜屏上預覽時會發現圖標是模糊的,因此咱們會同時準備一個2倍大小的圖標給高清屏,
那麼怎麼實如今普通屏下是普通背景圖,而在高清屏下是用的高清圖呢?
答:https://www.w3schools.com/cssref/css3_pr_mediaquery.asp
http://www.cnblogs.com/sese/p/5977486.html
http://mutian.wang/tech/1386
使用@media媒體查詢resolution的方式,設定圖片不一樣分辨率的url便可
課堂交流區 實例2:
完成響應式佈局的實現
已知一個自適應佈局的HTML結構以下:
<div class="parent">
<div class="side"></div>
<div class="main"></div>
</div>
請完成如下響應式要求:
一、默認狀況,PC電腦(假設視窗都大於等於1000px)訪問:兩列布局,.parent寬960px且水平居中,左列.side寬300px,右列.main寬650px,列間距10px。
二、當用平板(假設視窗都大於400px且小於1000px)訪問:兩列布局,.parent寬度撐滿,右列.main自適應剩餘寬度,兩列間距仍舊爲10px。
三、當用手機(假設視窗都小於等於400px)訪問:上下兩行佈局,.parent寬度撐滿,.side和.main寬度也撐滿,行間距爲10px。
html, body { height: 100%; } @media screen and (min-width: 1000px) { /* for laptop and pc */ .parent { width: 960px; height: 100%; margin: auto; } .side { float: left; width: 300px; height: 100%; margin-right: 10px; background-color: #4eb3b8; } .main { float: left; width: 650px; height: 100%; background-color: #ff1a97; } } @media screen and (min-width: 400px) and (max-width: 1000px) { /*for pad */ .parent { width: 100%; height: 100%; margin: auto; } .side { float: left; width: 300px; height: 100%; margin-right: 10px; background-color: #4eb3b8; } .main { float: none; width: auto; margin-left: 310px; height: 100%; background-color: #ff1a97; } } @media screen and (max-width: 400px) { /*for mobile phones*/ .parent { width: 100%; } .side { width: 100%; margin-bottom: 10px; background-color: #4eb3b8; } .main { width: 100%; background-color: #ff1a97; } }
媒體查詢條件中,(max-width:320px)表示的是
已知CSS以下:
.a{float:left;width:600px;margin:10px;}
@media screen and (max-width:959px){
.a{width:400px;padding:10px;}
}
@media screen and (max-width:320px){
.a{float:none;width:auto;}
}
請問,當視窗寬度爲300px時,.a的樣式是
要作響應式網站,就必須設置viewport
經過viewport,能夠設置是否容許用戶手動縮放網頁
viewport的默認寬度就是屏幕的水平分辨率
頁面優化的好處:
提高網頁響應速度
對搜索引擎、屏幕閱讀器友好
提升可讀性、可維護性
如何優化:
減小請求:
圖片合併:小圖標的合併(PS課程中提到過)
CSS文件合併:
將多個css文件合併;
少許css樣式內聯;
避免使用import方式引入css文件(每一個import都會產生一個請求,且這些請求是串行的)
減小資源文件大小:
減小圖片大小:
選擇合適的圖片格式:半透明的小圖標:PNG;色彩絢麗尺寸比較大:JPG
壓縮圖片:經常使用無損壓縮工具 ImageOptim/ ImageAlpha/ JPEGmini
減小css文件大小:
css值縮寫,如margin: 5px 10px;
其餘可縮寫屬性:padding/ border/ border-radius/ font/ background等等
省略值爲0的單位:如
margin: 0px 10px; --> margin: 0 10px;
background-position: 50% 0%; --> background-position: 50% 0;
line-height: 0.5; --> line-height: .5;
顏色值最短表示:
red
#333
rgb(255, 255, 0)
rgba(255, 255, 0, 0.5)
如:color: rgb(204,204,204); --> color: #cccccc; --> color: #ccc;
css選擇器合併:
.m-logo, .m-help ... { ... }
css文件壓縮:去空格等
YUI Compressor, cssmin等工具
提高頁面性能:
規範文件的加載順序:
將css文件放在<head>中,在head中找到css文件進行下載並解析;當在body中遇到相應元素時,就能夠直接將解析好的對應css樣式應用到元素上;這樣用戶看到的頁面就很順暢
若是將css文件放到底部的話,極可能第一次渲染的時候沒有將這些樣式應用到元素上
將js文件放在<body>的底部,由於js的加載和執行會阻塞其餘資源的加載和頁面的執行和渲染,並且js的不少邏輯也是等到頁面加載完成後纔開始處理的
減小標籤數量:標籤數量不少,當js遍歷頁面的DOM時會對性能產生影響;對可讀性也有提高
如<div class="list"> <ul>...</ul> </div> --> <ul class="list">...</ul>
選擇器長度:
儘量書寫較短的選擇器名字、省略沒必要要的父類選擇器
儘可能避免耗性能的屬性:
好比expression的計算量較大、filter、border-radius、box-shadow、gradients等
給圖片設置寬高:
img標籤中的圖片儘可能不要進行縮放,儘可能直接使用原圖大小
由於:瀏覽器在解析html代碼時,有可能在圖片下載完成前就對頁面的佈局進行了定位,若是沒有給圖片設置固定寬高或原圖寬高與設置寬高不一樣,瀏覽器在圖片下載完成後,須要進行迴流和重繪,將圖片從新渲染一遍。
表現儘可能使用css實現:
能用css實現的儘可能都用css來實現,好比選中狀態的樣式能夠經過css或js實現,儘可能使用css
提升代碼可讀性、可維護性
規範:好比indent用幾個空格、變量名/文件名規範等
語義化:對搜索引擎和屏幕閱讀器友好,也能增長可讀性和可維護性
儘可能避免hack:有的時候爲了兼容不一樣瀏覽器會進行一些hack,須要想一下是否有別的方式代替hack,若是沒有辦法或代價比較大的時候才用hack的方式;hack的方式也要統一,好比對IE6就用*號、對IE7就用_號。
模塊化:把頁面中一系列相關的部分作成一個模塊,好比導航模塊、列表模塊等
也使得代碼複用性更強,也能夠減小代碼數量
註釋:後期維護、可閱讀性
課堂交流區:
請對如下CSS進行優化:
h1{font-weight: bold;} h2{font-weight: bold;} h3{font-weight: bold;width:100px;} .g-bd{ border-top: 1px solid #000; border-right: 1px solid #f00; border-bottom: 1px solid #f00; border-left: 1px solid #000; color: #bbff22; } .m-tab{ margin-top: 10px; margin-right: 10px; margin-bottom: 20px; margin-left: 10px; color: rgb(255,0,0); } .m-tab li a{ display: block; padding: 0px 10px; font-family: "Microsoft YaHei", simsun; font-size: 20px; line-height: 1.5; } .m-side{ width: 200px; background-image: url(bg.png); background-repeat: repeat-y; background-color: #ccc; }
答:
1. h1, h2, h3中font-weight屬性重複
2. .g-bd中border屬性可簡寫
3. .g-bd中color屬性可縮短表示
4. .m-tab中margin屬性可簡寫
5. .m-tab中color屬性可縮短表示
6. .m-tab li a 選擇器可省略中間的li (甚至.m-tab也能夠省略)
7. .m-tab li a中padding的0px的單位可省略
7. .m-tab li a中的font屬性可簡寫
8. .m-side中background屬性可簡寫
h1, h2, h3{font-weight: bold;} h3{width:100px;} .g-bd{ border: 1px solid #000; border-right-color: #f00; border-bottom-color: #f00; color: #bf2; } .m-tab{ margin: 10px 10px 20px 10px; color: #f00; } .m-tab a{ display: block; padding: 0 10px; font: 20px/1.5 "Microsoft YaHei", simsun; } .m-side{ width: 200px; background: #ccc url(bg.png) repeat-y }
站在團隊的多人協同開發的角度看待
每一個工程師都有本身的規範,人員的更替,使得後期維護成本提升
-- 團隊規範:約束團隊的每個成員
文件規範:
文件分類:可將css文件分類
通用類:共用樣式base、第三方庫lib、自定義UI控件ui 等
業務類:專輯album、歌手artist、排行榜toplist等
如:
文件引入:
行內樣式:不推薦--表現與內容分離(可是某些時候必須用到)
外聯引入:推薦 <link rel="stylesheet" href="css/style.css"/>
內聯引入:推薦 <style>...</style>
避免使用@import--引發頁面從新渲染的性能問題
文件自己:
文件名:由小寫字母、數字、中劃線組成
文件編碼:UTF-8
註釋規範:
塊狀註釋:統一縮進、位於被註釋對象上面
單行註釋:文字兩端須有空格、位於被註釋對象上面
行內註釋:文字兩端須有空格、位於分號以後
命名規範:選擇器的命名
分類命名:
避免由於選擇器重名致使的樣式污染
好比對於佈局類樣式,可使用"g-"做爲前綴等等自定義命名規則
命名格式:
大小寫:建議小寫
長度:權衡長度和可讀性 (正常縮寫便可)
語義化命名:
之內容的語義進行命名,好比.nav
不推薦以結構命名(好比.top)
書寫規範
單行與多行:單行:節省空間、編輯器可能造成水平滾動條;多行:文件可能須要豎直滾動條
空格與分號:縮進:2個或4個空格;規則內空格,好比key-value之間的空格等;須要保留最後一個屬性的分號(爲了不沒必要要的錯誤)
屬性順序:按照屬性的重要性按順序書寫
顯示屬性:display, visibility, position, float, clear, list-style, top等
自身屬性:width, height, margin, padding, border, overflow等
文本屬性和其餘修飾:font, text-align, text-decoration, vertical-align, white-space, color, background等
Hack方式:
統一各瀏覽器的hack方式:
IE6:_property:value
IE6/7:*property:value
如:.m-list{ color:#000; *color:#888; _color:#fff; }
不要濫用hack
值格式:統一屬性值格式,好比顏色(通常選擇#xxx的形式);無引號/單引號/雙引號
其餘規範:
HTML規範:
文檔聲明:"<!DOCTYPE html>",首行頂格開始
閉合:閉合標籤須要閉合,自閉合標籤選擇使用/>或>結束
屬性:選擇雙引號仍是單引號;某些屬性是否寫屬性值,好比: <input readonly>仍是<input readonly="readonly">
層級:用縮進體現層級,提升可讀性;標籤正確嵌套(好比<ul>下嵌套<li>),且不要太深--性能問題
註釋:好比使用什麼格式?如註釋頭註釋尾 <!-- aa --> ...... <!-- /aa -->
大小寫:標籤、屬性均小寫
圖片規範:
文件名:語義性、合適長度
保留源文件:切圖時須要保留源文件
圖片合併:儘量使用sprite技術,指定劃分方式,如按模塊、按業務等
什麼是模塊化:
一系列相關聯的結構組成的總體;
總體帶有必定語義,而非表現
好比:翻頁模塊、圖片輪播模塊
怎麼實現模塊化:
爲模塊分類命名:好比 .m-, .md-
以一個主選擇器開頭(模塊根節點是惟一的)
使用以族選擇器開頭的後代選擇器(模塊子節點)
這樣就不會引發樣式污染了
實例:
一個導航模塊:
<!-- NAV MODULE --> <div class="m-nav"> <ul> <li class="z-crt"><a href="#">index</a></li> <li><a href="#">link1</a></li> ... </ul> </div> <!-- /NAV MODULE -->
/* 導航模塊 */ .m-nav{} .m-nav li, .m-nav a{} .m-nav li{} .m-nav a{} .m-nav .z-crt a{}
現有另外一個導航須要實現:
區別:按鈕邊框圓角、多了最後一個按鈕
實現NAV MODULE模塊的擴展
<!-- NAV-1 MODULE --> <div class="m-nav m-nav-1"> <ul> <li class="z-crt"><a href="#">index</a></li> <li><a href="#">link1</a></li> ... </ul> <a class="btn">Login</a> </div> <!-- /NAV MODULE -->
/* 導航模塊擴展 */ .m-nav-1 {} .m-nav-1 a {border-radius: 5px;} .m-nav-1 .btn {}
寫上新屬性便可
爲何要模塊化?
(要記住是多人協同開發)
可讀性強、維護性強
不會引發樣式污染(主選擇器)
擴展性、重用性
在學完了本課程後,推薦你們學習網易內部的CSS規範以及模塊化方案——NEC:
幫助你對頁面的規範和模塊有進一步認識。
課堂交流區:
模塊化實現
用模塊化的思想實現下圖所示導航(寫出html和css代碼,CSS只需寫出選擇器)。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模塊化實現</title> <style type="text/css"> .m-nav {} .m-nav .m-elem {} .m-nav .selected {} </style> </head> <body> <ul class="m-nav"> <li class="m-elem seleted">分類方法</li> <li class="m-elem">命名規則</li> <li class="m-elem">代碼格式</li> <li class="m-elem">優化方案</li> <li class="m-elem">最佳實踐</li> <li class="m-elem">典型錯誤</li> </ul> </body> </html>
下列瀏覽器對應的hack方式正確的是?
下面哪幾項是推薦的css屬性書寫順序?
下面哪些網頁內容,適合做爲一個模塊?
在註釋文字的兩端加空格,是爲了不註釋文字亂碼引發css失效的問題。
選擇器分類命名,能夠有效避免css樣式污染的問題。