在網上聽到的CSS大牛的課,感受頗有用,因而就作了筆記,但願與你們一塊兒分享,課程是張鑫旭在慕課網講的CSS。css
行高,兩行文字基線之間的距離html
基線是*線定義的根本css3
一兩行的定義已經據欸的那個了一行的表現web
"內容區域"(content area)是一種圍繞文字看不見的盒子,內容區域的大小與font-size相關,能夠理解爲選中文字時的背景chrome
「內聯盒子」(inline-boxes),不會讓內容成塊兒嚇死你hi,而是排成一行,若是外部喊inline水平的標籤(span、a、em等),屬於內斂盒子,只有文字屬於匿名內聯盒子;瀏覽器
「行框盒子」(line boxes),每一行就是一個「行框盒子」,每一個「行框盒子」又是由一個一個「內聯盒子」組成ide
「包含盒子」(containing boxes),由一啊很難過一行的行框盒子組成;佈局
內聯元素的高度由行高決定字體
行高因爲其繼承性,影響無處不在,單行文本也不例外。flex
高度的表現不是行高,而是內容區域和行間距。
內容區域(content area)高度+行間距(vertical spacing)=行高(line-height)
內容區域高度只與字號以及字體有關,與line-height沒有任何關係。
在宋體(simsun)字體下,內容區域高度等於文字大小值。
simsun字體下:font-size+行間距=line-height ###總結:行高決定內聯盒子高度;行間距牆頭草,可大可小(能夠是負值),保證高度正好等同於行高。
多行文本高度就是當行文本高度的累加。
支持的屬性值normal number length percent inherit
normal默認屬性值,跟着用戶的瀏覽器走,且與元素字體關聯,因爲其不肯定性,一般會進行reset
number 根據當前元素的font-size大小計算。number*font-size
length 具體長度值:1.5em 1.5rem 20px 20pt
percent 相對於設置了該屬性元素的font-size大小計算
inherit 繼承IE8+支持,行高天生就有繼承性,例如文字。input框等元素的默認行該是normal,使用inherit可讓文本可控性更強
計算沒有差異
應用元素有差異
1.5全部可繼承元素根據font-size從新計算行高,繼承給下面的元素
150% 1.5 em 當前元素根據font-size計算行高,繼承給下面的元素。
閱讀爲主要的要1.5-1.6
通常網頁開發,匹配20px-方便心算,例如20px/14px=1.42857,爲了chrome瀏覽器不是19px,要向上四捨五入1.4286
行高不會影響圖片實際佔據的高度
隱匿文本節點:例如圖片後面跟着看不見的文本節點
圖片塊兒狀化-無基線對齊img{display:block}
圖片底線對齊img{vertical-align:bottom}
行高足夠小-基線位置上移.box{line-height:0;}
###小圖片和大文字:基本上高度受行高控制(不要故意鬧事兒,例如vertical:-100
,不是IE6瀏覽器,跟着圖片走)
實現大小不固定的圖pain、多行文字垂直居中
圖片水平垂直居中 IE8+
.box{line-height:300px;text-align:center;} .box>img{vertical-align:middle;}
多行文本水平垂直居中IE8+
.box{line-height:250px;text-align:center;} .box>.text{display:inline-block;line-height:normal; text-align:left;vertical-align:middle;max-width:100%}
代替height,避免IE6/IE7下的haslayout
IE6/7元素設置height會讓元素由haslayout,設置行高就沒有haslayout,元素一旦有了haslayout會衝破父容器,好比說inline-block/float:left的寬度限制,包裹性受到了破壞。
{height:30px;line-height:30px;}
高度是多餘的
支持的屬性值
線類 baseline,top,middle,bottom
文本類 text-top,text-bottom
上標下標類 sub,super
數值百分比類 20px ,2em,20%,...
共性都帶數字,都支持負值(margin,letter-spacing,word-spacing,vertical-align支持) 行爲表現一致,
在baseline基礎上便宜對應數值的大小,vertical-align的百分比值是相對於行高計算的
IE6/7下vertical-align百分比不支持小數
vertical-align只能用於inline水平以及table-cell元素
inline水平:
inline:<img>,<span>,<strong>,<em>,自定義標籤(文字是匿名inline元素)
inline-block:<input>(IE8+),<button>(IE8+)
table-cell元素:
table-cell:<td>
默認狀態下支持的,圖片,按鈕,文字和單元格
display:更改元素的顯示水平
直接display設置
css聲明更改元素的顯示水平
添加浮動變爲block
絕對定位變爲block,主要由於脫離文檔流
圖片明明vertical-align:middle
,仍是不垂直居中,行高設爲容器高度值,達到近似居中,不是沒有起做用,而是過短不夠居中。
table-cell起做用的是其自身,vertical-align:middle
設置在父標籤
.test-list>span{display:inline-block;width:210px;vertical-align:middle} .test-list>img{vertical-align:middle}
對於內聯元素,vertical-align與line-height雖然看不見,單實際上處處都是
圖片放在<p>內沒法居中
消滅vertical-align->display:block margin:auto
改變對其方式->vertical-align:bottom/middle/top
改變line-height->line-height:0/font-size:0
基本衍生現象:近似垂直居中(IE7+,IE7圖片結尾要折行或空格)vertical-align:middle;line-height:36px
inline-block的基線是正常流中最後一個line box的基線,除非這個line box裏面沒有line-boxes或者自己'overflow屬性的計算值而不是visible',這種狀況下基線是margin底邊緣(就是空的或者是有overflow屬性,基線是底邊緣)
vertical-align:bottom
inline/inline-block元素:元素底部和整行的底部對齊.
table-cell元素:單元格底padding邊緣和表格行的底部對其.
總的來講就是子元素和父級下邊緣對其
vertical-align:top
vertical-align:middle
inline/inline-block元素:元素的垂直中心點和父元素基線上1/2x-height處對其
table-cell元素:單元個填充盒子相對於外面的表格行居中對齊
vertical-align:text-top:盒子的頂部和父級的content area頂部對齊
vertical-align:text-bottom:盒子的底部和父級的content area的底部對齊.
兼容性好,表情圖片(或原始尺寸背景圖標)與文字的對齊效果.
sub和sup,是文字的75%大小
之因此上下標緣由是<sup>->vertical-align:super,<sub>->vertical-align:sub
vertical-align:super:提升盒子的基線到父級合適的上標基線位置.
vertical-align:sub:下降盒子的基線到父級合適的下基線位置
都是相對於父級,因此彼此之間沒有影響
混雜屬性:近似垂直居中
<p><img src=""></p>
p{line:height:250px;} img{vertical-align:middle} img+span{vertical-align:middle;}
vertical-align全部的表現都是與父級相關,和先後沒有關係,只關注當前元素和父級,先後並無直接影響
IE6/7
IE8+/Chrome/Firefox
小圖標和文字的對齊:vertical-align垂直負值
不定尺寸圖片或多行文字的垂直居中
主體元素inline-block化;
0寬度100%高度輔助元素;
vertical-align:middle;
同源性
限制做用:限制left/top/right/bottom定位;限制z-index層級;限制在overflow下的囂張氣焰;
overflow:hidden可讓超出容器的部分隱藏,當時absolute元素除外,在父級容器加relative可解決,auto或scroll,relative可使其滾動
fixed(老三)與relative(老大)同源,relative對於fixed只能限制其層級
relative自身也具備定位特性
相對自身
無侵入:不會影響其餘元素佈局
瀏覽器本身的推拽API不能定義手型和UI表現,relative能夠實現簡單的拖拽效果;
relative定位實用性很是好,能夠用來簡單的調整,用的多會出現問題,不推薦
設置相對立屬性是鬥爭:top>bottom;left>right
提升層疊上下文
新建層疊上下文與層級控制:z-index爲具體數值時新建層疊上下文,爲auto時,不會產生層疊上下文,無各類限制,z-index:auto約等於z-index:0 (不包括IE6/7)
指的是儘可能下降relative屬性對其餘元素或佈局的潛在影響
儘可能避免使用relative:absolute定位不依賴於relative;使用margin調節
relative最小化;獨立粗一個div包含子元素
z-index屬性指定了元素及其子元素的z順序,z順序能夠決定發生覆蓋的時候,哪一個元素在上面.一般較大z-index值的元素會覆蓋較低的那一個
屬性值auto(默認值),integer(整數值),inherit
基本特性:支持負值;支持css3 animation動畫;若是不考慮css3,只有定位元素(relative/absolute/fixed/sticky)的z-index纔有做用,css3中有例外;
z-index只對定位元素有做用position:static(默認),無z-index效果
若是定位元素z-index沒有發生嵌套(子元素都是static):
後來居上的準則;
z-index值哪一個大,哪一個上
若是定位元素z-index發生嵌套(裏面有定位元素,外面也有定位元素):
祖先優先原則(前提z-index不是auto)
z-index:auto當前層疊上下文的生成盒子層疊水平時0.盒子(除非是根元素)不會建立一個新的層疊上下文
層疊上下文(stacking context)是html中的一個三維概念,表示z週上有了能夠高人一等。
頁面元素天生具備層疊上下文,稱之爲"根層疊上下文"
z-index值爲數值的定位元素也具備層疊上下文
其餘屬性 2.層疊水平(stacking level):層疊上下文的每一個元素都有一個層疊水平,決定了同一個層疊上下文中元素在z軸上的顯示順序。遵循"後來居上"和"誰大誰上"的層疊準則.
層疊水平和z-index不是一個東西.普通元素也有層疊水平。
層疊上下文的幾個特性:
層疊上下文能夠嵌套,組成一個分層次的層疊上下文.
每一個層疊上下文和兄弟元素獨立:當進行層疊變換或渲染的時候,只須要考慮後代元素.
每一個層疊上下文是自稱體系的:當父元素內容被層疊後,整個元素被認爲是在父層的層疊順序中.
層疊順序(static order):元素髮生層疊時候有着特定的垂直顯示順序
七階層疊水平
層疊上下文background/border -> 負z-index ->block塊兒狀水平盒子 ->float浮動盒子 ->inline/inline-block水平盒子 -> z-index:auto或當作z-index:0 不依賴z-index的層疊上下文 -> 正z-index
意義是規範元素層疊時候的呈現規則
爲何是這個層疊順序:更符合頁面加載的功能和視覺呈現
通常background/border用於裝飾,block,float,用於佈局,inline/inline-block絕大部分是能容,是頁面最重要的實體,所以層疊水平要高.
定位元素默認的z-index:auto能夠當作是z-index:0;
爲什麼定位元素會覆蓋普通元素,定位的元素z-index默認值爲auto能夠看爲z-index爲0;由層疊順序能夠發現,z-index:0層級大於inline/inline-block,圖片是inline元素.
z-index不爲auto的定位元素會建立層疊上下文;(不包括IE7)
z-index負值的層疊順序在層疊上下文元素背景之上
一旦容器z-index值爲數值,圖片的層疊上下文元素就變成了容器!
z-index層疊順序的比較止步於父級層疊上下文
z-index值部位auto的flex項(父元素display:flex|inline-flex).
元素的opacity值不是1;
元素的transform值不是none;
元素mix-blend-mode值不是normal.
元素的filter值不是none.
元素的isolation值是isolate(元素是孤立的不被混合模式混合).
position:fixed聲明(僅用於Chrome等blink/webkit內核瀏覽器)
will-change指定的屬性值爲上面的任意一個(指定瀏覽器與準備GPU渲染)
元素的-webkit-overflow-scrolling設爲touch.
不支持z-index的層疊上下文元素的層疊順序軍是z-index:auto級別
依賴z-index的層疊上下文元素的層疊順序取決於z-index值
position值爲relative/absolute或fixed
display:flex|inline-flex
層疊上下文致使的有趣現象,圖片上覆蓋文字
最小影響化原則
目的:避免z-index嵌套層疊關係混亂:
緣由:
元素怒的層疊水平主要由所在的層疊上下文決定;
IE7 z-index:auto也會建立層疊上下文.
作法:
避免使用定位屬性
定位屬性從大容器平級分離爲私有小容器
不犯二準則
目的:避免z-index混亂,一山比一山高樣式的問題:
緣由: 多人協做以及後期維護
作法: 對於非浮層元素,避免設置z-index值,z-index值沒有任何道理須要超過2;
組件層級計數器
目的:避免浮層組件因z-index被覆蓋的問題:
緣由:
總會遇到意想不到的高層級元素;
組件的覆蓋規則具備動態性;
作法: 組件層級計數器方法:經過js獲取body下子元素的最大z-index值,最大值加一,確保;
可訪問性隱藏
可訪問性隱藏:人看不見,可是輔助設備能夠識別
z-index負值元素在層疊上下文的背景之上,其餘元素之下.
應用:label按鈕,z-index:-1,高版本瀏覽器直接display:none;
css margin能夠改變容器的尺寸
margin與可視尺寸
適用於沒有設定width/height的普通block水平元素(float元素 absolute/fixed元素 inline水平,table-cell元素,均不能夠)
只適用於水平方向尺寸
應用:一側定寬的自適應佈局
margin與佔據尺寸
應用:滾動容器上下留白(padding非chrome瀏覽器下部不能夠,用margin)
margin水平方向百分比/垂直方向百分比
計算規則:
普通元素的百分比margin都是相對於容器的寬度計算的!
絕對定位的百分比margin是相對於第一個定位祖先元素(relative/absolute/fixed)的寬度計算的!
應用實例
寬高2:1自適應矩形
.box{background-color:olive;overflow:hidden} .box>div{margin:50;}
普通元素百分比/絕對定位元素百分比
margin重疊的一般特性
block水平元素(不包括float和absolute)
不考慮writing-mode,只發生在垂直方向(margin-top/margin-bottom)
margin重疊的3種狀況
相鄰兄弟元素
父級和第一個/最後一個子元素:son設置margin-top:80等同於father設置等贊成father和son同時設置
重疊其餘條件
父元素非塊兒狀格式化上下文元素
父元素沒有border-top/bottom設置
父元素沒有padding-top/bottom值
父元素和第一個子元素之間沒有inline元素分割 5.對於margin-bottom重疊,額外條件:復原怒視沒有height,min-height,max-height限制.
解決方法
father添加overflow:hidden.
設置border
設置padding-top:1px;
son前面/後面加入
對於margin-bottom,父元素設置高度值
空的block元素
重疊其餘條件
元素沒有border設置
元素沒有padding值
裏面沒有inline元素 4.沒有height,或者min-height
計算規則
正正取大值
正負值相加
負負最負值
margin重疊的意義
爲了讓傳統的網頁閱讀更舒服 5.善用margin重疊
.list{margin-top:15px;margin-bottom:15px;}
做用機制
是爲如何分配剩餘空間設計的
一側是定製,另外一側爲auto,auto爲剩餘大小.
兩側都是auto,是平分剩餘空間
圖片居中要display:block
沒有設置margin要會自動填充,才能夠居中,例如垂直不設置高度不會自動填充,因此不會自動居中
垂直居中的實現
設置writing-mode:vertical-lr,更改流爲垂直方向
絕對行爲元素的margin:auto居中,IE8+支持,很是實用
margin負值下的兩段對齊
margin負值下的等高佈局,缺點:要經過父元素overflow:hidden來限制,因爲重定位focus會出問題.
margin負值下的兩欄自適應佈局:DOM順序相符
inline水平元素的垂直margin無效,2個前提:非替換元素(例如不是<img>),正常的書寫模式;
margin重疊
display:table-cell與margin
margin能夠用於除了display爲table相關類型(不包括table-caption,table以及inline-table)的全部.甚至也能夠應用於::first-letter display:table-cell/display:table-row等聲明的margin無效!
例外的替換元素們:img,button(chrome下永遠是inline-block)
FireFox:table-cell類型inline-block的渲染行爲;
IE:table-cell類型也是table-cell的渲染行爲
position:absolute與margin
絕對定位元素非定位方向的margin值"無效",看似無效,實則微妙,容器相對定位,不影響定位,可是影響佔據的空間
絕對定位的margin值一直有效,只是不像普通元素那樣,能夠和兄弟元素插科打諢!
鞭長莫及致使的margin無效
margin是相對於整個容器的,不是浮動的圖片
內聯特性致使的margin無效
margin小到必定值無效,由於圖片是內斂的,受制於默認的vertical-align的限制
正常的流向,margin-start等同於margin-left,二者重疊不累加;
若是水平流是從右向左,margin-start等同於margin-right;
在垂直流下(writing-model:vertical-*;),margin-start等同於margin-top;
margin-before等同於margin-start
margin-after等同於margin-end
margin-collapse:決定發生margin重疊時的表現collapse(默認-重疊)discard(取消) separate(分隔)
padding中規中矩,性格溫婉平和!
對於block水平元素
padding值暴走,必定會影響尺寸
width非auto,padding影響尺寸; 3.width爲auto或box-sizing爲border-box,同時padding值沒有暴走,不影響尺寸.
對於inline水平元素
水平padding影響尺寸,垂直padding不影響尺寸,可是會影響背景色(佔據空間)
特性的利用,高度可控的分割線
直接使用字符
inline-block控制
使用inline padding
padding不支持負值
padding百分比均是先對於寬度計算的
輕鬆實現一個正方形 div{padding:50%}
inline元素的百分比值
一樣相對於寬度計算
默認的高度寬度細節有差別
padding會斷行
inline元素的垂直padding會讓"strut"出現,本質是inline文本的content area區域
ol/ul列表內置padding-left,單位是px,例如chrome瀏覽器是40px,字號若是很小,間距就會很開,字號大,序號會爬到容器外面.通常22-25就能夠
全部input/textarea輸入框內置padding
全部button按鈕內置padding
部分select下拉內置padding,如FireFox IE8+能夠設置padding
全部瀏覽器radio/checkbox單複選框無內置padding
button按鈕元素的padding最難控制!
FireFox -moz-focus-inner{padding:0}
使padding消失
IE7,文字越多padding越大,overflow:visible
padding與高度計算不兼容IE7, FireFox不兼容
button按鈕label模擬,button可訪問性隱藏,不是display:none,visible:hidden;好比絕對定位到屏幕外,z-index:-1;
使用百分比單位構建固定比例佈局結構
配合margin登高佈局
兩欄自適應佈局
border-width不支持百分比
語義和使用場景決定不支持百分比(相似的還有outline,box-shadow,text-shadow)
border-width支持關鍵字:thin,medium(默認值),thick(IE7除外,1px 3px 5px)
由於border-style:double
至少要3px纔有效果
solid:實線
dashed:虛線 Chrome/FireFox 實色寬高3:1,透明1:1,IE都是2:1
dotted:點線,