文: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小时内与您取得联系。