• 双飞翼布局和圣杯布局


    目录

    前言

    双飞翼布局

    圣杯布局

    总结


    前言

    双飞翼布局和圣杯布局都是面试中常考的三栏布局,其共同特点是,内容区分为左中右三部分,其中左右两部分的宽度固定,中间部分的宽度随视口变化。这里简单记录一下这两种布局的实现方式。

    双飞翼布局

    话不多说,直接写代码,先从较简单的双飞翼布局开始。

    注意,下面所说的写代码顺序只是思路顺序,并不是真的反映在代码上的顺序,完整代码后面附上了

    给出基本的结构:

    1. <div class="header">div>
    2. <div class="wrapper">
    3. <div class="center">div>
    4. div>
    5. <div class="left">div>
    6. <div class="right">div>
    7. <div class="footer">div>

    注意,页面从上到下,分为了header、内容区、footer三部分,其中header和footer的高度固定,宽度随视口变化。内容区就是我们要操作的三栏布局,需要将center放在最前面,并且加一层wrapper包裹着,然后left和right跟在后面。

    那么先把header和footer的样式写好:

    1. * {
    2. margin: 0;
    3. padding: 0;
    4. }
    5. .header,
    6. .footer {
    7. width: 100vw;
    8. height: 100px;
    9. }
    10. .header {
    11. background-color: antiquewhite;
    12. }
    13. .footer {
    14. background-color: gold;
    15. }

    最前面的*选择器是清除浏览器默认的padding和margin的,然后就设置了header和footer的宽高、颜色。

    接下来要考虑,如何实现三栏布局?

    首先需要把wrapper、left、right水平排列,这里采用浮动的办法,让它们三个向左浮动,并顺手设置其高度:

    1. .wrapper,
    2. .left,
    3. .right {
    4. float: left;
    5. height: 500px;
    6. }

    这样一来,在内容区下面的footer就需要清除浮动,于是修改footer的样式,在下面添加一行清除浮动即可:

    1. .footer {
    2. background-color: gold;
    3. clear: both;
    4. }

    我们注意到,wrapper包裹了center,并且排在left和right的前面,我们需要把left和right调整到center的两侧。为此,需要在center左右留出固定宽度的部分,用来放置left和right。因此,设置wrapper和center的样式:

    1. .wrapper {
    2. width: 100vw;
    3. }
    4. .center {
    5. margin: 0 300px;
    6. height: 100%;
    7. background-color: aquamarine;
    8. }

    wrapper的宽度设置为100%,这样就可以铺满屏幕。作为wrapper的子元素,center设置了左右的margin均为300px,可作为left和right放置的地方。接下来就可以设置left和right了:

    1. .left {
    2. margin-left: -100vw;
    3. width: 300px;
    4. background-color: pink;
    5. }
    6. .right {
    7. margin-left: -300px;
    8. width: 300px;
    9. background-color: azure;
    10. }

    逻辑是这样的:如果不设置margin-left, 由于wrapper的宽度是100vw,left和right将会出现在下一行,left紧靠左边,right紧靠left。left距离wrapper的最左侧,就是100vw,因此要想将left移到wrapper最左侧,覆盖掉center左边的margin,就需要给left设置margin-left为-100vw。一旦left设置了左外边距,right就将顶替left的位置,紧靠左侧,这样就需要给right设置margin-left为-300px,让它覆盖掉center右边的margin。

    这部分说着逻辑很清楚,但可能不是很好理解,需要动手操作一下试试看。

    至此,双飞翼布局已经实现,效果:

    附上源码:

    1. html>
    2. <html lang='en'>
    3. <head>
    4. <meta charset='UTF-8'>
    5. <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    6. <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    7. <title>Documenttitle>
    8. <style>
    9. * {
    10. margin: 0;
    11. padding: 0;
    12. }
    13. .header,
    14. .footer {
    15. width: 100vw;
    16. height: 100px;
    17. }
    18. .header {
    19. background-color: antiquewhite;
    20. }
    21. .footer {
    22. background-color: gold;
    23. clear: both;
    24. }
    25. .wrapper {
    26. width: 100vw;
    27. }
    28. .wrapper,
    29. .left,
    30. .right {
    31. float: left;
    32. height: 500px;
    33. }
    34. .center {
    35. margin: 0 300px;
    36. height: 100%;
    37. background-color: aquamarine;
    38. }
    39. .left {
    40. margin-left: -100vw;
    41. width: 300px;
    42. background-color: pink;
    43. }
    44. .right {
    45. margin-left: -300px;
    46. width: 300px;
    47. background-color: azure;
    48. }
    49. style>
    50. head>
    51. <body>
    52. <div class="header">div>
    53. <div class="wrapper">
    54. <div class="center">div>
    55. div>
    56. <div class="left">div>
    57. <div class="right">div>
    58. <div class="footer">div>
    59. body>
    60. html>

    圣杯布局

    有了双飞翼布局的基础,圣杯布局就容易理解了。其实,圣杯布局和双飞翼布局是一样的,只是实现方式不同而已。

    首先给出基本的架构:

    1. <div class="header">div>
    2. <div class="clearfix">
    3. <div class="center">123456div>
    4. <div class="left">45div>
    5. <div class="right">545div>
    6. div>
    7. <div class="footer">div>

    与双飞翼相同的是,center在left和right的前面;不同的是,center外面不需要包裹一层wrapper,而是在center、left、right这三个元素的外层包裹一层clearfix父元素。看这个类名,大概就能猜到,这个父元素起到了清除浮动的作用。

    接下来一点点实现。

    首先,一样的,给header和footer设置样式:

    1. * {
    2. margin: 0;
    3. padding: 0;
    4. }
    5. .header,
    6. .footer {
    7. width: 100vw;
    8. height: 100px;
    9. }
    10. .header {
    11. background-color: rgb(246, 208, 158);
    12. }
    13. .footer {
    14. background-color: salmon;
    15. }

    同样,需要给中间三个元素开启浮动,并顺手设置一下高度:

    1. .center,
    2. .left,
    3. .right {
    4. float: left;
    5. height: 500px;
    6. }

    紧接着,设置cleafrfix清除浮动:

    1. .clearfix::after {
    2. content: '';
    3. display: table;
    4. clear: both;
    5. }

    继续需要想,刚才在双飞翼布局,是让center在左右放出了margin,供left和right显示,那么在这里同样需要这个放置的地方。我们可以给clearfix添加左右padding,这样更容易理解:

    1. .clearfix {
    2. padding: 0 300px;
    3. }

    然后,既然是通过clearfix设置了左右padding,center就要填满内容区,来让左右padding部分放置left和right。所以设置center:

    1. .center {
    2. width: 100%;
    3. background-color: pink;
    4. }

    然后就可以设置left和right了,先设置宽度:

    1. .left,
    2. .right {
    3. width: 300px;
    4. }

    考虑,clearfix中的三个元素浮动,而且center的宽度是100%,那么left和right就被挤到下一行了。所以,要给left设置margin-left为-100%,让它跨过center,到达clearfix的左侧padding:

    1. .left {
    2. background-color: blanchedalmond;
    3. margin-left: -100%;
    4. }

    同样,right需要设置margin-left为-300px,放置在clearfix的右侧padding上:

    1. .right {
    2. background-color: aquamarine;
    3. margin-left: -300px;
    4. }

    这样得到的效果如图:

    这显然还没有达到目的。回顾一下,给left设置margin-left为-100%,的确跨过了与父元素宽度相等的长度左移,于是从center最右侧移到了center最左侧,right也是同理。所以还需要进一步移动一下,办法就是,给left和right再开启相对定位,分别左移和右移:

    1. .left,
    2. .right {
    3. width: 300px;
    4. position: relative;
    5. }
    6. .left {
    7. background-color: blanchedalmond;
    8. margin-left: -100%;
    9. left: -300px;
    10. }
    11. .right {
    12. background-color: aquamarine;
    13. margin-left: -300px;
    14. right: -300px;
    15. }

     移动好了之后看效果:

    成功!

    附上源码:

    1. html>
    2. <html lang='en'>
    3. <head>
    4. <meta charset='UTF-8'>
    5. <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    6. <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    7. <title>Documenttitle>
    8. <style>
    9. * {
    10. margin: 0;
    11. padding: 0;
    12. }
    13. .header,
    14. .footer {
    15. width: 100vw;
    16. height: 100px;
    17. }
    18. .header {
    19. background-color: rgb(246, 208, 158);
    20. }
    21. .footer {
    22. background-color: salmon;
    23. }
    24. .clearfix {
    25. padding: 0 300px;
    26. }
    27. .clearfix::after {
    28. content: '';
    29. display: table;
    30. clear: both;
    31. }
    32. .center,
    33. .left,
    34. .right {
    35. float: left;
    36. height: 500px;
    37. }
    38. .center {
    39. width: 100%;
    40. background-color: pink;
    41. }
    42. .left,
    43. .right {
    44. width: 300px;
    45. position: relative;
    46. }
    47. .left {
    48. background-color: blanchedalmond;
    49. margin-left: -100%;
    50. left: -300px;
    51. }
    52. .right {
    53. background-color: aquamarine;
    54. margin-left: -300px;
    55. right: -300px;
    56. }
    57. style>
    58. head>
    59. <body>
    60. <div class="header">div>
    61. <div class="clearfix">
    62. <div class="center">centerdiv>
    63. <div class="left">leftdiv>
    64. <div class="right">rightdiv>
    65. div>
    66. <div class="footer">div>
    67. body>
    68. html>

    总结

    本文使用简单的方法实现了两种常见的三栏布局。由于水平有限,其中难免存在谬误,希望大家轻喷,不吝赐教!

  • 相关阅读:
    Latex——换行换段
    SpringCloud:微服务保护之流量控制
    OTN的7层结构
    【愚公系列】2022年09月 MAUI框架-MAUI项目的创建
    人工智能基础_机器学习044_使用逻辑回归模型计算逻辑回归概率_以及_逻辑回归代码实现与手动计算概率对比---人工智能工作笔记0084
    通过电商API接口,代购系统可以获取到商品、订单、物流等多种信息
    Java中的线程等待和唤醒、线程死锁、常用的线程池类(多线程下篇含线程池的使用及原理)
    Vue前端框架09 计算属性、Class绑定、style绑定、侦听器、表单输入绑定、Dom操作模板引用
    Redis未授权访问漏洞实验
    七天接手react项目 系列 —— react 路由
  • 原文地址:https://blog.csdn.net/weixin_45792464/article/details/126369303