JavaScript圣杯布局与双飞翼布局实现案例详解


Posted in Javascript onAugust 05, 2022

一、圣杯布局和双飞翼布局的功能介绍

  • 圣杯布局和双飞翼布局是三栏布局中的两种布局方式,他们实现的效果是相同的,区别就是实现方法。
  • header和footer各自占领屏幕所有宽度,高度固定;
  • 中间的outer是一个三栏布局;
  • 三栏布局中left和right不变,center填充其他地方;
  • 中间部分的高度是三栏中最高的区域的高度。

JavaScript圣杯布局与双飞翼布局实现案例详解

二、圣杯布局

高度如何自适应屏幕高度

  • 其实这个并不是圣杯布局中的要求,圣杯布局是可以指定高度的,但是可以作为一个思考;
  • 方法就是使用flex布局,将主轴设置为纵轴,再将outer的flex设为1,意思就是填充多余空白,即可达到自适应屏幕高度的效果。
body{
    display: flex;
    width: 100%;
    height: 100%;
    flex-direction: column;
}
.header{
    background-color:grey;
    height: 50px;
}
.footer{
    background-color:grey;
    height: 50px;
}
.outer{
    flex:1;
}

圣杯布局思路

  • 将center盒子写在最前面,保证center盒子最先渲染;
  • 给outer盒子指定padding-left 和 padding-right值,留出left和right的位置;
  • 三个盒子都设置float:left,这时left和right就会被挤到下一行;
  • left设置margin-left:-100%;相对定位+left:-left的宽度;right设置margin-left=-right的宽度;相对定位+right:-right的宽度即可将两个盒子归位。

圣杯布局代码

<style>
  * {
      padding: 0;
      margin: 0;
      text-align: center;
  }
  html{
      height: 100%;
  }
  body{
      display: flex;
      flex-direction: column;
      height: 100%;;
  }
  .header{
      width: 100%;
      height: 50px;
      background-color:dimgray;
  }
  .footer{
      width: 100%;
      height: 50px;
      background-color:dimgray;
  }
  .outer{
      flex:1;
      padding-left: 100px;
      padding-right: 200px;
  }
  .center{
      float: left;
      background-color: darkslateblue;
      height: 100%;
      width: 100%;
  }
  .left{
      float: left;
      width: 100px;
      margin-left: -100%;
      background-color: burlywood;
      height: 100%;
      position: relative;
      left: -100px;
  }
  .right{
      float: left;
      width: 200px;
      margin-left: -200px;
      height: 100%;
      position: relative;
      right: -200px;
      background-color: cyan;
  }
</style>
<body>
    <div class="header">header</div>
    <div class="outer">
        <div class="center">center</div>
        <div class="left">left</div>
        <div class="right">right</div>
    </div>
    <div class="footer">footer</div>
</body>

三、双飞翼布局

双飞翼布局的思路

  • 给三个盒子都设置为左浮动;
  • center的宽度设为100%;
  • left设置margin-left:-100%;right设置margin-left=-right的宽度即可将两个盒子归位,但是将center的两端挡住了;
  • 在center盒子中再写一个content盒子,设置margin-left和margin-right为两侧的宽度,content盒子作为内容。

双飞翼布局的代码

<style>
    *{
        padding: 0;
        margin: 0;
    }
    html{
        width: 100%;
        height: 100%;
        text-align: center;
    }
    body{
        display: flex;
        width: 100%;
        height: 100%;
        flex-direction: column;
    }
    .header{
        background-color:grey;
        height: 50px;
    }
    .footer{
        background-color:grey;
        height: 50px;
    }
    .outer{
        flex:1;
    }
    .center{
        float: left;
        width: 100%;
        background-color: darkslateblue;
        height: 100%;
    }
    .left{
        float: left;
        margin-left: -100%;
        width: 100px;
        background-color: burlywood;
        height: 100%;
    }
    .right{
        float: left;
        width: 200px;
        background-color: cyan;
        margin-left: -200px;
        height: 100%;
    }
    .content{
        margin-left: 100px;
        margin-right: 200px;
        height: 100%;
    }
</style>
<body>
    <div class="header">header</div>
    <div class="outer">
        <div class="center">
            <div class="content">content</div>
        </div>
        <div class="left">left</div>
        <div class="right">right</div>
    </div>
    <div class="footer">footer</div>
</body>

圣杯布局和双飞翼布局的区别

  • 圣杯布局是利用padding将中间部分留出,再利用定位、margin的方式将左右盒子归位,因此不需要外层div;
  • 双飞翼布局是先设置中间盒子的宽度为100%,再用margin移动左右盒子覆盖了中间盒子的两侧,再将outer中间加入一个盒子,留出两侧的margin值,达到三栏布局的效果。

四、圣杯布局和双飞翼布局面试问题

回答:圣杯布局和双飞翼布局都可以实现三栏布局,即两侧宽度固定,中间自适应的效果。圣杯布局是先用padding将中间内容留出,再定位左右盒子到相应位置;而双飞翼布局首先将中间盒子的宽度设为了100%,在定位左右盒子的时候会覆盖中间盒子的两端,这样就需要在中间盒子中在定义一个盒子,并留出margin的两侧值。两种布局都需要把center盒子写在left和right前面,为了最先渲染。

到此这篇关于JavaScript圣杯布局与双飞翼布局实现案例详解的文章就介绍到这了,更多相关JS圣杯布局与双飞翼布局内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js实现ASP分页函数 HTML分页函数
Sep 22 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
May 15 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
Aug 10 Javascript
AngularJS 指令详细介绍
Jul 27 Javascript
jQuery仿IOS弹出框插件
Feb 18 Javascript
jQuery点击头像上传并预览图片
Feb 23 Javascript
整理一些最近经常遇到的前端面试题
Apr 25 Javascript
vue2.0实现分页组件的实例代码
Jun 22 Javascript
ReactNative Image组件使用详解
Aug 07 Javascript
实例解析Vue.js下载方式及基本概念
May 11 Javascript
vue-cli3中vue.config.js配置教程详解
May 29 Javascript
Javascript之datagrid查询详解
Sep 15 Javascript
react中useState使用:如何实现在当前表格直接更改数据
Aug 05 #Javascript
pnpm对npm及yarn降维打击详解
Aug 05 #Javascript
JS前端可视化canvas动画原理及其推导实现
Aug 05 #Javascript
JS前端使用canvas实现扩展物体类和事件派发
Aug 05 #Javascript
JS前端canvas交互实现拖拽旋转及缩放示例
Aug 05 #Javascript
canvas 中如何实现物体的框选
Aug 05 #Javascript
JS前端使用canvas实现物体的点选示例
Aug 05 #Javascript
You might like
How do I change MySQL timezone?
2008/03/26 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
php字符串截取函数用法分析
2014/11/25 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
javascript 短路法代码精简
2009/08/20 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
vue给组件传递不同的值方法
2018/09/29 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
python实现代码行数统计示例分享
2014/02/10 Python
Python中的自定义函数学习笔记
2014/09/23 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
用python与文件进行交互的方法
2018/03/01 Python
python奇偶行分开存储实现代码
2018/03/19 Python
python 实现登录网页的操作方法
2018/05/11 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
公司捐款倡议书
2014/05/14 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
mysql如何查询连续记录
2022/05/11 MySQL