盒子模型

盒子大小的初始计算

盒子宽度 = 左边框 + 内容的宽度 + 右边框
盒子高度 = 上边框 + 内容的宽度 + 下边框

出现的问题
设置border之后,盒子尺寸会被撑大
解决
计算多余的大小,手动在内容中减去(手动内减)

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. div{
  8. width: 190px;/* 这里设置的宽度其实是设置盒子内容区域的宽度 */
  9. height: 190px;
  10. background: pink;
  11. /* 添加边框 之后盒子的尺寸发生了变化
  12. 盒子实际尺寸(宽度) = 左边框 + 内容的宽度 + 右边框
  13. = 5+190+5
  14. = 200
  15. 结论:设置border会把盒子撑大
  16. 解决:使用手动内减的方式,也就是后面再把盒子内容区域 改为190px
  17. */
  18. border: 5px solid green;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div></div>
  24. </body>

内边距padding

作用
设置边框与内容区域之间的距离
记忆规则
从上开始赋值,然后顺时针赋值,如果没有赋值的话,看对面的
只给某一方向设置
padding-方位词:像素值

  1. <style>
  2. div{
  3. width: 100px;
  4. height: 100px;
  5. background: pink;
  6. /* 内边距 */
  7. /* padding: 10px; *//* 设置的是上右下左的内边距 */
  8. /* padding: 10px 20px; *//* 上下10 左右20 */
  9. /* padding: 10px 20px 30px; *//* 上10 右20 下30 左没有设置看对面20 */
  10. /* padding: 10px 20px 30px 40px; *//* 上10 右20 下30 左40 顺时针方向 */
  11. /* 记忆的规律:从上开始赋值,然后顺时针赋值,如果没有赋值的话,看对面的 */
  12. /* 只给左边设置内边距 */
  13. padding-left: 10px;
  14. }
  15. </style>

盒子大小的最终计算方式

盒子宽度 = 左边框 + 左内边距 + 内容的宽度 + 右内边距 + 右边框
盒子高度 = 上边框 + 上内边距 + 内容的宽度 + 下内边距 +下边框

出现的问题
设置padding之后,盒子尺寸也会被撑大
解决
计算多余的大小,手动在内容中减去(手动内减)

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. div{
  8. width: 240px;/* 其实设置是内容区域的宽度 */
  9. height: 240px;/* 其实设置是内容区域的高度 */
  10. background: pink;
  11. /* 设置边框会撑大盒子 */
  12. border: 10px solid black;
  13. /* 设置内边距也会撑大盒子 */
  14. padding: 20px;
  15. /* 盒子的尺寸的终极计算公式
  16. 宽度= 左边框 + 左内边距 + 内容宽度 + 右内边距 + 右边框
  17. = 10 + 20 + 300 + 20 + 10
  18. = 360
  19. 方式一:手动内减 将盒子的内容区域的宽高-60
  20. */
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <!-- 盒子的尺寸是300*300,背景是粉红色,边框是10黑实线,上下左右的内边距是20,怎么做 -->
  26. <div></div>
  27. </body>

盒子尺寸自动内减

做法
给盒子设置属性 box-sizing: border-box;

好处
浏览器会自动计算多余大小,自动在内容区域中减去,比手动内减方便

  1. <style>
  2. div{
  3. width: 300px;/* 其实设置是内容区域的宽度 */
  4. height: 300px;/* 其实设置是内容区域的高度 */
  5. background: pink;
  6. /* 设置边框会撑大盒子 */
  7. border: 10px solid black;
  8. /* 设置内边距也会撑大盒子 */
  9. padding: 20px;
  10. /* 盒子的尺寸的终极计算公式
  11. 宽度= 左边框 + 左内边距 + 内容宽度 + 右内边距 + 右边框
  12. = 10 + 20 + 300 + 20 + 10
  13. = 360
  14. 方式二:自动内减
  15. */
  16. box-sizing: border-box;/* 浏览器会自动计算多余大小,自动在内容区域中减去 */
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <!-- 盒子的尺寸是300*300,背景是粉红色,边框是10黑实线,上下左右的内边距是20,怎么做 -->
  22. <div></div>
  23. </body>

盒子不会被撑大的特殊情况

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. .father{
  8. width: 200px;
  9. height: 200px;
  10. background: pink;
  11. }
  12. .son{
  13. /* 1,块级元素宽度不设置,默认占满父元素一行 */
  14. height: 100px;/* 高度是父元素的一半 */
  15. background: skyblue;
  16. /* 设置boder和pading看会不会被撑大 */
  17. border-left: 10px solid green;
  18. border-right: 10px solid green;
  19. padding: 0 20px;
  20. /* 原因:主要是我们没有设置子元素的宽度,他的内容宽度可以根据情况自动调节*/
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <div class="father">
  26. <div class="son"></div>
  27. </div>
  28. </body>

外边距margin

作用
设置边框以为的,盒子与盒子之间的距离
记忆规则
从上开始赋值,然后顺时针赋值,如果没有赋值的话,看对面的
只给某一方向设置
margin-方位词:像素值

  1. <style>
  2. body{
  3. margin: 0;/* 去掉body默认外边距的影响 */
  4. }
  5. div{
  6. width: 100px;
  7. height: 100px;
  8. background: pink;
  9. /* 设置div的外边距 */
  10. /* margin: 10px; *//* 上右下左10 */
  11. /* margin: 10px 20px; *//* 上下10 左右20 */
  12. /* margin: 10px 20px 30px; *//* 上10 右20 下30 左20*/
  13. /* margin: 10px 20px 30px 40px; *//* 上10 右20 下30 左40*/
  14. /* 设置单一方向上的margin */
  15. margin-left: 20px;/* 盒子会往右边移动 */
  16. }
  17. </style>

清除默认的内边距

应用场景:浏览器会默认给部分标签设置默认的margin和padding
但是我们其实不是不需要的,一般在项目开始前就需要先清除这些标签的默认样式

例如:
body标签默认有margin : 8
p标签 默认有上下margin
ul标签 默认有上下的margin 和 padding-left

常见的两种设置方式
blockquote, body, button, dd, dl, dt, fieldset, form, h1, h2, h3, h4, h5, h6, hr, input, legend, li, ol, p, pre, td, textarea, th, ul {
margin: 0;
padding: 0;
}
——————————
* {
margin: 0;
padding: 0;
}

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. body{
  8. margin: 0;
  9. }
  10. p{
  11. margin: 0;
  12. }
  13. ul{
  14. list-style: none;
  15. margin: 0;
  16. padding: 0;
  17. }
  18. blockquote, body, button, dd, dl, dt, fieldset, form, h1, h2, h3, h4, h5, h6, hr, input, legend, li, ol, p, pre, td, textarea, th, ul {
  19. margin: 0;
  20. padding: 0;
  21. }
  22. * {
  23. margin: 0;
  24. padding: 0;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <p>我是段落</p>
  30. <p>我是段落</p>
  31. <p>我是段落</p>
  32. <p>我是段落</p>
  33. <p>我是段落</p>
  34. <ul>
  35. <li>无序列表</li>
  36. <li>无序列表</li>
  37. <li>无序列表</li>
  38. <li>无序列表</li>
  39. <li>无序列表</li>
  40. <li>无序列表</li>
  41. <li>无序列表</li>
  42. <li>无序列表</li>
  43. <li>无序列表</li>
  44. <li>无序列表</li>
  45. </ul>
  46. </body>

外边距正常的情况

场景
水平布局的盒子,左右的margin正常,互不影响
结果
最终两者间距为左右margin的和

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. *{
  8. margin: 0;
  9. padding: 0;
  10. }
  11. div{
  12. display: inline-block;
  13. width:300px;
  14. height: 300px;
  15. }
  16. .c1{
  17. background: red;
  18. margin-right: 100px;
  19. }
  20. .c2{
  21. background: blue;
  22. margin-left: 100px;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <div class="c1"></div><div class="c2"></div>
  28. </body>

外边距合并的情况

场景
垂直布局的块级元素,上下的margin会合并
结果
最终两者的距离为margin的最大值
解决方法
避免就好
只给其中一个盒子设置margin就行

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. *{
  8. margin: 0;
  9. padding: 0;
  10. }
  11. div{
  12. width:300px;
  13. height: 300px;
  14. }
  15. .c1{
  16. background: red;
  17. margin-bottom: 200px;
  18. }
  19. .c2{
  20. background: blue;
  21. /* margin-top: 100px; */
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <div class="c1"></div><div class="c2"></div>
  27. </body>

外边距塌陷的情况

场景
互相嵌套的块级元素,子元素的margin-top作用在父元素上
结果
导致父元素一起往下移动
解决方法
1,给父元素设置border-top或者padding-top(分隔父子元素的margin-top)
2,给父元素设置 overflow:hidden
3,转成行内块元素
4,设置浮动(推荐)

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. .father{
  8. width: 400px;
  9. height: 400px;
  10. background: pink;
  11. /* border-top: 1px solid black; */
  12. /* padding-top: 1px; */
  13. /* overflow: hidden; */
  14. /* display: inline-block; */
  15. float: left;
  16. }
  17. .son{
  18. width: 100px;
  19. height: 100px;
  20. background: skyblue;
  21. margin-top: 100px;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <div class="father">
  27. <div class="son"></div>
  28. </div>
  29. </body>

行内元素margin和padding无效情况

场景:
给行内元素设置margin和padding
结果:
水平方向的 margin和padding布局有效
垂直方向的 margin和padding布局无效

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. div{
  8. width:500px;
  9. height: 50px;
  10. background: pink;
  11. }
  12. span{
  13. /* 水平方向的 margin和padding布局有效 */
  14. margin-left: 100px;
  15. padding-left: 200px;
  16. /* 垂直方向的 margin和padding布局无效 */
  17. margin-top: 100px;
  18. padding-top: 200px;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div></div>
  24. <span>中国移动</span><span>中国联通</span><span>中国电信</span>
  25. <div></div>
  26. </body>

伪元素

作用
一般页面中的非主体内容可以使用伪元素
区别
元素:HTML设置的标签
伪元素:由css模拟出来的标签效果
种类
::before 在父元素位置的最前面添加一个伪元素
::after 在父元素位置的最后面添加一个伪元素
注意点
1,必须设置content属性才能生效
2,伪元素默认是行内元素

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. .father{
  8. width: 300px;
  9. height: 300px;
  10. background: pink;
  11. }
  12. .father::after{
  13. content: "我是一个伪元素";
  14. display: block;
  15. width: 100px;
  16. height: 100px;
  17. background: skyblue;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div class="father">
  23. 我是父元素
  24. </div>
  25. </body>

标准流

概念
又称文档流,是浏览器在渲染显示页面的时候默认采用的一个排版规则,规定了应该以何种方式排列元素
常见规则
块级元素:
从上到下,垂直布局,独占一行
行级元素(行内块元素)
从左到右,水平布局,空间不够才会自动换行

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. div{
  8. width: 100px;
  9. height: 100px;
  10. background: pink;
  11. }
  12. span{
  13. background: red;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <div>我是块级元素</div>
  19. <div>我是块级元素</div>
  20. <div>我是块级元素</div>
  21. <div>我是块级元素</div>
  22. <div>我是块级元素</div>
  23. <span>我是行级元素</span><span>我是行级元素</span><span>我是行级元素</span><span>我是行级元素</span><span>我是行级元素</span><span>我是行级元素</span><span>我是行级元素</span><span>我是行级元素</span>
  24. </body>

浮动

作用

  1. 早期的作用 图文混排<br /> 现在的作用 网页的布局(让垂直布局的盒子变成水平布局)

图文混排:

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. img{
  8. float: left;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <img src="./img/1.jpg" alt="">
  14. Lorem ipsum, dolor sit amet consectetur adipisicing elit. Doloribus id voluptate sapiente, exercitationem fugiat sunt esse tempore laboriosam animi obcaecati dolore quia voluptas officiis soluta eveniet quasi ipsa nulla possimus mollitia magni maiores asperiores temporibus cumque. Eligendi molestias harum velit consequuntur dolore facilis officiis hic, assumenda, delectus pariatur deserunt obcaecati beatae, itaque sed numquam fugit tempora illo autem earum perferendis eos vitae libero corporis? Assumenda quod deleniti magni nulla, dolorum delectus dignissimos exercitationem! Amet hic voluptate et quos error explicabo officiis ullam quisquam! Rerum a ratione officiis. Aliquid quia incidunt velit ducimus quasi temporibus optio maxime, itaque explicabo quod, earum fuga delectus qui cum! Eveniet quibusdam delectus esse. Hic quibusdam a quo consectetur, iure deserunt. Facere beatae tenetur in blanditiis sit temporibus ducimus aliquam animi reprehenderit eum cumque harum, sint tempora. Velit eius dolorum reprehenderit aspernatur quibusdam asperiores optio excepturi adipisci. Nostrum officia, aperiam assumenda vero nemo et similique ipsa praesentium alias recusandae magnam explicabo neque quas incidunt debitis nesciunt autem. Sunt amet aliquid soluta! Earum porro quod eligendi eum pariatur voluptatem suscipit ipsum incidunt, odio excepturi expedita praesentium tempora fugit odit molestiae ratione deleniti quis cumque! Accusamus nam ducimus iure excepturi labore repellendus alias nihil? Alias consequatur ullam explicabo.
  15. </body>

页面布局:

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. .c1{
  8. width: 150px;
  9. height: 150px;
  10. background: pink;
  11. float: left;
  12. }
  13. .c2{
  14. width: 200px;
  15. height: 200px;
  16. background: skyblue;
  17. float: right;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div class="c1"></div>
  23. <div class="c2"></div>
  24. </body>

使用

  1. float:left 向左浮动<br /> float:right 向右浮动

特点

  1. 1,浮动元素会脱离标准流(简称:脱标),在标准流中不占位置,相当于从地面飘向空中<br /> 2,浮动元素比标准流高半个级别,可以覆盖标准流中的元素<br /> 3,下一个浮动的元素,会在上一个浮动的元素后面,进行左右浮动<br /> 4,浮动元素会受到上面元素边界的影响<br /> 5,浮动元素有特殊的显示效果(一行可以显示多个,可以设置宽高)
  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. .c1{
  8. /* 浮动元素会受到上面元素边界的影响 下面的元素飘不到同一行 */
  9. /* 设置 display: inline-block; 下面的元素就能飘到同一行 */
  10. width: 150px;
  11. height: 150px;
  12. background: pink;
  13. }
  14. .c2{
  15. width: 200px;
  16. height: 200px;
  17. background: skyblue;
  18. float:right
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div class="c1"></div>
  24. <div class="c2"></div>
  25. </body>
  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. .d1{
  8. width:100px;
  9. height: 100px;
  10. background:pink;
  11. float: left;
  12. }
  13. .c1{
  14. width:100px;
  15. height: 100px;
  16. background:skyblue;
  17. float: left;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div class="father">
  23. <!-- 如果是块级元素浮动之后,就不会是独占一行了,一行可以显示多个 -->
  24. <div class="d1"></div>
  25. <!-- 如果是行级元素,浮动之后,设置宽高就有效果了 -->
  26. <span class="c1">我是一个span</span>
  27. <span class="c1">我是一个span</span>
  28. </div>
  29. </body>

案例应用:

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. /* 请求浏览器默认边距 */
  8. *{
  9. margin: 0;
  10. padding: 0;
  11. }
  12. .header{
  13. height:40px;
  14. background: #333;
  15. }
  16. .nav{
  17. width: 1226px;
  18. height: 100px;
  19. background: #ffc0cb;
  20. margin:0 auto;
  21. }
  22. .banner{
  23. width: 1226px;
  24. height: 460px;
  25. background: blue;
  26. margin:0 auto;
  27. }
  28. .banner .left{
  29. width: 234px;
  30. height: 460px;
  31. background: #ffa500;
  32. float: left;
  33. }
  34. .banner .right{
  35. width: 992px;
  36. height: 460px;
  37. background: #87ceeb;
  38. float: left;
  39. }
  40. </style>
  41. </head>
  42. <body>
  43. <!-- 布局流程:从上往下,从外往里 -->
  44. <!-- 网页头部 -->
  45. <div class="header"></div>
  46. <!-- 网页导航 -->
  47. <div class="nav"></div>
  48. <!-- 网页轮播图 -->
  49. <div class="banner">
  50. <div class="left"></div>
  51. <div class="right"></div>
  52. </div>
  53. </body>

tips:一般网页布局顺序

布局顺序
从外向内,从上往下
设置每一个盒子样式的时候
1,宽高
2,辅助的背景颜色
3,盒子模型部分:border padding margin…
4,其他样式:color font text…