居中布局


title: 主流 CSS 布局(水平居中、垂直居中、居中 )
date: 2019-11-01 14:11:51
tags:

  • CSS
  • CSS 布局

  • html 页面的整体结构或骨架

  • 布局不是某个技术内容 而是一种设计思想

[ 布局方式 ]

  • 水平居中布局
  • 垂直居中布局
  • 居中布局( 水平 + 垂直 )

什么是水平居中布局

水平居中布局 元素相对于页面/元素相对于父元素水平居中
[ 实现方式 ]

  • inline-block + text-align 属性配合使用

注:[优点] 浏览器兼容性比较好 [缺点] text-align 属性具有继承性 导致子级元素的文本居中显示
解决方法:在子级元素重新设置 text-align 属性覆盖掉父级元素的 text-align 属性

  1. <style>
  2. *{
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. width: 100%;
  8. height: 200px;
  9. background-color: #00ffff;
  10. /* 方法一: inline-block + text-align 属性配合使用 为父元素 添加 text-align 属性 为子元素添加 display 属性
  11. - text-align 属性 为文本内容设置对其方式
  12. + left: 左对齐
  13. + center: 居中对齐
  14. + right: 右对齐
  15. */
  16. text-align: center;
  17. }
  18. .child {
  19. width: 300px;
  20. height: 200px;
  21. background-color: #ff0000;
  22. /* display 属性:
  23. - block: 块级元素
  24. - inline: 内联元素 (text-align 有效)
  25. + width 和 height 属性无效
  26. - inline-block: 行内块元素 (块级 + 内联 )
  27. */
  28. display: inline-block;
  29. }
  30. </style>
  31. <body>
  32. <!-- 居中布局 -->
  33. <!-- 方法一: inline-block + text-align 属性配合使用 -->
  34. <div class="parent">
  35. <div class="child"></div>
  36. </div>
  37. </body>
  • table + margin 属性配合使用
    注:[优点] 只需要对子级元素进行设置就可以实现水平居中 [缺点] 如果子级元素脱离文档流,导致 margin 属性失效
    解决方法:考虑第一种或第三种解决方案

[ 拓展 ] CSS 中使元素脱离文档流的方式

  • 将元素设置浮动 float
  • 将元素设置为绝对定位 position: absolute
  • 将元素设置为固定定位 position: fixed
  1. <style>
  2. *{
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. width: 100%;
  8. height: 200px;
  9. background-color: #00ffff;
  10. }
  11. .child {
  12. width: 300px;
  13. height: 200px;
  14. background-color: #ff0000;
  15. /* 方法二: gtable + margin 属性配合使用 */
  16. /* display的值 为 table 或 block */
  17. display: table;
  18. /* margin 属性: 外边距
  19. - 一个值: 上下左右
  20. - 两个值: 上下,左右
  21. + auto 根据浏览器自动分配
  22. - 三个值: 上,左右,下
  23. - 四个值: 上,右,下,左
  24. */
  25. margin: 0 auto;
  26. }
  27. </style>
  • absolute + transform 属性配合使用

注:[优点] 无论父级元素是否脱离文档流,不影响子级元素水平居中的效果 [缺点] transform 属性是 CSS 3 中新增的属性 浏览器支持情况不好
解决方法:考虑第一种或第二种解决方案

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. width: 100%;
  8. height: 200px;
  9. background-color: #00ffff;
  10. /* 相对定位 */
  11. position: relative;
  12. }
  13. .child {
  14. width: 300px;
  15. height: 200px;
  16. background-color: #ff0000;
  17. /* 当把当前元素设置为绝对定位以后
  18. - 如果父级元素没有设置定位,当前元素是相对于页面定位的
  19. - 如果父级元素设置了定位,当前元素是相对于父级元素定位的
  20. */
  21. position: absolute;
  22. left: 50%;
  23. /* 水平方向平移 */
  24. transform: translateX(-50%);
  25. /* margin-left: -50%; */
  26. }
  27. </style>
  • … …

什么是垂直居中布局

垂直居中布局 :当前元素相对于页面/父元素垂直方向是居中显示的
[ 实现方式 ]

  • table-cell + vertical-align 属性配合使用
    注:[优点] 浏览器的兼容性比较好 [缺点] vertical-align 属性 具有继承性 导致子级元素的文本居中显示
    如果父级元素中包含除子级元素以外的文本内容,此方法不适用
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. /*方法一: table-cell + vertical-align 属性配合使用 */
  8. width: 200px;
  9. height: 600px;
  10. background-color: #00ffff;
  11. /* display 属性:
  12. - table: 设置当前元素为<table>元素
  13. - table-cell:设置当前元素为<td>元素 单元格
  14. - 设置完成以后 作为子级元素的div就相当于单元格中的内容了,设置对齐方式即可
  15. */
  16. display: table-cell;
  17. /*
  18. vertical-align 属性: 用于设置文本内容的垂直方向的定对齐方式
  19. - top: 顶部对齐
  20. - middle: 居中对齐
  21. - bottom: 底部对齐
  22. */
  23. vertical-align: middle;
  24. }
  25. .child {
  26. width: 200px;
  27. height: 300px;
  28. background-color: #ff0000;
  29. }
  30. </style>
  31. <body>
  32. <div class="parent">
  33. <div class="child"></div>
  34. </div>
  35. </body>
  • absolute + transform 属性配合使用
    注:[优点] 无论父级元素是否脱离文档流,不影响子级元素的垂直居中的效果 [缺点] transform 属性是 CSS 3 中新增的属性 浏览器支持情况不好
    解决方法:考虑第一种解决方案
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. width: 200px;
  8. height: 600px;
  9. background-color: #00ffff;
  10. position:relative;
  11. }
  12. /* 方法二: absolute + transform 属性配合使用 */
  13. .child {
  14. width: 200px;
  15. height: 300px;
  16. background-color: #ff0000;
  17. position: absolute;
  18. top: 50%;
  19. /* 垂直方向 */
  20. transform: translateY(-50%);
  21. }
  22. </style>

什么是居中布局

居中布局:( 水平 + 垂直 )居中
[ 实现方式 ]

  • display:block + margin 属性实现水平方向居中,table-cell + vertical-align 属性实现垂直方向居中
    注:[优点] 浏览器兼容性比较好 [缺点] 父元素与子元素都需要增加代码
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. width: 1000px;
  8. height: 600px;
  9. background-color: #00ffff;
  10. /* 实现垂直居中 */
  11. /* <td> */
  12. display: table-cell;
  13. vertical-align: middle;
  14. }
  15. .child {
  16. width: 200px;
  17. height: 300px;
  18. background-color: #ff0000;
  19. /* 实现水居中 */
  20. /* <table> */
  21. /* display: table; */
  22. display: block;
  23. margin: 0 auto;
  24. }
  25. </style>
  26. <body>
  27. <div class="parent">
  28. <div class="child"></div>
  29. </div>
  30. </body>
  • absolute + transform 属性实现水平和垂直方向的居中
    注:[优点] 无论父级元素是否脱离文档流,不影响子级元素的垂直居中的效果,不考虑浏览器兼容性,优于第一中方案 [缺点] transform 属性是 CSS 3 中新增的属性 浏览器支持情况不好同时子父元素都增加了代码
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. width: 1000px;
  8. height: 600px;
  9. background-color: #00ffff;
  10. /* 相对定位 不脱离文档流*/
  11. position:relative;
  12. }
  13. .child {
  14. width: 200px;
  15. height: 300px;
  16. background-color: #ff0000;
  17. /* 绝对定位 ———— 子绝父相 */
  18. position: absolute;
  19. top: 50%;
  20. left: 50%;
  21. transform: translate(-50%, -50%);
  22. /* transform: translateX(-50%);
  23. transform: translateY(-50%); */
  24. }
  25. </style>

多列布局


title: 多列布局
date: 2019-11-01 20:42:12
tags:

  • CSS
  • CSS 布局

什么是多列布局

——几个元素呈现水平方式排列的效果
[ 从元素分类角度 ]

  • 块级元素 默认垂直排列 设置浮动实现水平方式排列
  • 内联元素 默认水平方式排列
  • 行内块元素 默认水平方式排列

[ 多列布局分类 ]

  • 两列布局 一列定宽,另外一列宽度自适应
  • 三列布局
    • 两列定宽且相邻,另外一列宽度自适应
    • 两边定宽 中间自适应,即圣杯布局和双飞翼布局 先有圣杯布局然后演变出双飞翼布局
  • 等分布局 每一列宽度相同
  • 等高布局 每一列高度相同
  • CSS 3 三列布局

什么是两列布局

—— 左列确定宽度,右列自动填满剩余空间

两列布局的实现

float + margin 属性实现

** 此方案的优缺点
优点:实现方式简单
缺点:

  1. 自适应元素 margin 属性值必须与定宽元素的width 值保持一致 高耦合
  2. 定宽元素浮动与自适应元素不浮动导致浏览器兼容性不好
  3. 如果右侧容器存在子级元素,为子级元素清除浮动之后,整个页面布局会乱掉
    **
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. background-color: #eee;
  8. }
  9. .left,
  10. .right {
  11. height: 500px;
  12. }
  13. .left {
  14. width:300px;
  15. background-color: #00ffff;
  16. /* 脱离文档流 */
  17. float: left;
  18. }
  19. .right {
  20. /* 自动撑满父盒子 宽度默认父盒子宽度的100% */
  21. background-color: #ff0000;
  22. /* */
  23. margin-left: 300px;
  24. }
  25. /* .inner {
  26. height: 200px;
  27. background-color: #00ff00;
  28. /*清除浮动 */
  29. /* clear: both;
  30. } */
  31. </style>
  32. </head>
  33. <body>
  34. <div class="parent">
  35. <div class="left"> 左: 定宽</div>
  36. <div class="right"> 右: 自适应
  37. <!-- <div class="inner"></div> -->
  38. </div>
  39. </div>
  40. </body>

注:以下是代码优化 为自适应元素添加父级元素并设置浮动 没有解决高耦合的问题

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. background-color: #eee;
  8. }
  9. .left,
  10. .right {
  11. height: 200px;
  12. }
  13. .left {
  14. width:300px;
  15. background-color: #00ffff;
  16. /* 脱离文档流 */
  17. float: left;
  18. /* margin-left: -100%; */
  19. /* 提高显示层级 */
  20. position: relative;
  21. }
  22. .right-fix {
  23. /* 由于设置浮动,默认宽度为 0 */
  24. /* 由于设置 父级元素 的 width: 100%;所以 宽度不够 而掉到第二行*/
  25. width: 100%;
  26. /* 向左移动 此时覆盖掉 左侧*/
  27. margin-left: -300px;
  28. float: left;
  29. background-color: #000000;
  30. }
  31. .right {
  32. /* 自动撑满父盒子 宽度默认父盒子宽度的100% */
  33. margin-left: 300px;
  34. /* padding-left: 300px; */
  35. background-color: #ff0000;
  36. }
  37. </style>
  38. <body>
  39. <div class="parent">
  40. <div class="left"> 左: 定宽</div>
  41. <div class="right-fix">
  42. <div class="right"> 右: 自适应</div>
  43. </div>
  44. </div>
  45. </body>

float + overflow 属性实现

此方案的优缺点
优点:没有第一种解决方案中存在的问题
缺点:overflow 属性开启BFC模式的同时,也存在溢出隐藏,右列内容溢出的时候就会被隐藏 ,由于开启BFC模式,所以不存在第一种解决方案中的同级元素要浮动都浮动的浏览器兼容性问题

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. background-color: #eee;
  8. height: 500px;
  9. }
  10. .left,
  11. .right {
  12. height: 300px;
  13. }
  14. .left {
  15. width: 300px;
  16. background-color: #00ffff;
  17. float: left;
  18. }
  19. .right {
  20. background-color: #ff0000;
  21. /*
  22. overflow 属性:
  23. - hidden 溢出隐藏 和 开启BFC模式,当前元素的内部环境与外界完全隔离
  24. */
  25. overflow: hidden;
  26. }
  27. </style>
  28. <body>
  29. <div class="parent">
  30. <div class="left"> 左: 左对齐</div>
  31. <div class="right"> 右:自适应</div>
  32. </div>
  33. </body>

使用 display 属性的 table 相关值

此方案的优缺点
优点:浏览器的兼容性比较好
缺点:将所有元素的 display 属性设置为 table 相关值,受到相应制约,同时也需要重新设置表格的特性,比如双边框、文本内容等问题

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. background-color: #eee;
  8. height: 500px;
  9. /* 表格的单元格的宽度会自动分配,左侧固定,右侧则自适应 */
  10. display: table;
  11. /*
  12. table-layout 属性 用来显示表格单元格、行、列的算法规则
  13. - automatic: 默认,列宽度有单元格内容设定
  14. - fixed: 列宽由表格宽度和列宽度设定
  15. - inherit: 规定应该从父元素继承 table-layout 属性的值
  16. */
  17. table-layout: fixed;
  18. width: 100%;
  19. }
  20. .left,
  21. .right {
  22. height: 300px;
  23. display: table-cell;
  24. }
  25. .left {
  26. width: 300px;
  27. background-color: #00ffff;
  28. }
  29. .right {
  30. background-color: #ff0000;
  31. }
  32. </style>
  33. <body>
  34. <div class="parent">
  35. <div class="left"> 左: 左对齐</div>
  36. <div class="right"> 右:自适应</div>
  37. </div>
  38. </body>

什么是三列布局

—— 两列定宽且相邻,另外一列宽度自适应

三列布局的实现

实现方式与两列布局实现方式类似

float + margin 属性实现

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .parent {
  7. background-color: #eee;
  8. height: 500px;
  9. }
  10. .left,
  11. .center,
  12. .right {
  13. height: 300px;
  14. }
  15. .left {
  16. width: 300px;
  17. background-color: #00ffff;
  18. /* */
  19. float: left;
  20. }
  21. .center {
  22. width: 300px;
  23. background-color: #ffff00;
  24. float: left;
  25. }
  26. .right {
  27. background-color: #ff0000;
  28. margin-left: 600px;
  29. }
  30. </style>
  31. <body>
  32. <div class="parent">
  33. <div class="left"> 左: 定宽</div>
  34. <div class="center"> 中:定宽 </div>
  35. <div class="right"> 右:自适应</div>
  36. </div>
  37. </body>

float + overflow 属性实现

  1. 略,参考两列布局

使用 display 属性的 table 相关值

  1. 略,参考两列布局


什么是等分布局

—— 一行被分成若干列,每一列的宽度相同

等分布局的实现

  • float 属性实现等分布局效果
  • display 属性的值有关 table 的值实现

float 属性实现等分布局效果

  1. <style>
  2. /*
  3. *
  4. *
  5. */
  6. * {
  7. margin: 0;
  8. padding: 0;
  9. }
  10. .parent {
  11. background-color: #eee;
  12. }
  13. .column1,
  14. .column2,
  15. .column3,
  16. .column5,
  17. .column6 {
  18. height: 500px;
  19. width: 20%;
  20. float: left;
  21. }
  22. .column2 {
  23. background-color: #ff66ff;
  24. }
  25. .column3 {
  26. background-color: #00ffff;
  27. }
  28. .column1 {
  29. background-color: #ffff00;
  30. }
  31. .column5 {
  32. background-color: #ff0000;
  33. }
  34. .column6 {
  35. background-color: #00ff00;
  36. }
  37. </style>
  38. <body>
  39. <div class="parent">
  40. <div class="column1">1</div>
  41. <div class="column2">2</div>
  42. <div class="column3">3</div>
  43. <div class="column5">5</div>
  44. <div class="column6">6</div>
  45. </div>
  46. </body>

display 属性的值有关 table 的值实现

  1. <style>
  2. /*
  3. *
  4. *
  5. *
  6. */
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. .parent {
  12. background-color: #eee;
  13. width: 100%;
  14. /* <table> 元素 */
  15. display: table;
  16. }
  17. .column1,
  18. .column2,
  19. .column3,
  20. .column5,
  21. .column6 {
  22. height: 500px;
  23. /* <td> 元素 */
  24. display: table-cell;
  25. }
  26. .column2 {
  27. background-color: #ff66ff;
  28. }
  29. .column3 {
  30. background-color: #00ffff;
  31. }
  32. .column1 {
  33. background-color: #ffff00;
  34. }
  35. .column5 {
  36. background-color: #ff0000;
  37. }
  38. .column6 {
  39. background-color: #00ff00;
  40. }
  41. </style>
  42. <body>
  43. <div class="parent">
  44. <div class="column1">1</div>
  45. <div class="column2">2</div>
  46. <div class="column3">3</div>
  47. <div class="column5">5</div>
  48. <div class="column6">6</div>
  49. </div>
  50. </body>

等分布局的空白间距

[ 方法一 代码修改 ]

  1. <style>
  2. /*
  3. * 间距 + 容器宽度 = (间距 + 列宽度) * N列数
  4. *
  5. *
  6. */
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. .parent-fix {
  12. /* 溢出隐藏 */
  13. overflow: hidden;
  14. }
  15. .parent {
  16. background-color: #eee;
  17. /* 解决高度塌陷 */
  18. overflow: hidden;
  19. /* height: 500px; */
  20. margin-left: -20px;
  21. }
  22. .column1,
  23. .column2,
  24. .column3,
  25. .column5,
  26. .column6 {
  27. height: 500px;
  28. width: 20%;
  29. float: left;
  30. padding-left: 20px;
  31. /* margin-left: 20px; */
  32. /*
  33. box-sizing 属性
  34. */
  35. box-sizing: border-box;
  36. }
  37. .column2 .inner {
  38. background-color: #ff66ff;
  39. }
  40. .column3 .inner {
  41. background-color: #00ffff;
  42. }
  43. .column1 .inner {
  44. background-color: #ffff00;
  45. }
  46. .column5 .inner {
  47. background-color: #ff0000;
  48. }
  49. .column6 .inner {
  50. background-color: #00ff00;
  51. }
  52. .inner {
  53. height: 500px;
  54. }
  55. </style>
  56. <body>
  57. <div class="parent-fix">
  58. <div class="parent">
  59. <div class="column1"><div class="inner"></div></div>
  60. <div class="column2"><div class="inner"></div></div>
  61. <div class="column3"><div class="inner"></div></div>
  62. <div class="column5"><div class="inner"></div></div>
  63. <div class="column6"><div class="inner"></div></div>
  64. </div>
  65. </div>
  66. </body>

[ 方法二 代码修改 ]

  1. <style>
  2. /*
  3. * 实际开发中 parent 元素 width 的值是有一个范围
  4. * 在此案例中 parent-fix 的宽度为 1369px - 20px
  5. *
  6. */
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. .parent-fix {
  12. overflow: hidden;
  13. }
  14. .parent {
  15. background-color: #eee;
  16. width: 1369px;
  17. /* <table> 元素 */
  18. display: table;
  19. margin-left: -20px;
  20. }
  21. .column1,
  22. .column2,
  23. .column3,
  24. .column5,
  25. .column6 {
  26. height: 500px;
  27. /* <td> 元素 */
  28. display: table-cell;
  29. padding-left: 20px;
  30. box-sizing: border-box;
  31. }
  32. .column2 .inner {
  33. background-color: #ff66ff;
  34. }
  35. .column3 .inner {
  36. background-color: #00ffff;
  37. }
  38. .column1 .inner {
  39. background-color: #ffff00;
  40. }
  41. .column5 .inner {
  42. background-color: #ff0000;
  43. }
  44. .column6 .inner {
  45. background-color: #00ff00;
  46. }
  47. .inner {
  48. height: 500px;
  49. }
  50. </style>
  51. <body>
  52. <div class="parent-fix">
  53. <div class="parent">
  54. <div class="column1"><div class="inner"></div></div>
  55. <div class="column2"><div class="inner"></div></div>
  56. <div class="column3"><div class="inner"></div></div>
  57. <div class="column5"><div class="inner"></div></div>
  58. <div class="column6"><div class="inner"></div></div>
  59. </div>
  60. </div>
  61. </body>

什么是等高布局

—— 一行被分成若干列,每一列的高度相同

等高布局的实现

  • display 属性的值有关 table 的值实现
  • padding + margin 实现等高布局效果

display 属性的值有关 table 的值实现

  1. <style>
  2. /*
  3. * 表格中的单元格 默认是等高的,无论内容多少
  4. *
  5. *
  6. */
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. .parent {
  12. background-color: #eee;
  13. /* <table> 元素 */
  14. display: table;
  15. table-layout: fixed;
  16. }
  17. .left,
  18. .right {
  19. width: 300px;
  20. /* <td> 元素 */
  21. display: table-cell;
  22. }
  23. .left {
  24. background-color: #ffff00;
  25. }
  26. .right {
  27. background-color: #ff66ff;
  28. }
  29. </style>
  30. <body>
  31. <div class="parent">
  32. <div class="left">imooc</div>
  33. <div class="right">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quis repudiandae dolore minus maxime ex quos consectetur cumque autem iure vero corrupti at est cupiditate, praesentium dolorem itaque doloremque soluta veritatis!</div>
  34. </div>
  35. </body>

