寫出你所知道的 Block Elements(Block-level Elements) 、 inline Elements 、 Replaced Elements / Empty Elements ?css
CSS 中的元素類型html
元素自己的特色,能夠分爲替換和不可替換元素css3
替換元素是瀏覽器根據元素的標籤和屬性,來決定元素的具體顯示內容。 例如 <img>
標籤的 scr 屬性的值來讀取圖片的信息並顯示出來,而若是查看 html 代碼,則看不到圖片的實際內容;又列如會根據 input 的 type 屬性來決定顯示輸入框仍是單選按鈕。web
html 中的 <img>
<input>
<select>
<textarea>
<video>
都是可替換元素。canvas
html 中大部分元素是不可替換元素,即其內容直接展現。瀏覽器
默認狀況下塊級元素會新起一行。而且會橫向充滿其父元素的內容區域。緩存
常見的塊級元素bash
<address>
<div>
<article>
<aside>
<audio>
<canvas>
<section>
<header>
<p>
<form>
<h1>
到<h6>
等ide
特色:佈局
與行內元素相比
特色:
與塊級元素相比:
<span>
<i>
<strong>
<br>
<a>
幾乎全部的可替換元素都是行內元素。
其實就是對 display 屬性的考察,由於 diplay 能夠改變,因此元素的形態是常常能夠切換的。
將元素呈現爲內聯元素,可是對象的內容做爲塊級元素。
而後,同級的元素做爲內聯元素排在一行上,容許空格。
有兩種方法: 1.先使用display:inline-block屬性觸發塊元素,而後再定義display:inline,讓塊元素呈遞爲內聯對象(兩個display要前後放在兩個CSS聲明中才有效果,這是IE的一個經典bug,若是先定義了display:inline-block,而後再將display設回inline或block,layout不會消失)。代碼以下(...爲省略的其餘屬性內容):
div{display:inline-block;...}
div {display:inline;}
複製代碼
二、直接讓塊元素設置爲內聯對象呈遞(設置屬性display:inline),而後觸發塊元素的layout(如:zoom:1等)。代碼以下:
div{display:inline; zoom:1;...}
複製代碼
alt 標籤內容是 img src 屬性內容獲取失敗以後展現 title 是鼠標移動到圖片的時候顯示
BFC 是 塊級格式化上下文 (block fromatting context)是按照塊級盒子佈局的。 塊級格式化上下文包含建立它的元素內部的全部內容,而且在當前塊級格式化上下文中盒子豎着排列。可是 BFC 不包含子元素 BFC 的子元素。
造成 BFC 的條件:
也就是說,當看到這些屬性的時候,就表明了當前元素已經建立了一個 BFC。
對浮動定位與清除浮動都很重要。 浮動定位和清除浮動時只會應用於同一個 BFC 內的元素。 浮動不會影響其餘 BFC 中元素的佈局,清除浮動只能清除同一 BFC 內的元素。 外邊距摺疊(margin collapsing)也只會發生在同一個 BFC 的塊級元素之間。
主要解決的問題:
處理瀏覽器溢出的內容:若是一個沒有高度或者高度爲 auto 的盒子的子元素是浮動元素,則該盒子的高度是不會被撐開的,能夠經過父級建立 BFC來包含浮動元素,這時的父級的高度要計算浮動元素的高度。
建立新的BFC來避免相鄰的 div 之間的外邊距合併。
避免文字環繞問題。
<style>
.box{
background-color: #888; // 灰色
}
.float{
background: #73DE80; /* 綠色 */
opacity: 0.5;
border: 3px solid #F31264;
width: 200px;
height: 200px;
float: left;
}
.static{ /* 粉色 */
background: #EF5BE2;
opacity: 0.5;
border: 3px solid #F31264;
width:400px;
min-height: 100px;
}
</style>
複製代碼
<div class='box'>
<div class='float'></div>
<div class='static'></div>
</div>
複製代碼
box 添加 overflow:hidden 屬性來造成 BFC
.box{
background-color: #888;
overflow: hidden;
}
.float{
background: #73DE80; /* 綠色 */
opacity: 0.5;
border: 3px solid #F31264;
width: 200px;
height: 200px;
}
.static{ /* 粉色 */
background: #EF5BE2;
opacity: 0.5;
border: 3px solid #F31264;
width:400px;
min-height: 100px;
}
.m-1{
margin: 10px 0;
}
複製代碼
<div class='box'>
<div class='float m-1'> </div>
<div class='static m-1'> </div>
</div>
複製代碼
box 的兩個元素的實際外邊距只有 10px 。讓其中一個造成BFC就能夠解決這個問題。
.box{
background-color: #888;
overflow: hidden;
}
.float{
background: #73DE80; /* 綠色 */
opacity: 0.5;
border: 3px solid #F31264;
width: 100px;
height: 20px;
float: left;
}
複製代碼
<div class='box'>
<div class='float'> </div>
<p>BFC 是 塊級格式化上下文 (block fromatting context)是按照塊級盒子佈局的。 塊級格式化上下文包含建立它的元素內部的全部內容,而且在當前塊級格式化上下文中盒子豎着排列。可是 BFC 不包含子元素 BFC 的子元素</p>
</div>
複製代碼
將p標籤變爲新的BFC就能夠解決
padding 使用百分比時是基於內容的寬度計算的
或者:圖片在自適應過程當中,圖片的長寬比要保持不變。
使用圖片容器進行佔位來實現。 塊級元素的 padding 設置爲百分比的時候,是按照父元素的內容的寬度來設定的,那麼咱們能夠按照比例來設置容器的寬度(padding-top/padding-bottom), 圖片則使用絕對定位來顯示在容器的下層。
<div class="img">
<img src="">
</div>
複製代碼
.img{
width:100%;
position:relative;
height:0;
overflow:hidden;
padding-bottom: 75%; // 4:3
}
.img img{
positon: absolute;
width:100%;
height:100%;
top:0;
left:0;
}
複製代碼
還須要要求 .img 的父級元素也是 塊級 元素。
和上個題目同樣 塊級元素+padding 來肯定元素大小
div{
width:100%;
padding-top/padding-bottom:100%;
}
複製代碼
postion:
em 相對 父元素的屬性 rem 相對 html 根元素/css3 新增的一個相對單位
border: 1px solid red;
texteara webkit 內核的瀏覽器會默認設置 resize: both 用戶能夠調節元素的寬度和高度 resize 的屬性包括 none: 不能調節元素的尺寸 horizontal: 調節元素的寬度 vertical: 調節元素的高度
css2 :before :after css1 :first-line 向文本的第一行添加特殊樣式。 :first-letter 向文本的第一個字母添加特殊樣式。
:first-child 首個子對象 :last-child 最後一個對象 :link 未訪問的連接 :visited 已訪問的連接 :hover 鼠標移動到連接上 :active 選定的連接
注意:hover 必須在 link 和 visited 以後才能生效 注意:active 必須在 hover 以後才能生效
浮動是元素脫離文檔流。
清除浮動的方式:
// 現代瀏覽器clearfix方案,不支持IE6/7
.clearfix:after {
display: table;
content: " ";
clear: both;
}
// 全瀏覽器通用的clearfix方案
// 引入了zoom以支持IE6/7
.clearfix:after {
display: table;
content: " ";
clear: both;
}
.clearfix{
*zoom: 1;
}
// 全瀏覽器通用的clearfix方案【推薦】
// 引入了zoom以支持IE6/7
// 同時加入:before以解決現代瀏覽器上邊距摺疊的問題
.clearfix:before,
.clearfix:after {
display: table;
content: " ";
}
.clearfix:after {
clear: both;
}
.clearfix{
*zoom: 1;
}
複製代碼
content padding border margin
border-box: width = content+padding+border
content-box: width = content
重繪:元素的樣式改變不影響佈局時,瀏覽器使用重繪更新元素,只須要 UI 層面的像素從新繪製,所以損耗較少。 迴流:元素的佈局改變,須要從新部分或所有文檔的過程稱爲迴流。
引發迴流的操做: 元素的添加和移除 元素的大小、位置、內容、字體大小發生改變。 激活僞類(:hover)
其餘 頁面首次渲染 瀏覽器窗口大小發生改變 元素內容變化(文字數量或圖片大小等等) 添加或者刪除可見的DOM元素 激活CSS僞類(例如::hover) 查詢某些屬性或調用某些方法
經常使用的會致使迴流的屬性和方法
clientWidth、clientHeight、clientTop、clientLeft
offsetWidth、offsetHeight、offsetTop、offsetLeft
scrollWidth、scrollHeight、scrollTop、scrollLeft
scrollIntoView()、scrollIntoViewIfNeeded()
getComputedStyle()
getBoundingClientRect()
scrollTo()
複製代碼
如何避免
css
避免使用 table 佈局。 儘量在 DOM 樹的最末端改變 class 。 避免設置多層內聯樣式。 將動畫效果應用到 position 屬性爲 absolute 或 fixed 的元素上。 避免使用CSS表達式(例如:calc())
JavaScript
避免頻繁操做樣式,最好一次性重寫 style 屬性,或者將樣式列表定義爲 class 並一次性更改 class 屬性。 避免頻繁操做 DOM ,建立一個 documentFragment ,在它上面應用全部 DOM 操做,最後再把它添加到文檔中。 也能夠先爲元素設置 display: none ,操做結束後再把它顯示出來。由於在 display 屬性爲 none 的元素上進行的 DOM 操做不會引起迴流和重繪。 避免頻繁讀取會引起迴流/重繪的屬性,若是確實須要屢次使用,就用一個變量緩存起來。 對具備複雜動畫的元素使用絕對定位,使它脫離文檔流,不然會引發父元素及後續元素頻繁迴流。
瀏覽器把 html 解析成 Dom , CSS 解析成 CSSOM , 解析完成後將 Dom 和 CSSOM 合併產生了 RenderTree.
Javascript 腳本,主要是經過 DOM API 和 CSSOM API 來操做 DOM Tree 和 CSS Rule Tree.
Rendering Tree 渲染樹並不等同於 DOM 樹,由於一些像 Header 或 display:none 的東西就不必放在渲染樹中了。
CSS 的 Rule Tree主要是爲了完成匹配並把CSS Rule附加上Rendering Tree上的每一個Element。也就是DOM結點。也就是所謂的Frame。
而後,計算每一個 Frame(也就是每一個Element)的位置,這又叫 layout 和 reflow(迴流) 過程
最後經過調用操做系統 Native GUI 的 API 繪製。
display: flex 開啓,自動創建 BFC 。
容器屬性:
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
複製代碼
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
複製代碼
.box {
flex-flow: <flex-direction> <flex-wrap>;
}
複製代碼
.box {
justify-content: flex-start(默認值) | flex-end | center | space-between | space-around;
}
// space-between 項目之間的距離都相等
// space-around 項目兩側的間隔都相等,因此項目之間的間隔比與邊框的間隔大一倍
複製代碼
.box {
align-items: flex-start | flex-end | center | baseline | stretch(默認值));
}
// baseline 項目的第一行文字的基線對齊
// stretch 若是項目未設置高度或設爲auto,將佔滿整個容器的高度。
複製代碼
align-content屬性定義了多根軸線的對齊方式。若是項目只有一根軸線,該屬性不起做用
項目的順序,數字越小,排列越靠前,默認值是0
定義項目的放大的比例,默認爲0,保持自身,即便還有剩餘空間,也不放大。 若是全部項目的flex-grow屬性都爲1,則它們將等分剩餘空間(若是有的話)。若是一個項目的flex-grow屬性爲2,其餘項目都爲1,則前者佔據的剩餘空間將比其餘項多一倍。
定義項目的縮小比例,默認爲1,即若是空間不足,該項目將縮小。
定義了在分配多餘空間以前,項目佔據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的默認值是 auto ,即項目的原本大小。
能夠設置和 width 同樣的值。
flex-grow,flex-shrink,flex-basis 屬性的簡寫
align-self屬性容許單個項目有與其餘項目不同的對齊方式,可覆蓋align-items屬性。默認值爲auto,表示繼承父元素的align-items屬性,若是沒有父元素,則等同於stretch。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
複製代碼
css 樣式渲染順序
<style>
.blue{
color: blue;
}
.red{
color: red;
}
</style>
<div class="blue red">123</div>
<div class="red blue">123</div>
複製代碼
兩個 div 的字體分別是什麼顏色?
答案是:都是紅色
由於在 css 樣式表中 red 後於 blue,red 中的 color 樣式 的優先級比 blue 中 color 高