美文网首页
向左走,向右走:两种不同的圣杯布局实现

向左走,向右走:两种不同的圣杯布局实现

作者: 晴天小雨不感冒 | 来源:发表于2020-06-23 22:50 被阅读0次

圣杯布局是一种比较经典的布局方案。目前各大商城首页都采取该布局方案。目前有两种实现方式比较流行,分别是传统的css+div的布局方案以及由css3的flex特性实现的更简洁的布局方案。两种方案各有优缺点,那么,让我们看看具体的实现吧。

传统的css+div实现方式

传统模式的基本原理为:利用容器元素的padding偏移和子元素的浮动和margin偏移特性实现圣杯布局。代码如下:

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #container {
            padding-left: 200px;/*设置容器内边距的左侧偏移量,为左侧边栏腾出显示空间,大小和左侧边栏宽度一致。*/
            padding-right: 150px;/*设置容器内边距的右侧偏移量,为右侧边栏腾出显示空间,大小和左侧边栏宽度一致。*/
        }

        #container .column {
            float: left;/*容器的所有子元素都进行左浮动*/
            height: 400px;
        }
        #header {
            background-color: grey;
        }

        #center {
            width: 100%;/*主内容区,为相对大小,会根据屏幕宽度自动调整自身大小*/
            background-color: green;
        }

        #left {
            width: 200px;
            margin-left: -100%;/*浮动之后,向左偏移整个父容器宽度的长度,这样使left能够越过center,排在center前面*/
            position: relative;
            right: 200px;/*相对父容器右移自身长度,占据父容器腾出的左侧边栏空间*/
            background-color: red;
        }

        #right {
            width: 150px;
            margin-right: -150px;/*向左移动自身长度,占据父容器腾出的右侧边栏空间*/
            background-color: yellow;
        }

        #footer {
            clear: both;/*清除浮动影响*/
            background-color: grey;
        }
    </style>
</head>

<body>
    <div id="header">header</div>
    <div id="container">
        <div id="center" class="column">content</div>
        <div id="left" class="column">left</div>
        <div id="right" class="column">right</div>
    </div>
    <div id="footer">footer</div>

</body>

</html>

关于圣杯布局有以下细节需要注意:center元素必须排在left和right之前。原因在于center元素为主内容区。由于通常的商城首页需要加载的内容都比较多,我们希望在网络较为极端的情况下,优先显示主内容区。

基于Flex弹性布局的圣杯布局

弹性布局由于其特性,在实现圣杯布局是非常简单,代码可读性更好。代码如下:

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #container {
            display: flex;/*设置弹性布局容器*/
        }
        #header, #footer {
            background-color: grey;
        }

        #center {
            flex: 1;/*设置弹性伸缩比,1表示1:1的伸缩比*/
            background-color: red;
            height: 400px;
        }

        #left {
            flex: 0 0 300px;/*前两个参数设置元素为不能伸缩,后一个参数设置一个固定的初始值*/
            order: -1;/*元素排序向左移动一位,排在center前面*/
            height: 400px;
            background-color: yellow;
        }

        #right {
            flex: 0 0 200px;/*前两个参数设置元素为不能伸缩,后一个参数设置一个固定的初始值*/
            height: 400px;
            background-color: green;
        }
    </style>
</head>

<body>
    <div id="header">header</div>
    <div id="container">
        <div id="center">center</div>
        <div id="left">left</div>
        <div id="right">right</div>
    </div>
    <div id="footer">footer</div>

</body>

</html>

以上的注释行是关键代码。需要注意的细节是,left元素的oder:-1属性实现元素排序往左移动一位,以达到元素在center渲染完之后渲染,却显示在center元素之前的效果。该效果在极端网络条件下就能体现出来。

两种方式的优缺点

可以看到,传统的圣杯布局采用的是css+div的布局方式,在实现细节上主要利于padding,margin,float等一些偏移属性。这些属性是非常常规的属性,在各浏览器的表现都非常一致,因此这种方式的兼容性非常好。在不同内核的浏览器之间,以及桌面和移动设备的表现上都非常一致。即使在IE6,IE5这样的古老浏览器上也能完美的呈现效果。缺点是代码可读性不太好,它采用了一些不太常规的偏移操作,容易让人产生困惑。
flex的实现方式可读性好,代码简单。但是,flex是css3.0的新特性。对于移动端来说,各大浏览器基本都支持css3.0,但是桌面环境就比较复杂。仍然有一些老项目运行在IE6上,这样就会造成兼容性问题。那么比较推荐的做法是:如果项目只针对移动端,就采用flex布局,如果桌面端和移动端都要兼顾,就采用传统布局。由于弹性布局是css的新特性,下面我们来看一下弹性布局给我们提供了哪些操作空间。

