面试必问:圣杯布局和双飞翼布局的区别


Posted in HTML / CSS onMay 13, 2021

前言

今天给大家分享一个圣杯布局和双飞翼布局及他们之间的区别,这两个三行布局一直是一些大厂前端面试的高频考点,带你走进大厂面试题,活不多说,冲冲冲~

布局效果

面试必问:圣杯布局和双飞翼布局的区别

面试必问:圣杯布局和双飞翼布局的区别

这两个种三行布局效果是一样的,实现的效果如上图示所示,其特点为:

  • header和footer的高度为整个浏览器的宽度
  • 中间是个三行布局,left和right的宽度是固定的。
  • 而middle的内容的宽度是自适应占满中间位置的,高度为三栏中的最大高度其实圣杯布局和双飞翼布局在前的处理是一样的,只不过是在中间处理的时候有些小差异而已啦。

前期处理

  • 为了避免出现问题我们先给body设置一个min-width:600px;
  • 再将header和footer的宽度设为100%(整个浏览器的页面),并添加背景色便于区分。
  • 在content中我们给left,right,midlle都添加float:left效果,设置left,right的宽高。
  • middle的宽度设置为100%,高度为与left,right的高度相同,同样为了便于看效果我们这里也给它们一个背景色。
  • 这里有个需要注意的地方,我们还应该给content设置一个高度,content中的div我们添加了float:left属性,因此他们都脱离了文本流,导致出现了高度塌陷。
     

(ps:我这里是在content中添加了一个overflow: hidden,形成一个BFC区域来解决这个问题的,感兴趣的小伙伴可以自行了解,当然你不这样做设置content的高度就行啦)

*{
    margin: 0;
    padding: 0;
}
body{
    min-width: 600px;
}
#header,#footer{
    height: 50px;
    width: 100%;
    background: grey;
}
#middle,#left,#right{
    float: left;
}
#content{
    overflow: hidden;
}
#left,#right{
    width: 200px;
    height: 200px;
    background: pink;
}
#middle{
    width: 100%;
    height: 200px;
    background: yellowgreen; 
}

面试必问:圣杯布局和双飞翼布局的区别

我们发现现在的页面是这样子的,那这怎么回事呢?

答案很简单,left,right,middle本来应该是在一条直线上的,但是content的宽度不够,就把left,right两个盒子挤下来啦。

那现在我们分别来看看这两种布局接下来解决这个问的方法吧:

圣杯布局

我们先给content设置一个padding:0 200px,将左右两边各腾出200px宽度。
接下来我们只需要将left,right,两个盒子放在两个区域就行啦。
最后分别给left,left设置margin属性调整位置。

#content{
    overflow: hidden;
    padding: 0 200px;
}
#left{
    margin-left:-100% ;

} 
#right{
    margin-left: -200px;

我们再来看一下效果

面试必问:圣杯布局和双飞翼布局的区别

当当当,见证奇迹的时候到啦~

面试必问:圣杯布局和双飞翼布局的区别

双飞翼布局

那我们看看双飞翼布局是怎么解决这个问题的呢。来往下看

双飞翼布局是在middle下添加了一个middle-inner盒子,将middle的内容放在这个盒子里面(这有什么用呢?不着急咱先往下看)。
我们和圣杯布局中一样也给float,left设置margin值调整位置。
但是此布局就不需要给left,right设置定位啦。

#left{
    float: left;
    margin-left: -100%;
}
#right{
    float: left;
    margin-left: -200px;
}
.middle-inner{
    padding: 0 200px;
}

面试必问:圣杯布局和双飞翼布局的区别

这时我们发现middle中的内容不见了,此时我们之前在midlle里面添加的midlle-inner盒子就派上用场啦,此时只需要给这个盒子设置一个margin:0 200px,那么我们的内容是不是来到中间展示了呢。

.middle-inner{
    margin: 0 200px;
}

看效果

面试必问:圣杯布局和双飞翼布局的区别

和我们预期的一样,大厂面试题不过如此嘛,收工收工!!!!

总结一下

