(給前端大全加星標,提升前端技能)
作者:程式設計師成長指北 公號 / 小小張
1.什麼是 BFC機制BFC(Block Formatting Context),塊級格式化上下文,是一個獨立的渲染區域,讓處於 BFC 內部的元素與外部的元素相互隔離,使內外元素的定位不會相互影響。
在IE下, Layout,可通過zoom:1 觸發
浮動的元素會被父級計算高度(父級元素觸發了BFC)
非浮動元素不會覆蓋浮動元素的位置(非浮動元素觸發了BFC)
margin不會傳遞給父級(父級觸發BFC)
屬於同一個BFC的兩個相鄰元素上下margin會重疊
普通文檔流布局: 浮動的元素是不會被父級計算高度
非浮動元素會覆蓋浮動元素的位置
margin會傳遞給父級元素
兩個相鄰元素上下的margin會重疊
開發中的應用
2. CSS3中新增的選擇器以及屬性這裡只是列出來, 具體的使用,請查看我的關於css3新增選擇器與屬性文章
屬性選擇器含義描述E[att^="val"]屬性att的值以"val"開頭的元素E[att$="val"]屬性att的值以"val"結尾的元素E[att*="val"]屬性att的值包含"val"字符串的元素選擇器含義描述E:root匹配文檔的根元素,對於HTML文檔,就是HTML元素E:nth-child(n)匹配其父元素的第n個子元素,第一個編號為1E:nth-last-child(n)匹配其父元素的倒數第n個子元素,第一個編號為1E:nth-of-type(n)與:nth-child()作用類似,但是僅匹配使用同種標籤的元素E:nth-last-of-type(n)與:nth-last-child() 作用類似,但是僅匹配使用同種標籤的元素E:last-child匹配父元素的最後一個子元素,等同於:nth-last-child(1)E:first-of-type匹配父元素下使用同種標籤的第一個子元素,等同於:nth-of-type(1)E:last-of-type匹配父元素下使用同種標籤的最後一個子元素,等同於:nth-last-of-type(1)E:only-child匹配父元素下僅有的一個子元素,等同於:first-child:last-child或 :nth-child(1):nth-last-child(1)E:only-of-type匹配父元素下使用同種標籤的唯一一個子元素,等同於:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1)E:empty匹配一個不包含任何子元素的元素,注意,文本節點也被看作子元素屬性含義描述兼容transition設置過渡效果行內元素: text-align:center
塊級元素: margin:0 auto
絕對定位和移動: absolute + transform
絕對定位和負邊距: absolute + margin
flex布局: flex + justify-content:center
垂直居中
子元素為單行文本: line-height:height
absolute + transform
flex + align-items:center
table: display:table-cell; vertical-align: middle
利用position和top和負margin
水平垂直居中
1. 已知元素寬高:絕對定位+margin:auto:
div{
width: 200px;
height: 200px;
background: green;
position:absolute;
left:0;
top: 0;
bottom: 0;
right: 0;
margin: auto;
}
2. 已知元素寬高: 絕對定位+負margin
div{
width: 200px;
height: 200px;
background: green;
position:absolute;
left:0;
top: 0;
bottom: 0;
right: 0;
margin: auto;
}
3. absolute+transform
div{
width: 200px;
height: 200px;
background: green;
position:absolute;
left:50%; /* 定位父級的50% */
top:50%;
transform: translate(-50%,-50%); /*自己的50% */
}
4.flex + justify-content + align-items
.box{
height:600px;
display:flex;
justify-content:center; //子元素水平居中
align-items:center; //子元素垂直居中
/* aa只要三句話就可以實現不定寬高水平垂直居中。*/
}
.box>div{
background: green;
width: 200px;
height: 200px;
}
優點: 簡單, 寫少量代碼, 兼容性也好 缺點: 添加無語義html元素, 不利於代碼語義化, 後期維護成本大
優點: 簡單, 代碼少, 瀏覽器支持好 缺點: 不能和position配合使用, 因為超出的尺寸會被隱藏overflow:hidden
優點: 瀏覽器支持好,不容易出現怪問題(目前:大型網站都有使用,如:騰迅,網易,新浪等等) 缺點: 代碼多,要兩句代碼結合使用,才能讓主流瀏覽器都支持
簡單, 代碼少,好掌握 缺點: 只適用於高度固定的布局
5. 用純CSS創建一個三角形的原理是什麼之前寫三角形, 都是直接記住代碼,沒有探究原因,我也是直到有一次面試時,面試大哥讓我說說css創建三角形的原理,我就.回來就趕緊翻資料.接下來我就將當時我理解的過程列舉出來:
1. 寫一個我們最熟悉的 border應用
.box{
width:100px;
height:100px;
border: 3px solid;
border-color:#1b93fb #1bfb24 #efad48 #ef4848;
}
效果如下:
2. 接下來,我們將border值增大
.box{
width:100px;
height:100px;
border: 50px solid;
border-color:#1b93fb #1bfb24 #efad48 #ef4848;
}
很容易發現, border渲染並不是正方形, 而是梯形的.
3. 在增大border的基礎下, 此時我們將盒子寬高變成0,會產生什麼效果呢!
.box{
width:0px;
height:0px;
border: 50px solid;
border-color:#1b93fb #1bfb24 #efad48 #ef4848;
}
四個三角形拼合成的矩形呈現在我們眼前,那如如果我們只想要一個三角形, 我們是不是可以設想將其他三個設為不可見;
4. 設置透明, 隱藏其中三個三角形
.box{
width:0px;
height:0px;
border: 50px solid;
border-color:transparent transparent transparent #ef4848;
}
三角形這樣就出來, 有木有很簡單, 當然我們也可以採用逆向思維來寫這個效果, 就是先將所有邊框設為透明, 然後需要哪邊再對其設置顏色, 效果是一樣的
.box{
width:0px;
height:0px;
border: 50px solid transparent;
border-left:50px solid #ef4848;
}
這樣給面試你的人講,講明白應該不是問題., 重點就是要理解border的應用
6. 實現三欄布局有哪些方法, 分別描述一下三欄布局,顧名思義就是兩邊固定,中間自適應。三欄布局在開發十分常見,那麼什麼是三欄布局?即左右模塊固定寬度,中間模塊隨瀏覽器變化自適應,想要完成的最終效果如下圖所示:下面列出四種實現方式, 在開發中可以根據實際需求選擇適合自己的方法進行編碼:
<style>
.container{
display:flex;
justify-content: center;
height: 200px;
background: #eee;
}
.left {
width: 200px;
background-color: red;
height: 100%;
}
.main {
background-color: yellow;
flex: 1;
}
.right {
width: 200px;
background-color: green;
}
</style>
<div class="container">
<div class="left">1</div>
<div class="main">2</div>
<div class="right">3</div>
</div>
簡單實用,現在比較流行的方案,但是需要考慮瀏覽器的兼容性。
<style>
.container {
position: relative;
background:#eee;
height:200px;
}
.main {
height: 200px;
margin: 0 120px;
background-color: yellow;
}
.left {
position: absolute;
width: 100px;
height: 200px;
left: 0;
top: 0;
background-color: red;
}
.right {
position: absolute;
width: 100px;
height: 200px;
background-color: green;
right: 0;
top: 0;
}
</style>
<div class="container">
<div class="left">1</div>
<div class="main">2</div>
<div class="right">3</div>
</div>
這種方案也簡單實用, 並且可以將 <div></div>元素放到第一位,使得主要內容優先加載!
<style>
.content {
float: left;
width: 100%;
}
.main {
height: 200px;
margin-left: 110px;
margin-right: 220px;
background-color: yellow;
}
.left {
float: left;
height: 200px;
width: 100px;
margin-left: -100%;
background-color: red;
}
.right {
width: 200px;
height: 200px;
float: right;
margin-left: -200px;
background-color: green;
}
</style>
<div class="content">
<div class="main"></div>
</div>
<div class="left"></div>
<div class="right"></div>
<style>
.container {
margin-left: 120px;
margin-right: 220px;
}
.main {
float: left;
width: 100%;
height: 300px;
background-color: yellow;
}
.left {
float: left;
width: 100px;
height: 300px;
margin-left: -100%;
position: relative;
left: -120px;
background-color: blue;
}
.right {
float: left;
width: 200px;
height: 300px;
margin-left: -200px;
position: relative;
right: -220px;
background-color: green;
}
</style>
<div class="container">
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
聖杯布局和雙飛翼布局解決問題的方案在前一半是相同的,也就是三欄全部float浮動,但左右兩欄加上負margin讓其跟中間欄div並排,以形成三欄布局。
7. css3實現0.5px的細線<style>
.line {
position: relative;
}
.line:after {
content: "";
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 1px;
background-color: #000000;
-webkit-transform: scaleY(.5);
transform: scaleY(.5);
}
</style>
<div class="line"></div>
從屬關係區別
@import是 CSS 提供的語法規則,只有導入樣式表的作用;link是HTML提供的標籤,不僅可以加載 CSS 文件,還可以定義 RSS、rel 連接屬性等
加載順序區別
加載頁面時,link標籤引入的 CSS 被同時加載;@import引入的 CSS 將在頁面加載完畢後被加載。
兼容性區別
@import是 CSS2.1 才有的語法,故只可在 IE5+ 才能識別;link標籤作為 HTML 元素,不存在兼容性問題。
DOM可控性區別
可以通過 JS 操作 DOM ,插入link標籤來改變樣式;由於DOM方法是基於文檔的,無法使用@import的方式插入樣式。
css部分就整理到這裡, 小夥伴們面試還有什麼經常遇到的,可以在評論區給我留言, 我有時間就整理出來, IT(挨踢)都是一大家, 方便你我他
9. 開發中為什麼要初始化css樣式因為瀏覽器的兼容問題,不同瀏覽器對有些標籤的默認值是不同的,如果沒對CSS初始化往往會出現瀏覽器之間的頁面顯示差異。
10. CSS優化、提高性能的方法有哪些內容和樣式分離,易於管理和維護
減少頁面體積
css文件可以被緩存、重用,維護成本降低
不使用@import
避免使用複雜的選擇器,層級越少越好 建議選擇器的嵌套最好不要超過三層,比如:
精簡頁面的樣式文件,去掉不用的樣式
利用CSS繼承減少代碼量
避免!important,可以選擇其他選擇器
覺得本文對你有幫助?請分享給更多人
關注「前端大全」加星標,提升前端技能
好文章,我在看❤️