布局

2017-07-02  本文已影响0人  喵不吱

两栏布局(bfc)demo

原理:BFC的区域不会与float box重叠。通过触发main生成BFC, 来实现自适应两栏布局。

said定宽,main不定宽,自动填补

但是会有个问题:为何给body设置border之后参见demo

父元素添加border之后main下移

补坑解释:

外边距折叠(margin collapse) 发生的场景是,同一个块级盒子布局上下文(BFC)中相邻的次方向外边距会折叠

发生合并

box2没有padding和border那么,box1 box2 box3的margin就要折叠,但是如果 box2 有padding或border,那么内部box3的margin就被隔开了,就只有box1 box2margin参与折叠

加上border之后参见demo

加上border之后

这可能就是给body加border会出现不合并的原因了吧。

但是一般来讲会给加一个 padding-top:1px 来解决。

其他方式的两栏布局
。。。。。

三栏 (负margin思想)

涉及浮动和清除浮动,主要“圣杯”和“双飞翼”两种解决方法。这两种方法实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是常说的固比固布局。它们实现的效果是一样的,差别在于其实现的思想。

<header>header内容区域</header>
  <div class="container">
        <div class="middle">我是中间弹性布局</div>
        <div class="left">left</div>
        <div class="right">right</div>
  </div>
  <footer>footer内容区</footer>
body{ min-width:700px;}//当你缩放页面的时候,宽度不能小于700PX,为了安全起见,最好还是给body加一个最小宽度!
header{width: 100%;height: 40px;background-color: darkseagreen;}
.container{overflow:hidden;}
.middle{width: 100%;height: 200px; background-color: deeppink;float:left;}
.left{width: 200px;height: 200px;background-color: blue;float:left;}
.right{width: 200px;height: 200px;background-color: green;float:left;}
footer{width: 100%; height: 30px;background-color: darkslategray;}
效果图

可以看到左右两栏并没有在父元素的一行显示,因为中间盒子我们给了百分之百的宽度。所有左右两个盒子才会被挤下来。
如果中间盒子不是100%的宽度,那么按照文档流,左边的盒子一定会在中间盒子的后面显示,接着显示右边的盒子。但是现在中间盒子是满屏了的,所以左右两个盒子被挤到下一行显示。我们要做到的是让左右两个盒子都上去。此时,CSS的负边距(negative margin)该上阵了。

第二步:利用负margin布局

.left {margin-left:-100%;}为负的中间盒子的宽度,左盒子往最左边移动。
.right {margin-left:-200px;}为负的自己的宽度,右盒子才可以在一行的最右边显示出自己。

效果图
但是如果给中间盒子加很多内容,就会被左右盒子挡住。如图:
第三步:让中间自适应的盒子安全显示
第一步:给出页面结构以及各个盒子的具体样式
<header>header内容区域</header>
  <div class="container">
    <div class="middle">
       <div class="middle-inner">我是中间弹性布局</div></div>
       <div class="left">left</div>
       <div class="right">right</div>
  </div>
  </div>
  <footer>footer内容区</footer>
header{width: 100%;height: 40px;background-color: darkseagreen;}
.container{overflow:hidden;}
.middle{width: 100%;height: 200px; background-color: deeppink;float:left;}
.left{width: 200px;height: 200px;background-color: blue;float:left;}
.right{width: 200px;height: 200px;background-color: green;float:left;}
footer{width: 100%; height: 30px;background-color: darkslategray;}
效果图
第二步:跟圣杯布局一样,利用负margin布局
效果图

但是仍然被挡住,如何让中间一栏自适应呢?

第三步:中间盒子里面再添加一个 div

.middle-inner{margin:0 200px;}这个 div 设置 margin-left 和 margin-right来为左右盒子留位置;

双飞翼布局
圣杯和双飞翼异同:

两边定宽,中间自适应的三栏布局的解决方式,中间栏要在放在文档流前面以优先渲染。

简单来说:双飞翼布局比圣杯布局多创建了一个 div,但不用相对布局了,少设置几个属性。

关于负margin的用法

总结有几点:

本文参考链接CSS 布局经典问题初步整理

上一篇 下一篇

猜你喜欢

热点阅读