最后我们来总结一下,双飞翼布局其实和圣杯布局的精髓是一样的,都是通过设置负margin来实现元素的排布。

  • 不同的就是html结构,双飞翼是在middle元素内部又设置了一个milddle-inner并设置它的左右margin,而非圣杯布局的padding,来排除两边元素的覆盖。
  • 双飞翼布局可以多了一个html结构,但是可以不用设置left,right元素的定位。

下面给一下完整代码:

圣杯布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="wrap">
        <div id="header">header</div>
        <div id="content">
            <div id="middle">
                middle
            </div>
            <div id="left">left</div>         
            <div id="right">right</div>
        </div>
        <div id="footer">footer</div>
    </div>
</body>
</html>
*{
    margin: 0;
    padding: 0;
}
body{
    min-width: 600px;
}
#header,#footer{
    height: 50px;
    width: 100%;
    background: grey;
}
#middle,#left,#right{
    float: left;
}
#content{
    overflow: hidden;
    padding: 0 200px;
}
#left,#right{
    width: 200px;
    height: 200px;
    background: pink;
}
#middle{
    width: 100%;
    height: 200px;
    background: yellowgreen; 
}
 #left{
    margin-left:-100% ;
    position: relative;
    left:-200px;
} 
#right{
    margin-left: -200px;
    position: relative;
    left:200px; 
}

双飞翼布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="wrap">
        <div id="header">header</div>
        <div id="content">
            <div id="middle">
                <div class="middle-inner">
                    middle
                </div>
            </div>
            <div id="left">left</div>         
            <div id="right">right</div>
        </div>
        <div id="footer">footer</div>
    </div>
</body>
</html>
*{
    margin: 0;
    padding: 0;
}
.wrap{
    min-width: 600px;
}
#header,#footer{
    height: 50px;
    width: 100%;
    background:grey;
}
#left,#right{
    width: 200px;
    height: 200px;
    background: green;
}

#middle{
    background: pink;
    width: 100%;
    float: left;
    height:200px;
}
#content{
    overflow: hidden;
}
#left{
    float: left;
    margin-left: -100%;
}
#right{
    float: left;
    margin-left: -200px;
}
.middle-inner{
    margin: 0 200px;
}

到此这篇关于面试必问:圣杯布局和双飞翼布局的区别的文章就介绍到这了,更多相关圣杯布局和双飞翼布局区别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
HTML5如何适配 iPhone IOS 底部黑条
Mar 09 HTML / CSS
css3圆角边框和边框阴影示例
May 05 HTML / CSS
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
Sep 02 HTML / CSS
基于css3的属性transition制作菜单导航效果
Sep 01 HTML / CSS
使用CSS3实现多列布局与多背景的技巧
Feb 29 HTML / CSS
前端隐藏出边界内容的实现方法
Apr 14 HTML / CSS
css3 实现滚动条美化效果的实例代码
Jan 06 HTML / CSS
HTML5 微格式和相关的属性名称
Feb 10 HTML / CSS
基于HTML5 Canvas:字符串,路径,背景,图片的详解
May 09 HTML / CSS
使用HTML5拍照示例代码
Aug 06 HTML / CSS
多视角3D可旋转的HTML5 Logo动画
Mar 02 HTML / CSS
Html5实现文件异步上传功能
May 19 HTML / CSS
HTML5简单实现添加背景音乐的几种方法
May 12 #HTML / CSS
CSS 实现多彩、智能的阴影效果
解析CSS 提取图片主题色功能(小技巧)
为什么你写的height:100%不起作用
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
May 10 #HTML / CSS
background-position百分比原理详解
不要在HTML中滥用div
You might like
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
How do I change MySQL timezone?
2008/03/26 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
vue之父子组件间通信实例讲解(props、$ref、$emit)
2018/05/22 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
Python自动重试HTTP连接装饰器
2015/04/28 Python
Python实现简单截取中文字符串的方法
2015/06/15 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
python脚本后台执行方式
2019/12/21 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
主管职责范文
2013/11/09 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
sql字段解析器的实现示例
2021/06/23 SQL Server