两栏布局、三栏布局常用方法详解_两栏布局和三栏布局_abuanden的博客-程序员秘密

技术标签: 技能树  # HTML、CSS基础  

两栏布局

一栏固定宽度,一栏自适应

一、左float,右margin-left

	<div class="left">left</div>
	<div class="right">right</div>
	body,div{
    padding: 0 ;margin:0;}
	.left,.right{
    height: 200px;}
	.left{
    float: left;width: 200px;background-color:skyblue;}
	.right{
    margin-left: 200px; background-color: greenyellow;}

因为块级元素有流体特性,即默认会填充满外部容器,所以只需要设置margin,不需要设置width就可以让content填满剩余的部分。
这里margin-left的宽度和左栏宽度一样,是因为左栏浮动,脱离文档流。

二、左侧float:left; 右侧overflow:hidden;(推荐)

	<div class="left">left</div>
	<div class="right">right</div>
	body,div{
    padding: 0 ;margin:0;}
	.left,.right{
    height: 200px;}
	.left{
    float: left;width: 200px;background-color:skyblue;}
	.right{
    overflow:hidden; background-color: greenyellow;}

核心思想是触发BFC
回顾一下BFC的四种情况:
1、float的值不是none。(right、left、inherit)
2、position的值不是static或者relative。(absolute、fixed、 sticky)
3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex
4、overflow的值不是visible(hidden、scroll、auto)
注意:这里左float,右只能是overflow才能实现两栏布局

触发了BFC的元素仍然保持流体特性,也就是说BFC元素虽然不与浮动交集,自动退避浮动元素宽度的距离,但本身作为普通元素的流体特性依然存在,反映在布局上就是自动填满除去浮动内容以外的剩余空间。

1、position:absolute时

  • 这里加一个margin-left便于区分。
  • 绝对定位会叠加在float元素上面,并且不会自动填充
  • position不设置宽度时,根据内容确定宽度
  • 有一种办法可以解决:给右栏添加left:200px; right:0;在方法三有讲
    在这里插入图片描述

2、display:inline-block时

  • 这里加一个margin-left便于区分。
  • inline-block 行块盒不会自动填充
  • inline-block不设置宽度时,根据内容确定宽度
    在这里插入图片描述

3、float:right时

  • float不设置宽度时,根据内容确定宽度
    在这里插入图片描述

4、overflow为其他情况时

  • auto、hidden、overplay都可以实现
  • scroll时会出现滑动条,其他都不行

三、利用绝对定位

	<div class="wrap">
		<div class="left">left</div>
		<div class="right">right</div>
	</div>
.wrap{
    position : absolute; }
.left{
     width: 200px; }
.right{
     position: absolute; top: 0; left: 200px; right: 0}

通过设置right:0;来限制右边块级元素的宽度;left: 200px;来自适应宽度。

四、利用弹性布局(推荐)

	<div class="wrap">
		<div class="left">left</div>
		<div class="right">right</div>
	</div>
    body,div{
    padding: 0 ;margin:0;}
	.wrap{
    display: flex;}
	.left,.right{
    height: 200px;}
	.left{
    width: 200px;background-color:skyblue;}
	.right{
    flex: 1; background-color: greenyellow;}

一栏不定宽,一栏自适应

一、左侧float:left; 右侧overflow:hidden;(BFC)

不再赘述,原理同上面的

二、利用弹性布局(推荐)

        body,div{
    padding: 0 ;margin:0;}
		.wrap{
    display:flex;}
		.left,.right{
    height: 200px;padding: 10px;}
		.left{
    background-color:skyblue;}
		.right{
    flex:1;background-color: yellow;}

和上面定宽一样,通过flex:1

综上所述,使用BFC和flex布局通用性高

三栏布局

一. 浮动布局

	 .layout.float .left{
    
        float:left;
        width:300px;
        background: red;
      }
      .layout.float .center{
    
        background: yellow;
      }
      .layout.float .right{
    
        float:right;
        width:300px;
        background: blue;
      }

浮动布局是有局限性的,浮动元素是脱离文档流,要做清除浮动,这个处理不好的话,会带来很多问题,比如高度塌陷等。
浮动布局的优点就是比较简单,兼容性也比较好。只要清除浮动做的好,是没有什么问题的。
延伸:你知道哪些清除浮动的方案?每种方案的有什么优缺点?

二、绝对定位布局

.left{
    
    position: absolute;
    left: 0;
    width: 300px;
    background-color: red;
}
.center{
    
    position: absolute;
    left: 300px;
    right: 300px;
    background-color: blue;
}
.right{
    
    position: absolute;
    right: 0;
    width: 300px;
    background-color: #3A2CAC;
}

