CSS经典布局大揭秘

上一篇的文章介绍了BFC块级格式化上下文,BFC是CSS中的常用技巧。今天我们将详细地介绍网页中的常见布局,运用BFC,也或者是flex弹性布局。

1 两栏布局

两栏布局是非常常见的布局方案,在许多网站中都运用到这一布局。说到两栏布局,最常见的就是管理后台系统。左侧菜单栏固定宽度,右侧主要内容随窗口变化而自适应。

1.1 传统浮动方法
<!DOCTYPE html>
<html lang="en">

<head>
    <title>左定右适应两栏布局</title>
    <style>
        .aside {
            padding: 10px;
            width: 200px;
            float: left;
            background: rgb(212, 74, 208);
        }

        .right {
            padding: 10px;
            /* 创建BFC,避开浮动盒子 */
            overflow: hidden;
            background: rgb(20, 228, 100);
        }

        .container {
            padding: 10px;
            margin: 0 auto;
        }

        /* 清除浮动 */
        .clearfix::after {
            content: "";
            display: block;
            clear: both;
        }
    </style>
</head>

<body>
    <div class="container">
        <aside class="aside">Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsa, blanditiis! Dolorem
            temporibus, laboriosam numquam cupiditate omnis nobis, doloremque itaque exercitationem, veritatis explicabo
            nisi animi accusantium consequatur a! Aliquid, quia voluptate.</aside>
        <div class="right">Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos nostrum repudiandae
            reprehenderit temporibus ullam id blanditiis neque rerum obcaecati soluta, possimus sed ad vel aliquam harum
            odit ut quidem. Optio!Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos nostrum repudiandae
            reprehenderit temporibus ullam id blanditiis neque rerum obcaecati soluta, possimus sed ad vel aliquam harum
            odit ut quidem. Optio!Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos nostrum repudiandae
            reprehenderit temporibus ullam id blanditiis neque rerum obcaecati soluta, possimus sed ad vel aliquam harum
            odit ut quidem. Optio!Lorem ipsum dolor sit amet consectetur adipisicing elit. odit ut quidem. Optio!Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos nostrum repudiandae
            reprehenderit temporibus ullam id blanditiis neque rerum obcaecati soluta, possimus sed ad vel aliquam harum
            odit ut quidem. Optio!Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos nostrum repudiandae
            reprehenderit temporibus ullam id blanditiis neque rerum obcaecati soluta, possimus sed ad vel aliquam harum
            odit ut quidem. Optio!Lorem ipsum dolor sit amet consectetur adipisicing elit. 
    </div>
</body>

</html>

效果如下:
在这里插入图片描述
主要思路:

  • 先写两个div,侧边栏可以使用aside标签。
  • 让侧边栏向左浮动,脱离文档流
  • 这个时候,右侧主要内容会忽视浮动元素,所以让右侧的div创建一个BFC,这样可以达到避开浮动元素的效果
  • 如有需要设置两者间距,切记不能设置右侧div的margin-left,因为它参照的是页面左边缘,而不是aside元素。我们因该为侧边栏设置margin-right的值,以此达到调整间距的需求
1.2 有助于搜索引擎查找关键词的方法

和前面不一样,为了让搜索引擎能尽快拿到关键词,我们会把含有大量主要内容的右侧div写在前面。
主要思路:

  • 让右侧div空出左侧空间用于放置aside元素
  • 运用绝对定位将侧边栏定死在左侧位置
    代码如下:
<!DOCTYPE html>
<html lang="en">

