在《css世界》這本書中有一些「黑魔法」給列舉出來,在結合本身的理解。 篇幅有點長,但願你們可以堅持看完,必定會有收穫!!!
如下是摘自每章內一些重要的概念與技巧。其中有解決圖片間隙的問題、小圖標與文字居中問題等;
ps: 特別是 「line-height、vertical-align」內容須要反覆仔細研究閱讀php
成爲 文檔流,將窗體自上而下分紅一行一行,並在每行中按從左至右依次排放元素 (引導元素排列和定位)
利用元素「流」的特性實現的各種佈局效果。由於「流」自己具備自適應特性,因此「流體佈局」每每都是具備自適應性。
元素寬度按照分辨率寬度進行長度、寬度的調整,但佈局不變。
當某個瀏覽器中出現與其餘瀏覽器 不同的行爲或樣式表現;
Web應用場景變幻無窮,Web標準也是不可能面面俱到的,也會存在規範描述之外的場景,此時,各大瀏覽器廠家只能根據本身的理解與喜愛去實現,一旦個性化就會出現差別
當前的文字顏色;凡事須要使用顏色值的地方,均可以使用currentColor替換,比方說背景色 – background-color, 漸變色 – gradient, 盒陰影 – box-shadow, SVG的填充色 – fill等等
div { color:#3c3c3c; border: 1em solid currentColor; }
currentColor-CSS3超高校級好用CSS變量css
默認狀況下,塊級元素會新起一行;佔據其父元素(容器)的整個空間
正是因爲「塊級元素」具備換行特性,所以理論上它均可以配合clear屬性來清除浮動帶來的影響
.clear:after { content: ''; display: table; // 也能夠是block,或者是list-item clear: both; }
list-item(「 附加盒子」)名「 標記盒子」;由於生成了一個附加的盒子, 學名「標記盒子」(marker box),專門用來放圓點、數字這些項目符號;
元素都兩個盒子,外在盒子和內在盒子;
外在盒子:外在的「內聯盒子」(inline)
內在盒子:內在的「塊級容器盒子」(block)
<div>、<p>這些元素的寬度默認是100%於父級容器的
浮動、絕對定位、inline-block元素或table元素
出如今table-layout爲auto的表格中;當每一列空間都不夠的時候,文字能斷就斷,但中文是隨便斷的,英文單詞不能斷
內容很長的連續的英文和數字,或者內聯元素被設置了white-space:nowrap
「內部尺寸」: 尺寸由內部元素決定
「外部尺寸」: 寬度由外部元素決定
<div>、<p>這些元素的寬度默認是100%於父級容器;display:block;
寬度100%顯示,margin/border/padding和content內容區域自動分配水平空間html
絕對定位元素的寬度表現是「包裹性」,寬度由內部尺寸決定
div { position: absolute; left: 20px; right: 20px; } div { position: absolute; top: 20px; bottom: 20px; } // 但不知道爲何不行
除了「包裹」(max-width:100%),還有「自適應性(元素尺寸由內部元素決定, 但永遠小於「包含塊」容器的尺寸)」
<button>按鈕</button> <input type="button" value="按鈕">
著名的「按鈕」元素:極具表明性的inline-block元素css3
文字少的時候居中顯示,文字超過一行的時候居左顯示web
.box { padding: 10px; background-color: #cd0000; text-align: center; } .content { display: inline-block; text-align: left; }
<div class="box"> <p id="content" class="content">文字內容</p> </div>
元素最適合的最小寬度
是元素能夠有的最大寬度( 若是內部沒有塊級元素或者塊級元素沒有設定寬度值,其實是最大的連續內聯盒子的寬度)
解決 替換元素寬度自適應問題
父元素height爲auto,只要子元素在文檔流中,其百分比值徹底就被忽略了;百分比高度值要想起做用,其父級必須有一個能夠生效的高度值;
包含塊的高度沒有顯式指定(即 高度由內容決定),而且該 元素不是絕對定位,則計算值爲auto
'auto' * 100/100 = NaN
width:100%有效包含塊的寬度取決於該元素的寬度,那麼產生的佈局在CSS 2.1中是未定義的
假如說 max-width初始值是auto,咱們的width永遠不能設置爲比auto計算值更大的寬度值
max-width會覆蓋width,不是普通的覆蓋,是超級覆蓋;比直接在元素的style屬性中設置CSS聲明還要高
min-width和max-width衝突; 遵循「超越最大」規則(注意不是「後來居上」規則), min-width覆蓋
咱們展開的元素內容是動態的,換句話說高度是不固定的
.element { max-height: 0; overflow: hidden; transition: max-height .25s; } .element.active { max-height: 666px; /* 一個足夠大的最大高度值 */ }
max-height值比height計算值大的時候,元素的高度就是height屬性的計算高度canvas
max-height不能設置很大,若是延遲時間長,會有延遲的感受。瀏覽器
圍繞 文字看不見的盒子,其大小僅受字符自己特性控制,本質上是一個 字符盒子(character box);可是有些元素,如圖片這樣的替換元素,其內容顯然不是文字,不存在字符盒子之類的,所以,對於這些元素,內容區域能夠當作元素自身markdown
元素的「外在盒子」,用來決定元素是內聯仍是塊級
<span>、<a>和<em>等
由一個一個「內聯盒子」組成的
由一行一行的「行框盒子」組成(CSS規範中,並無「包含盒子」的說法,更準確的稱呼應該是「 包含塊」)
內聯元素的全部解析和渲染會有前面有一個「空白節點」;不佔據任何寬度,看不見也沒法經過腳本獲取( 文檔聲明必須是HTML5文檔聲明(HTML代碼以下))
div { background-color: #cd0000; } span { display: inline-block; } <div><span></span></div>
過修 改某個屬性值呈現的內容就能夠被替換的元素; 如「img」
須要相似appearance屬性,或者瀏覽器自身暴露的一些樣式接口,例如::-ms-check{}
其默認的尺寸(不包括邊框)是300像素×150像素,如<video>、<iframe>或者<canvas>
vertical-align屬性,對於替換元素和非替換元素,vertical-align屬性值的解釋是不同
替換內容本來的尺寸有着本身的寬度和高度
HTML原生屬性width和height屬性、<input>的size屬性、<textarea>的cols和rows屬性等
經過CSS的width和height或者max-width/min-width和max-height/min-height設置的尺寸
CSS尺寸 > HTML尺寸 > 固有尺寸
在沒有src屬性下,各個瀏覽器表現的各不相同;src缺省的<img>不是替換元素,而是一個普通的內聯元素
<img>
<img>直接沒有src屬性;當圖片的src屬性缺省的時候,圖片不會有任何請求,是最高效的實現方式
設置圖片個尺寸不是直接設置圖片的固有尺寸,圖片的固有尺寸是沒法設置;可是設定width和height會影響圖片的尺寸
查看示例app
基於僞元素的圖片內容生成技術
查看示例異步
在Chrome瀏覽器下,全部的元素都支持content屬性,而 其餘瀏覽器僅在::before/::after僞元素中才有支持
content屬性改變的僅僅是視覺呈現,當咱們以右鍵或其餘形式保存這張圖片的時候,所保存的仍是原來src對應的圖片
content屬性生成的內容都是 替換元素
div:before { content: url(1.jpg); }
img::after { /* 生成alt信息 */ content: attr(alt); /* 其餘CSS略 */ }
內聯元素沒有 可視寬度和可視高度的說法(clientHeight和clientWidth永遠是0), 垂直方向的行爲表現徹底受line-height和vertical-align的影響;視覺上並無改變和上一行下一行內容的間距
padding百分比值不管是 水平方向仍是垂直方向均是相對於寬度計算
margin才能夠改變元素的可視尺寸
列表塊兩端對齊,一行顯示3個,中間有2個20像素的間隙
ul { margin-right: -20px; } ul > li { float: left; width: 100px; margin-right: 20px; }
塊級元素的上外邊距(margin-top)與下外邊距(margin-bottom)有時會合併爲單個外邊距
p { margin: 1em 0; } <p>第一行</p> <p>第二行</p>
讓圖文信息的排版更加舒服天然
在頁面中任何地方嵌套或直接放入任何裸""<div>"",都不會影響原來的塊狀佈局。
width或height爲auto時;元素是具 有對應方向的自動填充特性
填充閒置尺寸
三道槓
.icon-menu { width: 120px; height: 20px; border-top: 60px double; border-bottom: 20px solid; }
border-color默認顏色就是color色值;沒有指定 border-color顏色值的時候,會使用當前元素的 color計算值做爲邊框色
.icon-clear { width: 16px; height: 16px; border: 11px solid transparent; }
ex是CSS中的一個相對單位; 小寫字母x的x-height(不受字體和字號影響的內聯元素的垂直居中對齊效果);內聯元素默認是基線對齊的,而基線就是x的底部,而1ex就是一個x的高度;
vertical-align:middle
定了用來計算行框盒子高度的基礎高度; 經過改變「行距」來實現
行距 = line-height - font-size
能夠瞬間明確咱們的閱讀方向,讓咱們閱讀文字更輕鬆
當前文字的上方和下方;這個「行距」的高度僅僅是完整「行距」高度的一半
半行距 = (line-height - font-size )/2;
line-height不能夠影響替換元素;可是在視覺上是受到line-height影響了,那是由於把「幽靈空白節點」的高度變高了;圖片爲內聯元素,會構成一個「行框盒子」,而在HTML5文檔模式下,每個「行框盒子」的前面都有一個寬度爲0的「幽靈空白節點」特性表現和普通字符如出一轍;
經過改變塊級元素裏面內聯級別元素佔據的高度實現
CSS中「行距的上下等分機制」
只須要line-height這一個屬性就能夠
文字字形的垂直中線位置廣泛要比真正的「行框盒子」的垂直中線位置低
須要line-height屬性的好朋友vertical-align屬性幫助
不一樣系統不一樣瀏覽器的默認line-height都是有差別
如line-height:1.5,其最終的計算值是和當前font-size相乘後的值
如line-height:150%,其最終的計算值是和當前font-size相乘後的值
也就是帶單位的值,如line-height:21px或者line-height:1.5em;最終的計算值是和當前font-size相乘後的值
考慮到文章閱讀的溫馨度,line-height值能夠設置在1.6~1.8
長度值或者數值
終父級元素的高度都是由 數值大的那個line-height決定
如baseline(默認值)、top、middle、bottom
如text-top、text-bottom;
如sub、super
如20px、2em、20%等 百分比是相對於line-height的計算值計算
只能做用在display計算值爲 inline、inline- block,inline-table或table-cell的元素上
對字符而言, font-size越大字符的基線位置越往下,由於文字默認所有都是基線對齊,因此當字號大小不同的兩個文字在一塊兒的時候,彼此就會發生上下位移,若是位移距離足夠大,就會超過行高的限制,而致使出現意料以外的高度
默認和基線(也就是這裏字母x的下邊緣)對齊,字母x往下的行高產生的多餘的間隙就嫁禍到圖片下面,讓人覺得是圖片產生的間隙,實際上,是 「幽靈空白節點」、line-height和vertical-align屬性共同做用的結果
一個inline-block元素,若是裏面沒有內聯元素,或者overflow不是visible,則該元素的基線就是margin底邊緣;
不然其基線就是元素裏面最後一行內聯元素的基線
圖標與文字居中
盒子的頂部和父級內容區域的頂部對齊
盒子的底部和父級內容區域的底部對齊
提升盒子的基線到父級合適的上標基線位置
下降盒子的基線到父級合適的下標基線位置。
浮動的本質就是爲了 實現文字環繞效果。 而這種文字環繞,主要指的就是文字環繞圖片顯示的效果
包裹
自適應性
元素一旦float的屬性值不爲none,則其display計算值就是block或者table
是float元素所在的「流」中的一個點,這個點自己並不浮動,就表現而言如同一個空的內聯元素,有內聯元素天然就有「行框盒子」
是浮動元素對齊參考的實體: float元素的「浮動參考」是「行框盒子」,也就是float元素在當前「行框盒子」內定位
.animal元素沒有浮動,也沒有設置寬度, 所以,流動性保持得很好,設置margin-left、border-left或者padding-left均可以自動改變content box的尺寸,繼而實現了寬度自適應佈局效果
clear屬性是 讓自身不能和前面的浮動元素相鄰,注意這裏「前面的」3個字,也就是clear屬性對「後面的」浮動元素是漠不關心的
「CSS世界的結界」;經過一些特定的手段造成的封閉空間,裏面的人出不去,外面的人進不來,具備極強的防護力
只要元素符合上面任意一個條件, 就無須使用clear:both屬性去清除浮動
img { float: left; } .animal { overflow: hidden; } <div class="father"> <img src="me.jpg"> <p class="animal">小貓1,小貓2,...</p> </div>
通流體元素在設置了overflow:hidden後, 會自動填滿容器中除了浮動元素之外的剩餘空間,造成自適應佈局效果,並且這種自適應佈局要比純流體自適應更加智能
要想完全清除浮動的影響,最適合的屬性不是clear而是overflow。通常使用overflow:hidden,利用BFC的「結界」特性完全解決浮動對外部或兄弟元素的影響
當子元素內容超出容器寬度高度限制的時候,剪裁的邊界是 border box的內邊緣
要儘可能避免滾動容器設置padding-bottom值,除了樣式表現不一致外,還會致使scrollHeight值不同
URL地址中的錨鏈與錨點元素對應並有交互行爲
可focus的錨點元素處於focus狀態
經過改變容器滾動高度或者寬度來實現;容器的滾動高度,而不是瀏覽器的滾動高度; 並且定位行爲的發生是由內而外
普通元素和窗體同時可滾動的時候,會由內而外觸發全部可滾動窗體的錨點定位行爲
別就在於有沒有那個滾動條。元素設置了overflow:hidden聲明, 裏面內容高度溢出的時候,滾動依然存在,僅僅滾動條不存在
當 absolute和float同時存在的時候, float屬性是無任何效果的
元素用來計算和定位的一個框
position:absolute,則「包含塊」由最近的position不爲static的祖先元素創建
內聯元素也能夠做爲「包含塊」所在的元素
內聯元素的「包含塊」是由「生成的」先後內聯盒子決定的,與裏面的內聯盒子細節沒有任何關係
包含塊」所在的元素不是父塊級元素,而是最近的position不爲static的祖先元素或根元素
邊界是padding box而不是content box
由於絕對定位元素的定位值和列表容器的padding值耦合在一塊兒了:咱們對padding間距進行調整的時候,絕對定位元素的right、top值也必定要跟着一塊兒調整,不然就會出現樣式問題
一個絕對定位元素,沒有任何left/top/right/bottom屬性設置,而且其祖先元素所有都是非定位元素: 當前位置
若是 overflow不是定位元素, 同時絕對定位元素和overflow容器之間沒有定位元素,則overflow沒法對absolute元素進行剪裁若是overflow的屬性值不是hidden而是auto或者scroll,即便絕對定位元素高寬比overflow元素高寬還要大,也都不會出現滾動條
clip屬性要想起做用,元素必須是 絕對定位或者固定定位
overflow屬性每每就力不能及了,由於fixed固定定位元素的包含塊是根元素,除非是根元素滾動條,普通元素的overflow是根本沒法對其進行剪裁的; 可是clip能夠
它具 有更強的廣泛適應性,任何元素、任何場景均可以無障礙使用
absolute元素才 真正變成絕對定位元素若是咱們僅設置了一個方向的絕對定位,沒有設置方向依然保持了相對特性
流體特性:對立方向同時發生定位的時候設置了對立定位屬性的絕對定位元素的表現神似普通的<div>元素,不管設置padding仍是margin,其佔據的空間一直不變,變化的就是content box的尺寸
.element { width: 300px; height: 200px; position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; }
相對於自身進行偏移定位
即便本身移動,也會在原來的位置留下空間當relative進行定位偏移的時候,通常狀況下不會影響周圍元素的佈局
position:fixed固定定位元素的「包含塊」是<html>根元素;
當內容發生層疊的時候,必定會有一個先後的層疊順序產生
自成一個小世界。這個小世界中可能有其餘的「層疊結界」,而自身也可能處於其餘「層疊結界」中
同一個層疊上下文中元素在z軸上的顯示順序
元素髮生層疊時有着特定的垂直顯示順序
當具備明顯的層疊水平標識的時候,如生效的z-index屬性值,在同一個層疊上下文領域,層疊水平值大的那一個覆蓋小的那一個
當元素的層疊水平一致、層疊順序相同的時候,在DOM流中處於後面的元素會覆蓋前面的元素
頁面根元素天生具備層疊上下文,稱爲根層疊上下文。
z-index值爲數值的定位元素的傳統「層疊上下文」。position值爲relative/absolute以及Firefox/IE瀏覽器(不包括Chrome瀏覽器)下含有position:fixed聲明的定位元素,當其z-index值不是auto的時候,會建立層疊上下文
其餘CSS3屬性
z-index負值渲染的過程就是一個尋找第一個層疊上下文元素的過程,而後層疊順序止步於這個層疊上下文元素
從普通定位元素變成了層疊上下文元素,相互間的層疊順序就發生了根本的變化,很容易出現設置了巨大的z-index值也沒法覆蓋其餘元素的問題
line-height的部分類別屬性值是相對於font-size計算的,vertical-align百分比值屬性值又是相對於line-height計算的
font-size值越大,天然ex對應的大小也就大em相對於當前元素,
rem相對於根元素,本質差異在於當前元素是多變的,根元素是固定的,也就是說,若是使用rem,咱們的計算值不會受當前元素font-size大小的影響
font-size默認值是medium,而medium計算值僅與瀏覽器設置有關
並非全部小於12px的font-size都會被看成12px處理,有一個值例外,那就是0,也就是說,若是font-size:0的字號表現就是0,那麼文字會直接被隱藏掉,而且只能是font-size:0,哪怕設置成font-size:0.0000001px,都仍是會被看成12px處理的
筆畫開始、結束的地方有額外裝飾並且筆畫的粗細會有所不一樣的字體
沒有這些額外的裝飾,並且筆畫的粗細差很少
font-family: Consolas, Monaco, monospace;
利於代碼呈現
ch相關的字符是0,就是阿拉伯數字0;1ch表示一個0字符的寬度,因此6個0所佔據的寬度就是6ch
用數值做爲font-weight屬性值,必須是100~900的整百數
由於咱們的系統裏面缺少對應粗細的字體
用當前字體的斜體字體
單純地讓文字傾斜
font-size和font-family是必需的
使用關鍵字做爲屬性值的時候必須是獨立的,不能添加font-family或者font-size之類
但願非Windows系統下不要使用「微軟雅黑」字體,而是使用其系統字體
html { font: menu; } body { font-size: 16px; } html { font: small-caption; } body { font-size: 16px; } html { font: status-bar; } body { font-size: 16px; }
讓網頁的字體跟系統走
@font-face { font-family: 'example'; src: url(example.ttf); font-style: normal; font-weight: normal; unicode-range: U+0025-00FF; }
font-family能夠當作是 一個字體變量;本來系統就有的字體名稱,不能隨便設置
引入的字體資源能夠是系統字體,也能夠是外鏈字體
使用系統安裝字體
使用外鏈字體
重置對應字體樣式或字重下該使用什麼字體
它定義了不一樣字重、使用不一樣字體
讓特定的字符或者特定範圍的字符使用指定的字體
對文本進行縮進控制
控制字符之間的間距,這裏說的「字符」包括英文字母、漢字以及空格等
增長空格的間隙寬度; 是做用在「空格」上
是全部的都換行,絕不留情,一點兒空隙都不放過
若是這一行文字有能夠換行的點,如空格或CJK(中文/日文/韓文)之類的,就不打英文單詞或字符的主意了,在這些換行點換行,至於對不對齊、好很差看則不關心
如何處理元素內的空白字符
當white-space設置爲nowrap的時候,元素的寬度此時表現爲「最大可用寬度」,換行符和一些空格所有合併,文本一行顯示
border
a { text-decoration: none; border-bottom: 1px solid; }
常見的標點符號、各種括號和引號在::first-letter僞元素眼中所有都是「輔助類」字符
電商產品常常會有價格,價格前面通常都有一個¥符號,這個符號字體每每會比較特殊,字號也比較大,同時和文字的數值有幾像素的距離
p:before { content: '新聞:'; } p:first-letter { color: silver; } <p>這是新聞的標題……</p>
向文本的首行添加特殊樣式
至於Chrome和Safari瀏覽器則彷佛更加智能一點
<script type="text/html"> <img src="1.jpg"> </script>
.dn { display: none; }
.hidden { position: absolute; visibility: hidden; }
.vh { visibility: hidden; }
.clip { position: absolute; clip: rect(0 0 0 0); } .out { position: relative; left: -999em; }
.lower { position: relative; z-index: -1; }
.opacity { position: absolute; opacity: 0; filter: Alpha(opacity=0); }
.opacity { opacity: 0; filter: Alpha(opacity=0); }
Chrome和Safari瀏覽器
父元素設置visibility:hidden,子元素也會看不見
visibility:hidden不會影響計數器的計數
CSS3 transition支持的CSS屬性中有visibility,可是並無display
語法和border屬性很是相似,分寬度、類型和顏色,支持的關鍵字和屬性值與border屬性如出一轍
outline屬性確實不佔據任何空間,輪廓寬度設置得再寬廣,也不會影響任何元素的任何佈局,而且outline輪廓是可穿透的
.direction { direction: ltr; // 默認值 direction: rtl; }
@media screen and (max-width: 480px) { .dialog-footer { direction: rtl; } }
用來實現文字豎向呈現
.writing-mode { writing-mode: lr-tb | tb-rl | tb-lr (IE8+); writing-mode: horizontal-tb | vertical-rl | vertical-lr; }
基於 本來水平方向才適用的規則所有均可以在垂直方向適用
.btn:active { text-indent: 2px; } .verticle-mode { writing-mode: tb-rl; writing-mode: vertical-rl; }
當文檔變成垂直流的時候,height高度自然自適應
改變 文檔流爲垂直方向
改變的是 垂直方向的內聯元素的文本方向
ps:有什麼不清楚、錯誤,歡迎提出。