CSS盒模型全面解析+应用

1,518 阅读7分钟

对于这种基础中的基础的知识点,这里只是想更加全面细致的帮大家整理出来。并结合具体的例子进一步说明某些特性的具体使用场景。

1. 盒模型分类

首先要明确一个概念,盒模型是属于css范畴的叫法,代表了元素在页面上的呈现形式。盒模型指的是每个元素在页面中都会生成一个矩形区域,也就是盒子。下面这些分类以前会叫做块级元素或行内元素,显然元素是属于HTML的范畴,所以更准确的叫法是下面这些。

1.1 块盒:

独占一行。
display: block; 
常见标签:div p h1-h6 
宽度会占一整行。
高度默认为0,高度随内容撑开
设置宽高有效

1.2. 行盒:

不独占一行。
display: inline; 默认值
常见标签:span a
宽高默认为auto 宽高都随内容撑开
设置宽高无效
有空白折叠(当出现多个空格或换行符等的元素的时候,会合并为一个空格)

1.3. 行块盒:

不独占一行。
display: inline-block;
常见标签:input
宽高随内容撑开
设置宽高有效
有空白折叠
  h1{
    background-color: wheat;
  }
  p{
    background-color: purple;
  }
  .box1{
    background-color: maroon;
  }
  span{
    background-color: red;
  }
  .box3 div{
    background-color: blue;
    display: inline-block;
  }
  <h1>Lorem ipsum dolor sit amet consectetur.</h1>
  <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Aut, necessitatibus beatae vero, officia alias voluptas sapiente rem harum, doloribus nisi nam accusamus consequatur reiciendis porro! Sit provident neque dolorum optio.</p>
  <div class="box1">Lorem ipsum dolor sit amet consectetur adipisicing elit. Perspiciatis, itaque quisquam? Ipsa amet harum obcaecati, maiores eius nisi expedita veniam vitae doloremque. Facere voluptatum, at error quod ipsa enim perferendis.</div>
  <br>
  <div class="box2">
    <span>Lorem.</span>
    <span>Quos.</span>
    <span>Id.</span>
    <span>Pariatur?</span>
    <span>Aliquid?</span>
    <span>Labore?</span>
    <span>Numquam.</span>
    <span>Dicta.</span>
    <span>Delectus.</span>
    <span>Non?</span>
  </div>
  <br>
  <div class="box3">
    <div>Lorem.</div>
    <div>Voluptas.</div>
    <div>Iusto?</div>
    <div>Maiores!</div>
    <div>Rem?</div>
    <div>Eius!</div>
    <div>Quasi!</div>
    <div>Corrupti.</div>
    <div>Laboriosam.</div>
    <div>Expedita.</div>
  </div>

2. 盒模型由四部分组成

2.1. 内容区:盒子内容区域

content
默认设置宽高的区域
内容盒:content-box

2.2 内边距:盒子边框到盒子内容之间的距离

padding 简写属性、速写属性 
padding-leftpadding-rightpadding-toppadding-bottom
填充盒:padding-box

2.3. 边框:

border 简写属性、速写属性
border: 1px solid red;  
        边框宽度、border-width、默认为0 
        边框样式、border-style、默认为none 
        边框颜色、border-color、默认使用字体颜色
border-left-widthborder-left-styleborder-left-color
border-right-widthborder-right-styleborder-right-color
border-top-widthborder-top-styleborder-top-color
border-bottom-widthborder-bottom-styleborder-bottom-color
  边框盒:border-box

2.4. 外边距:盒子之间的距离

margin 简写属性、速写属性
margin-leftmargin-rightmargin-topmargin-bottom

3.内容盒、填充盒、边框盒具体使用场景

3.1. 设置如何计算一个元素的总宽高的时候

这个属性值非常有用,一般会用在列表页面缩略图块需要固定大小的时候,可以设置这个属性,然后再任意调整内容,内边距,边框等尺寸都不会影响盒子所占据的空间。

box-sizing: content-box; // 宽高设置给内容盒
box-sizing: padding-box;  // 宽高设置给填充盒
box-sizing: border-box;  // 宽高设置给边框盒

3.2. 设置元素的背景区域的时候

background-clip: content-box; // 背景覆盖范围为内容盒
background-clip: padding-box;  // 背景覆盖范围为填充盒
background-clip: border-box;  // 背景覆盖范围为边框盒

  .box{
    width: 600px;
    border: 1px solid blue;
    overflow: hidden;
  }
  .box div{
    width: 200px;
    height: 200px;
    background-color: purple;
    float: left;
    border: 10px dashed red;
    padding: 10px;
    /* margin: 10px; */
    box-sizing: border-box; /* 如何计算一个元素的总宽高 */
    background-clip: border-box; /* 设置元素的背景区域 */
  }
  <div class="box">
    <div class="box1"></div>
    <div class="box2"></div>
    <div class="box3"></div>
  </div>




4. 三种盒子更进一步的区别

4.1 宽高

块盒:
  方方正正的盒子,无论内容到哪里,都会占据一整行。
  设置宽高都有效,但是依然占据一整行
行盒:
  盒子沿着内容延伸,内容到哪里,盒子就到哪里。
  设置宽高没有效果,原因:行盒的宽高应该取决于内容
  只能通过字体大小,行高(背景不覆盖)
  没有办法在上下任意增加背景的

4.2 内边距

块盒:
  都有效
行盒:
  左右有效,上下不实际占据空间

4.3 外边距

块盒:
  都有效
行盒:
  左右有效,上下不实际占据空间

4.4 边框

块盒:
  都有效
行盒:
  左右有效,上下不实际占据空间

