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 相关文章推荐
javascript中获取下个月一号,是星期几
Jun 01 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
Jul 07 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
Sep 01 Javascript
一个JavaScript获取元素当前高度的实例
Oct 29 Javascript
使用纯javascript实现放大镜效果
Mar 18 Javascript
JavaScript获取一个范围内日期的方法
Apr 24 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
BootStrap fileinput.js文件上传组件实例代码
Feb 20 Javascript
不使用 JS 匿名函数理由
Nov 17 Javascript
详解可以用在VS Code中的正则表达式小技巧
May 14 Javascript
JavaScript中callee和caller的区别与用法实例分析
Jun 28 Javascript
Vue封装全局过滤器Filters的步骤
Sep 16 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
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
nodejs实用示例 缩址还原
2010/12/28 NodeJs
Dom 结点创建 基础知识
2011/10/01 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
js单例模式的两种方案
2013/10/22 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
python正则表达式re模块详细介绍
2014/05/29 Python
Python中matplotlib中文乱码解决办法
2017/05/12 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
皮肤科医师岗位职责
2013/12/04 职场文书
八一建军节活动方案
2014/02/10 职场文书
小学运动会入场式解说词
2014/02/18 职场文书
环保公益策划方案
2014/08/15 职场文书
师德师风自我评价范文
2014/09/11 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
高三教师工作总结2015
2015/07/21 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技