zoukankan      html  css  js  c++  java
  • CSS两列布局的N种实现

    一、什么是两列布局

    两列布局分为两种,一种是左侧定宽、右侧自适应,另一种是两列都自适应(即左侧宽度由子元素决定,右侧补齐剩余空间)。在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;
    				 100%;
    				font-size:0;
    			}
    			.left{
    				display: inline-block;
    				 100px;
    				height: 200px;
    				background-color: red;
    				vertical-align: top;
    				
    			}
    			.right{
    				display: inline-block;
    				 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;
    				 100%;
    
    			}
    			.left{
    				float: left;
    				 100px;
    				height: 200px;
    				background-color: red;
    			}
    			.right{
    				float: left;
    				 calc(100% - 100px);
    				height: 400px;
    				background-color: blue;
    			}
    		</style>
    	</head>
    	<body>
    		<div>
    			<div>
    				<span>
    					123adadadddddddddddddddddddddddddddddddddddddddd
    				</span>
    			</div>
    			<div></div>
    		</div>
    	</body>
    </html>
    

    3.浮动+margin

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

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

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style>
    			*{
    				padding: 0;
    				margin: 0;
    			}
    			.box{
    				height: 600px;
    				 100%;
    
    			}
    			.left{
    				float: left;
    				 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;
    				 100%;
    				overflow: hidden;
    			}
    			.left{
    				float: left;
    				 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;
    				 100%;
    				position: relative;
    			}
    			.left{
    				position: absolute;
    				 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;
    				 100%;
    				display: flex;
    			}
    			.left{
    				 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>

    https://www.tmojm.com 创业加盟网

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

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

    1.浮动+BFC

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

    2.table布局

    原理:父元素display:table,左侧元素外围用一个div包裹,该div设置display:table-cell,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;
    				 100%;
    				
    			}
    			.box{
    				display: table-cell;
    				 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>
  • 相关阅读:
    【java】对象赋值给另一个对象
    spring boot系列(五)spring boot 配置spring data jpa (查询方法)
    Spring Data JPA 查询
    Spring Data JPA 介绍
    OpenID简介
    OAUTH协议介绍
    URL encoding(URL编码)
    RESTful 介绍
    spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)
    spring boot 启动报 java.lang.NoClassDefFoundError: ch/qos/logback/core/spi/LifeCycle 错误
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/15065747.html
Copyright © 2011-2022 走看看