【CSS布局】三栏式布局,左右定宽,中间内容区域自适应

实现三栏式布局的经典方法有:双飞翼布局、圣杯布局,两者都是利用了父margin来达到想要的效果,同时也是遵循重要的内容优先加载的原则(先加载center),只是在实现上稍微有些不同,同时利用CSS3的flex布局也可以实现以上效果。下面介绍下具体的实现方法:
(1)圣杯布局
原理:三个部分均被一个div元素进行包裹,同时优先加载center,利用float使元素进行浮动,其中的主要点就是利用父级div的padding+子元素的负的margin以及定位来实现效果的

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>圣杯布局</title>
    <style type="text/css">
        *{margin: 0;padding: 0;}
        body{min-width: 700px;}/*防止*/
        .header,
        .footer{
            border: 1px solid #333;
            background: #aaa;
            text-align: center;
        }
        .left,
        .middle,
        .right{
            position: relative;/*圣杯布局中主要利用的是定位加margin*/
            float: left;
            min-height: 130px;
        }
        .container{
            padding:0 220px 0 200px;
            overflow: hidden;/*BFC,float的元素的高度也可以将元素的高度撑起来*/
        }
        .left{
            margin-left: -100%;/*利用margin将元素提升到上一行中*/
            left: -200px;/*利用Left定位将元素当知道指定的位置*/
            width: 200px;
            background: red;
        }
        .right{
              margin-left: -220px;
              right: -220px;
              width: 220px;
              background: green;
          }
        .middle{
            width: 100%;
            background: blue;
            word-break: break-all;

        }
        .footer{
            clear: both;
        }
    </style>
</head>
<body>
<div class="header">
    <h4>header</h4>
</div>
<div class="container"><!--三个div子标签全都包裹在该容器中-->
    <div class="middle">
        <h4>middle</h4>
        <p>HHHHHHHHHHHHHHHHHHHHHH
            hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
            HHHHHHHHHHHHHHHHHHHHHH
            hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
        </p>
    </div>
    <div class="left">
        <h4>left</h4>
        <p>oooooooooooooo
            0000000000000000
            00000000000000000
            ooooooooooooooo
            ooooooooooooooo
            000000000000000</p>
    </div>
    <div class="right">
        <h4>right</h4>
        <p>BBBBBBBBBBBBBB
            888888888888888888
            BBBBBBBBBBBBBBBBBB
            88888888888888888888</p>
    </div>
</div>
<div class="footer">
    <h4>footer</h4>
</div>
</body>
</html>

(2)双飞翼布局
原理:首先布局上与圣杯布局有所不一样,双飞翼布局中的三个模块并没有直接包裹在同一个div内,而是center被包裹在一个div内,还是要将元素进行float的定位,然后利用center元素的margin+Left等的负margin实现效果,因为没有使用padding使得Left、right元素不需要进行定位,双飞翼布局实现上比圣杯布局简单。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>双飞翼布局</title>
    <style type="text/css">
        *{margin: 0;padding: 0;}
        body{min-width: 700px;}
        .header,
        .footer{
            border: 1px solid #333;
            background: #aaa;
            text-align: center;
        }
        .sub,
        .main,
        .extra{
            float: left;
            min-height: 130px;
        }
      .sub{
            margin-left: -100%;
            width: 200px;
            background: red;
        }
        .extra{
            margin-left: -220px;
            width: 220px;
            background: blue;
        }
        .main{
            width: 100%;
        }
        .main-inner{
            margin-left: 200px;
            margin-right: 220px;
            min-height: 130px;
            background: green;
            word-break: break-all;
        }
        .footer{
            clear: both;
        }
    </style>
</head>
<body>
<div class="header">
    <h4>header</h4>
</div>
<div class="main"><!--布局上与圣杯布局不一样,该div没有包裹所有的div标签-->
    <div class="main-inner">
        <h4>main</h4>
        <p>HHHHHHHHHHHHHHHHHHHHHH
            hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
            HHHHHHHHHHHHHHHHHHHHHH
            hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
        </p>
    </div>
</div>
<div class="sub">
    <h4>sub</h4>
    <p>oooooooooooooo
        0000000000000000
        00000000000000000
        ooooooooooooooo
        ooooooooooooooo
        000000000000000</p>
</div>

<div class="extra">
    <h4>extra</h4>
    <p>BBBBBBBBBBBBBB
        888888888888888888
        BBBBBBBBBBBBBBBBBB
        88888888888888888888</p>
</div>
<div class="footer">
    <h4>footer</h4>
</div>
</body>
</html>

