css学习(二)---盒模型及margin塌陷、合并问题

2023-12-05 10:32

本文主要是介绍css学习(二)---盒模型及margin塌陷、合并问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

css的重点

前面说了css选择器,当然css之后有css的一些属性,最重要的就是关于文字的属性。具体都是什么,在项目中大家都会练习到,也没办法都讲了。想要知道都是什么,那么就去 w3c规范看一下。接下来便谈一下,今天的重点吧!
盒模型 (w3c)
这里写图片描述
说到盒模型,这是一个老生常谈的问题,是我们每一位前端的小朋友都必须懂得。别着急,我会慢慢的介绍的,先给大家举一个例子吧,这样可能更容易懂一些。
假如你有一个很贵重的东西,这个东西很容易碎的,同样也很贵重的。你想把它藏起来,首先你的找一个容器(盒子),将东西给藏起来,又因为这东西比较易碎,你的需要放一些软的东西做一些缓冲,比如说棉花。这就是一个完整的盒子了,其实,仔细想一下盒模型跟着差不多的。
那么接下来,我先说一下,盒模型的几个属性,然后在逐一介绍一下。我们要知道,一个元素是由四部分组成的: margin、border、padding、content,分别是 外边距、边框、内边距、内容区的意思,这个content不需要我们设置,它也不是一个属性。它是由你给定的width、height,来确定其大小的。用一个图来解释一下吧,这样更好理解。
这里写图片描述

这里很清楚的介绍了,盒子模型,同时也给上面的例子做了一个解释,希望能有更深的理解。
那么接下,就对这里面的属性进行逐一的分析吧!

  • margin:它设置的是这个元素距离外面靠近它的其他元素或者浏览器边框的距离。这是一个复合属性,它其实是由margin-top、margin-right、margin-bottom、margin-left组成的,当然也可以分开设置每一个属性的属性值。这个复合属性的值也有4种写法:

1.4个值。如果写的是四个值,如margin: 10px 20px 30px 50px;这样的话,其分别按照上右下左的顺序来设置四个外边距的大小。

2.3个值。如果写的是三个值,如margin: 10px 20px 30px;这样的话,其分别按照上、左右、下的顺序来设置四个外边距的大小,中间的那个属性值设置的是左右的外边距。

3.2个值。如果写的是两个值,如margin: 10px 20px;这样的话,其分别按照上下、左右的顺序来设置四个外边距的大小。

4.1个值。这个没什么好说的…四个方向都是这个值。

  • border:这个属性是一个元素的边框,对边框进行设置宽度,颜色,样式。border:1px solid black;border里面的三个属性分别代表宽度,样式,颜色。样式solid为实心的线,当然不仅仅有实心,还有虚线呢,当设置成border:1px dash black;则最外层的线就会成一个虚线的。
  • padding:它是将内部盒子撑开的,使content和border产生间隔,其次他也是一个复合属性,它是由padding-top、padding-right、padding-bottom、padding-left这四个组成的,下面的和margin差不多。

1.4个值。如果写的是四个值,如padding: 10px 20px 30px 50px;这样的话,其分别按照上右下左的顺序来设置四个外边距的大小。

2.3个值。如果写的是三个值,如padding: 10px 20px 30px;这样的话,其分别按照上、左右、下的顺序来设置四个外边距的大小,中间的那个属性值设置的是左右的外边距。

3.2个值。如果写的是两个值,如padding: 10px 20px;这样的话,其分别按照上下、左右的顺序来设置四个外边距的大小。

4.1个值。这个没什么好说的…四个方向都是这个值。

  • content:这不是一个属性,前面也讲到了,他就是里面东西所用的空间,是你设置宽高的时候给设定的。

margin其实不属于一个盒子的模型部分,一个元素的盒子模型只有border、padding、content。记住这句话,下面计算盒模型的宽度和高度是能用的到。
我们现在一个盒子有10px的margin、5px的border、10px 20px 30px 40px的padding和100px的content,那么这个盒子的宽高分别是多少呢?

答案是:

width = 5 + 40+ 100 + 20+ 5 = 170px;

height = 5 + 10 + 100 + 30 + 5 = 150px;

• 宽度的计算是:5px的border+40px的padding-left+100px的content+20px的padding-right+5px的border=170px;

