三栏布局(左右宽度固定,中间自适应)的实现方式及其延伸问题

全局CSS设定

html *{
    padding: 0;
    margin: 0;
}
section {
	margin: 20px 0;
}
article > div {
	min-height: 100px;
}

浮动三栏布局
必须先写左右盒子再写中间盒子的html结构,设置左右两个盒子的宽高和浮动

<section class="layout float">
	<style>
		.layout.float .left-middle-right {
			overflow: hidden;  /*清除浮动*/
		}
		.layout.float .left-middle-right .left {
			width: 300px;
			float: left;
			background: red;
		}
		.layout.float .left-middle-right .right {
			width: 300px;
			float: right;
			background: blue;
		}
		.layout.float .left-middle-right .middle {
			background: yellow;
		}
	</style>
	<article class="left-middle-right">
		<div class="left">left</div>
		<div class="right">right</div>
		<div class="middle">middle</div>
	</article>
</section>

中间盒子的高度超过左右时,会延伸填充满父DIV宽度,内容会飘到左边,这和浮动的原理有关,因为都是块级元素,当没超过左右盒子时,会有阻挡物阻挡,超过时就没得阻挡,自然就填充剩余的地方,那如果要和原先的宽度一致,则要加上margin

<section class="layout float">
	<style>
		.layout.float .left-middle-right {
			overflow: hidden;  /*清除浮动*/
		}
		.layout.float .left-middle-right .left {
			width: 300px;
			float: left;
			background: red;
		}
		.layout.float .left-middle-right .right {
			width: 300px;
			float: right;
			background: blue;
		}
		.layout.float .left-middle-right .middle {
			background: yellow;
			margin-left: 300px;
			margin-right: 300px;
		}
	</style>
	<article class="left-middle-right">
		<div class="left">left</div>
		<div class="right">right</div>
		<div class="middle">middle</div>
	</article>
</section>

优点:比较简单,兼容性也比较好。只要清除浮动做的好,是没有什么问题的。

缺点:浮动布局是有局限性的,浮动元素是脱离文档流,要做清除浮动,这个处理不好的话,会带来很多问题,比如高度塌陷等,而且由于中间html写在最后,无法优先加载重要内容。


绝对定位三栏布局
父盒子进行相对定位,对左右盒子进行绝对定位,紧贴两边,中间盒子相对于两边盒子进行设置left和right,同时设定高度

    <section class="layout absolute">
    	<style>
			.layout.absolute .left-middle-right {
				position: relative;
			}
			.layout.absolute .left-middle-right .left {
				position: absolute;
				width: 300px;
				left: 0;
				background: red;
			}
			.layout.absolute .left-middle-right .right {
				position: absolute;
				width: 300px;
				right: 0;
				background: blue;
			}
			.layout.absolute .left-middle-right .middle {
				position: absolute;
				left: 300px;
				right: 300px;
				background: yellow;
			}
    	</style>
    	<article class="left-middle-right">
    		<div class="left">left</div>
    		<div class="right">right</div>
    		<div class="middle">middle</div>
    	</article>
    </section>

优点:很快捷,设置很方便,而且也不容易出问题,你可以很快的就能想出这种布局方式,而且可以和JS一起使用设置

缺点:绝对定位是脱离文档流的,意味着下面的所有子元素也会脱离文档流,这就导致了这种方法的有效性和可使用性是比较差的。


flex三栏布局

    <section class="layout flex">
    	<style>
			.layout.flex .left-middle-right {
				display: flex;
				margin-top: 140px;
			}
			.layout.flex .left-middle-right .left {
				width: 300px;
				background: red;
			}
			.layout.flex .left-middle-right .right {
				width: 300px;
				background: blue;
			}
			.layout.flex .left-middle-right .middle {
				flex: 1;
				background: yellow;
			}
    	</style>
    	<article class="left-middle-right">
    		<div class="left">left</div>
    		<div class="middle">middle</div>
    		<div class="right">right</div>
    	</article>
    </section>

优点:felxbox布局是css3里新出的一个,它就是为了解决上述两种方式的不足出现的,是比较完美的一个。目前移动端的布局也都是用flexbox。

缺点:不能兼容IE9及以下浏览器。


表格布局
要设置表格父容器的宽高

    <section class="layout table">
    	<style>
			.layout.table .left-middle-right {
				width: 100%;
				display: table;
				height: 100px;
			}
			.layout.table .left-middle-right .left {
				width: 300px;
				background: red;
				display: table-cell;
			}
			.layout.table .left-middle-right .right {
				width: 300px;
				background: blue;
				display: table-cell;
			}
			.layout.table .left-middle-right .middle {
				background: yellow;
				display: table-cell;
			}
    	</style>
    	<article class="left-middle-right">
    		<div class="left">left</div>
    		<div class="middle">middle</div>
    		<div class="right">right</div>
    	</article>
    </section>

优点:
表格布局在历史上遭到很多人的摒弃,说表格布局麻烦,操作比较繁琐,其实这是一种误解,在很多场景中,表格布局还是很适用的,比如这个三栏布局,用表格布局就轻易写出来了。还有表格布局的兼容性很好,在flex布局不兼容的时候,可以尝试表格布局。

缺点:
表格布局也是有缺陷的,当其中一个单元格高度超出的时候,两侧的单元格也是会跟着一起变高的,而有时候这种效果不是我们想要的。


网格布局

    <section class="layout grid">
    	<style>
			.layout.grid .left-middle-right {
				width: 100%;
				display: grid;
				grid-template-rows: 100px;
				grid-template-columns: 300px auto 300px;
			}
			.layout.grid .left-middle-right .left {
				width: 300px;
				background: red;
			}
			.layout.grid .left-middle-right .right {
				width: 300px;
				background: blue;
			}
			.layout.grid .left-middle-right .middle {
				background: yellow;
			}
    	</style>
    	<article class="left-middle-right">
    		<div class="left">left</div>
    		<div class="middle">middle</div>
    		<div class="right">right</div>
    	</article>
    </section>

