两栏布局
效果图(先写右又写的左):
先写右边又写的左边;先写左再写右也可以,必须是第一个出生的设置为绝对定位,下一个元素才可以上来成一排,若设置第二个出生的元素为绝对定位,就算他脱离原来位置进行定位,他也窜不到第一行来,因为第一个元素是块级元素,独占一行
<!-- 两栏布局 -->
<!-- 肯定是两个div;一个固定,一个自适应 -->
<!-- 思路,怎么让两个div并到一排:绝对定位,脱离原来位置进行定位 -->
<div class="right"></div>
<div class="left"></div>
<!-- 两栏布局 -->
/* 两栏布局 */
/* 1.右边是自适应,只设置了高度,,宽度自适应 */
/* 2.设置绝对定位,让下面的元素上来; */
/* 3.上来之后因为设置的宽度是100%;所以会掩盖下面的元素,设置margin-left,让他把左边的元素让出来 */
.right{
height:50px;
width:100%;
background-color: lightsalmon;
position:absolute;
left:0px;
margin-left:100px;
}
/* 一般都是左边固定,
1.设置好宽度和高度 */
.left{
height:50px;
width:100px;
background-color: lightgreen;
}
/* 两栏布局 */
俩个经典bug:margin塌陷
<!-- 两个经典bug:margin塌陷 -->
<div class="wrapper">
<div class="content"></div>
</div>
<!-- 两个经典bug:margin塌陷 -->
/* 两个经典bug:margin塌陷 */
.wrapper{
/* 让content的父级即wrapper距离带着他跑,距离页面左边150px;距离上边150px; */
margin-left:150px;
margin-top:150px;
background-color: #000;
width:100px;
height:100px;
}
.content{
/* 让content距离他父级的左边线50px; */
margin-left:50px;
background-color: green;
width:50px;
height:50px;
}
/* 两个经典bug:margin塌陷 */
content设置距离他父级左边margin-left没问题,但设置margin-top,即设置距离父级上边线时,没反应,还是上述的图;根本不相对于他父级的棚往下走;
.content{
margin-top:50px;
}
直到margin-top加到比他父级距离页面顶端的margin-top大时,才会动,但此时,他和他父级一起动,相当于一个整体;
即父子嵌套的元素垂直方向的margin父子是结合到一起的,他俩取最大的那个值.
即
.content{
margin-top:200px;
}
导致的一个现象就是,他父级的元素相对于浏览器顶棚进行定位没问题,但他的子级应该也要相对于父级的顶棚往下窜才对,但他没往下,就好像他父级没有棚一样.就好像棚塌陷了一样,所以叫margin塌陷.
解决办法:
这个bug不能完美的解决,只是找到一种方法来弥补
- 不能用的法子:父级棚塌陷了,就手动给他父级加一个,直接加border
不专业,不合适;按照图纸,差1px也不行,但它是可以解决这个问题的;
.wrapper{
border-top:1px solid red;
}
.content{
margin-top:50px;
}
- bfc ->block format context 块级格式化上下文
css是把html的每一个元素都当成一个盒子,而且他进一步的认为每一套盒子里面都有自己的一套渲染规则,这个渲染规则就是你写完这个代码,它能根据你写的这个代码给你绘制出来,就是每一个盒子里面都有一套一模一样的语法规则,这是html里面所有盒子的正常的规则,然后我们可以通过一些特定的手段让其中的一些盒子或一个盒子里面的渲染规则发生改变;
即bfc设置之后,特地党的盒子会遵循另一套语法规则;
解决方法:改变他父级的渲染规则,让他的父级变为bfc元素,他父级变为bfc后,父级和子级产生的margin塌陷就解决了
如何触发一个盒子的bfc
- position:absolute;
- display:inline-block;
- float:left/right
- overflow:hidden
使用overflow触发
给父级添加overflow:hidden 溢出部分隐藏
.wrapper{
overflow:hiddden;
}
.content{
margin-top:80px;
}
使用display:inline-block触发
改变为块级行元素
.wrapper{
display:inline-block;
}
.content{
margin-top:80px;
}
使用1 2 3 4均可以解决这个问题,但解决问题的同时,又引发了新的问题:针对特定的需求,哪一个无影响用哪个
两个经典bug:margin合并
<!-- 两个经典bug:margin合并 -->
<span class="box1">123</span>
<span class="box2">234</span>
<!-- 两个经典bug:margin合并 -->
/* 两个经典bug:margin合并 */
.box1{
background-color: red;
}
.box2{
background-color: green;
}
/* 两个经典bug:margin合并 */
1.设置box1的右边距
.box1{
margin-right:50px;
}
2.在设置box2的左边距
.box2{
margin-left:50px;
}
俩个box设置的左右margin相加了,这是正常现象叫区域不能共用
margin合并
俩个兄弟结构的元素,他俩垂直方向的margin是合并的,共用的
<!-- 两个兄弟结构的元素 -->
<div class="demo1">1</div>
<div class="demo2">2</div>
.demo1{
background-color: red;
margin-bottom:100px;
}
.demo2{
background-color: green;
margin-top:100px;
}
解决办法
依旧可以使用bfc来解决->要解决的是demo1和demo2的一个bug,就必须让他们俩处在bfc环境下,给他俩加一个父级,这个父级有bfc语法加持.
<div class="wrapper">
<div class="demo1">1</div>
</div>
<div class="wrapper">
<div class="demo2">2</div>
</div>
.wrapper{
overflow:hidden;
}
.demo1{
background-color: red;
margin-bottom:100px;
}
.demo2{
background-color: green;
margin-top:100px;
}
margin塌陷是只添加了Css,而margin合并解决的时候必须要在html上加持一个父级,改变了html结构.编程的时候html,即结构最重要,结构是不可以随便乱加,乱改的;就是我们不能因为修改一个bug,要去添加一个无用的结构
这个margin合并不解决,直接添加一个就可以,可以通过数学计算的方式解决
即若margin-bottom:100px;margin-top:100px;故应该间隔200px,则直接改为margin-bottom:200px;或者margin-top:200px;即可
float 浮动模型
三大模型:盒模型,层模型(position),浮动模型(float)
<!-- float -->
<!-- 三大模型:盒模型,层模型,浮动模型 -->
<!-- float:left/right -->
<div class="wrapper">
<div class="content">1</div>
<div class="content">2</div>
<div class="content">3</div>
</div>
<!-- float -->
/* float */
.wrapper{
width:300px;
height:300px;
border:1px solid #000;
}
.content{
color:#fff;
background-color: black;
width:100px;
height:100px;
}
/* float */
加上浮动left之后
排队了,占一行了 从左往右排
.content{
float:left;
}
加浮动right
从右往左排
.content{
float:right;
}
将内部子元素变多 变成9个 left
<div class="wrapper">
<div class="content">1</div>
<div class="content">2</div>
<div class="content">3</div>
<div class="content">4</div>
<div class="content">5</div>
<div class="content">6</div>
<div class="content">7</div>
<div class="content">8</div>
<div class="content">9</div>
</div>
.content{
float:left
}
float可以使元素站队,而且在站队的过程中还能加margin…
/* 将外部容器扩宽一点;因为浮动规则是:剩下的空间够占一个就占,不够就去下一行;站队的边界是父级的边界 */
.wrapper{
width:350px
}
.content{
margin-left:10px;
margin-bottom:10px;
}
淘宝上这些样式用float浮动便可以做
浮动元素产生了浮动流,
所有产生了浮动流的元素,
块级元素看不到,自然而然就是分层的效果
产生了1.bfc的元素和2.文本类属性(带有inline)的元素以及3.文本都能看到浮动元素
1.box设置了float,产生了浮动流,所以块级元素看不到,demo就上去了
)]
<div class="box"></div>
<div class="demo"></div>
.box{
width:100px;
height:100px;
background-color: #000;;
float:left;
opacity: 0.5;
}
.demo{
width:150px;
height:150px;
background-color: green;
}
2.文本类属性的元素以及文本可以看到产生浮动流的元素
<div class="box"></div>
123
3.触发bfc的元素也可以看到产生浮动流的元素
<div class="box"></div>
<div class="demo"></div>
.demo{
float:left;
}
当自子级设置了float之后,他的父级div便包不住它了,因为块级元素看不到产生了浮动流的元素
不加float 正常情况下:
<div class="wrapper">
<div class="content">1</div>
<div class="content">2</div>
<div class="content">3</div>
</div>
.wrapper{
/* 不加宽高,即宽度自适应,高度由内容撑起来 */
border:1px solid #000;
}
.content{
color:#fff;
background-color: black;
width:100px;
height:100px;
}
当添加浮动之后
他的父级包不住了,他的父级是块级元素,所以自然看不到浮动元素
.content{[
float:left;
]}
怎么拿父级来包住浮动子级呢?
1.加一个高就可以了;但不可以一劳永逸,高度不确定
.wrapper{
height:100px;
}
2.罪魁祸首是浮动流,只要把浮动流清除就没问题了,他的父级就正常了
<div class="wrapper">
<div class="content">1</div>
<!-- 1 产生的浮动流,逻辑上是对后续元素有影响
1产生的浮动流:------------------------------ -->
<div class="content">2</div>
<!-- 2产生的浮动流:------------------------------ -->
<div class="content">3</div>
<!-- 3产生的浮动流:------------------------------ -->
<!-- 若在最后添加一个p元素,则这个p元素会受第三个浮动流的影响,他出生的位置应该在第一行 -->
<p style="border-top:10px solid green"></p>
</div>
若把第三个产生的浮动流去掉,就没有人影响p了
在p上增加一个语法clear即可;clear只有一个功能:清楚周边的浮动流
p{
clear:both;
}
当设置p的边框粗细为0px时,我们的包裹问题解决了,即只要p它逻辑上在那,不需要像素,他就可以清除浮动流.