美文网首页
前端经典网页布局的实现方案你了解多少?

前端经典网页布局的实现方案你了解多少?

作者: 半截短袖 | 来源:发表于2023-08-15 16:10 被阅读0次

前端开发,离不开日常的网页结构布局,现下有很多第三方的组件库,也自带着很多布局的方案,例如Ant Design中就拥有一套自己的Grid 24栅格系统Layout布局,方便我们进行网页排版。

接下来,我们从前端技术角度上,去分析一下3种经典布局的实现方案。

首先,我们列出一些比较常规的布局:

  • 圣杯布局
  • 双飞翼布局
  • 多列等分布局

1. 圣杯布局

圣杯布局: 左右两栏的宽度固定不变,中间那一栏宽度自适应,且中间盒子的内容优先渲染。

最早的圣杯布局的实现方案是:利用浮动和负边距来实现。

父级元素设置左右的 padding,三列均设置向左浮动,中间一列放在最前面,宽度设置为父级元素的宽度,因此后面两列都被挤到了下一行,通过设置 margin 负值将其移动到上一行,再利用相对定位,定位到两边。

圣杯布局的优缺点:

  • 优点:不需要额外的DOM结构,中间栏放在文档流前面是优先渲染
  • 缺点:特殊情况下,当中间盒子宽度小于左盒子的时候 就会发生布局混乱

我们可以通过3种技术方案来实现圣杯布局的布局效果,分别是floatfloat优化Flex

实现代码:

HTML结构:

<div class="main">
    <!--   如果是圣杯布局的原始方案,此处的center盒子要放在最前面 -->
  <div class="center"></div>
   <div class="left"></div>
  <div class="right"></div>
</div>
  • 实现方案1:float+position+负边距
.main {
    height: 200px;
    /* 外层大盒子设置左右的padding,给两侧小盒子预留出位置 */
    padding: 0 200px;
}
.center, .left, .right {
    /* 三个盒子统一左浮动 */
    float: left;
}

/* 注意,在HTML结构中,center盒子一定要位于left和right盒子之前 */
.center {
    /* 中间盒子占据父盒子宽度的100% */
    width: 100%;
    height: 100%;
    background: lightgreen;           
}

.left {
    width: 200px;
    height: 100%;
    background: lightseagreen;

    /* left被center盒子挤到了下方,设置margin负值会让三个盒子在一行上显示 */
    margin-left: -100%;

    /* 通过定位负值让left盒子位于main盒子预留出的padding的位置 */
    position: relative;
    left: -200px;
}

.right {
    width: 200px;
    height: 100%;
    background: lightskyblue;
    /* right被center盒子挤到了下方,设置margin负值会让三个盒子在一行上显示 */
    margin-left: -200px;

    /* 通过定位负值让right盒子位于main盒子预留出的padding的位置 */
    position: relative;
    right: -200px; 
}
  • 实现方案2:float优化
.main {
    width: 100%;
    height: 100px;
}

.left {
    width: 200px;
    height: 100%;
    background: lightcoral;
    /*  左盒子左浮动  */
    float: left;
}

.right {
    width: 200px;
    height: 100%;
    background: lightgreen;
    /* 右盒子右浮动 */
    float: right;
}

.center {
    height: 100%;
    background: lightsalmon;
    /* 中间盒子左浮动 */
    float: left;
    /* 中间盒子使用css的calc()去自动计算宽度,思想为:父盒子宽度100% - (左盒子 + 右盒子) */
    /* 注意:如果网页中在意极致加载速度等优化效率时,尽量不要大量使用calc()函数  */
    width: calc(100% - 400px);
}
  • 实现方案3:Flex
.main {
    width: 100%;
    height: 100px;
    /*  父盒子转为flex弹性盒子  */
    display: flex;
    /*  子元素居中  */
    justify-content: center;
    align-items: center;
}

.left {
    width: 200px;
    height: 100%;
    background: lightcoral;
}

.right {
    width: 200px;
    height: 100%;
    background: lightgreen;
}

.center {
    height: 100%;
    background: lightsalmon;
    /*  中间盒子占据剩下的全部空间  */
    flex: 1;
}

当然,实现圣杯布局的效果,还可以使用其它的方案,比如Grid布局方式,只要能够实现其圣杯布局的效果,用什么方式均可以。


2. 双飞翼布局

概念:双飞翼布局最早是淘宝团队提出的,是针对圣杯局部优化的解决方案。主要是优化了圣杯布局中开启定位的问题

双飞翼布局的实现,本质上也是利用了浮动和外边距负值的思想

双飞翼布局与圣杯布局的不同之处在于,圣杯布局的左中右三列容器,中间center盒子多了一个子容器,通过控制center中子容器的margin空出左右两列的宽度。

<body>
  <div class="main">
    <div class="center">
      <div class="inner"></div>
    </div>
    <div class="left"></div>
    <div class="right"></div>
  </div>
</body>
.main {
    height: 200px;
}

.center,
.left,
.right {
    /* 三个盒子统一左浮动 */
    float: left;
}

.center {
    /* 中间大盒子占据父盒子宽度的100% */
    width: 100%;
    height: 100%;
    background: lightgreen;
}

.center .inner {
    height: 100%;
    /* 预留出左右两个盒子的空间 */
    margin: 0 200px;
    background: lightcoral;
}

.left {
    width: 200px;
    height: 100%;
    background: lightseagreen;

    /* left被center盒子挤到了下方,设置margin负值会让三个盒子在一行上显示 */
    margin-left: -100%;
}

.right {
    width: 200px;
    height: 100%;
    background: lightskyblue;
    /* right被center盒子挤到了下方,设置margin负值会让三个盒子在一行上显示 */
    margin-left: -200px;
}

3. Flex实现多列等分布局

关键点:列数可自由控制(无固定宽度)

 <div class="main">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>
.main {
    width: 100%;
    display: flex;
    /* 设置换行 */
    flex-wrap: wrap;
    /* 用来设置网格行与列之间的间隙,是row-gap(行间隙)和column-gap(列间隙)的简写形式 */
    gap: 20px;
}
.main .item {
    height: 200px;
    /* 关键点在于子盒子宽度的计算上 */
    /* flex: 0 0 calc((父元素宽度 - 列之间的宽度*(列数-1)) / 列数); */
    flex: 0 0 calc((100% - 20px * 3) / 4);
    background: lightskyblue;
}

以上3中布局,是我们开发中经常见到的布局方式,每种布局方式,都不仅限于一种技术来实现,可以是FloatPosition,也可以是Flex,还可以是Grid,甚至有的开发者对Boostrap很熟悉,也是一种实现方式。

个人认为,每种技术方案的使用,都有其优缺点,或考虑兼容性,或考虑性能,选择适合当下项目的内容,适当做取舍,才是最关键的。

关注我,下期我们一起探讨GridFlex的不同之处。

相关文章

  • Flex 布局

    Flex 布局,可以简便,完整,响应式的实现各种页面布局 网页布局是CSS中一个重点应用,传统的解决方案是基于盒模...

  • 向左走,向右走:两种不同的圣杯布局实现

    圣杯布局是一种比较经典的布局方案。目前各大商城首页都采取该布局方案。目前有两种实现方式比较流行,分别是传统的css...

  • 《Keylines》为网页元素添加随机描边颜色

    Keylines是一款为网页dom元素, 添加随机颜色描边的扩展程序, 可以让前端工程师快速了解网页布局, 提升开...

  • 用CSS实现布局(两栏布局,多栏布局)

    在网页上的布局比较经典的是两栏布局和三栏布局。下面简单总结自己对这两种布局的实现过程。 两栏布局 两栏布局是主内容...

  • 网页布局方案

    FlexBox弹性布局 将标签元素的display设置为flex,基于Webkit浏览器设置为 -Webkit-flex

  • 总体计划 -- Whatever It Takes

    1 下半年开始的主要任务: 1 纵向项目:水利委网站 React:实现网页前端页面布局和交互。Spring + S...

  • 前端开发之经典瀑布流布局(多种实现方案)

    本文字数稍长,思路清晰,耐心读下来绝对让你掌握瀑布流布局,大家加油! 瀑布流布局一般是下面这个样子 Tips:本文...

  • 常见问题

    如果让你实现一个promise怎么样实现前端性能理解,优化有哪些移动端适配方案express中间件如何实现了解TC...

  • 你画我猜笔记

    一、目标 vue + node 实现你画我猜先做个手机网页版功能,后续目标是迁移到微信小程序上 二、技术方案 前端...

  • Flex布局

    网页布局是CSS的一个重点应用,布局的传统方案布局的传统解决方案,基于盒状模型,依赖 display 属性 + p...

网友评论

      本文标题:前端经典网页布局的实现方案你了解多少?

      本文链接:https://www.haomeiwen.com/subject/nnmhmdtx.html