当前位置:   article > 正文

CSS之布局系列--三列布局(两边固定,中间自适应)--方法/实例_两边固定 中间自适应的布局

两边固定 中间自适应的布局

原文网址:CSS之布局系列--三列布局(两边固定,中间自适应)--方法/实例_IT利刃出鞘的博客-CSDN博客

简介

本文用示例介绍CSS三列布局的方案。

三列布局,即:左,中,右。有两种方案:1.两边固定,中间自适应;2.中间固定,两边自适应。本文介绍第1种方案。

两边固定,中间自适应,一共有如下几种方案:

  1. flex布局(推荐)
  2. 网格布局(grid)
  3. 浮动布局(float)
  4. 圣杯布局
  5. 双飞翼布局
  6. 表格布局(table)(不推荐)
  7. 绝对定位布局(不推荐)

想要达到的效果:

下边所有的方案的结果都跟上图一样。 

方案1:flex(推荐)

简介

flex是css3提供的一种新的布局方式,这种布局的产生就是为了实现自适应布局,它是随着移动互联网时代产生而引进的。

本方案是实现自适应布局的最佳方案。

父元素设置display: flex之后,子元素float,vertical-align,clear失效

优点

  1. 简单
  2. 维护性好

缺点

  1. 不兼容旧浏览器

示例

