博客列表 >页面元素居中方法探讨

页面元素居中方法探讨

吾逍遥
吾逍遥原创
2020年10月29日 18:40:211141浏览

一、页面元素居中的基础认识

相信页面元素居中是大家常用的需要,那么你有研究过怎么居中吗,首先我们要知道页面页面居中几个基础概念。

  • 容器: 其实它是Html中元素,不过只有块级元素行内块元素才可当容器。
  • 元素: 就是要居中的对象,可以是行内元素、行内块元素和块级元素
  • 元素类型 W3C定义了常用元素的类型,我们也可以通过display重新定义它的类型 ,如a链接元素默认是行内元素,可以定义它为行内块元素或块级元素。目前浮动float、定位position、table盒子(是display:table,而不是table元素)、flex盒子和grid盒子都默认将子元素转化为行内块元素 ,不论它之前是行内元素还是块级元素。
  • img元素 为什么单独提它,是因为百度时有人说它是行内块元素 ,因为它可以设置宽度和高度,有人说它是行内元素 ,因为在样式中显示inline(通过chrome开发者工具的Styles),那么到底它是什么类型?通过我实际测试,它呈现出来的是行内块元素特性 。虽然chrome开发者工具Styles显示它是inline行内元素,开始居中时就受它的误导。正如盒模型box-sizing:content-box一样,W3C开始定义的不被设计所接受,反而微软IE盒子(box-sizing:border-box)被大众所接受一样,它可能还要重新定义。

二、height和line-height二者的探讨

在说居中之前,我们必须弄清height和line-height二者区别,才有更好理解行内元素和行内块元素剧中的实现。

height

行高是指文本行基线间的垂直距离 , 基线(base line)并不是汉字文字的下端沿,而是英文字母“x”的下端沿。上图中两条红线之间的距离就是行高Height ,上行的底线和下一行顶线之间的距离就是行距,而同一行顶线和底线之间的距离是font-size的大小 ,行距的一半是半行距。下面演示了font-size、height和line-height的关系

  1. <style>
  2. .test {
  3. margin-bottom: 30px;
  4. text-align: center;
  5. border: 1px solid black;
  6. background: red;
  7. }
  8. .test1 {
  9. line-height: 0;
  10. }
  11. .test2 {
  12. line-height: 30px;
  13. }
  14. .test3 {
  15. height: 30px;
  16. line-height: 30px;
  17. }
  18. .test4 {
  19. height: 50px;
  20. line-height: 30px;
  21. }
  22. .test5 {
  23. height: 10px;
  24. line-height: 30px;
  25. }
  26. .test6{
  27. font-size: 50px;
  28. line-height: 30px;
  29. }
  30. .test7{
  31. font-size: 50px;
  32. height: 30px;
  33. }
  34. </style>
  35. <div class="test test1">line-height为0</div>
  36. <div class="test test2">只设置line-height,没设置height,则height取line-height</div>
  37. <div class="test test3">line-height和height相等时</div>
  38. <div class="test test4">line-height小于height时</div>
  39. <div class="test test5">line-height大于height时</div>
  40. <div class="test test6">font-size大于line-height时</div>
  41. <div class="test test7">font-size大于height时</div>

height-test

高度和行高总结:

  • line-height是透明的 ,它决定内容垂直对齐方式,默认是baseline。
  • height是受背景色影响的
  • 垂直居中 其实vertical-align等于middle就居中了,而我们平常所说的垂直居中是视觉居中 。就是height和line-height相等时,它们区域重叠,此时垂直居中就在视觉上也居中了。

特别说明: line-height是继承属性,就时说它会继承父元素的line-height

三、行内元素和行内块元素居中探讨

有了上面基础认识后,再说行内元素和行内块元素居中就好理解多了。行内元素和行内块元素居中涉及三个属性:text-align、line-height和vertical-align。下面是我总结的

  • 水平居中: 无论是行内元素或行内块元素,水平居中只要 容器(父元素) 的text-align:center就可以了。
  • 垂直居中: 分为行内元素和行内块元素
    • 行内元素垂直居中:容器(父元素)的line-height等于其的高度height就实现垂直居中。
    • 行内块元素垂直居中:①同行内元素垂直居中,将容器line-height等于其height②行内块元素设置vertical-align:middle就实现了垂直居中。
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. border: none;
  6. outline: none;
  7. box-sizing: border-box;
  8. }
  9. .container {
  10. width: 100vw;
  11. height: 100vh;
  12. color: #333;
  13. }
  14. .box {
  15. margin-bottom: 2em;
  16. }
  17. /* 行内元素水平居中和垂直居中 */
  18. .box p {
  19. background-color: cadetblue;
  20. height: 10em;
  21. text-align: center;
  22. line-height: 10em;
  23. }
  24. .box .in-block {
  25. width: 50vw;
  26. }
  27. /* 图片垂直居中 */
  28. img {
  29. vertical-align: middle;
  30. }
  31. </style>
  32. <div class="container">
  33. <div class="box">
  34. <p class=""><span>页面元素居中方法探讨</span></p>
  35. </div>
  36. <div class="box">
  37. <p class="in-block"><span>页面元素居中方法探讨</span></p>
  38. </div>
  39. <div class="box">
  40. <p class="">
  41. <img src="banner_img.jpg" alt="" height="70%" />
  42. </p>
  43. </div>
  44. <div class="box">
  45. <p class="in-block">
  46. <img src="banner_img.jpg" alt="" height="70%" />
  47. </p>
  48. </div>
  49. </div>

