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切换功能的简单方法
Nov 23 Javascript
jscript读写二进制文件的方法
Apr 22 Javascript
基于jQuery实现美观且实用的倒计时实例代码
Dec 30 Javascript
jQuery实现调整表格单列顺序完整实例
Jun 20 Javascript
JS原型链 详解及示例代码
Sep 06 Javascript
Bootstrap响应式侧边栏改进版
Sep 17 Javascript
Javascript实现信息滚动效果
May 18 Javascript
详解vue跨组件通信的几种方法
Jun 15 Javascript
JS控制鼠标拒绝点击某一按钮的实例
Dec 29 Javascript
JavaScript创建对象方法实例小结
Sep 03 Javascript
基于Vue插入视频的2种方法小结
Apr 02 Javascript
使用Layui搭建后台管理界面的操作方法
Sep 20 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读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
微信小程序实现工作时间段选择
2019/02/15 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
VUEX-action可以修改state吗
2019/11/19 Javascript
Python fileinput模块使用介绍
2014/11/30 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
python3+PyQt5使用数据库表视图
2018/04/24 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
小学新学期寄语
2014/04/02 职场文书
团队精神口号
2014/06/06 职场文书
劳模事迹材料范文
2014/12/24 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
家长反馈意见及建议
2015/06/03 职场文书
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python