通常原則: 類應該應用於概念上類似的元素,這些元素能夠出如今同一頁面上的多個位置,而ID 應該應用於不一樣的惟一的元素css
Normalize 相對「平和」,注重通用的方案,重置掉該重置的樣式,保留有用的 user agent 樣式,同時進行一些 bug 的修復,這點是 reset 所缺少的。
Reset 相對「暴力」,無論你有沒有用,通通重置成同樣的效果,且影響的範圍很大,講求跨瀏覽器的一致性。
http://jerryzou.com/posts/abo...
Normalize.css是一種CSS reset的替代方案。它們的區別有:html
選擇Normalize.css ,主要是reset.css爲幾乎全部的元素施加默認樣式,因此須要對全部公共的排版元素從新設置樣式,這是一件很麻煩的工做。前端
浮動出現的最開始出現的意義是用來讓文字環繞圖片而已。
float能夠自動包裹元素。
float會致使父容器高度塌陷。float爲何會致使高度塌陷:元素含有浮動屬性 –> 破壞inline box –> 破壞line box高度 –> 沒有高度 –> 塌陷。何時會塌陷:當標籤裏面的元素只要樣子沒有實際高度時會塌陷。
浮動會脫離文檔流。產生本身的塊級格式化上下文。android
首先來看在CSS中疊加上下文造成的緣由:ios
z-index屬性 :z-index只能在position屬性值爲relative或absolute或fixed的元素上有效。
基本原理:z-index值能夠控制定位元素在垂直於顯示屏方向(Z 軸)上的堆疊順序(stack order),值大的元素髮生重疊時會在值小的元素上面。
使用相對性:z-index值只決定同一父元素中的同級子元素的堆疊順序。父元素的z-index值(若是有)爲子元素定義了堆疊順序(css版堆疊「拼爹」)。向上追溯找不到含有z-index值的父元素的狀況下,則能夠視爲自由的z-index元素,它能夠與父元素的同級兄弟定位元素或其餘自由的定位元素來比較z-index的值,決定其堆疊順序。同級元素的z-index值若是相同,則堆疊順序由元素在文檔中的前後位置決定,後出現的會在上面。因此若是當你發現一個z-index值較大的元素被值較小的元素遮擋了,請先檢查它們之間的dom結點關係,多半是由於其父結點含有激活並設置了z-index值的position定位元素web
BFC:塊級格式上下文。定義:
浮動元素和絕對定位元素,非塊級盒子的塊級容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不爲「visiable」的塊級盒子,都會爲他們的內容建立新的塊級格式化上下文。
在一個塊級格式化上下文裏,盒子從包含塊的頂端開始垂直地一個接一個地排列,兩個盒子之間的垂直的間隙是由他們的margin 值所決定的。兩個相鄰的塊級盒子的垂直外邊距會發生疊加。
在塊級格式化上下文中,每個盒子的左外邊緣(margin-left)會觸碰到容器的左邊緣(border-left)(對於從右到左的格式來講,則觸碰到右邊緣),即便存在浮動也是如此,除非這個盒子建立一個新的塊級格式化上下文。chrome
BFC詳解: http://www.cnblogs.com/lhb25/...編程
display:blockwindows
display:inline瀏覽器
display:inline-block
就是將對象呈現爲inline對象,可是對象的內容做爲block對象呈現。以後的內聯對象會被排列在同一行內。
備註:屬性爲inline-block元素之間的空格或者換行在瀏覽器上會是一個空白的間隙。且IE6和7是不支持這個屬性的,須要經過display:inline;zoom:1作hack處理。
添加新的元素、應用 clear:both
<div class="outer"> <div class="div1">1</div> <div class="div2">2</div> <div class="div3">3</div> <div class="clear"></div> </div> .clear{clear:both; height: 0; line-height: 0; font-size: 0}
優勢:簡單,代碼少,瀏覽器支持好,不容易出現怪問題
缺點:要增長不少無效佈局,但這是清除浮動用的比較多的一種方法。
父級div定義overflow:auto或者hidden
<div class="outer over-flow"> //這裏添加了一個class <div class="div1">1</div> <div class="div2">2</div> <div class="div3">3</div> </div> .over-flow{ overflow: auto; zoom: 1; //zoom: 1; 是在處理兼容性問題 }
原理:必須定義width或zoom:1,同時不能定義height,使用overflow屬性來清除浮動有一點須要注意,overflow屬性共有三個屬性值:hidden,auto,visible。咱們可使用hiddent和auto值來清除浮動,但切記不能使用visible值,若是使用這個值將沒法達到清除浮動效果。
優勢:簡單,代碼少,瀏覽器支持好
缺點:使用auto時內部寬高超過父級div時,會出現滾動條,使用hidden時會被隱藏
after 方法
<div class="outer"> <div class="div1">1</div> <div class="div2">2</div> <div class="div3">3</div> </div> .outer {zoom:1;} /==for IE6/7 Maxthon2==/ .outer :after {clear:both;content:’.’;display:block;width: 0;height: 0;visibility:hidden;}
其中clear:both;指清除全部浮動;content: ‘.’; display:block;對於FF/chrome/opera/IE8不能缺乏,其中content()能夠取值也能夠爲空。visibility:hidden;的做用是容許瀏覽器渲染它,可是不顯示出來,這樣才能實現清除浮動。
因此總的來講,推薦使用僞類的辦法。
CSS Sprites就是把網頁中一些背景圖片整合到一張圖片文件中,再利用CSS的「background-image」,「background- repeat」,「background-position」的組合進行背景定位,background-position能夠用數字能精確的定位出背景圖片的位置。
優勢: 當頁面加載時,不是加載每一個單獨圖片,而是一次加載整個組合圖片。這是一個了不得的改進,它大大減小了HTTP請求的次數,減輕服務器壓力,同時縮短了懸停加載圖片所須要的時間延遲,使效果更流暢,不會停頓。
缺點:作圖像拼合的時候很麻煩
解決方案:
display:none 文本圖片的隱藏:
缺陷:搜索引擎可能認爲被隱藏的文字屬於垃圾信息而被忽略
屏幕閱讀器(是爲視覺上有障礙的人設計的讀取屏幕內容的程序)會忽略被隱藏的文字,同時不利於搜索引擎。
visibility: hidden:隱藏內容或圖片
缺陷:隱藏的內容會佔據他所應該佔據物理空間
Bootstrap中的流式佈局;Bootstrap提供了兩種佈局方式,固定式佈局和流式佈局(用em表示的叫作彈性佈局,用百分比表示的叫作流體佈局)方式,Bootstrap的佈局其實是在柵格外加個容器 (Container)
所以兩種佈局方式的惟一區別是:
固定佈局加的是固定寬度(width)的容器,
流式佈局加的是自適應(或叫可變)寬度的容器。
媒體查詢規則是開發者可以在相同的樣式中,針對不一樣的媒介來使用不一樣的樣式規則。在CSS2的時候有media Type的規則,經過不一樣的媒介來切換不一樣的CSS樣式。經過媒體查詢的技術能夠實現響應式佈局,適應不一樣終端的開發。媒體查詢的具體知識請見 CSS3新屬性應用文檔。
添加打印樣式,爲屏幕顯示和打印分別準備一個css文件,以下所示:
用於屏幕顯示的css:
<link rel="stylesheet" href="css/mainstylesheet.css" media="screen" />
用於打印的css:
<link rel="stylesheet" href="css/printstylesheet.css" media="print" />
import方式:
<style type="text/css"> @import url("css/printstylesheet.css") print; </style>
直接把屏幕顯示樣式和打印樣式寫在一個css文件中:
@media print {}{ h1 { color: black; } h2 {}{ color: gray; } }
@media print裏面的內容只對打印出來的內容有效,以外的內容就是屏幕顯示的樣式。
建立一個不指定媒體類型的樣式表一般頗有用(或者利用media=」all」)。當你準備好定義一些特別用
於打印的規則時,能夠只建立一個單獨的樣式表,使任何在打印時看起來很差的樣式都失效。使用這種方法的一個問題是必須確保打印機樣式實際上確實覆蓋了主樣式表。可使用!important.
打印樣式表也應有些注意事項:
備註: 參考: http://blog.csdn.net/pangni/a...
缺點:簡單來講CSS預處理器語言較CSS玩法變得更高級了,但同時下降了本身對最終代碼的控制力。更致命的是提升了門檻,首先是上手門檻,其次是維護門檻,再來是團隊總體水平和規範的門檻。這也形成了初學學習成本的昂貴。
優勢:用一種專門的編程語言,爲CSS增長了一些編程的特性,將CSS做爲目標生成文件,而後開發者就只要使用這種語言進行編碼工做。通俗的說,CSS預處理器用一種專門的編程語言,進行Web頁面樣式設計,而後再編譯成正常的CSS文件,以供項目使用。CSS預處理器爲CSS增長一些編程的特性,無需考慮瀏覽器的兼容性問題,例如你能夠在CSS中使用變量、簡單的邏輯程序、函數等等在編程語言中的一些基本特性,可讓你的CSS更加簡潔、適應性更強、可讀性更佳,更易於代碼的維護等諸多好處。
Webfonts (字體服務例如:Google Webfonts,Typekit 等等。)
瀏覽器先產生一個元素集合,這個集合每每由最後一個部分的索引產生(若是沒有索引就是全部元素的集合)。而後向上匹配,若是不符合上一個部分,就把元素從集合中刪除,直到真個選擇器都匹配完,還在集合中的元素就匹配這個選擇器了。
僞類用於當已有元素處於的某個狀態時,爲其添加對應的樣式,這個狀態是根據用戶行爲而動態變化的。
僞元素用於建立一些不在文檔樹中的元素,併爲其添加樣式。
區別:僞類的操做對象是文檔樹中已有的元素,而僞元素則建立了一個文檔數外的元素。所以,僞類與僞元素的區別在於:有沒有建立一個文檔樹以外的元素
參考: http://www.alloyteam.com/2016...
盒子模型分爲兩類:W3C標準盒子模型和IE盒子模型
這二者的關鍵區別就在於:
寬高的計算:W3C盒子模型——屬性高(height)和屬性寬(width)這兩個值不包含 填充(padding)和邊框(border)
IE盒子模型——屬性高(height)和屬性寬(width)這兩個值包含 填充(padding)和邊框(border)
各瀏覽器盒模型的組成結構是一致的,區別只是在」怪異模式」下寬度和高度的計算方式,而「標準模式」下則沒有區別。
組成結構以寬度爲例:總寬度=marginLeft+borderLeft+paddingLeft+contentWidth+paddingRight+borderRight+marginRight(W3C標準盒子模型)。頁面在「怪異模式」下,css中爲元素的width和height設置的值在標準瀏覽器和ie系列(ie9除外)裏的表明的含義是不一樣的(IE盒子模型)。
於是解決兼容型爲題最簡潔和值得推薦的方式是:下述的第一條。
一、hack的方式
#box { width:100px !important; // ie9,ff,chrome,opera這樣的標準瀏覽器 width:160px; //全部的瀏覽器;它的本意是隻對不認識!important的設置。但是ie七、ie8也認識 +width:160px!important;//ie7 width:160px/0!important;//ie8 padding:0 10px;border:20px solid blue;margin:70px; }
二、wrapper
#box { width:100px; margin:70px; float:left; } .wrapper { padding:0 10px;border:20px solid blue; }
總結:使用「標準模式」便可實現兼容,不兼容只發生在「怪異模式」下。並且正常的頁面基本上都選擇前者,若是選擇後者,麻煩不止於此,一些css技巧也將失靈,如將div居中:div {margin:0 auto;}
設置之後,至關於以怪異模式解析,border和padding全會在你設置的寬度內部,好比手機端設置兩行而且的佈局,寬度各爲50%,若是不用這個屬性,設置border後右邊的div會下來錯位,設置這個屬性,寬度仍是50%而不是50%+*px,兩行能夠並列顯示
說到 IE 的 bug,在 IE6之前的版本中,IE對盒模型的解析出現一些問題,跟其它瀏覽器不一樣,將 border 與 padding 都包含在 width 以內。而另一些瀏覽器則與它相反,是不包括border和padding的。對於IE瀏覽器,當咱們設置 box-sizing: content-box; 時,瀏覽器對盒模型的解釋聽從咱們以前認識到的 W3C 標準,當它定義width和height時,它的寬度不包括border和padding;對於非IE瀏覽器,當咱們設置box-sizing: border-box; 時,瀏覽器對盒模型的解釋與 IE6以前的版本相同,當它定義width和height時,border和padding則是被包含在寬高以內的。內容的寬和高能夠經過定義的「width」和 「height」減去相應方向的「padding」和「border」的寬度獲得。內容的寬和高必須保證不能爲負,必要時將自動增大該元素border box的尺寸以使其內容的寬或高最小爲0。
好處:
display 屬性規定元素應該生成的框的類型。
都是display 屬性規定元素應該生成的框的類型。可是block表明塊級元素,元素先後都有換行符;inline是默認的樣式,表示該元素被顯示爲內聯元素,元素先後沒有換行符號。也就是說,block元素一般被現實爲獨立的一塊,會單獨換一行;inline元素則先後不會產生換行,一系列inline元素都在一行內顯示,直到該行排滿。而inline-block表明行內塊元素(css2.0新增)。
display:block:
display:inline:
display:inline-block:
簡單來講就是將對象呈現爲inline對象,可是對象的內容做爲block對象呈現。以後的內聯對象會被排列在同一行內。好比咱們能夠給一個link(a元素)inline-block屬性值,使其既具備block的寬度高度特性又具備inline的同行特性
各個屬性的值:
relative和absolute進行對比分析:
relative和absolute與fixed進行對比分析:
盒子模型的三維立體結構: 第一層:border 第二層:內容+padding 第三層:背景圖片 第四層:背景顏色 第五層:外邊距
語義化的HTML就是寫出的HTML代碼,符合內容的結構化(內容語義化),選擇合適的標籤(代碼語義化),可以便於開發者閱讀和寫出更優雅的代碼的同時讓瀏覽器的爬蟲和機器很好地解析。
id選擇器、類選擇器、元素選擇器、全局選擇器、組合選擇器、繼承選擇器、僞類選擇器
權重計算:
第一等級:表明內聯樣式,如style="",權值爲 1000
第二等級:表明id選擇器,如#content,權值爲100
第三等級:表明類,僞類和屬性選擇器,如.content,權值爲10
第四等級:表明標籤選擇器和僞元素選擇器,如div p,權值爲1
Css 語句權重由選擇器的權值相加可得。
樣式優先級:!important>行內樣式>內部樣式>外部樣式
CSS的引入方式共有三種:
連接:
<link type="text/css" rel="styleSheet" href="CSS文件路徑" />
導入:
<style type="text/css"> @import url("css文件路徑"); </style>
連接和道路的區別:
<link>:
@import:
CSS選擇符: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
不可繼承的樣式:border, padding, margin, width, height
優先級(就近原則):!important > [ id > class > tag ]
!important 比內聯優先級高
該佈局模型的目的是提供一種更加高效的方式來對容器中的條目進行佈局、對齊和分配空間。在傳統的佈局方式中,block 佈局是把塊在垂直方向從上到下依次排列的;而 inline 佈局則是在水平方向來排列。彈性盒佈局並無這樣內在的方向限制,能夠由開發人員自由操做。
適用場景:彈性佈局適合於移動前端開發,在Android和ios上也完美支持。
首先,須要把元素的寬度、高度設爲0。而後設置邊框樣式。
width: 0; height: 0; border-top: 40px solid transparent; border-left: 40px solid transparent; border-right: 40px solid transparent; border-bottom: 40px solid #ff0000;
第一種真正的品字:
三塊高寬是肯定的;
上面那塊用margin: 0 auto;居中;
下面兩塊用float或者inline-block不換行;
用margin調整位置使他們居中。
第二種全屏的品字佈局:
上面的div設置成100%,下面的div分別寬50%,而後使用float或者inline使其不換行。
{ background-color:#f1ee18;/*全部識別*/ .background-color:#00deff\9; /*IE六、七、8識別*/ +background-color:#a200ff;/*IE六、7識別*/ _background-color:#1e0bd1;/*IE6識別*/ }
由於瀏覽器的兼容問題,不一樣瀏覽器對有些標籤的默認值是不一樣的,若是沒對CSS初始化每每會出現瀏覽器之間的頁面顯示差別。
不管屬於哪一種,都要先找到其祖先元素中最近的 position 值不爲 static 的元素,而後再判斷:
若是都找不到,則爲 initial containing block。
補充:
當一個元素的visibility屬性被設置成collapse值後,對於通常的元素,它的表現跟hidden是同樣的。
display屬性規定元素應該生成的框的類型;position屬性規定元素的定位類型;float屬性是一種佈局方式,定義元素在哪一個方向浮動。
相似於優先級機制:position:absolute/fixed優先級最高,有他們在時,float不起做用,display值須要調整。float 或者absolute定位的元素,只能是塊元素或表格。
BFC規定了內部的Block Box如何佈局。
定位方案:
知足下列條件之一就可觸發BFC:
浮動元素碰到包含它的邊框或者浮動元素的邊框停留。因爲浮動元素不在文檔流中,因此文檔流的塊框表現得就像浮動框不存在同樣。浮動元素會漂浮在文檔流的塊框上。
浮動帶來的問題:
清除浮動的方式:
在重合元素外包裹一層容器,並觸發該容器生成一個BFC。
例子:
<div class="aside"></div> <div class="text"> <div class="main"></div> </div> <!--下面是css代碼--> .aside { margin-bottom: 100px; width: 100px; height: 150px; background: #f66; } .main { margin-top: 100px; height: 200px; background: #fcc; } .text{ /*盒子main的外面包一個div,經過改變此div的屬性使兩個盒子分屬於兩個不一樣的BFC,以此來阻止margin重疊*/ overflow: hidden; //此時已經觸發了BFC屬性。 }
自動變成display:block
經過媒體查詢能夠爲不一樣大小和尺寸的媒體定義不一樣的css,適應相應的設備的顯示。
CSS選擇器的解析是從右向左解析的。若從左向右的匹配,發現不符合規則,須要進行回溯,會損失不少性能。若從右向左匹配,先找到全部的最右節點,對於每個節點,向上尋找其父節點直到找到根元素或知足條件的匹配規則,則結束這個分支的遍歷。兩種匹配規則的性能差異很大,是由於從右向左的匹配在第一步就篩選掉了大量的不符合條件的最右節點(葉子節點),而從左向右的匹配規則的性能都浪費在了失敗的查找上面。
而在 CSS 解析完畢後,須要將解析的結果與 DOM Tree 的內容一塊兒進行分析創建一棵 Render Tree,最終用來進行繪圖。在創建 Render Tree 時(WebKit 中的「Attachment」過程),瀏覽器就要爲每一個 DOM Tree 中的元素根據 CSS 的解析結果(Style Rules)來肯定生成怎樣的 Render Tree。
使用偶數字體。偶數字號相對更容易和 web 設計的其餘部分構成比例關係。Windows 自帶的點陣宋體(中易宋體)從 Vista 開始只提供 十二、1四、16 px 這三個大小的點陣,而 1三、1五、17 px時用的是小一號的點。(即每一個字佔的空間大了 1 px,但點陣沒變),因而略顯稀疏。
什麼時候使用margin:
什麼時候使用padding:
兼容性的問題:在IE5 IE6中,爲float的盒子指定margin時,左側的margin可能會變成兩倍的寬度。經過改變padding或者指定盒子的display:inline解決。
當按百分比設定一個元素的寬度時,它是相對於父容器的寬度計算的,可是,對於一些表示豎向距離的屬性,例如 padding-top , padding-bottom , margin-top , margin-bottom 等,當按百分比設定它們時,依據的也是父容器的寬度,而不是高度。
原理:有點相似於輪播,總體的元素一直排列下去,假設有5個須要展現的全屏頁面,那麼高度是500%,只是展現100%,剩下的能夠經過transform進行y軸定位,也能夠經過margin-top實現
overflow:hidden;transition:all 1000ms ease;
響應式網站設計(Responsive Web design)是一個網站可以兼容多個終端,而不是爲每個終端作一個特定的版本。
基本原理是經過媒體查詢檢測不一樣的設備屏幕尺寸作處理。
頁面頭部必須有meta聲明的viewport。
<meta name="’viewport’" content="」width=device-width," initial-scale="1." maximum-scale="1,user-scalable=no」"/>
視差滾動(Parallax Scrolling)經過在網頁向下滾動的時候,控制背景的移動速度比前景的移動速度慢來建立出使人驚歎的3D效果。
:before 和 :after 這兩個僞元素,是在CSS2.1裏新出現的。起初,僞元素的前綴使用的是單冒號語法,但隨着Web的進化,在CSS3的規範裏,僞元素的語法被修改爲使用雙冒號,成爲::before ::after
行高是指一行文字的高度,具體說是兩行文字間基線的距離。CSS中起高度做用的是height和line-height,沒有定義height屬性,最終其表現做用必定是line-height。
單行文本垂直居中:把line-height值設置爲height同樣大小的值能夠實現單行文字的垂直居中,其實也能夠把height刪除。
多行文本垂直居中:須要設置display屬性爲inline-block。
p{font-size:10px;-webkit-transform:scale(0.8);} //0.8是縮放比例
-webkit-font-smoothing在window系統下沒有起做用,可是在IOS設備上起做用-webkit-font-smoothing:antialiased是最佳的,灰度平滑。
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
多數顯示器默認頻率是60Hz,即1秒刷新60次,因此理論上最小間隔爲1/60*1000ms = 16.7ms
行框的排列會受到中間空白(回車空格)等的影響,由於空格也屬於字符,這些空白也會被應用樣式,佔據空間,因此會有間隔,把字符大小設爲0,就沒有空格了。
解決方法:
外層div使用position:relative;高度要求自適應的div使用position: absolute; top: 100px; bottom: 0; left: 0
頁面加載自上而下 固然是先加載樣式。
寫在body標籤後因爲瀏覽器以逐行方式對HTML文檔進行解析,當解析到寫在尾部的樣式表(外聯或寫在style標籤)會致使瀏覽器中止以前的渲染,等待加載且解析樣式表完成以後從新渲染,在windows的IE下可能會出現FOUC現象(即樣式失效致使的頁面閃爍問題)
將一個頁面涉及到的全部圖片都包含到一張大圖中去,而後利用CSS的 background-image,background- repeat,background-position 的組合進行背景定位。利用CSS Sprites能很好地減小網頁的http請求,從而大大的提升頁面的性能;CSS Sprites能減小圖片的字節。