Blogger Information
Blog 54
fans 6
comment 31
visits 107497
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
页面元素居中方法探讨
吾逍遥
Original
1143 people have browsed it

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

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

  • 容器: 其实它是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 应该可以解决大多数居中问题,其它居中实现可以参考上面思路实现。

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post