本文是面试汇总分支——说一下CSS盒模型。

  • 基本概念:W3C标准盒模型和IE盒模型
  • CSS如何设置这两种模型
  • JS如何获取盒模型对应的宽和高
  • 根据盒模型解释边距重叠
  • BFC(边距重叠解决方案)

一. 基本概念

盒模型的组成,由里向外content,padding,border,margin。

盒模型有两种标准,一个是标准模型,一个是IE模型。

标准模型如下图

所以盒子总宽度为:width+border+padding 

IE盒模型如下图

所以盒子总宽度为:width 

二. CSS如何设置这两种模型

这里用到了CSS的属性box-sizing

/* 标准模型 */
box-sizing:content-box; /*IE模型*/
box-sizing:border-box;

三. JS如何获取盒模型对应的宽和高

为了方便书写,以下用dom来表示获取的HTML的节点。

1. dom.style.width/height

  这种方式只能取到dom元素内联样式所设置的宽高,也就是说如果该节点的样式是在style标签中或外联的CSS文件中设置的话,通过这种方法是获取不到dom的宽高的。

2. dom.currentStyle.width/height

  这种方式获取的是在页面渲染完成后的结果,就是说不管是哪种方式设置的样式,都能获取到。

  但这种方式只有IE浏览器支持。

3. window.getComputedStyle(dom).width/height

  这种方式的原理和2是一样的,这个可以兼容更多的浏览器,通用性好一些。

4. dom.getBoundingClientRect().width/height

  这种方式是根据元素在视窗中的绝对位置来获取宽高的。

5.dom.offsetWidth/offsetHeight

  这个就没什么好说的了,最常用的,也是兼容最好的。

四. 根据盒模型解释边距重叠

什么是边距重叠

如下图,父元素没有设置margin-top,而子元素设置了margin-top:20px;可以看出,父元素也一起有了边距。

上图的代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
.demo{
height:100px;
background: #eee;
}
.parent{
height:200px;
background: #88f;
}
.child{
height:100px;
margin-top:20px;
background: #0ff;
width:200px;
}
</style>
</head>
<body>
<section class="demo">
<h2>此部分是能更容易看出让下面的块的margin-top。</h2>
</section>
<section class = "parent">
<article class="child">
<h2>子元素</h2>
margin-top:20px;
</article>
<h2>父元素</h2>
没有设置margin-top
</section>
</body>
</html>

五. BFC(边距重叠解决方案)

首先要明确BFC是什么意思,其全英文拼写为 Block Formatting Context 直译为“块级格式化上下文”。

BFC的原理

  1. 内部的box会在垂直方向,一个接一个的放置
  2. 每个元素的margin box的左边,与包含块border box的左边相接触(对于从做往右的格式化,否则相反)
  3. box垂直方向的距离由margin决定,属于同一个bfc的两个相邻box的margin会发生重叠
  4. bfc的区域不会与浮动区域的box重叠
  5. bfc是一个页面上的独立的容器,外面的元素不会影响bfc里的元素,反过来,里面的也不会影响外面的
  6. 计算bfc高度的时候,浮动元素也会参与计算

怎么去创建bfc

  1. float属性不为none(脱离文档流)
  2. position为absolute或fixed
  3. display为inline-block,table-cell,table-caption,flex,inine-flex
  4. overflow不为visible
  5. 根元素

应用场景

  1. 自适应两栏布局
  2. 清除内部浮动
  3. 防止垂直margin重叠

看一个垂直margin重叠例子

代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
.top{
background: #0ff;
height:100px;
margin-bottom:30px;
}
.bottom{
height:100px;
margin-top:50px;
background: #ddd;
}
</style>
</head>
<body> <section class="top">
<h1>上</h1>
margin-bottom:30px;
</section>
<section class="bottom">
<h1>下</h1>
margin-top:50px;
</section> </body>
</html>

效果图

用bfc可以解决垂直margin重叠的问题

关键代码

    <section class="top">
<h1>上</h1>
margin-bottom:30px;
</section> <!-- 给下面这个块添加一个父元素,在父元素上创建bfc -->
<div style="overflow:hidden">
<section class="bottom">
<h1>下</h1>
margin-top:50px;
</section>
</div>

效果图

关于bfc的应用的案例这里就不在一一举出了,大家去网上找一些其他的文章看一下。

感谢:

最新文章

  1. 自动绘图AI:程序如何画出动漫美少女
  2. Vue - 实例
  3. 对于SSH框架的选择
  4. 【Swift】iOS开发历险记(二)
  5. PostgreSQL笔记
  6. Twitter Bootstrap 3.0 正式发布,更好地支持移动端开发
  7. 【Unity】12.5 Navmesh Obstacle组件
  8. 多条查询sql语句返回多表数据集
  9. CSS自定义select下拉选择框(不用其他标签模拟)
  10. How to Send Information (String, Image, Record) Between Two Applications
  11. windows下设置socket的connect超时
  12. Hibernate查询之Example查询
  13. 【剑指Offer学习】【面试题18 :树的子结构】
  14. 安装Navicat for MySQL
  15. dp小总结
  16. Linuxs升级系统自带的openssh
  17. 隐藏字符 BOM
  18. VMware虚拟机中CentOS 7的硬盘空间扩容
  19. jenkins+gitlab webhooks 实现自动触发打包
  20. JS时间格式和时间戳的互转

热门文章

  1. Zookeeper常用命令行及API
  2. mongoose之操作mongoDB数据库
  3. 实现DataGridView控件中CheckBox列的使用
  4. SpringMVC(十五) RequestMapping map模型数据
  5. PAT (Advanced Level) Practise 1002 解题报告
  6. 146. 大小写转换 II
  7. 在notepad++中修改换行符
  8. 如何安装使用FastReport
  9. C#中的BeginInvoke和EndEndInvoke 异步问题
  10. 1099 Lottery