inline-center

四、块级元素居中探讨

块级元素水平居中一般是margin:auto闵可以了,垂直居中先介绍下定位实现的垂直居中,详细分析见我的博文https://www.php.cn/blog/detail/24594.html

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. }
  5. .wrapper {
  6. display: flex;
  7. justify-content: space-around;
  8. margin-top: 50px;
  9. margin-bottom: 100px;
  10. }
  11. /* 一、父元素未指定高度 */
  12. .container {
  13. background-color: lightgray;
  14. position: relative;
  15. }
  16. /* 二、父元素指定高度 */
  17. .con-fixed{
  18. width:40vw;
  19. height: 30vh;
  20. }
  21. /* 1.元素未指明宽和高,即都是width:auto;height:auto; */
  22. .box {
  23. position: absolute;
  24. left: 0;
  25. top: 0;
  26. right: 0;
  27. bottom: 0;
  28. }
  29. /* 2.元素指明宽度 */
  30. .box-fixed {
  31. width:20vw;
  32. height: 10vh;
  33. }
  34. /* margin百分比和auto */
  35. .auto {
  36. background-color: #007d20;
  37. opacity: 0.9;
  38. margin: auto;
  39. }
  40. .per {
  41. background-color: lightsalmon;
  42. opacity: 0.9;
  43. margin: 5%;
  44. }
  45. </style>
  46. <div class="wrapper">
  47. <div class="container">
  48. <h1>未指明父元素宽度和高度</h1>
  49. <h1>未指明父元素宽度和高度</h1>
  50. <div class="box auto">未指明元素宽高,即都为auto,margin也是auto</div>
  51. <div class="box per">未指明元素宽高,即都为auto,margin是百分比</div>
  52. </div>
  53. <div class="container">
  54. <h1>未指明父元素宽度和高度</h1>
  55. <h1>未指明父元素宽度和高度</h1>
  56. <div class="box box-fixed auto">元素宽度为20vw,高度为10vh,margin是auto</div>
  57. <div class="box box-fixed per">元素宽度为20vw,高度为10vh,margin是百分比</div>
  58. </div>
  59. </div>
  60. <div class="wrapper">
  61. <div class="container con-fixed">
  62. <h1>父元素宽度为40vw,高度为30vh</h1>
  63. <h1>父元素宽度为40vw,高度为30vh</h1>
  64. <div class="box auto">未指明元素宽高,即都为auto,margin也是auto</div>
  65. <div class="box per">未指明元素宽高,即都为auto,margin是百分比</div>
  66. </div>
  67. <div class="container con-fixed">
  68. <h1>父元素宽度为40vw,高度为30vh</h1>
  69. <h1>父元素宽度为40vw,高度为30vh</h1>
  70. <div class="box box-fixed auto">元素宽度为20vw,高度为10vh,margin是auto</div>
  71. <div class="box box-fixed per">元素宽度为20vw,高度为10vh,margin是百分比</div>
  72. </div>
  73. </div>

垂直居中

五、table盒子、flex盒子和grid盒子实现居中

正如开始所说table盒子、flex盒子和grid盒子将子元素转化为行内块元素,但它们的居中了除了table盒子外建议不要使用vertical-align,我也没测试,因为它们本身居中属性。

flex居中看我的博文https://www.php.cn/blog/detail/24616.html

grid居中目前还没写,可以关注我的博客

再推荐一篇我写的博文《盒模型中的百分比和auto探讨及居中的应用》https://www.php.cn/blog/detail/24594.html ,其中探讨了单位,也探讨了部分居中问题。

六、居中总结

写了这么多方法,相信你和我一样有点模糊,什么时候用那个要怎么介定,其实这个问题是在我去饭堂路上的想到的,这里说下我的总结:

  • 居中方式: 分为普通文档流居中非普通文档流居中

    • 普通文档流居中: 使用普通文档流中对齐属性 ,常见如text-align、line-height、vertical-align和margin。
    • 非普通文档流居中: 当元素脱离普通文档流后,再单独使用上面对齐属性就达不到居中效果了,此时需要结合转变成非普通文档流的方式的相应属性,如定位中left、top等、flex和grid的对齐属性。
  • 几个特例:

    • 块级元素 块级元素是普通文档流中元素,水平居中可以使用普通文档流方式margin,而垂直居中可以普通文档流的对齐属性如margin和padding,但这种方法只适用比较固定情况下,而动态时实现计算比较困难。此时我们一般将它转换为非普通文档流进行居中
    • img元素 它是比较特殊的元素,虽然上面我讲尽管W3C定义它为行内元素,但它要按行内块元素方式居中
    • 行内块元素和BFC 至于BFC(块格式化上下文)的探讨见https://www.php.cn/blog/detail/24616.html,记得我文章开头说行内块元素可以使用普通文档流对齐属性,而flex、grid、float、position都是将普通元素转换成BFC ,但它 不是普通文档流中行内块元素 ,它是 “独立王国”的行内块元素 ,它不属于普通文档流,所以要使用它们自己的属性来居中。

到这里页面元素居中探讨就基本结束了,加上我的博文《盒模型中的百分比和auto探讨及居中的应用》https://www.php.cn/blog/detail/24594.html 应该可以解决大多数居中问题,其它居中实现可以参考上面思路实现。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议