以上两种布局方式在实现上都神似,止于差别机智的你可以下来自己仔细琢磨下,哈哈哈
(3)flex布局
原理:flex弹性布局的详细介绍后面会出一篇博客,flex弹性布局中要是利用了其自身的一些属性,相比其他的方式而言,flex的方式会更加简洁,利用order调整元素的放置位置,Left、right的宽度固定,不用设置flex的值,只有center的值是随机变化的所以需要设置flex:1 1 width,其相当于三个属性的组合属性:flex-grow、flex-shrink、flex-basis。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>flex三栏式布局</title>
    <style type="text/css">
        .container{
            display:flex;
        }
        .center{
            flex: 1 1 300px;
            order:2;
            background:blue;
        }
        .left{
            width:220px;
            background:green;
            order:1;
        }
        .right{
            width:220px;
            background: #f00;
            order:3;
        }
    </style>
</head>
<body>
 <div class="container">
     <div class="center">
         <h4>middle</h4>
         <p>HHHHHHHHHHHHHHHHHHHHHH
             hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
             HHHHHHHHHHHHHHHHHHHHHH
             hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
         </p>
     </div>
     <div class="left">
         <h4>left</h4>
         <p>oooooooooooooo
             0000000000000000
             00000000000000000
             ooooooooooooooo
             ooooooooooooooo
             000000000000000</p>
     </div>
     <div class="right">
         <h4>right</h4>
         <p>BBBBBBBBBBBBBB
             888888888888888888
             BBBBBBBBBBBBBBBBBB
             88888888888888888888</p>
     </div>
 </div>
</body>
</html>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: <div style="width:100%;"> <div style="float:left;width:30%;">左栏内容</div> <div style="float:left;width:40%;margin-left:2%;">中间内容</div> <div style="float:right;width:30%;">右栏内容</div> </div> ### 回答2: 可以使用HTML和CSS来创建一个布局,其中左右两列的度固,而中间列的自适应。 首先,我们需要使用HTML创建一个列的容器,可以使用`<div>`标签来实现。代码如下: ```html <div class="container"> <div class="left-column"></div> <div class="middle-column"></div> <div class="right-column"></div> </div> ``` 接下来,我们可以使用CSS来设置样式,以实现固度和自适应度的效果。首先,我们设置列容器的样式,将其设置为一行布局,并使用`display: flex;`属性,使其自动伸缩。同时,设置容器的度为100%,以确保占据整个容器的度。代码如下: ```css .container { display: flex; width: 100%; } ``` 接下来,我们为左中右列设置样式。设置左右两列的度为固值,例如200像素。代码如下: ```css .left-column { width: 200px; } .right-column { width: 200px; } ``` 为了让中间自适应度,我们可以使用`flex-grow`属性,设置中间列的伸缩比例为1,使其自动填充剩余的度。代码如下: ```css .middle-column { flex-grow: 1; } ``` 最后,为了使布局更加美观,我们可以为列容器和内部的列添加一些样式,例如背景色和内边距。代码如下: ```css .container { background-color: #f1f1f1; padding: 10px; } .left-column, .middle-column, .right-column { background-color: #e0e0e0; padding: 10px; margin: 5px; } ``` 通过这样设置,我们就可以得到一个具有固左右列和自适应中间列的布局。 请注意,以上代码只是一个示例,你可以根据自己的需求进行调整和修改。 ### 回答3: 要实现一个左右度固中间自适应布局,可以使用HTML和CSS进行编写。 首先,在HTML中,我们可以使用```<div>```标签来创建三个元素,分别代表左栏、中栏和右栏。例如: ``` <div class="left-column">左栏内容</div> <div class="middle-column">中栏内容</div> <div class="right-column">右栏内容</div> ``` 然后,我们需要使用CSS来设置这些元素的样式。首先,设置左栏和右栏的度固,可以使用```width```属性进行设置,例如: ``` .left-column { width: 200px; } .right-column { width: 200px; } ``` 接下来,设置中栏的自适应,可以使用```flexbox```布局来实现。在CSS中,将父元素设置为```display: flex;```,然后将中栏设置为```flex-grow: 1;```,这样中栏的度将会自适应。例如: ``` body { display: flex; } .middle-column { flex-grow: 1; } ``` 最后,可以添加一些样式来美化布局,如设置背景颜色、边框样式等。 完整的HTML和CSS代码如下: ``` <!DOCTYPE html> <html> <head> <style> .left-column { width: 200px; background-color: lightgray; } .middle-column { flex-grow: 1; background-color: white; } .right-column { width: 200px; background-color: lightgray; } </style> </head> <body> <div class="left-column">左栏内容</div> <div class="middle-column">中栏内容</div> <div class="right-column">右栏内容</div> </body> </html> ``` 通过上述HTML和CSS代码,我们实现了一个左右度固中间自适应布局
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值