Blogger Information
Blog 45
fans 3
comment 0
visits 45860
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
盒模型与元素对齐方式
残破的蛋蛋
Original
838 people have browsed it

盒模型与对齐方式

box-sizing

在CSS中,box-sizing属性定义了用户代理(浏览器)应该如何计算一个元素的总宽度和总高度。

通常情况下,在默认的CSS盒模型定义里,一个元素的宽(width)高(height)只会应用到当前元素的内容区里。如果这个元素有padding(内边距)或border(边框),那么这个盒子在显示的时候,宽高会加上内边距和边框的值。这就意味着我们在布局的时候,需要时刻主要到这个盒子的内边距和边框,尤其是在使用响应式布局的时候,这点非常烦人。因此,w3c给出了一个新属性,box-sizing,它可以被用来调整这些烦人的特点。

box-sizing有两个值:

  • content-box: 默认值,元素的宽高只用到内容区,在该元素的宽高之外绘制内边距和边框。
    尺寸计算公式:
    width = 内容区的宽度
    height = 内容区的高度
    宽度和高度的结果值都不包含内边距(padding)和边框(border)

  • border-box: 元素的内边距和元素宽高都是包含在宽高内的。
    尺寸计算公式:
    width = 内容区的宽度 + padding + border
    height = 内容区的高度 + padding +border

以下是根据box-sizing不同的值渲染出来的元素尺寸:

  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. <title>box-sizing:不同值渲染的元素</title>
  7. <style>
  8. html {
  9. font-size: 10px;
  10. }
  11. div.box {
  12. width: 20em;
  13. height: 12em;
  14. padding: 2em;
  15. border: 5px solid red;
  16. background-color: violet;
  17. }
  18. .content-box {
  19. box-sizing: content-box;
  20. margin-bottom: 5em;
  21. }
  22. .border-box {
  23. box-sizing: border-box;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <div class="box content-box"></div>
  29. <div class="box border-box"></div>
  30. </body>
  31. </html>
  • 效果图:
    效果图
    box-sizing

从上图可以看出,content-box和border-box的总宽高的值是不一样的。当属性值为content-box时的总宽高:

  • width:200 + 20x2 + 5x2 = 250px
  • height: 120 + 20x2 + 5x2 = 170px

当属性值为border-box时的总宽高:

  • width:150 + 20x2 + 5x2 = 200px
  • height: 70 + 20x2 + 5x2 = 120px

这里有一点值得注意的是,我在写这个demo的时候为了方便区分两个盒模型,我在第一个box上加了一个margin-bottom,但是我发现这个margin-bottom貌似并不影响这个宽高的结果,不论box-sizing的值是哪个。后来我在MDN上得到了结果,确定了我的猜想是正确的。

元素居中方式

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

  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. <title>元素居中问题</title>
  7. <style>
  8. html {
  9. font-size: 1em;
  10. }
  11. .box {
  12. width: 15rem;
  13. height: 10rem;
  14. border: 1px solid #000;
  15. box-sizing: border-box;
  16. }
  17. .box {
  18. text-align: center;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <!-- 行内元素、行内块元素的水平居中 -->
  24. <div class="box">
  25. <a href="">Hello World!</a>
  26. <img src="https://img.php.cn/upload/course/000/117/584/5aa8cd08b9cf9363.jpg" width="150" alt="">
  27. </div>
  28. </body>
  29. </html>
  • 效果图:
    行内元素水平居中

2.行内元素的垂直居中:

  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. <title>元素居中问题</title>
  7. <style>
  8. html {
  9. font-size: 16px;
  10. }
  11. .box {
  12. width: 15em;
  13. height: 10em;
  14. border: 1px solid #000;
  15. box-sizing: border-box;
  16. }
  17. .box {
  18. text-align: center;
  19. }
  20. .box a {
  21. line-height: 10em;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <div class="box">
  27. <a href="">Hello World!</a>
  28. </div>
  29. </body>
  30. </html>
  • 效果图:
    行内元素垂直居中

  • 注意:如果要想使行内元素垂直居中,只需要将line-height的值设置成等于height的值就可以了。但是,这个方法对于行内块元素是无效的,需要注意。

3.垂直居中问题-padding:

  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. <title>垂直居中问题:padding</title>
  7. <style>
  8. html {
  9. font-size: 16px;
  10. }
  11. /* padding是最简单的方式 */
  12. .box {
  13. width: 15em;
  14. /* 不要给高度,这个高度应该由padding挤出来 */
  15. /* height: 10em; */
  16. border: 1px solid #000;
  17. }
  18. .box {
  19. padding: 5em 0;
  20. }
  21. .box > div {
  22. width: 5em;
  23. height: 5em;
  24. background-color: greenyellow;
  25. margin: 0 auto;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div class="box">
  31. <div></div>
  32. </div>
  33. </body>
  34. </html>
  • 效果图:
    padding

3.水平且垂直

1.行内元素的水平垂直居中:text-align + line-height

  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. <title>行内元素的水平垂直居中</title>
  7. <style>
  8. /* 行内元素的水平垂直居中 */
  9. /* text-align:center + line-height */
  10. .box {
  11. width: 15em;
  12. height: 10em;
  13. border: 1px solid #000;
  14. box-sizing: border-box;
  15. }
  16. .box {
  17. text-align: center;
  18. line-height: 10em;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div class="box">
  24. <a href="">Hello World!</a>
  25. </div>
  26. </body>
  27. </html>
  • 效果图:
    行内元素垂直居中

2.padding实现水平和垂直居中

  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. <title>padding实现水平和垂直居中</title>
  7. <style>
  8. .box {
  9. width: auto;
  10. height: auto;
  11. padding: 5em;
  12. text-align: center;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div class="box">
  18. <a href="">Hello World!</a>
  19. </div>
  20. </body>
  21. </html>
  • 效果图:
    padding

3.margin实现水平垂直居中

  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. <title>margin实现水平垂直居中</title>
  7. <style>
  8. .box {
  9. width: 15em;
  10. height: 10em;
  11. border: 1px solid #000;
  12. box-sizing: border-box;
  13. position: relative;
  14. }
  15. .box div {
  16. position: absolute;
  17. top: 0;
  18. left: 0;
  19. right: 0;
  20. bottom: 0;
  21. margin: auto;
  22. }
  23. .box > div {
  24. width: 5em;
  25. height: 5em;
  26. background-color: greenyellow;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div class="box">
  32. <div></div>
  33. </div>
  34. </body>
  35. </html>
  • 效果图:
    padding
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
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