弹性布局

弹性布局依赖主轴和交叉。我们一般地可以将主轴和交叉轴比作x轴和y轴,但如果项目需要,我们也可以将主轴设置为纵轴,这样主轴就相当于y轴,而交叉轴就相当于x轴了。或许另一种比喻更为恰当,将主轴视为布局轴,交叉轴视为对齐轴。即主轴表示元素的排列方向,交叉轴表示元素的对齐方向。关于弹性布局,它包括容器属性和项目属性,一共12个属性。其中容器属性作用于容器中的所有项目,起到一个整体布局的作用,项目属性作用于容器中具体的子元素,起到一个细节调整的作用。掌握这些属性的用法,就掌握了弹性布局。
容器属性如下:

flex-direction  /*设置主轴方向,可以设置横向和纵向,默认为横向*/
flex-wrap       /*设置当主轴方向空间不足时,是否换行*/
flex-flow       /*flex-direction,flex-wrap的简写形式*/
justify-content/*设置主轴对齐方式,取值范围:flex-start | flex-end | center | space-between | space-around*/
align-items     /*交叉轴对齐方式,取值范围:flex-start | flex-end | center | baseline | stretch*/
align-content   /*主轴间的对齐方式,取值范围:lex-start | flex-end | center | baseline | stretch*/

项目属性如下:

order       //元素在容器中的排列顺序,越小越靠前,默认为0
flex-grow   //元素在容器中的放大比例,在没有剩余空间或设置为的情况下,不放大。默认值为0
flex-shrink //元素在容器中的缩小比例,当空间不足时,元素将等比缩小,默认为1,如果设置为0,则不缩小
flex-basis  //设置一个固定空间,浏览器根据固定空间可以计算出剩余空间,默认值为auto
flex        //flex-grow,flex-shrink,flex-basis的简写模式
align-self  //单独定义自身的对齐方式,覆盖容器的align-items属性

好了,就到这里吧,希望你有所收获。晚安。。。

相关文章

  • 向左走,向右走:两种不同的圣杯布局实现

    圣杯布局是一种比较经典的布局方案。目前各大商城首页都采取该布局方案。目前有两种实现方式比较流行,分别是传统的css...

  • 三种实现圣杯布局方法

    本文介绍三种实现圣杯布局的方法,前两种可归为一类,与第三种方法差别在于加载顺序不同。 圣杯布局实现1: 步骤1:给...

  • css之圣杯布局

    昨天面试的时候被问到圣杯布局,之前知道怎么实现三栏布局,但是突然问到圣杯布局,当时我就凭着感觉说了两种方法,因为之...

  • 注定

    向左走,向右走 在地球的另一端 相遇 而后 向左走,向右走

  • 2019-1-2

    学习圣杯和双飞翼布局 圣杯和双飞翼布局即是可以实现三栏中两端宽度固定,中间宽度自适应布局效果的两种方式的叫法。下面...

  • 入门任务11

    1、实现一个单栏布局 单栏布局 2、实现一个三栏布局 三栏布局 3、实现一个圣杯布局 圣杯布局为什么?.main{...

  • 向左走,向右走——新蕾教室第一次生活调查记录

    向左走,向右走 ...

  • CSS Flex实现各种布局

    实现两栏布局 实现栅格布局 实现三栏布局 附录 双飞翼布局 圣杯布局

  • 圣杯布局&双飞翼布局

    实现一个圣杯布局 圣杯布局是为了讨论 三栏液态布局的实现 有几点要求 上部(header)和下部(footer)各...

  • 圣杯布局和双飞翼布局

    1、双飞翼 2、flex实现圣杯 3、圣杯布局

网友评论

      本文标题:向左走,向右走:两种不同的圣杯布局实现

      本文链接:https://www.haomeiwen.com/subject/towkfktx.html