4.5 行块盒:除了不独占一行,全部和块盒一样


  p{
    width: 200px;
    height: 200px;
    padding: 10px;
    border: 10px dashed red;
    margin: 10px;
    background-color: wheat;
    overflow: hidden;
  }
  span{
    line-height: 3;
    width: 100px;
    height: 100px;
    padding-left: 100px;
    padding-right: 100px;
    padding-top: 20px;
    padding-bottom: 20px;
    border: 10px solid red;
    margin-left: 100px;
    margin-right: 100px;
    margin-top: 100px;
    margin-bottom: 100px;
    background-color: wheat;
  }
  div{
    display: inline-block;
    background-color: magenta;
    width: 200px; 
    height: 200px;
    padding: 10px;
    margin: 10px;
    border: 10px solid red;
  }
  <p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Provident illum alias reprehenderit esse labore possimus enim dolore, ducimus rerum eos, odit iure cum quo! Vero doloribus iusto quaerat eos consequatur!</p>
  <br>
  <span>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Eius illum culpa omnis, quam et mollitia expedita. Dicta aliquid, sint porro necessitatibus deleniti nihil aut animi, obcaecati incidunt minima quasi tempore!</span>
  <span>Consequatur, iure recusandae. Esse tenetur dolore possimus assumenda nesciunt repudiandae. Neque iste officia quam corrupti quis accusantium, totam quo cumque ea cum consequatur. Harum eius aliquam sed odit non culpa.</span>
  <br>
  <div>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Optio, provident ea sed, similique nostrum omnis quis corporis eligendi inventore neque, distinctio quae deserunt itaque doloribus pariatur! Adipisci sed vero odit!</div>




5. 元素的可替换性

这里要说一下行盒里面最特殊的img元素,img既可以和行盒元素并排一行排列,但又能设置宽高等块盒才具有的属性值,这是为什么呢,秘密就在于元素的是否可替换性。

5.1. 块盒:

div h1-h6 p

5.2. 行盒:

可替换:可以通过元素的属性值替换
非可替换元素:span a 
可替换元素:img可以通过src属性对显示内容进行替换

5.3. 行块盒:

input

  img{
    width: 200px;
    height: 200px;
    padding: 10px;
    margin: 10px;
    background-color: red;
    border: 10px dashed blue;
    background-clip: padding-box;
  }
  input{
    width: 100px;
    height: 100px;
  }
  <img src="1.jpg" alt="">
  <br>
  <input type="text">


6. 溢出盒子处理

对于块盒水平会占据一整行,垂直高度会随着内容撑开,内容多高,盒子就会多高。当然这是在没有对盒子设置高度的情况下。 一旦设置了高度,那么盒子即要保证显示为具体设置的高度,同时又需要展示盒子内部所有的内容,如果内容过多,必将会在盒子外部显示。 对于溢出的这部分内容,可以通过overflow属性进行设置。

6.1 overflow:设置内容溢出后的处理方式。

overflow: visible 默认值 可见的
overflow: hidden 不可见的
overflow: scroll 始终出现滚动条
  overflow-x: scroll 始终出现横向的滚动条
  overflow-y: scroll 始终出现纵向的滚动条
overflow: auto 自动,需要出现滚动条的时候才出现

6.2 overflow的小应用

一般用在网站的logo图标上,logo图标一般使用h1标签进行包裹,同时为了seo的考虑,h1作为页面最重要的标签,里面最好放置位置内容来利于seo的优化,但是又不希望文字显示出来,这种情况下使用overflow来解决是非常适合的场景



7. 空白处理

在页面上我们经常会见到比如新闻标题,对于过长的标题会省略后面的文字部分,用省略号代替,这种情况下就需要用到空白处理。 空白处理的属性为white-space 比较常用的两个属性值为normal和nowrap,这两个都会合并空格为一个空格,但是前者在需要换行的时候会自动换行,后者则在需要换行的时候也不换行。

空白处理小应用:

列表内显示不下的更多文字用省略号代替

  li{
    list-style-type: none;
    line-height: 2;
    border-bottom-width: 1px;
    border-bottom-style: dashed;
    width: 360px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  div{
    background-color: wheat;
    width: 200px;
    height: 200px;
    white-space: nowrap;
  }
  <div>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Voluptas veritatis dolorum, molestias, odio nisi eveniet nihil aliquam minima, saepe doloremque possimus eligendi velit mollitia impedit qui sint illo praesentium? Esse.</div>
  <ul>
    <li>Lorem ipsum dolor sit amet consectetur.</li>
    <li>Commodi est labore porro perferendis dolor.</li>
    <li>Delectus laudantium natus excepturi hic consequuntur.</li>
    <li>Quis distinctio laborum molestiae minima minus?</li>
    <li>Odio, earum voluptatem. Tempore, id libero?</li>
    <li>Laboriosam omnis nulla officiis! Id, nostrum.</li>
  </ul>





8. 更多应用

8.1 分页

主要技术点是将a链接转换成行块盒模型
  div{
    font-size: 0;
  }
  div a{
    display: inline-block;
    width: 30px;
    height: 30px;
    box-sizing: border-box;
    border: 1px solid blue;
    text-align: center;
    line-height: 30px;
    text-decoration: none;
    font-size: initial;
    margin-right: 5px;
  }
  <div>
    <a href="">1</a>
    <a href="">2</a>
    <a href="">3</a>
    <a href="">4</a>
    <a href="">5</a>
    <a href="">6</a>
    <a href="">7</a>
    <a href="">8</a>
    <a href="">9</a>
    <a href="">10</a>
  </div>


9. 视频讲解教程

想详细了解的小伙伴可以去观看关于这篇文章详细的视频教程。

哔哩哔哩:专题02-CSS盒模型全面解析+应用