CSS3开发常用核心技能

基础网页布局

布局分类

  • 一列布局
  • 两列布局
  • 三列布局
  • 多列布局

一列布局:

二列布局:

三列布局:

<div class="container">
    <div class="header">我是header</div>
    <div class="content">
        <div class="left">左</div>
        <div class="right">右</div>
        <div class="middle">中间</div>
    </div>
    <div class="footer">我是footer</div>
</div>
        .content {
            min-height: 500px;
            height: auto;
            background-color: orange;
        }
        .content .left {
            float: left;
            width: 20%;
            height: 500px;
            background-color: orangered;
        }
        .container .right {
            float: right;
            width: 20%;
            height: 500px;
            background-color: yellow;
        }
        .container .middle {
            height: 500px;
            background-color: yellowgreen;
        }

⚠️ middle 写再最后,由于上面左右 div 是浮动的,所以 middle 就会浮上去;如果 middle 想先渲染出来,放到最开始,由于它是 block 块级元素,左右就会被挤下去;怎么办呢?下面就要使用到圣杯布局了。

将左右的背景颜色取消掉,你会发现左右是叠在 middle 上,这个时候middle 实际占比是100%,然后根据左右的的占比,自动计算出内容显示占比。

圣杯布局

圣杯布局的出现是为了解决:老套的布局必须按照源顺序(在 DOM 中表现为先写 Left,然后 Middle,最后,Right)等,它将可能导致代码不够灵活,尤其是从 DOM 的载入顺序上来说,中间的内容不能被首先加载。

圣杯布局实现套路

  • 两边带有固定宽度中间可以流动(fluid);
  • 允许中间一栏最先出现;
  • 允许任意一栏放在最上面;
  • 仅需一个额外的 div 标签; (最外层加一个div 容器包裹)
  • 仅需非常简单的 CSS,带上最少的兼容性补丁

利用上面的代码,将 Middle 放到第一位:

    <div class="content">
        <!-- 主要内容先渲染 -->
        <div class="middle">中间</div>
        <div class="left">左</div>
        <div class="right">右</div>
    </div>

呈现效果:

想让左边的移动上来, 也给 middle float 属性,然后再让left 左外边距 -100%;

    .content {
        min-height: 500px;
        height: auto;
        background-color: orange;
    }
    .content .left {
        float: left;
        width: 150px;
        height: 500px;
        background-color: orangered;
    }
    .container .right {
        float: right;
        width: 150px;
        height: 500px;
        background-color: yellow;
    }
    .container .middle {
        float: left;
        width: 100%;
        height: 500px;
        background-color: yellowgreen;
    }

理解下 margin-left , 设置与元素相关联的盒子模型的左外边距;

margin-left: 10px;  /* 绝对长度 */
margin-left: 1em;   /* 相对于字号的长度 */
margin-left: 5%;    /* 相对最近块元素的宽度 */

右也改造下

        .container .right {
            float: left;
            width: 150px;
            height: 500px;
            background-color: yellow;
            margin-left: -150px; 
        }

到这里是不是基本圣杯布局雏形就出来了,让人不省心的就是中间内容被被盖了, 怎么办呢?

让最外部的父级容器承担左右栏的距离好让中间内容显示出来,这个就上面说的多加一个 div 的意思了。

image.png

通过 position 相对自己进行移动去填补预留空间

        .content .left {
            position: relative;
            left: -150px;
            float: left;
            width: 150px;
            height: 500px;
            margin-left: -100%;
            background-color: orangered;
        }
        .container .right {
            position: relative;
            left: 150px;
            float: left;
            width: 150px;
            height: 500px;
            background-color: yellow;
            margin-left: -150px;
        }

圣杯布局,你学会了没有~

双飞翼布局 + CSS HACK

双飞翼布局由早期圣杯布局演变而来,始创于淘宝UED,双飞翼布局由左中右三栏组合,如同一只鸟(左翼、身体、右翼)所以称为双飞翼布局。

圣杯布局和双飞翼布局解决的问题是一样的,就是两边顶宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。

圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,也就是三栏全部float浮动,但左右两栏加上负margin让其跟中间栏div并排,以形成三栏布局。

不同在于解决"中间栏div内容不被遮挡"问题的思路不一样:

  • 圣杯布局,为了中间div内容不被遮挡,将中间div设置了左右padding-left和padding-right后,将左右两个div用相对布局position:relative并分别配合right和left属性,以便左右两栏div移动后不遮挡中间div

  • 双飞翼布局,为了中间div内容不被遮挡,直接在中间div内部创建子div用于放置内容,在该子div里用margin-left和margin-right为左右两栏div留出位置。多了1个div,少用大致4个css属性(圣杯布局中间div的padding-left和padding-right这2个属性,加上左右两个div用相对布局position:relative及对应的right和left共4个属性,一共6个:而双飞翼布局子div里用margin-left和margin-right共2个属性,6-2=4)。

简单说起来就是双飞翼布局比圣杯布局多创建了一个div,但不用相对布局了

其中使用

  • position
  • float
  • 负边距
  • 登高
  • 盒子模型
  • 清除浮动
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,629评论 1 92
  • 一、负边距在让元素产生偏移时和position: relative有什么区别? 负margin和position:...
    婷楼沐熙阅读 801评论 0 4
  • 三栏式布局 涉及浮动和清除浮动,主要讲解“圣杯”和“双飞翼”两种解决方法。这两种方法实现的都是三栏布局,两边的盒子...
    紫电倚青霜阅读 2,359评论 0 6
  • 收听音频,戳链接,旧号itclan已暂停使用,欢迎关注微信itclanCoder公众号可收听更多音频 前言 关于网...
    itclanCoder阅读 8,097评论 3 30
  • 前言 温馨提示:本文较长,图片较多,本来是想写一篇 CSS 布局方式的,但是奈何 CSS 布局方式种类太多并且实现...
    sunshine小小倩阅读 3,009评论 0 59