代码

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. }
  13. .container {
  14. display: flex;
  15. }
  16. .aside-left {
  17. width: 300px;
  18. background-color: #a9ff29;
  19. }
  20. .middle {
  21. flex: 1;
  22. background-color: #ffb91b;
  23. }
  24. .aside-right {
  25. width: 200px;
  26. background-color: #40c3ff;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div class="container">
  32. <div class="aside-left">左侧</div>
  33. <div class="middle">中间</div>
  34. <div class="aside-right">右侧</div>
  35. </div>
  36. </body>
  37. </html>

方案2:网格(grid)

简介

网格布局是比较新的东西,这个布局是新的css标准下的特性。在响应式布局大行其道的移动互联网时代,bootstrap之类的是对栅格化布局框架非常流行,而网格布局,就是对栅格布局的标准化实现。

优点

  1. 简单、清晰

缺点

  1. 不兼容旧浏览器。(因为是新CSS标准的特性)

代码

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container {
  11. display: grid;
  12. width: 100%;
  13. grid-template-rows: 100px;
  14. grid-template-columns: 300px auto 200px;
  15. }
  16. .aside-left {
  17. background-color: #a9ff29;
  18. }
  19. .middle {
  20. background-color: #ffb91b;
  21. }
  22. .aside-right {
  23. background-color: #40c3ff;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <div class="container">
  29. <div class="aside-left">左侧</div>
  30. <div class="middle">中间</div>
  31. <div class="aside-right">右侧</div>
  32. </div>
  33. </body>
  34. </html>

方案3:浮动(float)

优点

  1. 兼容旧浏览器

缺点

  1. 主体内容需要放到最后,当页面元素较多时候对开发不友好。

示例

必须把中间的元素写到最后,即:左、右、中。

代码

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. }
  13. .aside-left {
  14. float: left;
  15. width: 300px;
  16. background-color: #a9ff29;
  17. }
  18. .middle {
  19. background-color: #ffb91b;
  20. }
  21. .aside-right {
  22. float: right;
  23. width: 200px;
  24. background-color: #40c3ff;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <div class="container">
  30. <div class="aside-left">左侧</div>
  31. <div class="aside-right">右侧</div>
  32. <!-- 必须放到最后 -->
  33. <div class="middle">中间</div>
  34. </div>
  35. </body>
  36. </html>

结果

错误示例

如果按照正常的顺序写元素:左、中、右,将不会达到预期。

代码

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. }
  13. .aside-left {
  14. float: left;
  15. width: 300px;
  16. background-color: #a9ff29;
  17. }
  18. .middle {
  19. background-color: #ffb91b;
  20. }
  21. .aside-right {
  22. float: right;
  23. width: 200px;
  24. background-color: #40c3ff;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <div class="container">
  30. <div class="aside-left">左侧</div>
  31. <div class="middle">中间</div>
  32. <div class="aside-right">右侧</div>
  33. </div>
  34. </body>
  35. </html>

方案4:圣杯

简介

        圣杯布局并不是因为长得像杯子,在西方,圣杯是表达“渴求之物”的意思。下面回来看它的实现:首先我们的目的是要实现中间部分先加载,所以html结构大体上是确定的。

优点

  1. 兼容旧浏览器
  2. 可以实现中间部分优先加载

缺点

  1. 处理复杂
  2. 当中间元素小于两侧元素时候会出现变形
  3. 响应能力差

第1步:给元素添加左浮动效果

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. }
  13. .aside-left {
  14. float: left;
  15. width: 300px;
  16. background-color: #a9ff29;
  17. }
  18. .middle {
  19. float: left;
  20. width: 100%;
  21. background-color: #ffb91b;
  22. }
  23. .aside-right {
  24. float: left;
  25. width: 200px;
  26. background-color: #40c3ff;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div class="container">
  32. <div class="middle">中间</div>
  33. <div class="aside-left">左侧</div>
  34. <div class="aside-right">右侧</div>
  35. </div>
  36. </body>
  37. </html>

结果

第2步:为左右元素设置负的margin值

        设置左边元素左边距为负的中间盒子的宽度,也就是.left {margin-left:-100%;}。设置右边元素左边距为负的自己的宽度,也就是.right {margin-left:-300px;},

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. }
  13. .aside-left {
  14. float: left;
  15. width: 300px;
  16. margin-left: -100%;
  17. background-color: #a9ff29;
  18. }
  19. .middle {
  20. float: left;
  21. width: 100%;
  22. background-color: #ffb91b;
  23. }
  24. .aside-right {
  25. float: left;
  26. width: 200px;
  27. margin-left: -200px;
  28. background-color: #40c3ff;
  29. }
  30. </style>
  31. </head>
  32. <body>
  33. <div class="container">
  34. <div class="middle">中间</div>
  35. <div class="aside-left">左侧</div>
  36. <div class="aside-right">右侧</div>
  37. </div>
  38. </body>
  39. </html>

 结果

此时中间元素被压在下面,还需要进一步处理。

第3步:把左右元素放在中间元素两边

        要把左右元素放在中间元素两边,就需要让两边有边距,所以首先要给父元素加一个内边距,即添加padding: 0 200px 0 300px;。

代码

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. }
  13. .container {
  14. padding: 0 300px;
  15. }
  16. .aside-left {
  17. float: left;
  18. width: 300px;
  19. margin-left: -100%;
  20. background-color: #a9ff29;
  21. }
  22. .middle {
  23. float: left;
  24. width: 100%;
  25. background-color: #ffb91b;
  26. }
  27. .aside-right {
  28. float: left;
  29. width: 200px;
  30. margin-left: -200px;
  31. background-color: #40c3ff;
  32. }
  33. </style>
  34. </head>
  35. <body>
  36. <div class="container">
  37. <div class="middle">中间</div>
  38. <div class="aside-left">左侧</div>
  39. <div class="aside-right">右侧</div>
  40. </div>
  41. </body>
  42. </html>

结果

此时两边已经产生边距,不过两边元素还是在中间元素上面显示。

第4步:把两边的元素加相对定位,把它们定位到两边空位处

左元素添加:position: relative; left: -300px;

右元素添加:position: relative; right: -300px;

代码

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. }
  13. .container {
  14. padding: 0 200px 0 300px;
  15. }
  16. .aside-left {
  17. float: left;
  18. width: 300px;
  19. margin-left: -100%;
  20. position: relative;
  21. left: -300px;
  22. background-color: #a9ff29;
  23. }
  24. .middle {
  25. float: left;
  26. width: 100%;
  27. background-color: #ffb91b;
  28. }
  29. .aside-right {
  30. float: left;
  31. width: 200px;
  32. margin-left: -200px;
  33. position: relative;
  34. right: -200px;
  35. background-color: #40c3ff;
  36. }
  37. </style>
  38. </head>
  39. <body>
  40. <div class="container">
  41. <div class="middle">中间</div>
  42. <div class="aside-left">左侧</div>
  43. <div class="aside-right">右侧</div>
  44. </div>
  45. </body>
  46. </html>

结果

方案5:双飞翼

简介

        这种实现方案来自淘宝的UED,叫做双飞翼布局。

        双飞翼布局的html结构和圣杯布局有一点小差别,就是中间元素外面多了一层容器。

优点

  1. 兼容旧浏览器
  2. 比圣杯简单
  3. 响应比圣杯好

缺点

  1. 需要在中间元素上加容器

示例

        前两步的样式设置和和圣杯布局是相同的,元素左浮动,两侧-margin,最终产生了和上面相同的元素被遮盖的情况。

        接下来,也是双飞翼布局的特点所在,由于实际中间元素是放在一个容器里面的,我们可以给内部元素设置外边距,这样就可以让出两边的位置,两边元素也无需重定位即可完成布局。

代码

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. }
  13. .aside-left {
  14. float: left;
  15. width: 300px;
  16. margin-left: -100%;
  17. background-color: #a9ff29;
  18. }
  19. .middle-container {
  20. float: left;
  21. width: 100%;
  22. background-color: #ffb91b;
  23. }
  24. .middle {
  25. margin: 0 200px 0 300px;
  26. }
  27. .aside-right {
  28. float: left;
  29. width: 200px;
  30. margin-left: -200px;
  31. background-color: #40c3ff;
  32. }
  33. </style>
  34. </head>
  35. <body>
  36. <div class="container">
  37. <div class="middle-container">
  38. <div class="middle">中间</div>
  39. </div>
  40. <div class="aside-left">左侧</div>
  41. <div class="aside-right">右侧</div>
  42. </div>
  43. </body>
  44. </html>

方案6:表格(不推荐)

简介

把三列都看做是表格,控制表格的显示情况即可。

优点

  1. 简单
  2. 兼容旧浏览器(因为表格是兼容旧浏览器的)

缺点

  1. 不灵活。(边框设置、高度设置等等都有很大受限)

代码

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. display: table-cell;
  13. }
  14. .container {
  15. display: table;
  16. width: 100%;
  17. }
  18. .aside-left {
  19. width: 300px;
  20. background-color: #a9ff29;
  21. }
  22. .middle {
  23. background-color: #ffb91b;
  24. }
  25. .aside-right {
  26. width: 200px;
  27. background-color: #40c3ff;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div class="container">
  33. <div class="aside-left">左侧</div>
  34. <div class="middle">中间</div>
  35. <div class="aside-right">右侧</div>
  36. </div>
  37. </body>
  38. </html>

方案7:绝对定位(不推荐)

优点

  1. 兼容旧浏览器
  2. 简单

缺点

  1. 脱离文档流,可维护性很差

代码

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is title</title>
  6. <style>
  7. html, body {
  8. margin: 0; /*若不设置,默认为8px*/
  9. }
  10. .container>div {
  11. height: 100px;
  12. position: absolute;
  13. }
  14. .aside-left {
  15. left: 0;
  16. width: 300px;
  17. background-color: #a9ff29;
  18. }
  19. .middle {
  20. left: 300px;
  21. right: 200px;
  22. background-color: #ffb91b;
  23. }
  24. .aside-right {
  25. right: 0;
  26. width: 200px;
  27. background-color: #40c3ff;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div class="container">
  33. <div class="aside-left">左侧</div>
  34. <div class="middle">中间</div>
  35. <div class="aside-right">右侧</div>
  36. </div>
  37. </body>
  38. </html>

其他网址

css三列布局--两边固定中间自适应和中间固定两边自适应_DOM曼珠沙华的博客-CSDN博客css两边固定中间自适应布局 - 掘金css三列布局--两边固定中间自适应和中间固定两边自适应_DOM曼珠沙华的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/812309?site
推荐阅读
相关标签
  

闽ICP备14008679号