为了账号安全,请及时绑定邮箱和手机立即绑定

CSS - 三栏响应式布局(左右固宽,中间自适应)的五种方法

这种布局方式除了是很常见的面试题,更重要的,他还是很常见的一种页面布局。因此必须要掌握几种制作情况。

这里我先列出几种我总结的,可能有些不足,希望大家也可以留言补充,我再整理成更完善的。



在分条展示实现方案前,我先把通用的css贴一下:

*{
margin: 0;
padding: 0;
}
html{
font-family: "微软雅黑";
}
ul li{
list-style: none;
}
a:link,a:hover{
text-decoration: none;
}
.clearfix{
*zoom:1;
}
.clearfix:after{
height: 0;
clear: both;
content: "";
visibility: hidden;
display: block;
}
.fl{
float: left;
}
.fr{
float: right;
}
h3,.tips-info{
margin: 8px 0;
font-size: 14px;
}
li{
margin-bottom: 10px
}
.tips,ol{
background: #fffbfb;
padding: 10px 20px;
}
.tips-ex{
font-size: 12px;
color: #99c1c1;
}
.block{
padding: 10px 20px;
border-top: 5px solid #99c1c1;
margin: 30px 0 0px;
background: #f5f5f5;
}
.browser,.container{
padding: 20px;
}
.container{
font-size: 14px;
}
.container,.img-box{
background: #eee;
border: 1px solid #999;
}
.box{
background: #fff;
padding: 20px;
border: 1px solid #999;
}
.team-box{
width: 158px;
}
.info-box{
}
.person-box{
width: 78px;
}
.person-box .img-box{
margin-bottom: 20px;
}
.person-box .img-box:last-child{
margin: 0;
}
.img-box{
width: 78px;
}
.img-txt{
line-height: 20px;
margin: 20px 0;
text-align: center;
padding: 0 5px;
}
.team-name{
width: 78px;
height: 80px;
text-align: center;
}
/* others */
.top{
margin-top: 150px;
}
.bottom{
margin-bottom: 150px;
}

主要是以下几种方案基础代码、无关痛痒的样式代码和左中右三栏各自需要提前固定的尺寸代码。

 

以下分几种情况实现:

第一种,float布局实现

这绝对是我大脑能第一下想到的!

https://img1.sycdn.imooc.com//5c0f35210001dab711670612.jpg

左右两栏分别左浮动、右浮动。

中间栏使用margin/padding撑开左右两栏需要占据的位置即可。

代码:

html:

<div class="browser">
    <div class="container f-cont clearfix">
        <div class="box team-box clearfix">
            <div class="img-box">
                <div class="img-txt">团队logo 80x80</div>
            </div>
            <div class="team-name">团队名称</div>
        </div>
        <div class="box person-box clearfix">
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
        </div>
        <div class="box info-box">
            <div>
                <h3>关于你们团队的介绍</h3>
                <span>可以给我们解释一下团队名称得来历,或是分别介绍你们的团队成员。(以下为示例)</span>
                <p>页面的样式表是非必要的。当有页面样式表时,页面的样式表中的样式规则会层叠覆盖 app.wxss 中的样式规则。如果不指定页面的样式表,也可以在页面的结构文件中直接使用 app.wxss 中指定的样式规则。index.json 是页面的配置文件:页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。</p>
                <h3>又一个小标题</h3>
                <p>
                    页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。
                </p>
            </div>
        </div>
    </div>
</div>

css:

.f-cont .team-box,.img-box,.team-name{
float: left;
}
.f-cont .person-box{
float: right;
}
.f-cont .info-box,.p-cont .info-box{
margin: 0 140px 0 220px;
}

看下动态效果:

妈耶传不了动图


第二种,定位布局+margin

https://img1.sycdn.imooc.com//5c0f352200011a4411670586.jpg

左右栏分别使用absolute定位,同float一样,左边的定位left 0,右边的定位right 0;

中间还是用margin或padding撑开左右栏需要占据的位置即可。(利用了浮动或定位时,结构飘起来不占据文档空间的特点)

代码:

html:

<div class="browser">
    <div class="container p-cont">
        <div class="box team-box clearfix">
            <div class="img-box">
                <div class="img-txt">团队logo 80x80</div>
            </div>
            <div class="team-name">团队名称</div>
        </div>
        <div class="box info-box">
            <div>
                <h3>关于你们团队的介绍</h3>
                <span>可以给我们解释一下团队名称得来历,或是分别介绍你们的团队成员。(以下为示例)</span>
                <p>页面的样式表是非必要的。当有页面样式表时,页面的样式表中的样式规则会层叠覆盖 app.wxss 中的样式规则。如果不指定页面的样式表,也可以在页面的结构文件中直接使用 app.wxss 中指定的样式规则。index.json 是页面的配置文件:页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。</p>
                <h3>又一个小标题</h3>
                <p>
                    页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。
                </p>
            </div>
        </div>
        <div class="box person-box clearfix">
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
        </div>
    </div>
</div>

css:

.p-cont{
position: relative;
height: 430px;
}
.p-cont .team-box,.p-cont .person-box{
position: absolute;
top: 20px;
z-index: 9;
}
.p-cont .team-box{
left: 20px;
}
.p-cont .person-box{
right: 20px;
}

不足点:

不过这种布局有点缺点就是,父元素需要设置固定高度,中间自适应时,如果内容过多而宽度又过窄,会导致高度被迫增加,严重时冲破父元素高度,产生溢出的现象:

看动图,看不了就去my博客看吧,无奈:(


第三种,display:table 实现

https://img1.sycdn.imooc.com//5c0f354100015a9a11660665.jpg

父元素display:table;

左右子元素使用display:table-cell;

中间正常文档流,margin撑开间距即可

代码:

html:

<div class="browser">
    <div class="container d-cont">
        <div class="cell">
            <div class="box team-box clearfix">
            <div class="img-box">
                <div class="img-txt">团队logo 80x80</div>
            </div>
            <div class="team-name">团队名称</div>
        </div>
        </div>
        <div class="box info-box">
            <div>
                <h3>关于你们团队的介绍</h3>
                <span>可以给我们解释一下团队名称得来历,或是分别介绍你们的团队成员。(以下为示例)</span>
                <p>页面的样式表是非必要的。当有页面样式表时,页面的样式表中的样式规则会层叠覆盖 app.wxss 中的样式规则。如果不指定页面的样式表,也可以在页面的结构文件中直接使用 app.wxss 中指定的样式规则。index.json 是页面的配置文件:页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。</p>
                <h3>又一个小标题</h3>
                <p>
                    页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。
                </p>
            </div>
        </div>
        <div class="cell">
            <div class="box person-box clearfix">
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
            <div class="img-box">
                <div class="img-txt">个人logo 80x80</div>
            </div>
        </div>
        </div>
    </div>
</div>

css:

.d-cont{
display: table;
}
.d-cont .cell{
display: table-cell;
vertical-align: top;
}
.d-cont .info-box{
margin: 0 20px;
}

这种的高度就不会被撑破,父元素高度就会自适应子元素的高度进行伸缩;

同样,动图飞了...


第四种,浮动 + margin负边距

https://img1.sycdn.imooc.com//5c0f35240001d45a11650689.jpg


代码:

html:

<div class="browser">
    <div class="container m-cont clearfix">
        <div class="m-c">
            <div class="box info-box">
                <div>
                    <h3>关于你们团队的介绍</h3>
                    <span>可以给我们解释一下团队名称得来历,或是分别介绍你们的团队成员。(以下为示例)</span>
                    <p>页面的样式表是非必要的。当有页面样式表时,页面的样式表中的样式规则会层叠覆盖 app.wxss 中的样式规则。如果不指定页面的样式表,也可以在页面的结构文件中直接使用 app.wxss 中指定的样式规则。index.json 是页面的配置文件:页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。</p>
                    <h3>又一个小标题</h3>
                    <p>
                        页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。
                    </p>
                </div>
            </div>
        </div>
        <div class="m-l">
            <div class="box team-box clearfix">
                <div class="img-box">
                    <div class="img-txt">团队logo 80x80</div>
                </div>
                <div class="team-name">团队名称</div>
            </div>
        </div>
        <div class="m-r">
            <div class="box person-box clearfix">
                <div class="img-box">
                    <div class="img-txt">个人logo 80x80</div>
                </div>
                <div class="img-box">
                    <div class="img-txt">个人logo 80x80</div>
                </div>
                <div class="img-box">
                    <div class="img-txt">个人logo 80x80</div>
                </div>
                <div class="img-box">
                    <div class="img-txt">个人logo 80x80</div>
                </div>
            </div>
        </div>
    </div>
</div>

css:

.m-l,.m-c,.m-r{
float: left;
}
.m-l{
margin-left: -100%;
}
.m-c{
margin: 0 140px 0 220px;
}
.m-r{
margin-left: -120px;
}


第五种,css3 - flex

https://img1.sycdn.imooc.com//5c0f352300010e0f11660642.jpg

代码:

html:

<div class="browser">
    <div class="container fx-cont">
        <div class="cell">
            <div class="box team-box clearfix">
                <div class="img-box">
                    <div class="img-txt">团队logo 80x80</div>
                </div>
                <div class="team-name">团队名称</div>
            </div>
        </div>
        <div class="cell">
            <div class="box info-box">
                <div>
                    <h3>关于你们团队的介绍</h3>
                    <span>可以给我们解释一下团队名称得来历,或是分别介绍你们的团队成员。(以下为示例)</span>
                    <p>页面的样式表是非必要的。当有页面样式表时,页面的样式表中的样式规则会层叠覆盖 app.wxss 中的样式规则。如果不指定页面的样式表,也可以在页面的结构文件中直接使用 app.wxss 中指定的样式规则。index.json 是页面的配置文件:页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。</p>
                    <h3>又一个小标题</h3>
                    <p>
                        页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。
                    </p>
                </div>
            </div>
        </div>
        <div class="cell">
            <div class="box person-box clearfix">
                <div class="img-box">
                    <div class="img-txt">个人logo 80x80</div>
                </div>
                <div class="img-box">
                    <div class="img-txt">个人logo 80x80</div>
                </div>
                <div class="img-box">
                    <div class="img-txt">个人logo 80x80</div>
                </div>
                <div class="img-box">
                    <div class="img-txt">个人logo 80x80</div>
                </div>
            </div>
        </div>
    </div>
</div>

css:

.fx-cont{
display: -webkit-flex;
display: flex;
}
.fx-cont .info-box{
flex: 1;
margin: 0 20px;
}


最后,想看动图的效果的还请您移驾

CSS-三栏响应式布局(左右固宽,中间自适应)的五种方法


点击查看更多内容
18人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
78
获赞与收藏
516

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消