<head>
    <title>左定右适应两栏布局</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .aside {
            position: absolute;
            top: 10px;
            left: 10px;
            padding: 10px;
            width: 200px;
            background: rgb(212, 74, 208);
        }

        .right {
            margin-left: 300px;
            padding: 10px;
            background: rgb(20, 228, 100);
        }

        .container {
            padding: 10px;
            margin: 0 auto;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="right">Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos nostrum repudiandae
            reprehenderit temporibus ullam id blanditiis neque rerum obcaecati soluta, possimus sed ad vel aliquam harum
            odit ut quidem. Optio!Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos nostrum repudiandae
            reprehenderit temporibus ullam id blanditiis neque rerum obcaecati soluta, possimus sed ad vel aliquam harum
            odit ut quidem. Optio!Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos nostrum repudiandae
            reprehenderit temporibus ullam id blanditiis neque rerum obcaecati soluta, possimus sed ad vel aliquam harum
            odit ut quidem. Optio!Lorem ipsum dolor sit amet consectetur adipisicing elit. odit ut quidem. Optio!Lorem
            ipsum dolor sit amet consectetur adipisicing elit. Eos nostrum repudiandae

        </div>
        <aside class="aside">Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsa, blanditiis! Dolorem
            temporibus, laboriosam numquam cupiditate omnis nobis, doloremque itaque exercitationem, veritatis explicabo
            nisi animi accusantium consequatur a! Aliquid, quia voluptate.</aside>

</body>

</html>
1.3 flex实现

flex弹性布局是CSS3的牛逼特性之一,从此多了一种布局的方式,而且非常强大。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <style>
        .container {
            padding: 20px;
            height: 500px;
            border: 1px solid #222;
            /* 设置弹性布局 */
            display: flex;
            /* 设置排列方式 */
            flex-flow: row;
        }

        .aside {
            width: 200px;
            margin-right: 20px;
            background: #0eb3ff;
        }

        .main {
            /* 占满剩余空间 */
            flex: 1;
            background: #faaf0d;
        }
    </style>
</head>

<body>
    <div class="container">
        <aside class="aside"></aside>
        <div class="main"></div>
    </div>
</body>

</html>

我们会发现,代码非常简洁,思路非常清晰。运用flex我们可以很轻松地做出等高布局。效果如下:
在这里插入图片描述

2 三栏布局

和两栏布局一样,都有多种方法。

2.1 浮动方案
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>三栏布局</title>
    <style>
        .container {
            padding: 10px;
            border: 1px solid #000;
            overflow: hidden;
        }

        .left,
        .right {
            width: 200px;
            padding: 10px;
            background: rgb(123, 163, 250);
        }

        .left {
            float: left;
            margin-right: 20px;
        }

        .right {
            float: right;
            margin-left: 20px;
        }

        /* 注意处理中间板块的问题,文字之所以会避开浮动元素,是因为行级元素的特性 */
        .main {
            padding: 10px;
            border: 1px solid #000;
            overflow: hidden;
        }
    </style>
</head>

<body>
    <div class="container">
        <aside class="left">Lorem ipsum dolor sit amet consectetur adipisicing elit. Facere obcaecati, tempora
            repellendus explicabo quibusdam soluta quaerat, ducimus sed iste praesentium, quisquam placeat sunt dolores
            optio voluptatem fugiat eum laborum architecto?</aside>
        <aside class="right">Lorem ipsum dolor sit amet consectetur adipisicing elit. Facere obcaecati, tempora
            repellendus explicabo quibusdam soluta quaerat, ducimus sed iste praesentium, quisquam placeat sunt dolores
            optio voluptatem fugiat eum laborum architecto?Lorem ipsum dolor sit amet consectetur adipisicing elit.
        </aside>
        <div class="main">Lorem ipsum dolor sit amet consectetur adipisicing elit. Facere obcaecati, tempora repellendus
            explicabo quibusdam soluta quaerat, ducimus sed iste praesentium, quisquam placeat sunt dolores optio
            voluptatem fugiat eum laborum architecto?</div>
    </div>
</body>

</html>

主要思路:

  • 先写左右侧边栏,再写中间div
  • 让左右侧边栏分别浮动,这样两者就会浮动在两边
  • 注意处理中间div,看起来文字已经避开了浮动的侧边栏,实际上整个div还是占了一整行,因为行级元素本身就不会忽略浮动元素。所以我们应该给这个div创建BFC,以此达到避开浮动元素的效果。

效果如下:
在这里插入图片描述

2.2 方便搜索引擎抓取关键字方法

和两栏布局一样,三栏布局更是需要如此。思路基本和两栏布局1.2一样,代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>三栏布局</title>
    <style>
        .container{
            padding: 10px;
            border: 1px solid #000;
        }

        aside {
            position: absolute;
            background: royalblue;
        }

        .main {
            margin: 0 300px;
        }

        .left {
            width: 200px;
            left: 10px;
            top: 10px;
            margin-right: 20px;
        }

        .right {
            width: 200px;
            right: 10px;
            top: 10px;
            margin-left: 20px;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="main">Lorem ipsum dolor sit amet consectetur adipisicing elit. Praesentium neque distinctio pariatur
            ut, id excepturi debitis ea provident. Sequi nesciunt est voluptate commodi. Sint quo dignissimos, odit ut
            voluptatum aspernatur.Lorem ipsum dolor sit amet consectetur adipisicing elit. Praesentium neque distinctio pariatur
            ut, id excepturi debitis ea provident. Sequi nesciunt est voluptate commodi. Sint quo dignissimos, odit ut
        </div>
        <aside class="left">Lorem ipsum dolor sit amet consectetur adipisicing elit. </aside>
        <aside class="right">Lorem ipsum dolor sit, amet consectetur adipisicing elit. </aside>
    </div>
</body>

</html>
2.3 双飞翼布局VS圣杯布局

这两种布局是面试中常问的,解决问题都是实现三栏布局,思路基本一致,只不过在处理中间栏不被遮盖的方式上有所不同。

双飞翼布局
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>双飞翼布局</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .container div {
            height: 300px;
        }

        .main {
            float: left;
            width: 100%;
            background: rgb(52, 197, 216);
        }

        .left {
            float: left;
            margin-top: -300px;
            width: 200px;
            background: rgb(233, 229, 18);
        }

        .right {
            float: right;
            margin-top: -300px;
            width: 200px;
            background: rgb(211, 18, 236);
        }
        .bag{
            margin: 0 200px;
            background: rgb(52, 197, 216);
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="bag">
            <div class="main"></div>
        </div>
        <div class="left"></div>
        <div class="right"></div>
    </div>
</body>

</html>
圣杯布局
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>圣杯布局</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .container{
            padding: 0 200px;
        }

        .container div {
            float: left;
            height: 300px;
        }

        .main {
            width: 100%;
            background: rgb(52, 197, 216);
        }

        .left {
            position: relative;
            left: -200px;
            margin-left: -100%;
            width: 200px;
            background: rgb(233, 229, 18);
        }

        .right {
            position: relative;
            right: -200px;
            margin-left: -200px;
            width: 200px;
            background: rgb(211, 18, 236);
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="main"></div>
        <div class="left"></div>
        <div class="right"></div>
    </div>
</body>

</html>

圣杯布局采用的方式是主动为左右侧边栏留空间,即父元素设置左右padding;相反双飞翼布局,中间栏主动放弃争抢,独自占领div,设置左右margin。具体还是要具体体会,思想是一致的,但是不同人写的代码还是稍有不同。

3 居中
  • 运用定位

运用绝对定位,然后再让矩形中心移动到中点,代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        html {
            height: 100%;
        }

        .container {
            position: absolute;
            top: 50%;
            left: 50%;
            margin-left: -150px;
            margin-top: -150px;
            background: rgb(255, 187, 0);
            width: 300px;
            height: 300px;
        }
    </style>
</head>

<body>
    <div class="container"></div>
</body>

</html>

效果如下:
在这里插入图片描述

  • 运用弹性布局

运用flex,结合主轴侧轴居中,代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>flex居中</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        html{
            display: flex;
            /* 主轴 */
            justify-content: center;
            /* 侧轴 */
            align-items: center;
            height: 100%;
        }
        .main{
            display: flex;
            /* 主轴 */
            justify-content: center;
            /* 侧轴 */
            align-items: center;
            height: 500px;
            width: 500px;
            background: rgb(68, 228, 240);
        }
        .container {
            background: rgb(255, 88, 11);
            width: 100px;
            height: 100px;
        }
    </style>
</head>

<body>
    <div class="main">
        <div class="container"></div>
    </div>
</body>

</html>

效果如下:
在这里插入图片描述

  • 巧用line-height
<!DOCTYPE html>
<html lang="en">

<head>
    <title>运用line-height实现居中</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .div{
            width: 200px;
            height: 50px;
            color: #eee;
            font-weight: bold;
            text-align: center;
            line-height: 50px;
            background: rgb(49, 85, 248);
        }
    </style>
</head>

<body>
    <div class="div">测试文字居中</div>
</body>

</html>

效果如下:
在这里插入图片描述
如果想了解BFC的相关知识,可以参考https://blog.csdn.net/weixin_38207472/article/details/102646450

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值