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 相关文章推荐
Jquery事件的连接使用示例
Jun 18 Javascript
提取字符串中年月日的函数代码
Nov 05 Javascript
Javascript中3个需要注意的运算符
Apr 02 Javascript
javascript实现完美拖拽效果
May 06 Javascript
把Node.js程序加入服务实现随机启动
Jun 25 Javascript
第一次记录Bootstrap table学习笔记(1)
May 18 Javascript
javascript实现最长公共子序列实例代码
Feb 05 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
Mar 24 Javascript
Angular 封装并发布组件的方法示例
Apr 19 Javascript
elementUI select组件value值注意事项详解
May 29 Javascript
React+EggJs实现断点续传的示例代码
Jul 07 Javascript
JavaScript获取URL参数的方法分享
Apr 07 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 array_push 数组函数
2009/12/26 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
php利用递归实现删除文件目录的方法
2016/09/23 PHP
潜说js对象和数组
2011/05/25 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
2017/06/19 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
详解python3实现的web端json通信协议
2016/12/29 Python
Python subprocess模块详细解读
2018/01/29 Python
Python函数参数操作详解
2018/08/03 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
新闻发布会策划方案
2014/06/12 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
公司授权委托书范文
2014/08/02 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
授权委托书公证
2014/09/14 职场文书
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
js前端图片加载异常兜底方案
2022/06/21 Javascript