CSS实现两列布局的N种方法


Posted in HTML / CSS onAugust 02, 2021

一、什么是两列布局

两列布局分为两种,一种是左侧定宽、右侧自适应,另一种是两列都自适应(即左侧宽度由子元素决定,右侧补齐剩余空间)。在css面试题里面属于常考题,也是一个前端开发工程师必须掌握的技能,下面将分别介绍实现方式。

二、左侧定宽、右侧自适应如何实现?

1.双inline-block

原理:两个元素都设置dislpay:inline-block,为了消除html空格的影响,父元素的font-size需要设置为0,右侧自适应元素的宽度使用calc函数计算。如果两个元素的高度不一样,可以给元素设置vertical-align:top调整。

缺点:由于父元素设置了font-size为0,子元素内文字不会显示

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
		   *{
			   padding: 0;
			   margin: 0;
		   }
			.box{
				height: 600px;
				width: 100%;
				font-size:0;
			}
			.left{
				display: inline-block;
				width: 100px;
				height: 200px;
				background-color: red;
				vertical-align: top;
				
			}
			.right{
				display: inline-block;
				width: calc(100% - 100px);
				height: 400px;
				background-color: blue;
				vertical-align: top;
			}
			
		</style>
	</head>
	<body>
		<div>
			<div>
				<span>1234</span>
			</div>
			<div>
				<span>1234</span>
			</div>
		</div>
	</body>
</html>

2.双浮动

原理:两个元素设置浮动,右侧自适应元素宽度使用calc函数计算

缺点:父元素需要清除浮动

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			*{
				padding: 0;
				margin: 0;
			}
			.box{
				height: 600px;
				width: 100%;

			}
			.left{
				float: left;
				width: 100px;
				height: 200px;
				background-color: red;
			}
			.right{
				float: left;
				width: calc(100% - 100px);
				height: 400px;
				background-color: blue;
			}
		</style>
	</head>
	<body>
		<div>
			<div>
				<span>
					123adadadddddddddddddddddddddddddddddddddddddddd
				</span>
			</div>
			<div></div>
		</div>
	</body>
</html>

原理:左侧定宽元素浮动,右侧自适应元素设置margin-left的值大于定宽元素的宽度即可

缺点:父元素需要清除浮动

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			*{
				padding: 0;
				margin: 0;
			}
			.box{
				height: 600px;
				width: 100%;

			}
			.left{
				float: left;
				width: 100px;
				height: 200px;
				background-color: red;
			}
			.right{
				margin-left: 100px;
				height: 400px;
				background-color: blue;
			}
		</style>
	</head>
	<body>
		<div>
			<div>
				<p>1234</p>
			</div>
			<div>
				<p>1234</p>
			</div>
		</div>
	</body>
</html>

4.浮动+BFC

原理:父元素设置overflow:hidden,左侧定宽元素浮动,右侧自适应元素设置overflow:auto创建BFC

缺点:左侧元素的内容如果超过设定宽度会重叠到右侧元素上

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			*{
				padding: 0;
				margin: 0;
			}
			.box{
				height: 600px;
				width: 100%;
				overflow: hidden;
			}
			.left{
				float: left;
				width: 100px;
				height: 200px;
				background-color: red;
			}
			.right{
				overflow: auto;
				height: 400px;
				background-color: blue;
			}
		</style>
	</head>
	<body>
		<div>
			<div>111111111111111111111111</div>
			<div>111111111111111111111111111111111111111111111</div>
		</div>
		<div></div>
	</body>
</html>

5.absolute+margin-left

原理:父元素相对定位,左侧元素绝对定位,右侧自适应元素设置margin-left的值大于定宽元素的宽度

缺点:父元素设置了相对定位

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			*{
				padding: 0;
				margin: 0;
			}
			.box{
				height: 600px;
				width: 100%;
				position: relative;
			}
			.left{
				position: absolute;
				width: 100px;
				height: 200px;
				background-color: red;
			}
			.right{
				margin-left: 100px;
				height: 400px;
				background-color: blue;
			}
		</style>
	</head>
	<body>
		<div>
			<div></div>
			<div></div>
		</div>
	</body>
</html>

6.flex布局

