关于三栏布局的五种方法及所遇到的各种问题及解决方法

关于三栏布局的五种方法及所遇到的各种问题及解决方法

根据慕课视频总结的笔记
在这里插入图片描述
页面的三栏布局一直是一个经典的问题,很多情况下的面试都会遇到这个问题。我一直以为这个很简单,但是在练习的过程中发现这个问题不亏是经典问题,考察了很多细节的知识点,我将贴出我的解法以及在解决过程中的问题。

1. 解法一:使用float来解决

代码如下:

	<style>
	*{
		padding: 0;
		margin:0;
	}
		.left{
			background-color: pink;
			width: 300px;
			height:300px;
			float:left;
		}
		.main{
			background-color: red;
     		margin-left: 300px;
     		margin-right: 300px;
     		height:300px;
		}
		.right{
			background-color: green;
			float:right;
			width: 300px;
			height:300px;
		}
	</style>
</head>
<div class="mo">
	<div class="left">left</div>
	<div class="right">right</div>
	<div class="main">main</div>
</div>
</body>

遇到的问题:
最开始的时候,我使用的DOM顺序如下图:

<div class="mo">
	<div class="left">left</div>
	<div class="main">main</div>
	<div class="right">right</div>
</div>

在这种情况下,类为right的div总是会掉到下一行,即便每一行的宽度都是刚刚合适的。
对于该问题的解决:
我调整了DOM的顺序就没有任何问题了,这是为什么呢?因为left,right设置了浮动,就不会占有文本流,而main没有设置浮动就会独占一行。即如果先写main,再写right的话,right就会掉到下一行(因为main独占了上面一行)。
PS:这个问题真是没想到,考虑细节没考虑到,跪了。。。╮(╯﹏╰)╭

缺点:对于浮动问题,关键的就是清除浮动,如果处理不好,页面就会出现问题
优点:兼容性比较好

2. 解法二:使用position来定位

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		*{
		padding: 0;
		margin:0;
	}
		.left{
			background-color: pink;
			width: 300px;
			height:300px;
			position:absolute;
			left:0;
		}
		.main{
			background-color: red;
     		position: absolute;
     		left: 300px;
     		right:300px;
     		height:300px;
		}
		.right{
			background-color: green;
			width: 300px;
			height:300px;
			position:absolute;
			right: 0;
		}
		.mo{
			position: relative;
		}
	</style>
</head>
<body>
	<div class="mo">
	<div class="left">left</div>
	<div class="main">main</div>
	<div class="right">right</div>
</div>
</body>
</html>

用定位来解决就很开心了,这个方法只需要注意子绝父相就行了(~ ̄▽ ̄)~

缺点:注意脱标问题
优点:快捷

3.解法三:使用flexbox

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		*{
		padding: 0;
		margin:0;
	}
		.left{
			background-color: pink;
			width: 300px;
			height:300px;
		}
		.main{
			background-color: red;
     		height:300px;
     		flex:1;
		}
		.right{
			background-color: green;
			width: 300px;
			height:300px;
		}
		.mo{
			display: flex;
		}
	</style>
</head>
<body>
	<div class="mo">
	<div class="left">left</div>
	<div class="main">main</div>
	<div class="right">right</div>
</div>
</body>
</html>

缺点:IE8不支持,兼容性问题
优点:比较完美,移动端一般是使用这种

4.解法四:使用表格布局
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
	*{
		padding: 0;
		margin: 0;
	}
	.mo{
		display: table;
		width: 100%;
	}
		.left{
			background-color: pink;
			height:300px;
			width: 300px;
			display: table-cell;
		}
		.main{
			background-color: red;
			height:300px;
			display: table-cell;
		}
		.right{
			background-color: green;
			height: 300px;
			width: 300px;
			display: table-cell;
		}
	</style>
</head>
<body>
	<div class="mo">
		<div class="left">left</div>
		<div class="main">main</div>
		<div class="right">right</div>
	</div>
</body>
</html>

缺点:如果其中一个高度超出,其他的也会变化
优点:兼容性比较好

5.解法五:使用网格布局
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
	*{
		padding: 0;
		margin: 0;
	}
	.mo{
		display: grid;
		width: 100%;
		grid-template-rows: 300px;
		grid-template-columns: 300px auto 300px;
	}
	.left{
		background-color: pink;
	}
	.main{
		background-color: red;
	}
	.right{
		background-color: green;
	}
	</style>
</head>
<body>
	<div class="mo">
		<div class="left">left</div>
		<div class="main">main</div>
		<div class="right">right</div>
	</div>
</body>
</html>

优点:代码量较少

延伸:如果去除已知高度的话,对代码如果不进行改变的话,只有flex布局和表格布局可以继续使用

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值