优点:
是创建网格布局最强大和最简单的工具。就像表格一样,网格布局可以让Web设计师根据元素按列或行对齐排列,但他和表格不同,网格布局没有内容结构,从而使各种布局不可能与表格一样。例如,一个网格布局中的子元素都可以定位自己的位置,这样他们可以重叠和类似元素定位。

缺点:
兼容性不好。IE10+上支持,而且也仅支持部分属性。


圣杯布局

  • 主面板设置宽度为100%,主面板和两个侧栏都设置浮动,常见为左浮动,这个两个侧栏会被主面板挤下去,通过设置负边距将浮动的侧栏拉上来,左侧栏的负边距为100%,刚好是窗口的宽度,因此会从主面板下面的左边跑到与主面板对齐的左边,右侧栏此时浮动在主面板下面的左边,设置负边距为负的自身宽度刚好浮动到主面板对齐的右边。
  • 为了避免侧栏遮挡主面板内容,在外层设置左右padding值为左右侧栏的宽度,给侧栏腾出空间,此时主面板的宽度减小。由于侧栏的负边距是相对主面板的,所以两个侧栏并不会像我们理想中的停靠在左右两边,而是跟着缩小的主面板一起向中间靠拢,此时使用相对布局,调整两个侧栏到相应的位置。
  • 注意dom结构不能变,而且注意要清除浮动,避免高度坍塌
<section class="layout shengbei">
 	<style>
		.layout.shengbei .left-middle-right {
			padding: 0 300px 0 300px;
		}
		.layout.shengbei .left-middle-right > div {
			position: relative;
			float: left;
		}
		.layout.shengbei .left-middle-right .left {
			left: -300px;
			background: red;
			width: 300px;
			margin-left: -100%;
		}
		.layout.shengbei .left-middle-right .right {
			right: -300px;
			width: 300px;
			background: blue;
			margin-left: -300px;
		}
		.layout.shengbei .left-middle-right .middle {
			background: yellow;
			width: 100%;
		}
 	</style>
 	<article class="left-middle-right">
 		<div class="middle">middle</div>
 		<div class="left">left</div>
 		<div class="right">right</div>
 	</article>
 </section>

优点:可优先渲染主要部分,兼容性好,结构简单

缺点:

  • 有一个最小宽度,当页面小于最小宽度时布局就会乱掉。
  • 所以最好给body设置一个min-width。这个min-width肯定不能是试出来的,怎么计算呢?就是left-width * 2 +right-width,至于为什么,简单的说就是:“由于设置了相对定位,所以当left原来的位置和right的位置产生重叠时,由于浮动的原因一行放不下就会换行”。
  • 因为「圣杯布局」存在宽度过小导致布局混乱的缺陷,阿里淘宝提出了「双飞翼布局」

双飞翼布局
思想:

	<section class="layout feiyi">
    	<style>
    		.layout.feiyi .left-middle-right {
    			overflow: hidden;
    		}
    		.layout.feiyi .left-middle-right > div {
    			float: left;
    		}
    		.layout.feiyi .left-middle-right .left {
    			width: 300px;
    			background: red;
    			margin-left: -100%;
    		}
    		.layout.feiyi .left-middle-right .right {
    			width: 300px;
    			background: blue;
    			margin-left: -300px;
    		}
    		.layout.feiyi .left-middle-right .content {
    			width: 100%;
    			background: yellow;
    		}
    		.layout.feiyi .left-middle-right .middle {
    			margin: 0 300px;
    		}
    	</style>
    	<article class="left-middle-right">
    		<div class="content">
    			<div class="middle">middle</div>
    		</div>
    		<div class="left">left</div>
    		<div class="right">right</div>
    	</article>
    </section>

优点:解决了圣杯布局的问题,通用性强,支持各种宽高变化

缺点:但是「双飞翼布局」增加了 DOM 树的层级,因此也会增加 浏览器渲染引擎构建布局树时的计算消耗

双飞翼布局比圣杯布局多创建了一个div,但不用相对布局了。


其他的布局方法

	<section class="layout new">
    	<style>
    		.layout.new .left-middle-right {
    			position: relative;
    		}
    		.layout.new .left-middle-right > div {
    			
    		}
    		.layout.new .left-middle-right .left {
    			position: absolute;
    			top: 0;
    			width: 300px;
    			background: red;
    			left: 0;
    		}
    		.layout.new .left-middle-right .right {
    			position: absolute;
    			top: 0;
    			width: 300px;
    			background: blue;
    			right: 0;
    		}
    		.layout.new .left-middle-right .middle {
    			margin: 0 300px;
    			background: yellow;
    		}
    	</style>
    	<article class="left-middle-right">
    		<div class="middle">middle</div>
    		<div class="left">left</div>
    		<div class="right">right</div>
    	</article>
    </section>

兼容性也比较强


延伸一:

1、每个方法的优缺点,上面已列出
2、如果高度不是已知,中间的内容撑开了,那前面的方法哪些还可以使用?

  • 加了margin的浮动三栏布局
  • flex布局
  • 表格布局
  • 圣杯布局
  • 双飞翼布局
  • 还有另外的方法布局

3、每个方法的兼容性如何,上面已列出

延伸二:页面布局的变通
三栏布局:

  1. 左右宽度固定,中间自适应
  2. 上下高度固定,中间自适应

两栏布局:

  1. 左宽度固定,右自适应
  2. 右宽度固定,左自适应
  3. 上高度固定,下自适应
  4. 下高度固定,上自适应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值