我们需要选择给 左 中 右 都使用 absolute 绝对定位

绝对定位布局优点,很快捷,设置很方便,而且也不容易出问题,你可以很快的就能想出这种布局方式。
缺点就是,绝对定位是脱离文档流的,意味着下面的所有子元素也会脱离文档流,这就导致了这种方法的有效性和可使用性是比较差的。

三、flex布局(推荐)

.main {
    
    display: flex;
}
.left{
    
    width: 400px;
    background-color: red;
}
.center{
    
    background-color: blue;
    word-break: break-word;/*可以不用*/
}
.right{
    
    background-color: red;
    width: 400px;
}

目前移动端的布局都是用flexbox。
felxbox的缺点就是不能兼容IE8及以下浏览器。

四、网格布局(推荐)

    <div class="div">
        <div class="box1"></div>
        <div></div>
        <div></div>
    </div>
	.box1{
    
          background: red;
    }
    .div {
    
        width: 100%;
        display: grid;
        grid-template-rows: 100px;
        grid-template-columns: 300px auto 300px;
    }

在这里插入图片描述

五、圣杯布局(float+负margin)

    <div class="container">
        <div class="main col">Main</div>
        <div class="left col">Left</div>
        <div class="right col">Right</div>
    </div>
        /* 两边定宽,中间自适用 */
        body,html,.container{
    
            height: 100%;
            padding:0;
            margin: 0;
        }
        .col{
    
            float: left;   /* 三个col都设置float: left,为了把left和right定位到左右部分 */
            position:relative;
        }
         /*父元素空出左右栏位子: 因为上一步中,左右栏定位成功了,但是中间栏的内容会被遮盖住*/
        .container{
    
            padding:0 200px 0 100px;
        }
        /*左边栏*/
        .left{
    
            left:-100px;
            width: 100px;
            height:100%;
            margin-left: -100%;
            background: #ff69b4;
        }
        /*中间栏*/
        .main{
    
            width:100%;
            height: 100%;
            background: #659;
        }
        /*右边栏*/
        .right{
    
            right:-200px;
            width:200px;
            height:100%;
            margin-left: -200px;
            background: #ff69b4;
        }

圣杯布局使用float布局框架 , margin为负值 , position: relative定位,不添加额外标签

六、双飞翼布局(推荐)

    <div class="container">
        <div class="main col ">
            <div class="main_inner">Main</div>
        </div>
        <div class="left col ">Left</div>
        <div class="right col ">Right</div>
    </div>
        body,html,.container{
    
            height: 100%;
            padding:0;
            margin: 0;
        }
        .col{
     
            float: left; /* 把left和right定位到左右部分 */
        }
        .main{
     
            width:100%;
            height:100%;
            background: #659;
        }
        .main_inner{
       /* 处理中间栏的内容被遮盖问题 */
            margin:0 200px 0 100px;
        }
        .left{
    
            width: 100px;
            height: 100%;
            margin-left: -100%;
            background: #ff69b4;
        }
        .right{
    
            height:100%;
            width:200px;
            margin-left: -200px;
            background: #ff69b4;
        }

双飞翼布局的优点:
(1)主要的内容先加载的优化。

(2)兼容目前所有的主流浏览器,包括IE6在内。

(3)实现不同的布局方式,可以通过调整相关CSS属性即可实现。

圣杯布局和双飞翼布局达到的效果基本相同,都是侧边两栏宽度固定,中间栏宽度自适应。 主要的不同之处就是在解决中间部分被挡住的问题时,采取的解决办法不一样.
圣杯布局是在父元素上设置了padding-left和padding-right,在给左右两边的内容设置position为relative,通过左移和右移来使得左右两边的内容得以很好的展现。
而双飞翼则是在center这个div中再加了一个div来放置内容,在给这个新的div设置margin-left和margin-right

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abuanden/article/details/114298781

智能推荐

ROS Indigo learning_tf-05 now() 和 Time(0)的区别 (Python版) — waitForTransform() 函数_ADAS_LOVER的博客-程序员秘密

ROS Indigo learning_tf-05 now() 和 Time(0)的区别 (Python版) — waitForTransform() 函数我使用的虚拟机软件:VMware Workstation 11使用的Ubuntu系统:Ubuntu 14.04.4 LTSROS 版本:ROS Indigo一. 前言这一节要做的事情:使用 tf 的 now() 和 Time(0)...

