博客列表 >css 盒模型的 box-sizing 属性以及仅用 css 完成元素居中的方法

css 盒模型的 box-sizing 属性以及仅用 css 完成元素居中的方法

祥子弟弟
祥子弟弟原创
2020年12月21日 17:06:03642浏览

一、box-sizing 属性

通常我们认为的盒子是由 width(宽)和 height(高)设置的,一旦两个属性设置好之后就不会变化了。但是在 html 中盒子不仅具有 width 和 height 属性,它的实际大小还会受到 padding(内边距)和 border(边框)的影响。
默认情况下,盒子的 width 和 height 是不包含 padding 和 border 的,所以当你不去刻意的设置的时候,你所得到的盒子大小总会与你想要的不符。我们可以设置两个盒子,来观察一下它们的实际表现。

演示:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>box-sizing</title>
  6. </head>
  7. <body>
  8. <div class="box">
  9. <div></div>
  10. </div>
  11. </body>
  12. </html>

这里我们使用两个盒子来观察 padding 属性和 border 属性对盒子大小的影响。

  1. :root {
  2. font-size: 10px;
  3. }
  4. * {
  5. padding: 0;
  6. margin: 0;
  7. }
  8. .box {
  9. background-color: skyblue;
  10. border: 5px solid yellow;
  11. /* 宽 */
  12. width: 20em;
  13. /* 高 */
  14. height: 15em;
  15. /* 这里设置成水平居中,有利于观察 */
  16. margin: auto;
  17. }
  18. /* 设置子盒子的宽度为父盒子的100%,用来观察盒子大小的变化。 */
  19. .box div {
  20. background-color: green;
  21. width: 20em;
  22. height: 5em;
  23. }

效果如下:

我们可以看到的是 child 此时是占据了 parent 的内容区,之后我们在给它添加上 padding 和 border 看看效果。

  1. .box div {
  2. padding: 2em;
  3. border: 5px solid blue;
  4. }

效果如下:

可以看到的是加上了 padding 和 border 之后,子盒子的大小瞬间就超出了父盒子,这就与我们所预期想要的结果不符了。我们想要的是第一种效果的样子。我们可以怎么解决这个问题呢?

  1. 使用计算公式
    可以想到的是,既然它会自动的加上 padding 和 border 的值,那我们减去不就好了,我们可以试一下这种方法。此时盒子尺寸的计算方式:width/height + padding*2 + border*2。
  1. .box div {
  2. width: calc(20em - 50px);
  3. height: calc(5em - 50px);
  4. }

显示效果如下:

可以看到的是,我们如愿以偿的让子元素的大小变成了我们希望的样子。这证明用这个方法是完全行的通的,不过每次都需要去计算大小,好麻烦的样子,这时候就引出了 box-sizing 属性。

  1. 使用 box-sizing 属性

box-sizing 属性有两个值,分别是 content-box 和 border-box

  • ontent-box
    这是 CSS 标准指定的初始值和默认值。width 和 height 属性包括的内容,但不包括填充,边框。例如,.box {width: 350px; border: 10px solid black;}渲染一个 370px 宽的框。
    在这里,元素的尺寸计算为:width =内容的宽度,height =内容的高度。(边界和填充不包括在计算中。)
  • border-box
    width 和 height 属性包括内容,填充和边框。请注意,填充和边框将在框内。例如,.box {width: 350px; border: 10px solid black;}渲染一个 350px 宽的框,内容区域为 330px 宽。内容框不能为负,且底限为 0,因此无法使用 border-box 该元素使元素消失。
    在这里,元素的尺寸计算为:width =边框+填充+内容的宽度,height =边框+填充+内容的高度。

有了 box-sizing 属性,就可以不用那么麻烦的取计算了,以后就将 width: calc(20em - 50px);height: calc(5em - 50px);这两个值直接换成 box-sizing:border-box;就行了。

二、元素居中的实现

  1. 行内和行内块元素的居中
  • 水平居中

行内元素和行内块元素水平居中,设置盒子的 text-align 属性就行

示例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>box-sizing</title>
  6. </head>
  7. <body>
  8. <div class="box">
  9. <a href="">链接</a>
  10. <img src="img/1.png" width="150px" alt="" />
  11. <div></div>
  12. </div>
  13. </body>
  14. </html>
  1. .box {
  2. width: 15em;
  3. height: 15em;
  4. border: 1px solid #111;
  5. }
  6. .box {
  7. text-align: center;
  8. }

效果如下:

可以看到的是,“链接”处在水平居中的位置。

块元素的水平居中要使用 margin 属性来对盒子进行挤压达到居中的效果。

  1. .box > div {
  2. width: 5em;
  3. height: 5em;
  4. background-color: skyblue;
  5. }
  6. .box > div {
  7. /* margin-right: auto;
  8. margin-left: auto; */
  9. margin: 0 auto;
  10. }

可以看到效果如图:

  • 垂直居中

行内元素不能设置自己的宽高,只能设置容器的宽高,所以设置盒子的 line-height 属性和盒子的高度一样,就可以实现居中效果。line-height 属性的值必须和 height 的值一样。

  1. .box {
  2. line-height: 15em;
  3. }

效果如图:

行内块元素的垂直居中要按照块元素的水平居中处理,块元素的垂直居中问题是由 padding 解决的,通过不设置盒子的高度,使用 padding 属性撑开,就可以实现垂直居中。

例子:

  1. .box {
  2. width: 15em;
  3. /* 不要设置高度,高度由padding挤出来 */
  4. /* height: 15em; */
  5. border: 1px solid #111;
  6. }
  7. /* 行内元素不能设置自己的宽高,只能设置容器的宽高 */
  8. .box a {
  9. /* 行内元素line-height属性的值和父级元素的行高一样,就可以实现居中 */
  10. line-height: 15em;
  11. }
  12. /* 行内块元素属于块元素范畴,line-height属性不起作用 */
  13. .box {
  14. padding: 5em 0;
  15. }
  16. .box > div {
  17. background-color: skyblue;
  18. width: 5em;
  19. height: 5em;
  20. /* margin: auto; */
  21. }

效果如图所示:

  • 水平和垂直都居中

行内元素的水平且垂直居中通过设置 text-align 和 line-height 属性实现

示例:

  1. .box {
  2. text-align: center;
  3. line-height: 15em;
  4. }

效果如图:

块元素的水平垂直居中,使用 margin 实现绝对定位。

示例:

  1. .box {
  2. /* 容器定位,转为定位元素 */
  3. position: relative;
  4. }
  5. .box div {
  6. /* 进行绝对定位(对块元素定位) */
  7. position: absolute;
  8. top: 0;
  9. left: 0;
  10. bottom: 0;
  11. right: 0;
  12. margin: auto;
  13. }

效果显示:

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