Webkit 內核的瀏覽器,必須加上-webkit前綴css
row(默認值):主軸爲水平方向,起點在左端。html
row-reverse:主軸爲水平方向,起點在右端。node
column:主軸爲垂直方向,起點在上沿。css3
column-reverse:主軸爲垂直方向,起點在下沿。git
nowrap(默認):不換行github
wrap:換行,第一行在上方web
wrap-reverse:換行,第一行在下方算法
flex-direction屬性和flex-wrap屬性的簡寫形式chrome
flex-start(默認值):左對齊編程
flex-end:右對齊
center: 居中
space-between:兩端對齊,項目之間的間隔都相等。
space-around:每一個項目兩側的間隔相等。因此,項目之間的間隔比項目與邊框的間隔大一倍。
flex-start:交叉軸的起點對齊。
flex-end:交叉軸的終點對齊。
center:交叉軸的中點對齊。
baseline: 項目的第一行文字的基線對齊。
stretch(默認值):若是項目未設置高度或設爲auto,將佔滿整個容器的高度。
flex-start:與交叉軸的起點對齊。
flex-end:與交叉軸的終點對齊。
center:與交叉軸的中點對齊。
space-between:與交叉軸兩端對齊,軸線之間的間隔平均分佈。
space-around:每根軸線兩側的間隔都相等。因此,軸線之間的間隔比軸線與邊框的間隔大一倍。
stretch(默認值):軸線佔滿整個交叉軸。
通用選擇器:*
類別選擇器:.class
id選擇器:#id
標籤選擇器:p
後代選擇器:div p
子選擇器:div > p
羣組選擇器:div , p
相鄰同胞選擇器:div +p
僞類選擇器::link :visited :active :hover :focus :first-child
僞元素選擇器::first-letter :first-line:before :after :lang(language)
屬性選擇器:[attribute] [attribute=value] [attribute~=value] [attribute|=value]
超連接:LVHA的順序解決點擊連接後hover不出現的問題
不一樣級別: !important > 行內樣式 > ID選擇器 > 類選擇器 > 標籤 > 通配符 > 繼承 > 瀏覽器默認屬性
同一級別:CSS優先級:是由四個級別和各級別的出現次數決定的。四個級別分別爲:行內選擇符、ID選擇符、類別選擇符、元素選擇符。
優先級的算法:
每一個規則對應一個初始"四位數":0、0、0、0
如果 行內選擇符,則加一、0、0、0
如果 ID選擇符,則加0、一、0、0
如果 類選擇符/屬性選擇符/僞類選擇符,則分別加0、0、一、0
如果 元素選擇符/僞元素選擇符,則分別加0、0、0、1
算法:將每條規則中,選擇符對應的數相加後獲得的」四位數「,從左到右進行比較,大的優先級越高。
塊級格式化上下文會阻止外邊距疊加:當兩個相鄰的塊框在同一個塊級格式化上下文中時,它們之間垂直方向的外邊距會發生疊加。換句話說,若是這兩個相鄰的塊框不屬於同一個塊級格式化上下文,那麼它們的外邊距就不會疊加。
塊級格式化上下文不會重疊浮動元素:根據規定,一個塊級格式化上下文的邊框不能和它裏面的元素的外邊距重疊。這就意味着瀏覽器將會給塊級格式化上下文建立隱式的外邊距來阻止它和浮動元素的外邊距疊加。因爲這個緣由,當給一個挨着浮動的塊級格式化上下文添加負的外邊距時將會不起做用。
①在浮動的盒子之下再放一個標籤,在這個標籤中使用clear:both,來清除浮動對頁面的影響。即加標籤,並設置標籤的style爲clear:both
②僞類元素
.clearfix:after{ content:"";//設置內容爲空 height:0;//高度爲0 lineheight: 0;//行高爲0 display:block;//將文本轉爲塊級元素 visibility:hidden;//將元素隱藏 clear:both//清除浮動 }
③觸發BFC
層疊上下文(stacking context),是HTML中一個三維的概念。在CSS2.1規範中,每一個盒模型的位置是三維的,分別是平面畫布上的X軸
,Y軸
以及表示層疊的Z軸
。通常狀況下,元素在頁面上沿X軸Y軸
平鋪,咱們察覺不到它們在Z軸
上的層疊關係。而一旦元素髮生堆疊,這時就能發現某個元素可能覆蓋了另外一個元素或者被另外一個元素覆蓋。
若是一個元素含有層疊上下文,(也就是說它是層疊上下文元素),咱們能夠理解爲這個元素在Z軸
上就「高人一等」,最終表現就是它離屏幕觀察者更近。
層疊等級指的又是什麼?層疊等級(stacking level,叫「層疊級別」/「層疊水平」也行)
Z軸
上的上下順序。Z軸
上的上下順序。普通元素的層疊等級優先由其所在的層疊上下文決定。
層疊等級的比較只有在當前層疊上下文元素中才有意義。不一樣層疊上下文中比較層疊等級是沒有意義的。
如何產生層疊上下文呢?如何讓一個元素變成層疊上下文元素呢?HTML
中的根元素<html></html>
自己就具備層疊上下文,稱爲「根層疊上下文」。position
屬性爲非static
值並設置z-index
屬性爲具體數值,產生層疊上下文。z-index 屬性設置元素的堆疊順序。擁有更高堆疊順序的元素老是會處於堆疊順序較低的元素的前面。
z-index
屬性值並非在任何元素上都有效果。它僅在定位元素(定義了position
屬性,且屬性值爲非static
值的元素)上有效果。Z軸
上的堆疊順序,不只僅是直接比較兩個元素的z-index
值的大小,這個堆疊順序實際由元素的層疊上下文、層疊等級共同決定。屏幕上的xyz軸
<style> div { position: relative; width: 100px; height: 100px; } p { position: absolute; font-size: 20px; width: 100px; height: 100px; } .a { background-color: blue; z-index: 1; } .b { background-color: green; z-index: 2; top: 20px; left: 20px; } .c { background-color: red; z-index: 3; top: -20px; left: 40px; } </style> <body> <div> <p class="a">a</p> <p class="b">b</p> </div> <div> <p class="c">c</p> </div> </body>
由於p.a、p.b、p.c三個的父元素div都沒有設置z-index
,因此不會產生層疊上下文,因此.a、.b、.c都處於由<html></html>
標籤產生的「根層疊上下文」中,屬於同一個層疊上下文,此時誰的z-index
值大,誰在上面。
<style> div { width: 100px; height: 100px; position: relative; } .box1 { z-index: 2; } .box2 { z-index: 1; } p { position: absolute; font-size: 20px; width: 100px; height: 100px; } .a { background-color: blue; z-index: 100; } .b { background-color: green; top: 20px; left: 20px; z-index: 200; } .c { background-color: red; top: -20px; left: 40px; z-index: 9999; } </style> <body> <div class="box1"> <p class="a">a</p> <p class="b">b</p> </div> <div class="box2"> <p class="c">c</p> </div> </body>
咱們發下,雖然p.c
元素的z-index
值爲9999,遠大於p.a
和p.b
的z-index
值,可是因爲p.a
、p.b
的父元素div.box1
產生的層疊上下文的z-index
的值爲2,p.c
的父元素div.box2
所產生的層疊上下文的z-index
值爲1,因此p.c
永遠在p.a
和p.b
下面。
同時,若是咱們只更改p.a
和p.b
的z-index
值,因爲這兩個元素都在父元素div.box1
產生的層疊上下文中,因此,誰的z-index
值大,誰在上面。
Z軸
上垂直顯示。因而可知,前面所說的「層疊上下文」和「層疊等級」是一種概念,而這裏的「層疊順序」是一種規則。
background/border
"指的是層疊上下文元素的背景和邊框。inline/inline-block
元素的層疊順序要高於block
(塊級)/float
(浮動)元素。z-index: auto
和z-index: 0
在同一層級,但這兩個屬性值自己是有根本區別的。劃重點了!!!!到底應該怎麼判斷呢???
CSS3中出現了不少新屬性,其中一些屬性對層疊上下文也產生了很大的影響。以下:
flex|inline-flex
,子元素z-index
屬性值不爲auto
的時候,子元素爲層疊上下文元素;opacity
屬性值不是1
;transform
屬性值不是none
;mix-blend-mode屬性值不是
normal`;filter
屬性值不是none
;isolation
屬性值是isolate
;will-change
指定的屬性值爲上面任意一個;-webkit-overflow-scrolling
屬性值設置爲touch
。本部分參考連接:https://www.jianshu.com/p/0f88946a0746
<!--position + margin:--> <style> * { padding: 0; margin: 0; } .left { width: 200px; height: 600px; background: red; text-align: center; /*文字水平居中*/ line-height: 600px; /*文字垂直居中*/ color: #fff; position: absolute; top: 0; left: 0; } .right { height: 600px; background: yellow; text-align: center; /*文字水平居中*/ line-height: 600px; /*文字垂直居中*/ margin-left: 210px; } </style> <div class="left">定寬</div> <div class="right">自適應</div>
<!--float + margin:--> <style> * { padding: 0; margin: 0; } .left { width: 200px; height: 600px; background: red; text-align: center; /*文字水平居中*/ line-height: 600px; /*文字垂直居中*/ color: #fff; float: left; } .right { height: 600px; background: yellow; text-align: center; /*文字水平居中*/ line-height: 600px; /*文字垂直居中*/ margin-left: 210px; } </style> <div class="left">定寬</div> <div class="right">自適應</div>
<!--3.float + overflow--> <style> * { padding: 0; margin: 0; } .left { width: 200px; height: 600px; background: red; text-align: center; /*文字水平居中*/ line-height: 600px; /*文字垂直居中*/ color: #fff; float: left; } .right { height: 600px; background: yellow; text-align: center; /*文字水平居中*/ line-height: 600px; /*文字垂直居中*/ /*建立BFC 設置 overflow: hidden 會觸發 BFC 模式(Block Formatting Context)塊級格式上下文。*/ overflow: hidden; } </style> <div class="left">定寬</div> <div class="right">自適應</div>
<!--4. flex--> <style> * { padding: 0; margin: 0; } .parent { display: flex; } .left { width: 200px; height: 600px; background: red; text-align: center; /*文字水平居中*/ line-height: 600px; /*文字垂直居中*/ color: #fff; } .right { height: 600px; background: yellow; text-align: center; /*文字水平居中*/ line-height: 600px; /*文字垂直居中*/ flex: 1; } </style> <body class="parent"> <div class="left">定寬</div> <div class="right">自適應</div> </body>
比較特殊的三欄佈局,一樣也是兩邊固定寬度,中間自適應,惟一區別是dom結構必須是先寫中間列部分,這樣實現中間列能夠優先加載。
.container { padding-left: 220px;//爲左右欄騰出空間 padding-right: 220px; } .left { float: left; width: 200px; height: 400px; background: red; margin-left: -100%; position: relative; left: -220px; } .center { float: left; width: 100%; height: 500px; background: yellow; } .right { float: left; width: 200px; height: 400px; background: blue; margin-left: -200px; position: relative; right: -220px; } <article class="container"> <div class="center"> <h2>聖盃佈局</h2> </div> <div class="left"></div> <div class="right"></div> </article>
一樣也是三欄佈局,在聖盃佈局基礎上進一步優化,解決了聖盃佈局錯亂問題,實現了內容與佈局的分離。並且任何一欄均可以是最高欄,不會出問題。
.container { min-width: 600px;//確保中間內容能夠顯示出來,兩倍left寬+right寬 } .left { float: left; width: 200px; height: 400px; background: red; margin-left: -100%; } .center { float: left; width: 100%; height: 500px; background: yellow; } .center .inner { margin: 0 200px; //新增部分 } .right { float: left; width: 200px; height: 400px; background: blue; margin-left: -200px; } <article class="container"> <div class="center"> <div class="inner">雙飛翼佈局</div> </div> <div class="left"></div> <div class="right"></div> </article>
.center, .left, .right { padding-bottom: 10000px; margin-bottom: -10000px; } .container { padding-left: 220px; padding-right: 220px; overflow: hidden;//把溢出背景切掉 }
本部分摘自:http://www.javashuo.com/article/p-oomacldo-dg.html
① 設置 Meta 標籤
大多數移動瀏覽器將HTML頁面放大爲寬的視圖(viewport)以符合屏幕分辨率。你可使用視圖的meta標籤來進行重置。下面的視圖標籤告訴瀏覽器,使用設備的寬度做爲視圖寬度並禁止初始的縮放。在<head>標籤里加入這個meta標籤。
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
user-scalable = no 屬性可以解決 iPad 切換橫屏以後觸摸才能回到具體尺寸的問題。
②經過媒介查詢來設置樣式 Media Queries
Media Queries 是響應式設計的核心。
它根據條件告訴瀏覽器如何爲指定視圖寬度渲染頁面。假如一個終端的分辨率小於 980px,那麼能夠這樣寫:
@media screen and (max-width: 980px) { #head { … } #content { … } #footer { … } }
這裏的樣式就會覆蓋上面已經定義好的樣式。
③ 設置多種試圖寬度
假如咱們要設定兼容 iPad 和 iphone 的視圖,那麼能夠這樣設置:
/** iPad **/ @media only screen and (min-width: 768px) and (max-width: 1024px) {} /** iPhone **/ @media only screen and (min-width: 320px) and (max-width: 767px) {}
CSS預處理器定義了一種新的語言,其基本思想是,用一種專門的編程語言,爲CSS增長了一些編程的特性,將CSS做爲目標生成文件,而後開發者就只要使用這種語言進行編碼工做。通俗的說,CSS預處理器用一種專門的編程語言,進行Web頁面樣式設計,而後再編譯成正常的CSS文件。
廣義上說,目標格式爲 CSS 的 預處理器 是 CSS 預處理器,但本文 特指 以最終生成 CSS 爲目的的 領域特定語言。Sass
、LESS
、Stylus
是目前最主流的 CSS 預處理器。
實現原理
優缺點
CSS 後處理器 是對 CSS 進行處理,並最終生成 CSS 的 預處理器,它屬於廣義上的 CSS 預處理器。
咱們好久之前就在用 CSS 後處理器 了,最典型的例子是 CSS 壓縮工具(如 clean-css),只不過之前沒單獨拿出來講過。還有最近比較火的 Autoprefixer,以 Can I Use 上的 瀏覽器支持數據 爲基礎,自動處理兼容性問題。
CSS 後處理器 是對 CSS 進行處理,並最終生成 CSS 的 預處理器,它屬於廣義上的 CSS 預處理器。
咱們好久之前就在用 CSS 後處理器 了,最典型的例子是 CSS 壓縮工具(如 clean-css
),只不過之前沒單獨拿出來講過。
實現原理
本部分參考連接:https://blog.csdn.net/yushuangyushuang/article/details/79209752
1.CSS3的選擇器
2. @Font-face 特性
Font-face 能夠用來加載字體樣式,並且它還可以加載服務器端的字體文件,讓客戶端顯示客戶端所沒有安裝的字體。
@font-face { font-family: iconfont; src: url(//at.alicdn.com/t/font_1465189805_4518812.eot); }
3. 圓角 border-radius: 15px;
4.陰影(Shadow)
.class1{ text-shadow:5px 2px 6px rgba(64, 64, 64, 0.5); }
5.CSS3 的漸變效果
background-image:-webkit-gradient(linear,0% 0%,100% 0%,from(#2A8BBE),to(#FE280E));
6.css彈性盒子模型
<div class="boxcontainer"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> .boxcontainer { width: 1000px; display: -webkit-box; display: -moz-box; -webkit-box-orient: horizontal; -moz-box-orient: horizontal; } .item { background: #357c96; font-weight: bold; margin: 2px; padding: 20px; color: #fff; font-family: Arial, sans-serif; }
7.Transition 對象變換時的過渡效果
transition-property 對象參與過渡的屬性
transition-duration 過渡的持續時間
transition-timing-function 過渡的類型
transition-delay 延遲過渡的時間
transition:border-color .5s ease-in .1s, background-color .5s ease-in .1s, color .5s ease-in .1s; <!--示例代碼--> <style type="text/css"> .main{ position: relative; margin: 0 auto; height:45px; width: 300px; background-color:lightgray; transition:background-color .6s ease-in 0s; } .main:hover{ background-color: dimgray; } </style> <div class="main"></div>
8. Transforms 2D/3D轉換效果
主要包括 translate(水平移動)、rotate(旋轉)、scale(伸縮)、skew(傾斜)、沿X,Y,Z軸的旋轉
<style type="text/css"> .main{ position: relative; top:200px; margin: 0 auto; height:45px; width: 300px; background-color:dimgray; transition:transform .6s ease 0s; transform: rotate(0deg); } .main:hover{ transform: rotate(180deg); } </style> <div class="main"></div>
9. Animation動畫特效
下面的表格列出了 @keyframes 規則和全部動畫屬性:
屬性 | 描述 |
---|---|
@keyframes | 規定動畫。 |
animation | 全部動畫屬性的簡寫屬性,除了 animation-play-state 屬性。 |
animation-name | 規定 @keyframes 動畫的名稱。 |
animation-duration | 規定動畫完成一個週期所花費的秒或毫秒。默認是 0。 |
animation-timing-function | 規定動畫的速度曲線。默認是 "ease"。 |
animation-delay | 規定動畫什麼時候開始。默認是 0。 |
animation-iteration-count | 規定動畫被播放的次數。默認是 1。 |
animation-direction | 規定動畫是否在下一週期逆向地播放。默認是 "normal"。 |
animation-play-state | 規定動畫是否正在運行或暫停。默認是 "running"。 |
<style type="text/css"> .main{ position: absolute; left: 10px; top:200px; height:45px; width: 300px; background-color:cadetblue; } .main:hover{ animation: animations 2s ease 0s; } @keyframes animations { 0%{ left: 10px; opacity: 1; } 50%,70%{ left: 50%; opacity: .7; margin-left:-150px; } 100%{ left: 100%; opacity: 0; margin-left:-300px; } } </style> <div class="main"></div>
當動畫爲 25% 及 50% 時改變背景色,而後當動畫 100% 完成時再次改變:
@keyframes myfirst { 0% {background: red;} 25% {background: yellow;} 50% {background: blue;} 100% {background: green;} }
雖說瀏覽器執行js是單線程執行(注意,是執行,並非說瀏覽器只有1個線程,而是運行時,runing),但實際上瀏覽器的2個重要的執行線程,這 2 個線程協同工做來渲染一個網頁:主線程和合成線程
通常狀況下,主線程負責:運行 JavaScript;計算 HTML 元素的 CSS 樣式;頁面的佈局;將元素繪製到一個或多個位圖中;將這些位圖交給合成線程。
相應地,合成線程負責:經過 GPU 將位圖繪製到屏幕上;通知主線程更新頁面中可見或即將變成可見的部分的位圖;計算出頁面中哪部分是可見的;計算出當你在滾動頁面時哪部分是即將變成可見的;當你滾動頁面時將相應位置的元素移動到可視區域。
本部分摘自:http://www.javashuo.com/article/p-ojjjvoyb-g.html
inline-block 後的元素建立了一個行級的塊容器,該元素內部(內容)被格式化成一個塊元素,同時元素自己則被格式化成一個行內元素。
也就是說,它是一個格式化爲行內元素的塊容器。兼具行內元素和塊元素的特色。
DOM 規範中規定,一切皆是節點,換行或者空格,會被當成文檔節點來處理。
因此那個空隙就是這個空的文檔節點致使。(它由空格、換行或回車所產生空白符所致)
方法1. 將標籤之間的空格與換行所有去掉
<p>
<span>hello</span><span>world</span>
</p>
可是這樣寫很不人性化,能夠用以下方式解決:
也就是在相鄰的元素之間加上空白的html註釋,變相地取消了他們之間的空白節點。還有其餘的幾種改法這裏不一一列舉,你們也能夠自由發揮,只要是取消了相鄰元素之間的空白節點就能達到目的。
<ul> <li>控球后衛</li><!-- --><li>得分後衛</li><!-- --><li>小前鋒</li><!-- --><li>大前鋒</li><!-- --><li>中鋒</li> </ul>
方法2. font-size設爲零
<p> <span>hello</span> <span>world</span> </p> span { display:inline-block; width:100px; background:#36c; color:#fff; font-size:30px; text-align:center; } p { font-size: 0; }
方法3. letter-spacing和word-spacing改爲某個負值
.span { letter-spacing: -.5em; /* webkit: collapse white-space between units */ *letter-spacing: normal; /* reset IE < 8 */ word-spacing: -.5em; /* IE < 8 && gecko: collapse white-space between units */ }
方法4. 使用負邊距margin
ul li { display: inline-block; width: 160px; text-align: center; border-right: 1px solid #8E0303; margin-right: -10px; } ul li:last-child { border-right: none; margin-right: 0; }
讓當前viewport的寬度等於設備的寬度,同時不容許用戶手動縮放。
<meta name="viewport" content="width=device-width, user-scalable=no,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> width=device-width: 讓當前viewport寬度等於設備的寬度 user-scalable=no: 禁止用戶縮放 initial-scale=1.0: 設置頁面的初始縮放值爲不縮放 maximum-scale=1.0: 容許用戶的最大縮放值爲1.0 minimum-scale=1.0: 容許用戶的最小縮放值爲1.0
第一步先計算高度,假設寬100%,那麼高爲h=9/16=56.25%
第二步利用以前所說設置padding-bottom方法實現矩形
<div class="box"> <div class="scale"> <p>這是一個16:9的矩形</p> </div> </div> .box { width: 80%; } .scale { width: 100%; padding-bottom: 56.25%; height: 0; position: relative; } .item { width: 100%; height: 100%; background-color: aquamarine; position: absolute; }
rem佈局的本質是等比縮放,通常是基於寬度。
當咱們設置盒子的width和height爲0時,此時效果以下:
而後將border的底部取消
最後設置border的左邊和右邊爲白色
/* border-radius的值要設置高寬的一半值 */ 圓形 { display:inline-block; margin-right:5px; border-radius:50px; /* 圓形邊緣弧度 */ width:100px; /* 寬度 */ height:100px; /* 高度 */ background-color: red; }
咱們在html中,若是要設置一個1像素的邊框,最多見的就是border: 1px solid #000; 這句就表示設置一個1像素的,實心的,黑色的邊框。這個css語句,在pc上毫無問題,可是隨着移動web的興起,貌似就有些問題了。能夠試驗一下,把這句放到手機瀏覽器中顯示一下,而後屏幕截圖,你會驚奇的發現,1px已經顯示爲2px了。若是你放到iphone6 plus下,你會更神奇的發現,竟然是3px。
那麼,爲何設置爲1px的邊框,在手機下會顯示爲2px,甚至3px呢?其實,這就是retina屏幕搞的鬼。
至於retina的原理,這裏就很少介紹了,retina的作法是把1像素分割成4個像素顯示,這樣看起來更細膩,但其實仍是1像素。因此,1px的邊框,在retina屏幕上就會顯示成2px的寬度。
利用viewport + rem + js
動態的修改頁面的縮放比例,實現小於1像素的顯示。在頁面初始化時,在頭部引入原始默認狀態以下,接下來的任務就是js的動態修改縮放比 以及 實現rem根元素字體大小的設置。
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta name="viewport" id="WebViewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> var viewport = document.querySelector("meta[name=viewport]") if (window.devicePixelRatio == 1) { viewport.setAttribute('content', 'width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no') } if (window.devicePixelRatio == 2) { viewport.setAttribute('content', 'width=device-width, initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no') } if (window.devicePixelRatio == 3) { viewport.setAttribute('content', 'width=device-width, initial-scale=0.333333333, maximum-scale=0.333333333, minimum-scale=0.333333333, user-scalable=no') } var docEl = document.documentElement; var fontsize = 10 * (docEl.clientWidth / 320) + 'px'; docEl.style.fontSize = fontsize;
position的取值:static(靜態定位)、relative(相對定位)、absolute(絕對定位)、fixed(固定定位)。
其中static和fixed比較好理解:static是position的默認值,沒有定位,元素出如今正常的的流中(忽略top、bottom、left、right、z-index聲明);fixed是至關於瀏覽器窗口進行定位,元素的位置經過left、right、top、bottom進行規定,可經過z-index進行層次分級
relative:定位爲relative的元素脫離正常的文本流中,但其在文本流中的位置依然存在他是默認參照父級的原始點爲原始點,無父級則以文本流的順序在上一個元素的底部爲原始點,配合TRBL(Top、Right、Bottom、left)進行定位。【通俗的說就是不管父級是否存在有沒有TRBL均是以父級的左上角進行定位,可是父級的padding屬性會對其有影響】
absolute:定位爲absolute的元素脫離正常的文本流,但其在正常流中的位置不存在。若是父級沒有設定position屬性,則當前absolute元素以瀏覽器左上角爲原始點進行定位,不然以父級元素左上角原定進行定位,位置由TRBL決定,父級的padding屬性,對其不起做用。
relative定位的層是相對其最近的父元素(無論這個父元素的是什麼定位方式),而absolute定位的層是相對其最近的定義爲absolute或relative的父層(可能不是直接父元素)若是其父層都未定義absolute或relative,則相對body進行定位。
inherit:規定應該從父元素繼承 position 屬性的值。
1) 只適用: 寬高已定
設置position: absolute(父元素記得設置: relative), 而後top和left設置50%, 50%, 再設置margin-left=寬/2, margin-top:寬/2
.div1{ width:500px; height:500px; border:1px solid black; position: relative; /*很重要,不能忘*/ } .div2{ background: yellow; width:300px; height:200px; margin-left:-150px; margin-top:-100px; top:50%; left:50%; position: absolute; }
2) 只適用: 固定寬高; 若是寬高隨意,想靠內部撐開的話, 會佔滿整個父div
依然是利用position:子div的上下左右都設置成0,而後margin設置auto。關鍵是要設置position:子absolute,父relative。
.div1{ width:500px; height:500px; border:1px solid black; position: relative; /*很重要,不能忘*/ } .div2{ background: yellow; width:300px; height:200px; margin:auto; bottom: 0; top:0; left:0; right:0; position: absolute; }
3) 適用: 不管是否固定寬高均可用. 問題在於兼容性. ie9及如下不支持
設置父級flex屬性: display:flex; justify-content:center; align-items: center;
這種方法在子級div有多個時也能夠實現居中----具體看flex屬性設置
.div1{ width:500px; height:500px; border:1px solid black; display: flex; justify-content: center; /*使垂直居中*/ align-items:center; /*使水平居中*/ } .div2{ background: yellow; /*width:300px; height:200px;*/ }
4) 適用: 要設寬度, 不然會使得寬度爲父級div的寬度
父級元素設置display:table-cell ,而後vertical-align:middle。這種方法能夠設置垂直居中. 這時候只要在子元素裏設置margin:auto便可實現水平居中
可是這種方法好像會使父元素的居中無效。
.div1{ width:500px; height:500px; border:1px solid black; display:table-cell; vertical-align: middle; } .div2{ background: yellow; width:300px; /*height:200px;*/ margin:auto; }
5) 適用: 可不指定寬高
使用transform居中. 設置父級position:relative; 子級position:absolute. 而後top: 50%; left:50%; transform:translate(-50%,-50%)
.div1{ width:500px; height:500px; border:1px solid black; position: relative; } .div2{ background: yellow; position: absolute; /*width:200px;*/ top:50%; left:50%; transform:translate(-50%,-50%); }
6) 適用: 指定寬高百分比
保證left和right的百分數同樣就能夠實現水平居中,保證top和bottom的百分數同樣就能夠實現垂直居中。可是這種方法不能由內部元素自動調節div的寬高,而是經過父元素大小控制的
.div1{ width:500px; height:500px; border:1px solid black; position: relative; } .div2{ background: yellow; position: absolute; left: 30%; right: 30%; top:40%; bottom: 40%; }
7) 使用display:inline-block加僞元素
box 容器經過 after或者before 生成一個高度 100% 的「備胎」,他的高度和容器的高度是一致的,相對於「備胎」垂直居中,在視覺上表現出來也就是相對於容器垂直居中了
.div1{ width:600px; height:200px; border:1px solid black; text-align: center; } .div1:after{ content:""; display: inline-block; vertical-align: middle; height: 100%; } .div2{ background: black; color:white; display: inline-block; }
使用雪碧圖的目的:有時爲了美觀,咱們會使用一張圖片來代替一些小圖標,可是一個網頁可能有不少不少的小圖標,瀏覽器在顯示頁面的時候,就須要像服務器發送不少次訪問請求,這樣一來,一是形成資源浪費,二是會致使訪問速度變慢。這時候,把不少小圖片(須要使用的小圖標)放在一張圖片上,按照必定的距離隔開,就解決了上述的兩個問題。
通俗來講:將小圖標合併在一塊兒以後的圖片稱做雪碧圖,每一個小圖標的使用須要配合background-position來獲取。
1.將多張圖片合併到一張圖片中,能夠減少圖片的總大小。
2.將多張圖片合併成一張圖片後,下載所有所需的資源,只需一次請求。能夠減少創建鏈接的消耗。
1.肯定在哪裏引入精靈圖,併爲其設置大小。
2.在樣式CSS中插入背景圖,background-image:url("");
3.利用background-position:x y;屬性和background-size:cover;background-repeat:no-repeat;等屬性的組合進行定位。
<li class="cat1"><i></i><h3>服飾內衣</h3></li> <li class="cat2"><i></i><h3>鞋包配飾</h3></li> <li class="cat3"><i></i><h3>運動戶外</h3></li> <li class="cat4"><i></i><h3>珠寶手錶</h3></li> i{ width: 30px; height: 24px; float: left; background: url(images/sprite.png); margin: 5px 10px 0 0 ; } .cat1 i{ background-position: 0 0; } .cat2 i{ background-position: 0 -24px; } .cat3 i{ background-position: 0 -48px; } .cat4 i{ background-position: 0 -72px; }
後續遇到新的問題還會繼續補充·······