原理:父元素设置display:flex,自适应元素设置flex:1

缺点:存在兼容性问题,IE10以下不支持

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			*{
				padding: 0;
				margin: 0;
			}
			.box{
				height: 600px;
				width: 100%;
				display: flex;
			}
			.left{
				width: 100px;
				height: 200px;
				background-color: red;
			}
			.right{
				flex: 1;
				height: 400px;
				background-color: blue;
			}
		</style>
	</head>
	<body>
		<div>
			<div></div>
			<div></div>
		</div>
	</body>
</html>

三、左右两侧元素都自适应

严格来讲,并不算两个元素都是自适应,只是将上面的定宽改为由子元素撑开而已

1.浮动+BFC

原理和上面一样,只是左侧元素的宽度没有设置,由子元素撑开

2.table布局

原理:父元素display:table,左侧元素外围用一个div包裹,该div设置display:table-cell,width:0.1%(保证最小宽度),左侧元素内部设置margin-right,右侧元素设置display:table-cell。

缺点:IE7及以下不支持,当display:table时,padding失效,父元素的line-height属性失效,当display:table-cell时,margin失效。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			.parent{
				display: table;
				width: 100%;
				
			}
			.box{
				display: table-cell;
				width: 0.1%;
			}
			.left{
				margin-right: 20px;
				background-color: red;
				height: 200px;
			}    
			.right{
				display: table-cell;
				background-color: blue;
				height: 300px;
			}
		</style>
	</head>
	<body>
		<div>
			<div>
				<div>126545453dddddddd453453453</div>
			</div>
			<div>12121</div>
		</div>
	</body>
</html>

3.flex布局

原理、缺点同上面的flex布局

4.grid布局

原理:父元素设置display:grid,grid-template-columns:auto 1fr;(这个属性定义列宽,auto关键字表示由浏览器自己决定长度。fr是一个相对尺寸单位,表示剩余空间做等分)grid-gap:20px(行间距)

缺点:兼容性太差,IE11都不支持,谷歌57以上才可以

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			.parent{
				display:grid;
				grid-template-columns:auto 1fr;
				grid-gap:20px
			}  
			.left{
				background-color: red;
				height: 200px;
			}
			.right{
				height:300px;
				background-color: blue;
			}
		</style>
	</head>
	<body>
		<div>
			<div>1111111111111111111111111</div>
			<div></div>
		</div>
	</body>
</html>

到此这篇关于CSS实现两列布局的N种方法的文章就介绍到这了,更多相关css两列布局内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
css3 border-radius属性详解
Jul 05 HTML / CSS
css背景图片的背景裁切、背景透明度、背景变换等效果运用
Dec 24 HTML / CSS
CSS3盒子模型详解
Apr 24 HTML / CSS
CSS3旋转——彩色扇子兼容firefox浏览器
Jun 04 HTML / CSS
html5 分层屏幕适配的方法
Mar 16 HTML / CSS
Html5内唤醒百度、高德APP的实现示例
May 20 HTML / CSS
HTML5梦幻之旅——炫丽的流星雨效果实现过程
Aug 06 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
Dec 30 HTML / CSS
详解HTML5中ol标签的用法
Sep 08 HTML / CSS
探讨HTML5移动开发的几大特性(必看)
Dec 30 HTML / CSS
Html5实现文件异步上传功能
May 19 HTML / CSS
HTML5实现桌面通知 提示功能
Oct 11 HTML / CSS
html+css实现滚动到元素位置显示加载动画效果
Aug 02 #HTML / CSS
纯html+css实现打字效果
html form表单基础入门案例讲解
Jul 21 #HTML / CSS
带你了解CSS基础知识,样式
Jul 21 #HTML / CSS
CSS实现隐藏搜索框功能(动画正反向序列)
Jul 21 #HTML / CSS
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
html5实现点击弹出图片功能
Jul 16 #HTML / CSS
You might like
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
PHP编程基本语法快速入门手册
2016/01/07 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
JavaScript 动态改变图片大小
2009/06/11 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
编辑找工作求职信分享
2014/01/03 职场文书
单位消防安全制度
2014/01/12 职场文书
餐厅总厨求职信
2014/03/04 职场文书
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang