自适应两栏布局

自适应两栏布局

  • 自适应两栏布局

    所谓自适应即是“随屏幕分辨率改变而改变”,而自适应两栏布局即是“一栏固定宽度,一栏不设具体宽度自适应屏幕宽度

  • 1、BFC实现两栏布局

    BFC(Block formatting context)块级格式化上下文。大白话的意思是:BFC是个封闭大盒子,盒子里的元素无论在里面干什么,都不会影响到盒子外面。
    
  • BFC的布局规则

    一、处于BFC内盒子会垂直方向放置(类似html根元素内放块级元素,html根元素内本身也是BFC)
    二、盒子box垂直方向的距离由(margin:距离值)决定。但在同一bfc内部的两个相邻盒子margin值会发生重叠,所谓重叠就是按照哪个盒子设置的最大margin值设置(给子元素设置不同bfc就可解决重叠)
    三、每个元素的margin box的左边, 与包含块border box的左边相接触。BFC的区域不会与float box重叠。(例如不在bfc内的两个相邻盒子设置左边设置float:left,而右边盒子不设,两个盒子就会脱离文档流,右边盒子就会跑到左边盒子进行重叠。而触发右边盒子bfc就不会重叠,这也是自适应两栏布局应用)
    四、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。
    五、计算bfc的高度时,浮动元素也参与计算(子元素浮动会脱离文档流,触发bfc能让浮动元素宽高参与计算)
    
  • BFC触发条件

    1、根元素html默认就是BFC
    2、float属性不为none
    3、position为absolute或fixed
    4、display为inline-block, table-cell, table-caption, flex, inline-flex
    5、overflow不为visible 
    
  • BFC的应用

    1、自适应两栏布局 
    2、清除内部浮动
    3、防止margin上下重叠
    
  • BFC具体应用于两栏布局

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    		*{
    			margin: 0; padding: 0;
    		}
    			#app{
    				width: 400px; height: 400px;
    				background-color: #55ff00;
    				/* overflow: hidden; */
    			}
    			.box1{
                   /* 一边固定宽度(设置在左边或右边按需求即可) */
    				width: 100px; height: 100px;
    				float: left;
    				margin-right: 50px;
    				background-color: #55ffff;
    			}
    			.box2{
                     /* 一边不设宽度(不设默认为父元素100%) */
    				height: 150px;
    				/* 触发BFC */
    				overflow: hidden;
    				background-color: #ffff7f;
    			}
    		</style>
    	</head>
    	<body>
    		<div id="app">
    			<div class="box1">
    				盒子一
    			</div>
    			<div class="box2">
    				盒子二
    			</div>
    		</div>
    	</body>
    </html>
    
  • 2、flex布局实现两栏布局

    flex容器:采用flex布局的元素的父元素(display: flex;)
    flex项目:采用flex布局的元素的子元素(即在父元素盒子里的子元素盒子)
    容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。
    主轴的开始位置(与边框交叉点)称为main start  //默认从左到右,相对的,可改
    主轴的结束位置(与边框交叉点)称为main end //同上
    交叉轴的开始位置(与边框交叉点)称为cross start
    交叉轴的结束位置(与边框交叉点)称为cross end
    主轴如按默认可假设X轴、交叉轴可假设Y轴。但这些都是相对的,还是得看具体设置)
    项目默认沿着主轴排列(主轴是相对的)。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
    
    flexbox布局功能主要具有以下几点:
    1. 屏幕和浏览器窗口大小发生变化也可以灵活调整布局
    2. 指定伸缩项目沿着主轴或侧轴按比例分配额外空间,从而调增伸缩项目的大小
    3. 指定伸缩项目沿着主轴或侧轴将伸缩容器额外空间,分配到伸缩项目之前、之后或之间
    4. 指定如何将垂直于元素布局轴的额外空间分布到该元素的周围
    5. 控制元素在页面上的布局方向
    6. 按照不同于标准流所指定的排序方式对屏幕上的元素重新排序
    flex容器属性
    display:flex/inline-flex;  //设置为flex布局,而float、clear、vertical-align属性将失效
    
    1、flex-direction属性决定主轴的方向(即是flex项目元素盒子的排列方向):
    flex-direction: row(从左到右)| row-reverse(从右到左)| column(从上到下) | column(从下到上)
    
    2、flex-wrap属性,定义flex项目子元素是否换行显示
    flex-wrap:nowrap; //不换行 默认值:flex项目超出或不超都不换行
    flex-wrap:wrap; //换行 flex项目超出就会换行
    flex-wrap:wrap-reverse: 换行方向 //主轴水平时,上下反向,主轴垂直时,左右反向
    
    3、 flex-flow :是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap;
    4、justify-content属性 定义了项目在主轴上的对齐方式
    justify-content: 
     flex-start  伸缩项目向一行的起始位置靠齐;
     flex-end   伸缩项目向一行的结束位置靠齐;
     center     伸缩项目向一行的中间位置靠齐;
     space-between  伸缩项目会平均的分布在行里;
     space-around;  伸缩项目会平均的分布在行里,两端保留一半的空间;
     space-evenly:把剩余的空间进行均分
    
    5、align-items属性定义项目在交叉轴上如何对齐
    align-items:
    	flex-start:伸缩项目在侧轴起点边的外边距 紧靠住 该行在侧轴起始边;
    	flex-end:伸缩项目在侧轴终点边的外边距 紧靠住 该行在侧轴终点边;
    	center:伸缩项目的外边距盒 在该行的侧轴上居中放置;
    	baseline:伸缩项目根据伸缩项目的基线对齐;
    	(有内容时,按照文字的基线对齐,没有内容时会按元素的基线对齐)
    	stretch:伸缩项目拉伸填充整个伸缩容器。(默认值)
    	注:stretch是把它的高度进行拉伸,确保没有高度的情况下,如果有高度会跟高度走,没有高度会进行拉伸,不定议高度是默认值拉伸
    
    6、align-content属性定义多根轴线的对齐方式。对于单行子元素,该属性不起作用。
    align-content: flex-start | flex-end | center | space-between | space-around | stretch;
    align-content在侧轴上执行样式的时候,会把默认的间距给合并。对于单行子元素,该属性不起作用
    align-content 定义多个伸缩行的对齐方式,往往要与换行同时应用(换行时才用)
    flex-start:各行向伸缩容器的起点位置堆叠;
    flex-end:各行向伸缩容器的结束位置堆叠;
    center:各行向伸缩容器的中间位置堆叠;
    space-between:各行在伸缩容器中平均分布;
    space-around:各行在伸缩容器中平均分布,两端保留一半的空间;
    stretch:各行将伸展以占用额外空间。(默认值)
    

    flex项目属性

    1、align-self属性
    Internet Explorer 和 Safari 浏览器不支持 align-self 属性
    说明:
    	align-self 属性规定灵活容器内被选中项目的对齐方式。
    	注意:align-self 属性可重写灵活容器的 align-items 属性。
    	属性值
    		auto 		默认值。元素继承了它的父容器的 align-items 属性。如果没有父容器则为 "stretch"。
    		Stretch		元素被拉伸以适应容器。
    		Center		元素位于容器的中心。
    		flex-start		元素位于容器的开头。
    		flex-end		元素位于容器的结尾。
    

    2、order

    说明:
    	number排序优先级,数字越大越往后排,默认为0,支持负数。
    

    3、flex

    说明:
    	复合属性。设置或检索弹性盒模型对象的子元素如何分配空间
    	详细属性值:
    		缩写「flex: 1」, 则其计算值为「1 1 0%」
    		缩写「flex: auto」, 则其计算值为「1 1 auto」
    		flex: none」, 则其计算值为「0 0 auto」
    		flex: 0 auto」或者「flex: initial」, 则其计算值为「0 1 auto」,即「flex」初始值
    

    4、flex-xxx

    flex-grow
    	 flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
    如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
    
    //!!!flex-shrink:解决flex项目缩小问题
    flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
       如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
    负值对该属性无效。
    flex-basis=width(height)属性
        flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小
    	项目的长度 分配多余空间之前,项目占据的主轴空间(Flex元素在主轴方向的初始大小,如果主轴是x轴,相当于width,如果主轴是Y,相当于height)
    	
    flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。
    
    
  • flex具体应用于两栏布局

  • <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			* {
    				margin: 0;
    				padding: 0;
    			}
    
    			#app {
    				width: 400px;
    				height: 400px;
    				background-color: #55ff00;
                    /*转换布局方式*/
    				display: flex; 
    			}
    
    			.box1 {
    				width: 100px;
    				height: 100px;
    				background-color: #55ffff;
    			}
    
    			.box2 {
    				height: 150px;
    				overflow: hidden;
    				background-color: #ffff7f;
                    /*让其将剩余空间铺满*/
    				flex: 1;
    			}
    		</style>
    	</head>
    	<body>
    		<div id="app">
    			<div class="box1">
    				盒子一
    			</div>
    			<div class="box2">
    				盒子二
    			</div>
    		</div>
    	</body>
    </html>
    
  • 3、定位实现两栏布局

    前提:承载两栏的父元素要设置定位为相对定位。(子绝对定位父相对定位)

    原理:固定宽度的一栏设定具体的top、left(定位而已),自适应一栏使用外边距跟固定宽度一栏拉开

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			* {
    				padding: 0;
    				margin: 0;
    			}
    
    			body {
    				position: relative;
    			}
    
    			#left {
    				width: 300px;
    				height: 400px;
    				background: yellow;
    				/* 定位实现两栏布局关键 */
    				position: absolute;
    				top: 0;
    				left: 0;
    				/* margin-right:300px ; */
      
    			}
    
    			#right {
    				height: 500px;
    				background-color: blue;
    				/* 外边距拉开距离 */
    				margin-left: 300px;
    			}
    		</style>
    	</head>
    	<body>
    		<div id="left">
    
    		</div>
    		<div id="right">
    
    		</div>
    	</body>
    </html>
    
    

三栏布局-中间自适应

  • 浮动实现三栏布局

    原理:左边左浮动,中间右浮动,最后不设浮动
    如果自适应盒子在中间则无法自适应宽度受到内容影响,自适应盒子要放在最右边并且不设置浮动和宽度

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			*{
				padding: 0; margin: 0;
			}
			body{
				overflow: hidden;
			}
			.left {
				width: 100px;
				height: 300px;
				background: #0000FF;
				/* 三栏布局关键 */
				float: left;
			}

			.center {
				height: 300px;width: 100px;
				background: #ffff00;
				/* 三栏布局关键 */
				float: right;
			}

			.right {
				height: 500px;
				background: #aaff00;
				/* 三栏布局关键 */
				overflow: hidden;
			}
		</style>
	</head>
	<body>
		<div class="left">

		</div>
		<div class="center">

		</div>
		<div class="right">

		</div>
	</body>
</html>
  • Flex实现三栏布局

    实现:左右设定固定宽度,中间使用flex:1 让其自动适应铺满。

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			*{
    				padding: 0; margin: 0;
    			}
    			body{
    				/* Flex实现三栏布局关键 */
    				display: flex;
    			}
    			.left {
    				width: 100px;
    				height: 300px;
    				background: #0000FF;
    				
    			}
    			
    			.center {
    				height: 500px;
    				background: #ffff00;
    				/* Flex实现三栏布局关键 */
    				flex: 1;
    			}
    			
    			.right {
    				height: 300px; width: 100px;
    				background: #aaff00;
    			}
    		</style>
    	</head>
    	<body>
    		<div class="left">
    		
    		</div>
    		<div class="center">
    		
    		</div>
    		<div class="right">
    		
    		</div>
    	</body>
    </html>
    
    
  • 定位实现三栏布局

    实现:左边设置绝对定位(top:0;left:0),中间设置左右边距,右边设置左边设置绝对定位(top:0;right:0)

    原理:利用绝对定位让左右元素靠近左右边框,而中间就不设宽度自适应但是得设置外边距和左右元素拉开距离

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			*{
    				padding: 0; margin: 0;
    			}
    			body{
    				/* 定位实现三栏布局关键 */
    				position: relative;
    			}
    			.left {
    				width: 100px;
    				height: 300px;
    				background: #0000FF;
    				/* 实现三栏布局关键 */
    				position: absolute;
    				top: 0;
    				left: 0;
    			}
    			
    			.center {
    				height: 500px;
    				background: #ffff00;
    				/* 实现三栏布局关键 */
    				margin: 0 100px;
    			}
    			
    			.right {
    				height: 300px; width: 100px;
    				background: #aaff00;
    				/* 实现三栏布局关键 */
    				top: 0;
    				right: 0;
    				position: absolute;
    			}
    		</style>
    	</head>
    	<body>
    		<div class="left">
    		
    		</div>
    		<div class="center">
    		
    		</div>
    		<div class="right">
    		
    		</div>
    	</body>
    </html>
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏日先锋小队长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值