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 tab标签页的制作
May 10 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
Nov 14 Javascript
jquery中的$(document).ready()使用小结
Feb 14 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 Javascript
JQuery在循环中绑定事件的问题详解
Jun 02 Javascript
jquery+html仿翻页相册功能
Dec 20 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
js cookie实现记住密码功能
Jan 17 Javascript
vue通过watch对input做字数限定的方法
Jul 13 Javascript
React Native 截屏组件的示例代码
Dec 06 Javascript
微信小程序图片加载失败时替换为默认图片的方法
Dec 09 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
Nov 03 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
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
微博短链接算法php版本实现代码
2012/09/15 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
python小技巧之批量抓取美女图片
2014/06/06 Python
python实现识别相似图片小结
2016/02/22 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
python中logging库的使用总结
2017/10/18 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
python实现批量命名照片
2020/06/18 Python
Python排序函数的使用方法详解
2020/12/11 Python
美国最受欢迎的童装品牌之一:The Children’s Place
2016/07/23 全球购物
自我鉴定范文200字
2013/10/02 职场文书
公司收款委托书范本
2014/09/20 职场文书
小学优秀学生评语
2014/12/29 职场文书
银行催款通知书
2015/04/17 职场文书
致青春观后感
2015/06/09 职场文书
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle