博客列表 >display初探讨和实现列间隙与等高列中的应用

display初探讨和实现列间隙与等高列中的应用

吾逍遥
吾逍遥原创
2020年10月25日 07:13:17697浏览

一、学习的新知识

今天主要学习了盒模型的box-sizing对宽度影响,以及列间隙和用表格模式实现等高列。可以说又认识了几个新知识点:

  • calc() 此CSS函数允许在声明CSS属性值时执行一些计算,可用运算符是+、-、*、/。要注意是操作符前后要有空格 ,否则无效。
  • display:table 表格布局,这个实在是让我又重新认识display,后来查了mdn发现布局中display还真是少不了,有N多值,如常见的flex和grid。

二、CSS中函数

为什么单独来说,因为后面用的越来越多,尤其是自适应流式布局中经常要用到。这里主要学习CSS中两个重要的CSS函数。

1. var()

var()函数可以代替元素中任何属性中的值的任何部分。var()函数不能作为属性名、选择器或者其他除了属性值之外的值。

语法 var(\<自定义属性名> , \<后备值>? )

  • 自定义属性名 以两个破折号开始的任何有效标识符,自定义属性仅供作者和用户使用。
  • 后备值 在自定义属性值无效的情况下保证函数有值,可以是多个,此时从左到右,检测到有效值时停止继续查找。
  1. /* 基本使用 */
  2. :root {--main-bg-color: pink;}
  3. body { background-color: var(--main-bg-color); }
  1. /* 后备值 */
  2. /* 在父元素样式中 */
  3. .component { --text-color: #080; /* header-color 并没有被设定 */ }
  4. /* 在 component 的样式中: */
  5. .component .header { color: var(--header-color, blue); /* 此处 color 被回退到 blue */ }
  6. .component .text { color: var(--text-color, black); }

2. calc()

calc() 此CSS函数允许在声明CSS属性值时执行一些计算 。它可以用在如下场合:长度length、百分比percentage、数值number、角度angle、时间time和重复frequency。

语法 calc(表达式expression)

  • 运算符 只能是:加法+、减法-、乘法*和除法/四种, 运算符前后必须有空格 ,否则无效。
  • 运算对象 可以使用任意length值。可以在一个表达式中混用这类值的 不同单位 。在需要时,你还可以使用 小括号来建立计算顺序
  • 嵌套 calc()函数支持嵌套,但支持的方式是:把被嵌套的calc()函数全当成 普通的括号

应用一:左右外边距固定,内容居中

以前margin实现居中就是auto,让浏览器来计算左右外边距。现在有了calc(),我们也可以实现居中,并且更灵活,如实现 左右外边距固定,内容居中显示

  1. <div class="banner">This is a banner!</div>
  2. <style>
  3. .banner {
  4. box-sizing: border-box;
  5. margin:auto 40px;
  6. width: calc(100% - 80px);
  7. border: 1px solid;
  8. box-shadow: 1px 2px;
  9. background-color: yellow;
  10. text-align: center;
  11. }
  12. </style>

应用二:自适应容器

容器中子元素可以按一定比例适应容器的变化

  1. .container {
  2. width: 80%;
  3. background-color: lightgray;
  4. font-size: 0;/* 解决inline-block水平间隙,此时子元素要重新设置字号 */
  5. }
  6. .item {
  7. display: inline-block;
  8. color: white;
  9. font-size: 1rem;
  10. background-color: #0072b0;
  11. width: calc(100% / 4 - 6px);
  12. margin:auto 3px;
  13. text-align: center;
  14. }
  15. <div class="container">
  16. <div class="item"><p>11</p></div>
  17. <div class="item"><p>12</p></div>
  18. <div class="item"><p>23</p></div>
  19. <div class="item"><p>34</p></div>
  20. </div>

效果

3. calc()和var()结合使用

CSS中经常要calc()和var()配合使用,此时var()看成一个普通运算对象。

  1. .foo {
  2. --widthA: 100px;
  3. --widthB: calc(var(--widthA) / 2);
  4. --widthC: calc(var(--widthB) / 2);
  5. width: var(--widthC);
  6. }

在所有的变量都被展开后,widthC 的值就会变成 calc( calc( 100px / 2) / 2),然后,当它被赋值给 .foo 的 width 属性时,所有内部的这些 calc()(无论嵌套的有多深)都将会直接被扁平化为一个括号,所以这个 width 属性的值就直接相当于 calc( ( 100px / 2) / 2) 了,或者说就变成 25px 了。 简而言之:一个 calc() 里面的 calc() 就仅仅相当于是一个括号。

4. 其它几个常用CSS函数简介

  • min() 从逗号分隔符表达式中选择一个最小值,如width: min(1vw, 4em, 80px);
  • max() 从逗号分隔符表达式中选择一个最大值,如width: max(1vw, 4em, 80px);
  • clamp() 函数的作用是把一个值限制在一个上限和下限之间,当这个值超过最小值和最大值的范围时,在最小值和最大值之间选择一个值使用。它接收三个参数:最小值、首选值、最大值。如font-size: clamp(1rem, 2.5vw, 2rem);
    • 首选值比最小值要小时,则使用最小值
    • 首选值介于最小值和最大值之间时,用首选值
    • 首选值比最大值要大时,则使用最大值

三、display初探讨

学布局就离不开display的学习,老师在讲块元素和行内元素时就已经和display有关了,我也是查mdn后才发现的.

普通文档流: 是网页元素默认的布局/排列方式,元素按它们在html文档中的书写顺序进行排列

display属性可以设置元素的内部外部显示类型

  • 外部显示类型Outside: 决定该元素在流式布局中的表现 。主要就是块级元素block和行内元素inline。
    • 块级元素: 总是完整占据一个整行,元素前后会自动添加”换行符” br
    • 行内元素: 总是随文字方向从左到右排列,并在到达了容器的边缘时自动换行显示
    • 行内块元素: 按行内元素规则排列,又可以按块级元素设置宽度和高度。
  • 内部显示类型Inside: 控制其子元素的布局 ,如table、flex和grid等。
    • 表格table: 按表格布局,这个有点意思,老师说表格布局,我还以为table标签呢。可以快速解决等高列问题
    • 弹性flex: 弹性布局,不用说了,小程序和APP端推荐布局。
    • 网络grid: 相比flex更强大的布局方式,flex可以看成一维,而grid是二维,从一定角度上讲,可以看成table布局和flex布局的整合。
  • 特定显示类型: 有些布局模型(如table和ruby)有着复杂的内部结构,因此它们的子元素可能扮演着不同的角色。这一类关键字就是用来定义这些“内部”显示类型,并且只有在这些特定的布局模型中才有意义。
    • table-x: 表格布局相关的内部类型,如本文下面用到的table-cell。
    • ruby-x: ruby相关的内部类型,目前没有接触,可以暂时忽略。
  • none: 将元素从文档流中中移除,这会导致该元素及其所有子代元素不再被屏幕访问。

这里主要列举了常用的,怎么使用和注意事项,在使用时会再说明。display更详细的可上mdn查询,

四、布局中box-sizing的注意事项和列间隙演示

W3C的盒模型宽度和高度默认是指内容content区,而在布局中我们则经常需要清除边框border和内边距padding将盒子撑开的影响,后来根据IE盒模型,W3C增加了box-sizing属性,开发者可以选择宽度和高度是否包括border和padding。一般建议清除样式中要包括box-sizing:border-box。即

  1. <!-- 建议盒模型清除的样式 -->
  2. *{
  3. margin:0;
  4. padding:0;
  5. border:none;
  6. outline:none;
  7. box-sizing:border-box;
  8. }

display行内块元素的间隙问题: 老师讲课时使用浮动float来解决了块元素的横向布局,不过我对浮动不兴趣,于是想到display的行内块元素解决,不过发现行内块(目前测试了inline-block或inline-flex)水平方向总是存在间隙,导致不是我想要的布局。

  • 水平间隙清除: 在父级加上font-size:0;此时在元素要重新设置font-size,否则继承父级字号就不对。
  • 垂直间隙清除: 一种是通过在元素上加vertical-align:bottom;另一种是元素中有文字时不会生成垂直间隙。

目前列间隙解决方案有两种:一种是将间隙按百分比计算,另一种就是通过calc()+百分比+em灵活控制间隙。后者相比于前者更灵活。

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. border: none;
  6. outline: none;
  7. box-sizing: border-box;
  8. }
  9. header {
  10. background-color: #0072b0;
  11. color: white;
  12. padding: 0.5em 1em;
  13. border-radius: 0.5em;
  14. margin-bottom: 1em;
  15. }
  16. .container { font-size: 0;/* 解决行内块水平间隙问题 */ }
  17. .main,
  18. .sidebar,
  19. .widget {
  20. display: inline-block;
  21. font-size: 1rem;/* 解决行内块水平间隙问题 */
  22. vertical-align: top;/* 解决行内块不是顶端对齐,默认是底部对齐 */
  23. background-color: lightcyan;
  24. padding: 1.5em;
  25. }
  26. /* 一、百分比实现列间隙 */
  27. /* .main{width: 70%;}
  28. .sidebar{width:29%;margin-left: 1%;} */
  29. /* 二、百分比+em实现列间隙 */
  30. .main { width: calc(70% - 0.5em); margin-right: 0.5em; }
  31. .sidebar { width: calc(30% - 0.5em); margin-left: 0.5em; }
  32. </style>
  33. <header>
  34. <h1>
  35. 列间隙
  36. <small>display行内块和box-sizing</small>
  37. </h1>
  38. </header>
  39. <div class="container">
  40. <main class="main">
  41. <h2>欢迎加入战队</h2>
  42. <p>
  43. <a href="https://w3techs.com/">w3techs</a>
  44. 统计,目前全球Web开发领域,php仍以78.8%占有率,傲视所有对手, 那些天天唱衰PHP的家伙们被啪啪打脸
  45. </p>
  46. </main>
  47. <aside class="sidebar">
  48. <div class="widget"></div>
  49. <div class="widget"></div>
  50. </aside>
  51. </div>

列间隙

五、等高列的解决方案一:table布局

上例中左边和右边是不等高,这就涉及到元素高度的溢出问题 。在实际开发过程中,程序员通常不会直接去定义元素的一个高度,在普通文档流中,根据阅读的习惯,屏幕的宽度是受限,而高度不受限 。所以,容器高度一般由内容决定,而不是由用户来决定。对于元素高度的溢出问题处理的属性就是overflow。

元素高度溢出处理overflow

  • 默认值visible: 就是溢出显示超过元素高度的内容。
  • hidden: 溢出内容裁切,不显示溢出的内容。
  • scroll: 对溢出内容不改变宽度或高度情况下,通过设置overflow-x:scroll、overflow-y:scroll和overflow:scroll,实现滚动查看溢出内容。
  • auto: 当内容溢出时,显示滚动条,否则就不显示

这里要注意下表格间隙问题,课中老师是使用border-spacing来实现的,因为表格没有margin了,然后通过在外套一层容器,通过容器的margin取负值拉伸来调整达到100%,不过又产生一个问题是底部横向出现滚动条,明显这不是我们想要的。border-spacing设置间隙时不能控制左右或上下,只能是横向或竖向,而相近的border则可以任意控制上、下、左或右,那么表格布局中border是否还有效呢?经测试有效,于是改进方案就是通过border来设置间隙可以完善解决问题。

  • 为了平衡,我设置了左侧的右边框和右侧的左边框为间隙的一半。
  • 背景裁切backgrond-clip要修改为padding-box,不能是默认的border-box,否则背景色或背景图延伸到边框,就看不到边框产生的间隙了。
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. border: none;
  6. outline: none;
  7. box-sizing: border-box;
  8. }
  9. header {
  10. background-color: #0072b0;
  11. color: white;
  12. padding: 0.5em 1em;
  13. border-radius: 0.5em;
  14. margin-bottom: 1em;
  15. }
  16. .main,
  17. .sidebar,
  18. .widget {
  19. background-color: #0072b0;
  20. background-clip: padding-box;
  21. color: white;
  22. padding: 0.5em 1em;
  23. vertical-align: top;
  24. }
  25. /* table布局实现等高列 */
  26. .container {
  27. display: table;
  28. /* 表格宽高默认由内容决定,并不会像块元素那样充满父级容器的全部空间 */
  29. width: 100%;
  30. /* 表格中不支持margin; 列间隙/单元格间隙*/
  31. /* 经测试使用此间隙,再通过外套margin取负值拉伸,结果在横向出现滚动条 */
  32. /* border-spacing: 1em; */
  33. }
  34. .main,
  35. .sidebar {
  36. /* 转为单元格之后就默认等高了,于是等高列就实现了 */
  37. display: table-cell;
  38. }
  39. /* 列间隙通过边框border来实现,可以灵活调整上下左右,而不像border-spacing那么死只能横向或竖向 */
  40. /* #十六进制表示颜色,前6位就是我们常用的RGB,最后两位是透明度,有00-ff个透明选择 */
  41. .main {
  42. width: 70%;
  43. border-right: 0.5em solid#ffffff00;
  44. }
  45. .sidebar {
  46. width: 30%;
  47. border-left-width: 0.5em solid #ffffff00;
  48. }
  49. </style>
  50. </style>
  51. <header>
  52. <h1> 等高列解决方案一:table布局</h1>
  53. </header>
  54. <div class="container">
  55. <main class="main">
  56. <h2>欢迎加入战队</h2>
  57. <p>
  58. <a href="https://w3techs.com/">w3techs</a>
  59. 统计,目前全球Web开发领域,php仍以78.8%占有率,傲视所有对手, 那些天天唱衰PHP的家伙们被啪啪打脸
  60. </p>
  61. </main>
  62. <aside class="sidebar">
  63. <div class="widget"></div>
  64. <div class="widget"></div>
  65. </aside>
  66. </div>

