有兩種, IE 盒子模型、W3C 盒子模型;
盒模型: 內容(content)、填充(padding)、邊界(margin)、 邊框(border);
區 別: IE的content部分把 border 和 padding計算了進去; css
在CSS3中引入了box-sizing屬性, 它能夠容許改變默認的CSS盒模型對元素寬高的計算方式.
共包括兩個選項:
content-box:標準盒模型,CSS定義的寬高只包含content的寬高
border-box:IE盒模型,CSS定義的寬高包括了content,padding和borderhtml
id選擇器( # myid)
類選擇器(.myclassname)
標籤選擇器(div, h1, p)
相鄰選擇器(h1 + p)
子選擇器(ul > li)
後代選擇器(li a)
通配符選擇器( * )
屬性選擇器(a[rel = "external"])
僞類選擇器(a:hover, li:nth-child)
可繼承的樣式: font-size font-family color, UL LI DL DD DT;
不可繼承的樣式:border padding margin width height ;前端
* 優先級就近原則,同權重狀況下樣式定義最近者爲準;
* 載入樣式以最後載入的定位爲準;
優先級爲:
!important > id > class > tag
important 比 內聯優先級高
ios
舉例:
p:first-of-type 選擇屬於其父元素的首個 <p>元素的每一個 <p>元素。
p:last-of-type 選擇屬於其父元素的最後 <p>元素的每一個 <p>元素。
p:only-of-type 選擇屬於其父元素惟一的 <p>元素的每一個 <p>元素。
p:only-child 選擇屬於其父元素的惟一子元素的每一個 <p>元素。
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每一個 <p>元素。
:after 在元素以前添加內容,也能夠用來作清除浮動。
:before 在元素以後添加內容
:enabled
:disabled 控制表單控件的禁用狀態。
:checked 單選框或複選框被選中。css3
水平垂直居中問題,在css中margin: 0 auto;能夠實現水平居中,可是在垂直居中方面一直沒有特定的屬性,直到css3的出現,有了彈性盒,能夠經過設置彈性盒直接設置居中位置,作瀏覽器兼容的話能夠經過使用一些hack處理 負margin方法,table-cell方法,位移方法web
CSS代碼:算法
.container{ width: 500px; height: 400px; border: 2px solid #379; position: relative; } .inner{ width: 480px; height: 380px; background-color: #746; position: absolute; top: 50%; left: 50%; margin-top: -190px; /*height的一半*/ margin-left: -240px; /*width的一半*/ }
HTML代碼:bootstrap
<div class="container"> <div class="inner"> </div> </div>
這裏,咱們首先用top:50%和left:50%讓inner的座標原點(左上角)移動到container的中心,而後再利用負margin讓它往左偏移自身寬的一半,再往上偏移自身高的一半,這樣inner的中心點就跟container的中心點對齊了。瀏覽器
CSS代碼:sass
div{ width: 300px; height: 300px; border: 3px solid #555; display: table-cell; vertical-align: middle; text-align: center; } img{ vertical-align: middle; }
HTML代碼:
<div> <img src="mm.jpg"> </div>
經過將盒子轉換爲table元素,table元素自己是能夠經過屬性來控制位置,div上面的vertical-align: middle是控制垂直方向上的居中的,而text-align: center是控制水平方向的
3)彈性盒子法
CSS代碼:
.container{ width: 300px; height: 200px; border: 3px solid #546461; display: -webkit-flex; display: flex; -webkit-align-items: center; align-items: center; -webkit-justify-content: center; justify-content: center; } .inner{ border: 3px solid #458761; padding: 20px; }
HTML代碼:
<div class="container"> <div class="inner"> 我在容器中水平垂直居中 </div> </div>
align-items控制垂直方向的居中,justify-content控制水平方向的居中。這是CSS3的新方法
位移方法和margin定位方法同樣,只不過吧margin改爲了位移不須要計算一半是多少,直接 transform:translate(-50%,--50%)
block 象塊類型元素同樣顯示。
none 缺省值。象行內元素類型同樣顯示。
inline-block 象行內元素同樣顯示,但其內容象塊類型元素同樣顯示。
list-item 象塊類型元素同樣顯示,並添加樣式列表標記。
table 此元素會做爲塊級表格來顯示
inherit 規定應該從父元素繼承 display 屬性的值
absolute 生成絕對定位的元素,相對於值不爲 static的第一個父元素進行定位。
fixed (老IE不支持) 生成絕對定位的元素,相對於瀏覽器窗口進行定位。
relative 生成相對定位的元素,相對於其正常位置進行定位。
static 默認值。沒有定位,元素出如今正常的流中(忽略 top, bottom, left, right z-index 聲明)。
inherit 規定從父元素繼承 position 屬性的值。
新增各類CSS選擇器 (: not(.input):全部 class 不是「input」的節點)
圓角 (border-radius:8px)
多列布局 (multi-column layout)
陰影和反射 (ShadowReflect)
文字特效 (text-shadow、)
文字渲染 (Text-decoration)
線性漸變 (gradient)
旋轉 (transform)
增長了旋轉,縮放,定位,傾斜,動畫,多背景
transform:scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg)Animation:
把上、左、右三條邊隱藏掉(顏色設爲 transparent)
#demo { width: 0; height: 0; border-width: 20px; border-style: solid; border-color: transparent transparent red transparent; }
簡單的方式:
上面的div寬100%,
下面的兩個div分別寬50%,
而後用float或者inline使其不換行便可
行框的排列會受到中間空白(回車空格)等的影響,由於空格也屬於字符,這些空白也會被應用樣式,佔據空間,因此會有間隔,把字符大小設爲0,就沒有空格了。
最簡單的初始化方法: * {padding: 0; margin: 0;}
(強烈不建議)
淘寶的樣式初始化代碼:
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; } body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; } h1, h2, h3, h4, h5, h6{ font-size:100%; } address, cite, dfn, em, var { font-style:normal; } code, kbd, pre, samp { font-family:couriernew, courier, monospace; } small{ font-size:12px; } ul, ol { list-style:none; } a { text-decoration:none; } a:hover { text-decoration:underline; } sup { vertical-align:text-top; } sub{ vertical-align:text-bottom; } legend { color:#000; } fieldset, img { border:0; } button, input, select, textarea { font-size:100%; } table { border-collapse:collapse; border-spacing:0; }
不管屬於哪一種,都要先找到其祖先元素中最近的 position 值不爲 static 的元素,而後再判斷:
1)若此元素爲 inline 元素,則 containing block 爲可以包含這個元素生成的第一個和最後一個 inline box 的 padding box (除 margin, border 外的區域) 的最小矩形;
2)不然,則由這個祖先元素的 padding box 構成。
若是都找不到,則爲 initial containing block。
1)static(默認的)/relative:簡單說就是它的父元素的內容框(即去掉padding的部分)
2)absolute: 向上找最近的定位爲absolute/relative的元素
3)fixed: 它的containing block一概爲根元素(html/body),根元素也是initial containing block
(W3C CSS 2.1 規範中的一個概念,它是一個獨立容器,決定了元素如何對其內容進行定位,以及與其餘元素的關係和相互做用。)
一個頁面是由不少個 Box 組成的,元素的類型和 display 屬性,決定了這個 Box 的類型。
不一樣類型的 Box,會參與不一樣的 Formatting Context(決定如何渲染文檔的容器),所以Box內的元素會以不一樣的方式渲染,也就是說BFC內部的元素和外部的元素不會互相影響。
建立規則:
根元素
浮動元素(float不是none)
絕對定位元素(position取值爲absolute或fixed)
display取值爲inline-block,table-cell, table-caption,flex, inline-flex之一的元素
overflow不是visible的元素
做用:
能夠包含浮動元素
不被浮動元素覆蓋
阻止父子元素的margin摺疊
如下是權重的規則:標籤的權重爲1,class的權重爲10,id的權重爲100,如下例子是演示各類定義的權重值:
/權重爲1/ div{}
/權重爲10/ .class1{}
/權重爲100/ #id1{}
/權重爲100+1=101/ #id1 div{}
/權重爲10+1=11/ .class1 div{}
/權重爲10+10+1=21/ .class1 .class2 div{}
若是權重相同,則最後定義的樣式會起做用,可是應該避免這種狀況出現
浮動元素引發的問題:
(1)父元素的高度沒法被撐開,影響與父元素同級的元素
(2)與浮動元素同級的非浮動元素(內聯元素)會跟隨其後
(3)若非第一個元素浮動,則該元素以前的元素也須要浮動,不然會影響頁面顯示的結構
解決方法:
使用CSS中的clear:both;屬性來清除元素的浮動可解決二、3問題,對於問題1,添加以下樣式,給父元素添加clearfix樣式:
.clearfix:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; } .clearfix{ display: inline-block; } /* for IE/Mac */
清除浮動的幾種方法:
1)額外標籤法,<div style="clear:both;"></div>(缺點:不過這個辦法會增長額外的標籤使HTML結構看起來不夠簡潔。)
2)使用after僞類
content:"."; height:0; visibility:hidden; display:block; clear:both;
}
3)浮動外部元素
4)設置overflow爲hidden或者auto
css的媒體查詢容許經過@media標籤爲特定媒體的瀏覽器設定樣式,其中包含衆多篩選,功能強大。
18.使用 CSS 預處理器嗎?喜歡那個?
SASS (SASS、LESS沒有本質區別,只由於團隊前端都是用的SASS),可使用sass和less對css作模塊化開發,定製樣式的組件
19.CSS優化、提升性能的方法有哪些?
將樣式表放到頁面頂部
不使用CSS表達式
不使用@import
不使用IE的Filter
是的,元素的百分比設置通常是根據父級元素的寬高決定的,若是父級元素沒有寬高百分比是不起做用的
響應式設計就是爲了實現根據不一樣設備環境自動響應及調整網頁佈局的一種設計方案
基本原理就是利用css的媒體查詢功能更具不一樣屏幕的大小,向下兼容設備、移動優先,達到響應的效果
雙冒號是在當前規範中引入的,用於區分僞類和僞元素。可是僞類兼容現存樣式,瀏覽器須要同時支持舊的僞類,好比:first-line、:first-letter、:before、:after等。
對於CSS2以前已有的僞元素,好比:before和:after,單冒號和雙冒號的寫法::before和::after做用是同樣的。
若是隻須要兼容webkit、firefox、opera等瀏覽器,建議對於僞元素採用雙冒號的寫法,若是不得不兼容IE瀏覽器,仍是用CSS2的單冒號寫法比較安全。
移除空格、使用margin負值、使用font-size:0、letter-spacing、word-spacing
GIF: 8位像素,256色 無損壓縮 支持簡單動畫 支持boolean透明 適合簡單動畫
JPEG:顏色限於256 有損壓縮 可控制壓縮質量 不支持透明 適合照片
PNG:有PNG8和truecolor PNG PNG8相似GIF顏色上限爲256,文件小,支持alpha透明度,無動畫、適合圖標、背景、按鈕
概念:將多個小圖片拼接到一個圖片中。經過background-position和元素尺寸調節須要顯示的背景圖案
優勢:
減小HTTP請求數,極大地提升頁面加載速度
增長圖片信息重複度,提升壓縮比,減小圖片大小
更換風格方便,只需在一張或幾張圖片上修改顏色或樣式便可實現
缺點:
圖片合併麻煩
維護麻煩,修改一個圖片可能須要重新佈局整個圖片,樣式
如今大部分UI框架都內置有刪格化系統,經常使用bootstrap中的,bootstap它提供了一套響應式,移動優先的流式柵格系統(grid system),將屏幕分紅12列來實現響應式的。它的實現原理很是簡單,Media Query加上float佈局,也研究過bootstrap的源碼,在這個過程當中也對預處理器有了更深的體會,刪格系統這塊在bootstrap中sass源碼使用的循環生成,less使用的遞歸生成,我本身也單獨封裝過一個刪格系統
漸進加強 :針對低版本瀏覽器進行構建頁面,保證最基本的功能,而後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優雅降級 :一開始就構建完整的功能,而後再針對低版本瀏覽器進行兼容。
FOUC - Flash Of Unstyled Content 文檔樣式閃爍
<style type="text/css" media="all">@import "../fouc.css";</style>
而引用CSS文件的@import就是形成這個問題的罪魁禍首。IE會先加載整個HTML文檔的DOM,而後再去導入外部的CSS文件,所以,在頁面DOM加載完成到CSS導入完成中間會有一段時間頁面上的內容是沒有樣式的,這段時間的長短跟網速,電腦速度都有關係。
解決方法簡單的出奇,只要在<head>之間加入一個<link>或者<script>元素就能夠了。
聯繫:它們都能讓元素不可見
區別:
display:none;會讓元素徹底從渲染樹中消失,渲染的時候不佔據任何空間;
visibility: hidden;不會讓元素從渲染樹消失,渲染師元素繼續佔據空間,只是內容不可見
display: none;是非繼承屬性,子孫節點消失因爲元素從渲染樹消失形成,經過修改子孫節點屬性沒法顯示;visibility: hidden;是繼承屬性,子孫節點消失因爲繼承了hidden,經過設置visibility: visible;可讓子孫節點顯式
修改常規流中元素的display一般會形成文檔重排。修改visibility屬性只會形成本元素的重繪。
讀屏器不會讀取display: none;元素內容;會讀取visibility: hidden;元素內容
常見的佈局這麼幾種單列水平居中佈局, 一列定寬一列自適應佈局, 兩列定寬一列自適應佈局, 兩側定寬中間自適應三列布局。
一列定寬一列自適應
左邊的寬度寫死,右邊盒子使用定位拉伸法實現,left等於左邊盒子的寬度,right等於0
.left-box{ width:200px; } .right-box{ position:absolute; left:200px; right:0; }
或者左邊的定位寫死寬度,右邊的寫padding-left等於左邊的寬度(經常使用一點)
.left-box{ width:200px; position: fixed; height:100%; } .right-box{ padding-left:200px; }
左邊的寬度寫死而且浮動,右邊盒子寫overflow:hidden;利用的是建立一個新的BFC(塊級格式化上下文)來防止文字環繞的原理來實現的。BFC就是一個相對獨立的佈局環境,它內部元素的佈局不受外面佈局的影響
.left-box { width: 200px; height: 150px; float: left; background: #f22; } .right-box { height: 200px; overflow: hidden; background: #cff; }
兩列定寬一列自適應上面的佈局方式一樣適用
常見的三列布局通常使用聖盃佈局和雙飛翼佈局。
聖盃佈局和雙飛翼佈局
二者都屬於三列布局,是一種很常見的頁面佈局方式,
三列通常分別是子列、主列和附加列,其中子列通常是居左的導航,且寬度固定;主列是居中的主要內容,寬度自適應;附加列通常是廣告等額外信息,居右且寬度固定。
<div class="container"> <div class="main"></div> <div class="sub"></div> <div class="extra"></div> </div> .container { padding-left: 210px; padding-right: 190px; } .main { float: left; width: 100%; height: 300px; } .sub { position: relative; left: -210px; float: left; width: 200px; height: 300px; margin-left: -100%; } .extra { position: relative; right: -190px; float: left; width: 180px; height: 300px; margin-left: -180px; }
<div class="main-wrapper"> <div class="main"></div> </div> <div class="sub"></div> <div class="extra"></div> .main-wrapper { float: left; width: 100%; } .main { height: 300px; margin-left: 210px; margin-right: 190px; background-color: rgba(255, 0, 0, .5); } .sub { float: left; width: 200px; height: 300px; margin-left: -100%; background-color: rgba(0, 255, 0, .5); } .extra { float: left; width: 180px; height: 300px; margin-left: -180px; background-color: rgba(0, 0, 255, .5); }
倆種佈局方式都是把主列放在文檔流最前面,使主列優先加載。
兩種佈局方式在實現上也有相同之處,都是讓三列浮動,而後經過負外邊距造成三列布局。
兩種佈局方式的不一樣之處在於如何處理中間主列的位置:聖盃佈局是利用父容器的左、右內邊距定位;雙飛翼佈局是把主列嵌套在div後利用主列的左、右外邊距定位。
**其餘的話還有
flex佈局**
Flexbox又叫彈性盒模型。它能夠簡單使用一個元素居中(包括水平垂直居中),可讓擴大和收縮元素來填充容器的可利用空間,能夠改變源碼順序獨立佈局,以及還有其餘的一些功能。
Flex佈局是我最喜歡的佈局,合理使用它可以大大減小布局方面的工做, 例如以上列舉的三列布局也可使用flex輕鬆實現。此外在移動端使用flex也比較常見。
響應式佈局
網頁能夠自動識別設備屏幕寬度,根據不一樣的寬度採用不一樣的CSS的樣式,從而達到兼容各類設備的效果。
響應式佈局使用媒體查詢(CSS3 Media Queries), 根據不一樣屏幕分辨率採用不一樣CSS規則
流式佈局
流式布常見的就是bootstrap了它提供了一套響應式,移動優先的流式柵格系統(grid system),將屏幕分紅12列來實現響應式的。它的實現原理很是簡單,Media Query加上float佈局
因爲不一樣廠商的流覽器或某瀏覽器的不一樣版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),對CSS的支持、解析不同,致使在不一樣瀏覽器的環境中呈現出不一致的頁面展示效果。這時,咱們爲了得到統一的頁面效果,就須要針對不一樣的瀏覽器或不一樣版本寫特定的CSS樣式,咱們把這個針對不一樣的瀏覽器/不一樣版本寫相應的CSS code的過程,叫作CSS hack
CSS Hack的方法
條件註釋法 <!--[if IE]> 這段文字只在IE瀏覽器顯示 <![endif]—> 類內屬性前綴法 .hack{ background-color:red; /* All browsers */ background-color:blue !important;/* All browsers but IE6 */ *background-color:black; /* IE6, IE7 */ +background-color:yellow;/* IE6, IE7*/ background-color:gray\9; /* IE6, IE7, IE8, IE9, IE10 */ background-color:purple\0; /* IE8, IE9, IE10 */ background-color:orange\9\0;/*IE9, IE10*/ _background-color:green; /* Only works in IE6 */ } 媒體查詢 @media \0screen\,screen\9 { .hack{ /* IE 6 7 8 */ } } @media screen and (-webkit-min-device-pixel-ratio:0) { .demo { /* Webkit內核 */ } }
水平垂直居中問題,在css中margin: 0 auto;能夠實現水平居中,可是在垂直居中方面一直沒有特定的屬性,直到css3的出現,有了彈性盒,能夠經過設置彈性盒直接設置居中位置,作瀏覽器兼容的話能夠經過使用一些hack處理 負margin方法, table-cell方法,位移方法
負margin方法
咱們首先用top:50%和left:50%讓inner的座標原點(左上角)移動到container的中心,而後再利用負margin讓它往左偏移自身寬的一半,再往上偏移自身高的一半,這樣inner的中心點就跟container的中心點對齊了。
table-cell方法
經過將盒子轉換爲table元素,table元素自己是能夠經過屬性來控制位置,div上面的vertical-align: middle是控制垂直方向上的居中的,而text-align: center是控制水平方向的
彈性盒子法
align-items控制垂直方向的居中,justify-content控制水平方向的居中。這是CSS3的新方法
位移方法
位移方法和margin定位方法同樣,只不過吧margin改爲了位移不須要計算一半是多少,直接 transform:translate(-50%,--50%)
可繼承的樣式font-size font-family color text-indent
link屬於XHTML標籤,而@import是CSS提供的
頁面被加載的時,link會同時被加載,而@import引用的CSS會等到頁面被加載完再加載
@import只在IE5以上才能識別,而link是XHTML標籤,無兼容問題
link方式的樣式的權重 高於@import的權重
static:默認的屬性值,按照標準流(包括浮動方式)進行佈局。
relative:稱爲相對定位,使用相對的盒子的位置常以標準量的排版方式爲基礎,而後使盒子相對於它在本來的標準位置偏移指定的距離.相對定位仍在標準流中,它對父塊和兄弟塊盒子沒有任何影響。
absolute:絕對定位,盒子的位置以它的包含框爲基準進行偏移。絕對定位從標準流中脫離,而且以它最近的一個已經定位的祖先元素爲基準進行定位。沒有已經定位的祖先元素,則以瀏覽器窗口爲基準進行定位。
inherit:規定從父元素繼承 position 屬性的值。
fixed:固定定位,與絕對定位相似,以瀏覽器窗口爲基準進行定位,拖動瀏覽器窗口的滾動條時,位置保持不變。
sticky:粘性定位,粘性定位是相對定位和固定定位的混合。元素在跨越特定閾值前爲相對定位,以後爲固定定位。可是這個屬性兼容性不太好,ios上支持度相對好一些