Windows 2003 安装后设置大全(转贴)_hychieftain的博客-程序员秘密

  1,管理工具》服务》Themes 设为auto   2,打开 DirectX 的 D3D 硬件加速:   看桌面属性,设置 -> 高级 -> 疑难问答 -> 硬件加速 -> 完全。运行 dxdiag.exe,打开Display选项卡,可看到 3 项全部启用了。最后,利用Windows updates在Windows Server 2003中安装DirectX 9.0a。      3. 启用声

SPI、I2C、UART三种串行总线的原理、区别及应用_嵌入式Linux,的博客-程序员秘密

SPI协议解析,链接如下https://blog.csdn.net/weiqifa0/article/details/82765892I2C协议解析,链接如下https://blog.csdn.net/weiqifa0/article/details/82765349串口UART串行总线协议https://blog.csdn.net/weiqifa0/article/detai...

Navicat:Access violation at address xxxxxxxxx in module 'navicat.exe'.Read of address xxxxxx_Syyyyy_的博客-程序员秘密

在navicat中如果报了这个错误,则表示内存越界,需要重新注册windows的动态链接库;解决方案:打开cmd;在命令行中输入 for %1 in (%windir%\system32\*.dll)do regsvr32.exe /s %1 回车运行;等待动态链接库刷新完成,重启mysql和navicat即可。...

常用Python标准库对象速查表(2):文件与文件夹操作_dongfuguo的博客-程序员秘密

封面图片:《Python程序设计基础与应用》,董付国,机械工业出版社图书详情:https://item.jd.com/12433472.html===========os模块常用成员方法功...

java 多选题_华为java面试题中的九道单选_weixin_39577908的博客-程序员秘密

华为java面试题中的九道单选时间:2014-12-26 17:41分享到:1.Java是从( )语言改进重新设计。A.Ada B.C++ C.Pasacal D.BASIC  答案:B2.下列语句哪一个正确( )A. Java程序经编译后会产生machine codeB. Java程序经编译后会产生byte codeC. Java程序经编译后会产生DLLD. 以上都不正确  答案:B3.下列说法...

随便推点

C# 构造xml格式的字符串_c# xml字符串_波风亭的博客-程序员秘密

比如要构造这样的字符串:<OnlineEdu> <head> <PassWord>****</PassWord> <ServiceCode>BS002</ServiceCode> </head> <body> <PeopleList> <PeopleInfo> <Idcard>320323199305

微信支付测试返回:access_control:not_allow或system:access_denied_Sbangm的博客-程序员秘密

比如我的测试js支付的页面是 http://10.10.x.y/test/wxpay 。首先要将“商户功能”->支付测试 下的“支付测试目录”改成  http://10.10.x.y/test/。然后注意这句话“测试域名只能在公众号会话内测试才有效”。因此,要完成测试,你需要关注这个公众账号,让公众账号回复你这个链接“ http://10.10.x.y/test/wxpay”。这时候,

innerHTML 的坑_weixin_30409849的博客-程序员秘密

http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspxRemarksTheinnerHTMLproperty is valid for both block and inline elements. By definition, elements that do not have both an opening a...

Shell脚本编程规范_shell脚本规范_运维@小兵的博客-程序员秘密

文章目录一、注释`头部注释``单行注释与多行注释`二、排版规范`1.程序块采用缩进,缩进为4个空格`修改vim中Tab键的距离`2.函数编写``3.命令较长需分行书写,在低优先级操作符处划分新行,用'\'标识``4.一行只写一条语句``5.逻辑运算符&amp;&amp;、||和重定向、管道符前后要留空格``6.一个函数只完成一个功能,且不能超过100行``7.case语句格式``8.注释与上面的代码用空行隔开`三、变量规范`1.变量名由字母、数字、下划线组成, 只能以字母、下划线开头``2.尽量减少全局变量

Java使用RSA的公钥加密,私钥解密;私钥加密,公钥解密_dtb rsa公钥_silangfeilang的博客-程序员秘密

Java使用RSA的公钥加密,私钥解密;私钥加密,公钥解密package org.system.common.util.RSA;import lombok.extern.slf4j.Slf4j;import org.apache.commons.codec.binary.Base64;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Compone

C语言库函数---strtok_c语言strtok_s库函数_勤学-365的博客-程序员秘密

文章目录头文件作用扩展举例头文件#include &lt;string.h&gt;作用strtok函数的作用是把字符串以规定的字符分割开:p = strtok(buf, "$"); p为指针,buf也是指针,这句代码的意思就是把buf中的字符串以"$"为分隔符分割开来,分割出来的字符串保存到指针p中。再次调用strtok函数时,把buf换成NULL,不需要再写buf。即:p =...