等高列

六、等高列的解决方案二:flex布局

现在最流行的flex布局实现等高列就更简单了,几行CSS样式就完美解决,默认行中所有列都是等高的,而且没有滚动条的烦恼。

  1. .main,
  2. .sidebar,
  3. .widget {
  4. background-color:brown;
  5. color: white;
  6. padding: 0.5em 1em;
  7. }
  8. /* flex布局 */
  9. .container {
  10. display: flex;
  11. justify-content: space-between;
  12. }
  13. .main {
  14. flex: 0 0 70%;
  15. background-color: #0072b0;
  16. }
  17. .sidebar {
  18. flex: 0 0 29%;
  19. background-color: #0072b0;
  20. }
  21. <header>
  22. <h1>等高列解决方案二:flex布局</h1>
  23. </header>
  24. <div class="container">
  25. <main class="main">
  26. <h2>欢迎加入战队</h2>
  27. <p>
  28. <a href="https://w3techs.com/">w3techs</a>
  29. 统计,目前全球Web开发领域,php仍以78.8%占有率,傲视所有对手, 那些天天唱衰PHP的家伙们被啪啪打脸
  30. </p>
  31. </main>
  32. <aside class="sidebar">
  33. <div class="widget"></div>
  34. <div class="widget"></div>
  35. </aside>
  36. </div>

flex等高列

学习后总结

  • display要深入探讨下,尤其是在布局中应用。如本文所说的table布局。
  • 自适应是适应多端的根本本要求,它们离不开相对单位、百分比和calc()和布局。
  • 无论行内块元素inline-block(或inline-flex)还是table布局,都存在间隙问题 。前者是默认存在,需要清除。后者不推荐使用border-spacing,具体说明见上面。这里推荐border来解决。
  • flex弹性布局在自适应布局上有先天优势,如等高、居中等问题都能很简便解决。
  • 等高列解决方案老师还讲了min-height和max-height,由于它只能适应固定尺寸,不符合现在自适应,这里就不推荐了。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议