文:http://www.cnblogs.com/dragonir/archive/2017/10/27/7744192.html
實現代碼:
方法一 :使用float浮動
自身浮動法的原理就是使用對左右使用分別使用float:left和float:right,float使左右兩個元素脫離文檔流,中間元素正常在正常文檔流中,使用margin指定左右外邊距對其進行一個定位。
推薦下我的前端群:524262608,不定期會有干貨分享,初學者還有一套整理好的入門教程,歡迎初學者和進階中的小伙伴。
方法二:使用絕對定位
絕對定位法原理是將左右兩邊使用absolute定位,因為絕對定位使其脫離文檔流,后面的center會自然流動到他們上面,然后使用margin屬性,留出左右元素的寬度,既可以使中間元素自適應屏幕寬度。
方法三:使用負margin(圣杯布局)
圣杯布局的原理是margin負值法。使用圣杯布局首先需要在center元素外部包含一個div,包含div需要設置float屬性使其形成一個BFC,并設置寬度,并且這個寬度要和left塊的margin負值進行配合,具體原理參考這里。這里對圣杯布局解釋特別詳細。
方法四:使用flex(css3新特性)
<table>標簽:
<table>指的是表格,用表格來搭建界面布局,即用表格的嵌套,來搭建界面布局。
<table>布局優勢:
table優勢:開發時間短(使用DW開發速度快);純table各瀏覽器不會有兼容問題;內容可自適應;在搜索引擎排名能靠前;
但是 table如果布局變更,需要重新開發;如果table里有div ul 等,可能會出現瀏覽器兼容問題;加載速度慢;table嵌套的太多,運維是非常困難的。
<div>塊級(block-level)標簽:
DIV是層疊樣式表中的定位技術,全稱DIVision,即為劃分。有時可以稱其為圖層。
<div>布局優勢:
一.精簡代碼,減少重構難度。
網站使用DIV+CSS布局使代碼很是精簡,css文件可以在網站的任意一個頁面進行調用,而若是使用table表格修改部分頁面卻是顯得很麻煩。要是一個門戶網站的話,需手動改很多頁面,而且看著那些表格也會感覺很亂也很浪費時間,但是使用css+div布局只需修改css文件中的一個代碼即可。
二.網頁訪問速度
使用了DIV+CSS布局的網頁與Table布局比較,精簡了許多頁面代碼,那么其瀏覽訪問速度自然得以提升,也從而提升了網站的用戶體驗度。
三.SEO優化
采用div-css布局的網站對于搜索引擎很是友好,因此其避免了Table嵌套層次過多而無法被搜索引擎抓取的問題,而且簡潔、結構化的代碼更加有利于突出重點和適合搜索引擎抓取。
四.瀏覽器兼容性
若使用table布局網頁,在使用不同瀏覽器情況下會發生錯位,而div+css則不會,無論什么瀏覽器,網頁都不會出現變形情況。
1.流動式布局:是HTML網頁默認的布局方式
特點:
1.塊級元素都會在所處的包含元素內自上而下按順序處置延伸分布,且默認狀態下,塊級元素占整個文檔流,默認寬度為100%。
2.內聯元素都會在所處的包含元素內從左到右水平分布顯示,不占整個文檔流。
常見的塊級(block)元素有:<h1-h5> 、<table>、 <ul>、<li> 、<p> 、<form>、 ol
常見的內內聯(行內)元素有:<a>、<span>、<img>、<input>、<select>、<textarea>
2.浮動布局(float)
特點:
浮動布局依靠【 浮動屬性 float:left/right/... 】來使標簽脫離文檔流,達到兩個塊級元素并排顯示的效果。
float:left ; 浮動脫離當前文檔流浮動。
同時可以依靠【展示屬性display:inline/block/inline-block】來進行行內元素和塊級元素的效果切換。從而達到靈活運用塊級元素和行內元素布局的效果。
3.層模型布局又叫定位布局
特點:
當我們應擁div布局是,在第一層塊界面上來做第二層塊界面的開發時,就要用到我們所說的定位布局。
通過運用【定位屬性position:absolute/relative/fixed】 來進行第二層界面的定位布局。
網頁是靜態的,網頁上的定位
position:absolute ;絕對定位脫離文檔流,不受浮動影響,就是相對于窗體(body)邊界的margin定位。
position:relative; 相對定位不脫離文檔流,相對于父級標簽元素的位置定位。
position:fixed;固定位置,不會受任何因素影響。
滾動條移動前
滾動條移動后
優先層顯示方法:【屬性:z-index:0/1/2...】
特點: 數值越大,越優先顯示。
注意:只有元素使用了position屬性的,才具有z-index屬性。
本文部分內容來自網絡,如有侵權,請聯系修改。
目:假設高度已知,請寫出三欄布局,其中左欄、右欄高度各為300px,中間自適應
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Layout</title>
<style media="screen">
html *{
padding: 0;
margin: 0;
}
.layout article div{
min-height: 100px;
}
.layout.float .left{
float:left;
width:300px;
background: red;
}
.layout.float .center{
background: yellow;
}
.layout.float .right{
float:right;
width:300px;
background: blue;
}
</style>
</head>
<body>
<!--浮動布局 -->
<section class="layout float">
<h1>三欄布局</h1>
<article class="left-right-center">
<div class="left"></div>
<div class="right"></div>
<div class="center">
<h2>浮動解決方案</h2>
</div>
</article>
</section>
<!-- 絕對布局 -->
<section class="layout absolute">
<style>
.layout.absolute .left-center-right>div{
position: absolute;
}
.layout.absolute .left{
left:0;
width: 300px;
background: red;
}
.layout.absolute .center{
left: 300px;
right: 300px;
background: yellow;
}
.layout.absolute .right{
right:0;
width: 300px;
background: blue;
}
</style>
<h1>三欄布局</h1>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h2>絕對定位解決方案</h2>
</div>
<div class="right"></div>
</article>
</section>
<!-- flexbox布局 -->
<section class="layout flexbox">
<style>
.layout.flexbox{
margin-top: 110px;
}
.layout.flexbox .left-center-right{
display: flex;
}
.layout.flexbox .left{
width: 300px;
background: red;
}
.layout.flexbox .center{
flex:1;
background: yellow;
}
.layout.flexbox .right{
width: 300px;
background: blue;
}
</style>
<h1>三欄布局</h1>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h2>flexbox解決方案</h2>
</div>
<div class="right"></div>
</article>
</section>
<!-- 表格布局 -->
<section class="layout table">
<style>
.layout.table .left-center-right{
width:100%;
height: 100px;
display: table;
}
.layout.table .left-center-right>div{
display: table-cell;
}
.layout.table .left{
width: 300px;
background: red;
}
.layout.table .center{
background: yellow;
}
.layout.table .right{
width: 300px;
background: blue;
}
</style>
<h1>三欄布局</h1>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h2>表格布局解決方案</h2>
</div>
<div class="right"></div>
</article>
</section>
<!-- 網格布局 -->
<section class="layout grid">
<style>
.layout.grid .left-center-right{
width:100%;
display: grid;
grid-template-rows: 100px;
grid-template-columns: 300px auto 300px;
}
.layout.grid .left-center-right>div{
}
.layout.grid .left{
width: 300px;
background: red;
}
.layout.grid .center{
background: yellow;
}
.layout.grid .right{
background: blue;
}
</style>
<h1>三欄布局</h1>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h2>網格布局解決方案</h2>
</div>
<div class="right"></div>
</article>
</section>
</body>
</html>
能寫出以上五種來,已經很優秀了,但是面試官可能會繼續追問以下問題:
1.這5種方案的優缺點是什么?
(1)浮動方案
優點:兼容性好
缺點:在于需要清除浮動,浮動以后是脫離文檔流,如果處理不好會帶來很多問題,這是它本身的局限性。
(2)絕對定位
優點:快捷
缺點:布局已經脫離文檔流,意味著里面所有的子元素也必須脫離文檔流,就導致了有效性/可使用性比較差
(3)flex布局
優點:CSS3中用于解決上面兩個方案的不足出現的,比較完美的一個方案,移動端普遍使用
缺點:兼容性問題(IE8以上可用)
(4)table布局
兼容性好(比flex好)例子中,中間內容多撐開后兩側容器也會自動增高(同時也是自身的不足,選擇哪個方案看具體的業務,沒有絕對的優缺點)
(5)網格grid布局
一些CSS框架在做網格的事情,例如柵格系統,960px寬度設計12列,模擬網格控制每一部分的位置達到布局的方式,在新出的網格布局中,通過把它標準化也就是CSS開始支持,可以做很多復雜事情,同時代碼量簡化的多
2.如果把假設高度已知去掉,比如,中間部分的內容太多把容器撐高了,兩側的容器也要相應增高,這樣哪種方案就不適用了?
flex布局和table布局可以繼續使用,其它的不適用(兩側沒有自動增高)。
3.5種方案的兼容性如何?如果讓你真正去寫業務中的頁面布局,那最優的方案是哪個?
答案可以參考第1題
此處總結優缺點是比較常見通用的話術,小伙伴們也可以自行查找并整理出來,如果有什么問題歡迎留言一起討論噢~
*請認真填寫需求信息,我們會在24小時內與您取得聯系。