深入理解CSS盒模型 - 程序猿的程 - 博客园

深入理解CSS盒模型

 本文是学习中传思客在慕课网开的课程《前端跳槽面试必备技巧》的学习笔记。课程地址:https://coding.imooc.com/class/evaluation/129.html#Anchor。

 如果你在面试的时候面试官让你谈谈对盒模型的理解,你是不是不知从何谈起。这种看似简单的题其实是最不好答的。

  下面本文章将会从以下几个方面谈谈盒模型。

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

 

基本概念

盒模型的组成大家肯定都懂,由里向外content,padding,border,margin.

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

 

 从上面两图不难看出在标准模型中,盒模型的宽高只是内容(content)的宽高,

而在IE模型中盒模型的宽高是内容(content)+填充(padding)+边框(border)的总宽高。

 

css如何设置两种模型

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

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

 

JS获取宽高

通过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的应用的案例这里就不在一一举出了,大家去网上找一些其他的文章看一下。

 

欢迎补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程死锁问题

1 package com.demo.bingfa;2 3 /**4 * java并发编程中&#xff0c;死锁的概念5 *6 * 我们启用了两个线程&#xff0c;分别抢占2个资源&#xff0c;但这两个资源又分别被不同的对象&#xff08;字符串&#xff09;锁住了。7 * 当第一个线程调用 resource1 方法&#xff0c;…

使用PM2搭建在线vue.js开发环境(以守护进程方式热启动)

项目以vue.jslayUI的作为前端开发技术栈&#xff0c;需要有一个在线的环境供项目成员实时查看效果&#xff0c;总不能每次都webpack打包发布后才能看到效果吧&#xff01;刚开始就简单使用npm run dev命令热启动&#xff0c;但是shell命令窗口退出后&#xff0c;热启动也就失效…

zabbix实现mysql数据库的监控

先来介绍zabbix中几个常用的术语&#xff1a; 主机&#xff08;host&#xff09;&#xff1a; 要监控的网络设备&#xff0c;可由ip或DNS名称指定。 主机组&#xff08;host group&#xff09;&#xff1a; 主机的逻辑容器&#xff0c;可以包含主机和模板&#xff…

VSCode配合eslint进行JavaScript质量检查

写在开始前&#xff1a;如有不准确的地方希望大家提出&#xff0c;文章可以改知识不能错。 创建一个项目 这里已node项目为例 npm init 根据提示填写相关信息 安装eslint npm install eslint --save也可以全局安装 npm install eslint -g初始化 eslint文件 eslint --init执行命…

未找到导入的项目,请确认 Import 声明中的路径正确

VS2017打开以前vs版本开发的项目 <Import Project"$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project"$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" /> 修改V12…

bzoj [Usaco2009 Hol]Cattle Bruisers 杀手游戏

Description Input 第1行输入N&#xff0c;R&#xff0c;BX&#xff0c;BY, BVX&#xff0c;BVY&#xff0c;之后N行每行输入四个整数Xi&#xff0c;Yi&#xff0c;VXi&#xff0c;VYi&#xff0e; Output 一个整数&#xff0c;表示在逃脱过程中&#xff0c;某一个时刻最多有这…

Visual Studio Code 使用 ESLint 增强代码风格检查 - gyzhao - 博客园

前言 在团队协作开发中&#xff0c;为了统一代码风格&#xff0c;避免一些低级错误&#xff0c;应该设有团队成员统一遵守的编码规范。很多语言都提供了Lint工具来实现这样的功能&#xff0c;JavaScript也有类似的工具&#xff1a;ESLint。除了可以集成到构建工具中(如&#x…

eclipse下使用git插件上传代码至github

eclipse下使用git插件上传代码至github 1.eclipse下安装git 正常情况下&#xff0c;eclipse 是自带 git 插件的&#xff0c;那么即可跳至步骤1的最后一小步&#xff0c;配置 git 。 如果十分悲剧&#xff0c;你的 eclipse 中见不到 git 的身影&#xff0c;那么也没关系&#…

VS(C++)配置Halcon(一次配置,永久使用)

【说明】只需配置一次&#xff0c;以后新项目无需再次配置。 本教程是64位版本&#xff0c;32位可参考本教程。VS与Halcon无论哪个版本&#xff0c;都可参考本教程。 【步骤】以VS2015Halcon18.11为例 1、新建一个C|Win32控制台应用程序项目 2、视图|其他窗口|属性管理器 在 De…

(转)msys2使用教程

一、安装 官方下载地址 http://www.msys2.org/ 指定好安装路径&#xff08;一般D根目录即可&#xff09;&#xff0c;一路下一步就好。 二、配置国内镜像、设置窗体修改颜色 使用[清华大学开源软件镜像站]中的地址&#xff0c;修改\etc\pacman.d目录下的三个文件。 配置教程 ht…

简单使用Git和Github来管理自己的代码和读书笔记

简单使用Git和Github来管理自己的代码和读书笔记 以前不知道使用代码管理工具&#xff0c;最后写的一些东西都没有了&#xff0c;由于硬盘坏了或者不小心格式化了之类的&#xff0c;后来使用了Git 和Github来托管自己的代码和读书笔记方便了不少&#xff0c;到哪里只要有网就可…

android 资源

在进行APP开发的过程当中&#xff0c;会用到许多资源&#xff0c;比如&#xff1a;图片&#xff0c;字符串等。现对android资源知识进行简单记录。 具体的详细信息及用法&#xff0c;点击查看官方文档 分类 一般android资源分为可直接访问的系统资源和不可直接访问的原生资源 r…

ssh整合学习(1)

Hibernate框架 1 hibernate核心配置文件 &#xff08;0&#xff09;orm思想 -对象关系映射 &#xff08;1&#xff09;数据库信息 &#xff08;2&#xff09;hibernate信息 &#xff08;3&#xff09;映射配置 &#xff08;4&#xff09;hibernate核心配置文件 -如果单纯使用hi…

2018-2019-2 网络对抗技术 20165305 Exp6 信息搜集与漏洞扫描

1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法。 2.实践内容 &#xff08;1&#xff09;各种搜索技巧的应用 &#xff08;2&#xff09;DNS IP注册信息的查询 &#xff08;3&#xff09;基本的扫描技术&#xff1a;主机发现、端口扫描、OS及服务版本探测、具体服务…

Java 观察者模式

定义&#xff1a;定义了对象之间的一对多依赖&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当主题对象发生变化时&#xff0c;它的依赖者&#xff08;观察者&#xff09;都会收到通知并更新 适用场景&#xff1a; 关联行为场景&#xff0c;建立一套触发机制…

苹果电脑快捷键有哪些?mac系统快捷键大全详细介绍(全部)_苹果MAC_操作系统_脚本之家

苹果电脑快捷键有哪些&#xff1f;mac系统快捷键大全详细介绍(全部) 电脑中的每对快捷键有对应了一种操作效果&#xff0c;对于使用苹果电脑的操作系统的新人来说&#xff0c;快捷键是个很麻烦的问题&#xff0c;要一个个的找到快捷键也不是很容易的问题&#xff0c;本文就为大…

Oracle数据库基础入门《一》Oracle服务器的构成

Oracle数据库基础入门《一》Oracle服务器的构成 Oracle 服务器是一个具有高性能和高可靠性面向对象关系型数据库管理系统&#xff0c;也是一 个高效的 SQL 语句执行环境。 Oracle 服务器具备以下的特点&#xff1a; ● 能够可靠的进行多用户环境下大量数据的处理&#xff0c;允…

虚拟机配置域名

1.虚拟机的hosts文件 2.本地电脑的hosts文件 转载于:https://www.cnblogs.com/xiaobiaomei/p/10790907.html

查看端口、关闭端口

1.在dos命令下查看tomcat占用的进程&#xff0c;首先在运行里输入cmd进入dos&#xff0c;输入命令“netstat -ano | findstr 8080”&#xff08;tomcat默认端口为8080&#xff09;。查出PID&#xff08;最后一列就是&#xff09;&#xff0c;假设PID为207340&#xff0c;输入命…

Web文件管理器 elfinder-彩龙社区

最近接到一个需求&#xff0c;客户需要能在web页面进行文件管理&#xff0c;在需求调研时发现一个很好用的开源web文件管理器插件 elfinder&#xff0c;功能比较完善&#xff0c;社区也很活跃&#xff0c;方便二次开发&#xff0c;源码在GitHub上有将近3K的star&#xff0c;而且…