• 高度的计算是: 5px的border+10px的padding-top+100px的content+30px的padding-bottom+5px的border=150px;
盒模型 (IE)
上面讲了w3c盒模型,这又说了IE盒模型,当然他们是相同的话,也不会分开讲了。下面引用一个图,让你感受一下。
这里写图片描述
这里的主要区别就是在它的height和width,从上图可以看到 IE 盒子模型的范围也包括 margin、border、padding、content,和标准 W3C 盒子模型不同的是:IE 盒子模型的 content 部分包含了 border 和 padding。这也是它跟w3c盒子的主要区别了,特别是在计算的时候一定要注意。
w3c:height = boeder*2+padding*2+content;
IE:height = content-boeder*2-padding*2;
讲到这是,那么就会说到css3,为什么会说这呢?
css3中引入了border-box,这样就会区分到底是那一种盒模型,css3以后再介绍。你知道border-box是css3中引入的就行了。如果不设置box-sizing这个属性的话,HTML5会默认box-sizing这个属性为content-box,一般都是w3c里面的盒模型。
这个内容主要的内容就这么多,这是一个相对来说很重要的知识点,大家一定的搞懂这个知识点。弄懂了,对你是一个很大的帮助的,这也是一个面试很常问的一个基础题,考验你的基础,一定不能打错哦。当然你可以拓展一下,这俩个模型的作用,为什么要引入border-box。你都可以说一下的。
margin塌陷和margin合并
margin合并
说道margin合并,首先我们要知道margin合并的定义是什么?我就用我自己话去理解一下这个定义吧。margin合并是关于margin(margin-top、margin-rignt、margin-bottom、margin-left)值进行了合并,没有达到我们想要他们相加的要求,这就是一个css的bug。这个问题很常见的,所以大家一定要会,也要知道解决的方法。
那么接下来我们就用一个例子来感受一下吧:
先来看一下下面的代码:

  <style>.top{height: 100px;width: 100px;background: yellow;margin-bottom: 10px;}.bottom{height: 100px;width: 100px;background: red;margin-top: 10px;}</style><body><header><div class="top">margin合并1</div></header><header><div class="bottom">margin合并2</div></header>
</body>

经过上面的代码,在浏览器中的显示,我们认为应该是这样的:

这里写图片描述

第一次我也是这么认为,怎么想就用该这样,但是实际操作是确实一下这样的:
这里写图片描述

一开始我也有点蒙的,就开始查,然后找到了,就说是一个bug,当时内心是什么感觉,你懂得。心想bug你怎么不去修复啊,这就尴尬了。
给大家说了这些大家都应该知道这个概念了吧,当然,我们尝试改变每一个div的margin-top或者margin-bottom的值,最后发现:二者上下之间的距离是取得两个数值之中的 最大值 。大家都可以去亲自去试一下,这样才会记得更加的深刻。其次margin-left和margin-right问题和这个问题是一样的,都是完全一样的问题。
问题出现了,我们的去解决呀,指定会有解决方案的。
解决方案
说道解决的方法,大家的了解一下BFC( block formatting context)。简单来说,BFC 就是一种属性,这种属性会影响着元素的定位以及与其兄弟元素之间的相互作用。具体是什么以后在详细说明,先知道这一点是触发bfc来解决这个问题的就行了。
是利用一个父元素将这两个子元素给包裹起来,再给父元素设置一个属性 overflow:hidden,这样父元素就触发了bfc就会消除这个bug,这样也就不会合并了。

 <style>.header{overflow: hidden;}.top{height: 100px;width: 100px;background: yellow;margin-bottom: 10px;}.bottom{height: 100px;width: 100px;background: red;margin-top: 10px;}</style><body><header><div class="top">margin合并1</div></header><header><div class="bottom">margin合并2</div></header>
</body>

margin塌陷
margin塌陷是一个父子结构的元素,当父元素设置margin-top和margin-left时,子元素也设置时,子元素中margin-left会随之变化,但margin-top不会随之变化。这就是margin塌陷,接下来用一个例子来感受一下:

  <style>.father {width: 100px;height: 100px;margin-top: 100px;margin-left: 100px;background-color: yellow;}.child {width: 50px;height: 50px;margin-top: 50px;margin-left: 50px;background-color: red;}</style><body><div class="father"><div class="child"></div></div>
</body>

同样的,我们认为的结果应该是:

这里写图片描述

然而实际结果是这样的:
这里写图片描述

子元素中margin-left实现了,而margin-top则没有实现,就是因为有margin塌陷这个bug,从而导致子元素随父元素一块运动,才导致以上的结果。同样的,我们的需要解决方案啊。
解决方案
同样的,也得触发bfc,触发bfc的方式有很多种,这里也就不详细的讲解了。

1.利用border来触发bfc的效果。

2.利用overflow属性来触发bfc的效果。

虽然第一种方案也可以用但基本不用第一种方案的,你想一下,当你在写一个页面的时候,如果无缘无故加一个border:1px solid black;即使你设置为白色的话它毕竟有一个占位,这样可能导致你的布局效果会非常的不好看,所以第一种基本是不用的。
第二种方案,在父元素中添加一个overflow:hidden;触发bfc的效果,就会解决这个塌陷问题。

 .father {width: 100px;height: 100px;margin-top: 100px;margin-left: 100px;background-color: yellow;overflow: hidden;}

触发bfc的方式有很多种,当然触发bfc解决问题也不止这一个问题,从这感觉bfc是不是挺重要的。这部分就先讲到这了,等到以后再分享一下吧。

这篇关于css学习(二)---盒模型及margin塌陷、合并问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

idea中project的显示问题及解决

《idea中project的显示问题及解决》:本文主要介绍idea中project的显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录idea中project的显示问题清除配置重China编程新生成配置总结idea中project的显示问题新建空的pr

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

Vue中插槽slot的使用示例详解

《Vue中插槽slot的使用示例详解》:本文主要介绍Vue中插槽slot的使用示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、插槽是什么二、插槽分类2.1 匿名插槽2.2 具名插槽2.3 作用域插槽三、插槽的基本使用3.1 匿名插槽

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口