padding + margin 实现等高布局效果

  1. <style>
  2. /*
  3. *
  4. *
  5. *
  6. */
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. .parent {
  12. background-color: #eee;
  13. /* 解决高度塌陷 */
  14. overflow: hidden;
  15. }
  16. .left,
  17. .right {
  18. width: 300px;
  19. float: left;
  20. padding-bottom: 99999px;
  21. margin-bottom: -99999px;
  22. }
  23. .left {
  24. background-color: #ffff00;
  25. }
  26. .right {
  27. background-color: #ff66ff;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div class="parent">
  33. <div class="left">imooc</div>
  34. <div class="right">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quis repudiandae dolore minus maxime ex quos consectetur cumque autem iure vero corrupti at est cupiditate, praesentium dolorem itaque doloremque soluta veritatis!</div>
  35. <div class="left">imooc</div>
  36. <div class="right">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quis repudiandae dolore minus maxime ex quos consectetur cumque autem iure vero corrupti at est cupiditate, praesentium dolorem itaque doloremque soluta veritatis!</div>
  37. <div class="left">imooc</div>
  38. <div class="right">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quis repudiandae dolore minus maxime ex quos consectetur cumque autem iure vero corrupti at est cupiditate, praesentium dolorem itaque doloremque soluta veritatis!</div>
  39. </div>
  40. </body>

CSS 3 多列布局

[ column 属性 ]

——column 属性是一个简写属性 包含 column-count 属性 定义列的数量 和 column-width 属性定义列的宽度

  • column-count 属性 用于设置列的数量或允许的最大列数

  • auto: 默认值,用于表示列的数量由其他 CSS 属性绝对决定

  • number: 必须是正整数,用于表示定义列的数量

  • column-width 属性 用于设置列的宽度或列的最小宽度

    • auto: 默认值,用于表示列的宽度由其他 CSS 属性绝对决定
    • length: 必须是正整数,用于表示定义列的宽度
  1. <style>
  2. /*
  3. *
  4. *
  5. *
  6. */
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. .parent {
  12. background-color: #eee;
  13. /* column-count: 6; */
  14. /* column-width: 200px; */
  15. /* 简写属性 */
  16. columns: 6 auto;
  17. }
  18. .column1,
  19. .column2,
  20. .column3,
  21. .column5,
  22. .column6 {
  23. height: 300px;
  24. }
  25. .column2 {
  26. background-color: #ff66ff;
  27. }
  28. .column3 {
  29. background-color: #00ffff;
  30. }
  31. .column1 {
  32. background-color: #ffff00;
  33. }
  34. .column5 {
  35. background-color: #ff0000;
  36. }
  37. .column6 {
  38. background-color: #00ff00;
  39. }
  40. </style>
  41. <body>
  42. <div class="parent">
  43. <div class="column1"></div>
  44. <div class="column2"></div>
  45. <div class="column3"></div>
  46. <div class="column6"></div>
  47. <div class="column5"></div>
  48. <div class="column6"></div>
  49. </div>
  50. </body>

[ 列的间距 ]

  • column-gap 属性用于设置列于列之间的间距,该属性需要为多列显示时的元素设置
    • normal: 用于表示使用浏览器定义列的默认间距,默认值 1em
    • length: 必须是正整数,用于表示定义列之间的间距
  1. <style>
  2. .parent {
  3. background-color: #eee;
  4. /* column-count: 6; */
  5. /* column-width: 200px; */
  6. /* 简写属性 */
  7. columns: 5 auto;
  8. column-gap: 20px;
  9. }
  10. </style>

[列的边框 column-rule ]

—— column-rule 属性用于定义列于列之间的边框,其中包括边框宽度、边框颜色、边框样式。

  • column-rule-width: 列于列之间的边框宽度
  • column-rule-color: 列于列之间的边框颜色
  • column-rule-style: 列于列之间的边框样式
  1. <style>
  2. .parent {
  3. background-color: #eee;
  4. /* column-count: 6; */
  5. /* column-width: 200px; */
  6. /* 简写属性 */
  7. columns: 5 auto;
  8. column-gap: 20px;
  9. /* column-rule-width: 5px;
  10. column-rule-color: #ff0000;
  11. column-rule-style: double; */
  12. /* 简写属性 */
  13. column-rule: 5px #ff0000 double;
  14. }
  15. </style>

[ 横跨多列 ]

  • column-span 属性 用于定义一个列元素是否跨列
    • none:表示元素不跨列
    • all: 表示元素跨所有列
  1. <style>
  2. .column6 {
  3. background-color: #00ff00;
  4. column-span: all;
  5. }
  6. </style>

[ 列的填充 ]

  • column-fill 属性用于定义列的高度由内容决定,还是同一高度
    • auto: 默认值,列的高度由内容绝对
    • balance: 列的高度根据内容最多的一列的高度为准
  1. <style>
  2. .column6,
  3. .column7,
  4. .column8,
  5. .column9 {
  6. /* 浏览器兼容不好 包括chrome浏览器 */
  7. column-fill: balance;
  8. }
  9. </style>
  10. <div class="parent">
  11. <div class="column6">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ipsum eum dolorum ad quod velit. Corporis inventore alias nostrum dignissimos nihil saepe harum vitae, sint, id voluptate, reprehenderit officiis magnam repellat?</div>
  12. <div class="column7">Lorem ipsum dolor sit amet consectetur adipisicing elit. Tenetur iure dolorum deleniti soluta ipsum at ratione magni recusandae, sapiente necessitatibus, expedita nobis, animi corrupti exercitationem delectus ullam unde sed autem.</div>
  13. <div class="column8">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Eius placeat blanditiis harum? Eum, sit corporis illo maxime, nemo excepturi nisi eveniet, error quis ex cum ut nulla sunt aut saepe?
  14. Lorem ipsum dolor sit amet consectetur, adipisicing elit. Facilis debitis officia distinctio cupiditate tempora! Debitis corrupti omnis rerum voluptates laboriosam hic alias repellat nostrum, expedita rem perspiciatis totam maxime labore!
  15. </div>
  16. <div class="column9">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Laborum, earum. Nobis illo maxime necessitatibus voluptatibus quam nemo blanditiis impedit perferendis, porro delectus eligendi laboriosam voluptate adipisci, culpa vitae accusantium nesciunt.</div>
  17. </div>

经典布局

什么是圣杯布局

  • 布局效果类似于圣杯而得名,也叫做三行三列布局。
  • 定宽 — 自适应 — 定宽

圣杯布局.png

[根据两列布局实现 定宽 — 自适应 — 定宽 布局方式]

  1. <style>
  2. /* 改变了结构顺序,搜索引擎抓取主要内容变为最后
  3. * 结构不同,解决方案也会不同
  4. *
  5. */
  6. * {
  7. margin: 0;
  8. padding: 0;
  9. }
  10. .header,
  11. .footer {
  12. height: 100px;
  13. background-color: #000;
  14. }
  15. .parent {
  16. background-color: #eee;
  17. padding: 10px;
  18. }
  19. .left,
  20. .center,
  21. .right {
  22. height: 300px;
  23. }
  24. .left,
  25. .right {
  26. width: 300px;
  27. }
  28. .left {
  29. width: 300px;
  30. background-color: #00ffff;
  31. float: left;
  32. }
  33. .center {
  34. background-color: #ffff00;
  35. margin-left: 300px;
  36. margin-right: 300px;
  37. }
  38. .right {
  39. background-color: #ff0000;
  40. float: right;
  41. }
  42. /* 中间自适应部分没有浮动,右边元素浮动,在兄弟元素中,前边元素没有浮动,后边的元素浮动,浮动的元素不允许超过前边的元素,依旧垂直方向排列,把right的结构位置调到前面*/
  43. </style>
  44. </head>
  45. <body>
  46. <div class="header"></div>
  47. <div class="parent">
  48. <div class="left"> 左: 定宽</div>
  49. <div class="right"> 右:自适应</div>
  50. <div class="center"> 中:定宽 </div>
  51. </div>
  52. <div class="footer"></div>
  53. </body>

圣杯布局的实现

  1. <style>
  2. /* 改变了结构顺序,搜索引擎抓取主要内容变为最后
  3. * 结构不同,解决方案也会不同
  4. * 根据问题,把center调至最前,但是需要其他方法解决,即给三个div添加父元素
  5. */
  6. * {
  7. margin: 0;
  8. padding: 0;
  9. }
  10. .header,
  11. .footer {
  12. height: 100px;
  13. background-color: #000;
  14. }
  15. .parent {
  16. background-color: #eee;
  17. /* 解决父级元素高度塌陷 */
  18. height: 300px;
  19. /* 对应 left 的宽度 */
  20. margin-left: 300px;
  21. /* 对应 right 的宽度 */
  22. margin-right: 300px;
  23. }
  24. .left,
  25. .center,
  26. .right {
  27. height: 300px;
  28. /* 使三个div 浮动 */
  29. float: left;
  30. }
  31. .left,
  32. .right {
  33. width: 300px;
  34. }
  35. .left {
  36. background-color: #00ffff;
  37. /* 将当前元素从当前行移动到上一行同一个位置*/
  38. margin-left: -100%;
  39. /* 将当前元素移动到理想位置 */
  40. position: relative;
  41. left: -300px;
  42. }
  43. .center {
  44. width: 100%;
  45. background-color: #ffff00;
  46. }
  47. .right {
  48. background-color: #ff0000;
  49. margin-left: -300px;
  50. position: relative;
  51. right: -300px;
  52. }
  53. </style>
  54. <body>
  55. <div class="header"></div>
  56. <div class="parent">
  57. <div class="center"> 中:定宽 </div>
  58. <div class="left"> 左: 定宽</div>
  59. <div class="right"> 右:自适应</div>
  60. </div>
  61. <div class="footer"></div>
  62. </body>

什么是双飞翼布局

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

双飞翼布局的实现

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>双飞翼布局</title>
  8. <style>
  9. /*
  10. *
  11. *
  12. */
  13. * {
  14. margin: 0;
  15. padding: 0;
  16. }
  17. .header,
  18. .footer {
  19. height: 100px;
  20. background-color: #000;
  21. }
  22. .parent {
  23. height: 300px;
  24. background-color: #eee;
  25. }
  26. .left {
  27. width: 300px;
  28. height: 300px;
  29. background-color: #00ffff;
  30. float: left;
  31. margin-left: -100%;
  32. }
  33. .center {
  34. width: 100%;
  35. height: 300px;
  36. background-color: #ffff00;
  37. float: left;
  38. }
  39. .right {
  40. width: 300px;
  41. height: 300px;
  42. background-color: #ff0000;
  43. float: left;
  44. margin-left: -300px;
  45. }
  46. .inner {
  47. height: 300px;
  48. background-color: #ff66ff;
  49. margin-left: 300px;
  50. margin-right: 300px;
  51. }
  52. </style>
  53. <body>
  54. <div class="header"></div>
  55. <div class="parent">
  56. <div class="center">
  57. <div class="inner">中:定宽</div>
  58. </div>
  59. <div class="left"> 左: 定宽</div>
  60. <div class="right"> 右:自适应</div>
  61. </div>
  62. <div class="footer"></div>
  63. </body>
  64. </html>

全屏布局


title: 全屏布局
date: 2019-11-01 20:43:24
tags:

  • CSS
  • CSS 布局

什么是全屏布局?

—— HTML页面铺满整个浏览器串口窗口,并且没有横竖滚动条,而且可以跟随浏览器窗口的大小变化而变化。
全屏布局.png

  1. <style>
  2. /*
  3. * .content .right {
  4. height: 1000px;
  5. background-color: rgb(243, 239, 12);
  6. margin-left: 300px;
  7. }
  8. * 此元素的高度可以不用设置,由内容高度撑开。
  9. *
  10. */
  11. html,body{
  12. margin: 0;
  13. padding: 0;
  14. /* 避免全屏出现滚动条*/
  15. overflow: hidden;
  16. }
  17. header {
  18. height: 100px;
  19. background-color: #eee;
  20. position: fixed;
  21. top: 0;
  22. left: 0;
  23. right: 0;
  24. }
  25. .content {
  26. /* 提供滚动条 */
  27. overflow: auto;
  28. background-color: rgb(14, 197, 221);
  29. position: fixed;
  30. left: 0;
  31. right: 0;
  32. top: 100px;
  33. bottom: 100px;
  34. }
  35. .content .left {
  36. width: 300px;
  37. height: 100%;
  38. background-color: rgb(247, 54, 54);
  39. position: fixed;
  40. left: 0;
  41. top: 100px;
  42. bottom: 100px;
  43. }
  44. .content .right {
  45. height: 1000px;
  46. background-color: rgb(243, 239, 12);
  47. margin-left: 300px;
  48. }
  49. footer {
  50. height: 100px;
  51. background-color: rgb(39, 38, 38);
  52. position:fixed;
  53. bottom: 0;
  54. left: 0;
  55. right: 0;
  56. }
  57. </style>
  58. <body>
  59. <header></header>
  60. <div class="content">
  61. <div class="left"></div>
  62. <div class="right"></div>
  63. </div>
  64. <footer></footer>
  65. </body>

总结

居中布局

  • 水平居中布局
  • 垂直居中布局
  • 居中布局( 水平 + 垂直 )

多列布局

  • 两列布局
  • 三列布局
  • 等分布局
  • 等高布局
  • CSS 3 多列布局

经典布局

  • 圣杯布局
  • 双飞翼布局

全屏布局

未涉及的布局

  • 网格布局
  • 弹性盒子布局 CSS3

**没有任何一种布局方式是全优的,在实际应用中根据实际情况选择最合理的布局方式**