【Web前端HTML5CSS3】06、盒模型

news2025/7/17 3:12:58

六、盒模型

1、文档流(normalflow)

网页是一个多层的结构,一层摁着一层

通过 CSS 可以分别为每一层来设置样式,作为用户来讲只能看到最顶上一层

这些层中,最底下的一层称为文档流

文档流是网页的基础我们所创建的元素默认都是在文档流中进行排列

对于我们来元素主要有两个状态

  • 在文档流中
  • 不在文档流中(脱离文档流)

那么元素在文档流中有什么特点,我们接着往下看

2、块元素

  • 块元素会在页面中独占一行
  • 默认宽度是父元素的全部(会把父元素撑满)
  • 默认高度是被内容撑开(子元素)

3、行内元素

  • 行内元素不会独占页面的一行,只占自身的大小
  • 行内元素在页面中左向右水平排列(书写习惯一致)
  • 如果一行之中不能容纳下所有的行内元素,则元素会换到第二行继续自左向右排列
  • 行内元素的默认宽度和高度都是被内容撑开

4、盒子模型

盒模型、盒子模型、框模型(box model)

CSS 将页面中的所有元素都设置为了一个矩形的盒子

将元素设置为矩形的盒子后,对页面的布局就变成将不同的盒子摆放到不同的位置

每一个盒子都由一下几个部分组成:

  • 内容区(content)
  • 内边距(padding)
  • 边框(border)
  • 外边距(margin)

内容区(content)

内容区是盒子模型的中心,它呈现了盒子的主要信息内容,这些内容可以是文本、图片等多种类型

元素中的所有的子元素和文本内容都在内容区中

  • width和height 设置排列内容区的大小
  • width 设置内容区的宽度
  • height 设置内容区的高度

示例

.box1 {width: 200px;height: 200px;border-color: red;/*solid 实线dotted 点状虚线dashed 虚线double 双线*/border-style: solid;background-color: rgb(73, 184, 139);
} 

效果

边框(border)

边框属于盒子边缘,边框里边属于盒子内部,出了边框都是盒子的外部

注意:边框的大小会影响到整个盒子的大小

  • border-width:边框的宽度:默认 3px* border-top-width 上边框的宽度* border-right-width 右边框的宽度* border-bottom-width 下边框的宽度* border-left-width 左边框的宽度
  • border-color 边框的颜色:默认使用 color 的颜色值* border-top-color 上边框的颜色* border-right-color 右边框的颜色* border-bottom-color 下边框的颜色* border-left-color 左边框的颜色* border-style:边框的样式:没有默认值,必须指定* border-top-style 上边框的样式* border-right-style 右边框的样式* border-bottom-style 下边框的样式* border-left-style 左边框的样式

效果(solid)

效果(dotted)

效果(dashed)

效果(double)

不论是border-widthborder-colorborder-style 还是其衍生出来的属性写法,都可以指定每个方向的边框情况

设定几个值就决定了对应方向的宽度、颜色或样式

  • 四个值:上 右 下 左
  • 三个值:上 左右 下
  • 两个值:上下 左右
  • 一个值:上下左右

其实不管设置几个值,只要记住:其顺序是按顺时针方向设置的,剩下的可以由矩形的对称性推导出来

border:简写属性,通过该属性可以同时设置边框所有的相关样式,并且没有顺序要求

  • border-top 上边框的宽度、颜色和样式
  • border-right 右边框的宽度、颜色和样式
  • border-bottom 下边框的宽度、颜色和样式
  • border-left 左边框的宽度、颜色和样式
.box1 {border: 10px red solid;
} 

内边距(padding)

内边距,也叫填充,是内容区和边框之间的空间

  • padding-top 上内边距
  • padding-right 右内边距
  • padding-bottom 下内边距
  • padding-left 左内边距

padding 内边距的简写属性,可以同时指定四个方向的内边距,规则和边框中属性值设置一样

注意:内边距的设置会影响到盒子的大小,背景颜色会延伸到内边距上

示例

<style> .outer {width: 200px;height: 200px;border: 10px orange solid;background-color: pink;padding-right: 100px;padding-top: 100px;padding-bottom: 100px;padding-left: 100px;}.inner {width: 200px;height: 200px;background-color: greenyellow;} </style>

<div class="outer"><div class="inner"></div>
</div> 

效果

可以看出,当内外 div 宽度和高度一样时,由于 outer 设置了一个 padding 属性,其盒子大小被“撑大了”

盒子可见框的大小,由内容区、内边距和边框共同决定,所以在计算盒子大小时,需要将这三个区域加到一起计算

外边距(margin)

外边距,也叫空白边,位于盒子的最外围,是添加在边框外周围的空间。空白边使盒子之间不会紧凑地连接在一起,是 CSS 布局的一个重要手段

注意:外边距不会影响盒子可见框的大小,但是外边距会影响盒子的位置和占用空间

一共有四个方向的外边距:

  • margin-top:上外边距* 设置正值,元素自身向下移动* 设置负值,元素自身向上移动
  • margin-right:右外边距* 设置正值,其右边的元素向右移动* 设置负值,其右边的元素向左移动* 上述说法并不准确,对于块元素,设置margin-right不会产生任何效果
  • margin-bottom :下外边距* 设置正值,其下边的元素向下移动* 设置负值,其下边的元素向上移动* 上述说法并不准确,对于块元素,会有垂直方向上的边距重叠问题(后面会细说)
  • margin-left:左外边距* 设置正值,元素自身向右移动* 设置负值,元素自身向左移动

元素在页面中是按照自左向右的顺序排列的,所以默认情况下

  • 如果我们设置的左和上外边距则会移动元素自身
  • 而设置下和右外边距会移动其他元素

示例 1

.box1 {width: 200px;height: 200px;background-color: #bfa;border: 10px orange solid;margin-top: 100px;margin-right: 100px;margin-bottom: 100px;margin-left: 100px;
} 

效果

示例 2:

.box1 {width: 200px;height: 200px;background-color: #bfa;border: 10px orange solid;margin-bottom: 100px;
}

.box2 {width: 200px;height: 200px;background-color: #bfa;border: 10px red solid;margin-top: 100px;
} 

效果

5、水平方向布局

元素在其父元素中水平方向的位置由以下几个属性共同决定

  • margin-left
  • border-left
  • padding-left
  • width
  • padding-right
  • border-right
  • margin-right

一个元素在其父元素中,水平布局必须要满足以下的等式

margin-left + border-left + padding-left + width + padding-right + border-right + margin-right = 其父元素的宽度 

以上等式必须满足,如果相加结果使等式不成立,则称为过渡约束

则等式会自动调整调整的情况:

  • 如果这七个值中没有auto的情况,则浏览器会自动调整margin-right值以使等式满足100 + 0 + 0 + 200 + 0 + 0 + 0 = 800 ==> 100 + 0 + 0 + 200 + 0 + 0 + 500 = 800* 如果这七个值中有auto的情况,则会自动调整auto值以使等式成立这七个值中有三个值可以设置为autowidthmargin-leftmaring-right1.如果某个值为 auto,则会自动调整auto的那个值以使等式成立 200 + 0 + 0 + auto + 0 + 0 + 200 = 600 ==> 200 + 0 + 0 + 400 + 0 + 0 + 200 = 800``auto + 0 + 0 + 200 + 0 + 0 + 200 = 600 ==> 400 + 0 + 0 + 200 + 0 + 0 + 200 = 800``200 + 0 + 0 + 200 + 0 + 0 + auto = 600 ==> 200 + 0 + 0 + 200 + 0 + 0 + 400 = 8002.如果宽度为auto,则宽度会调整到最大,其他auto的外边距会自动设置为 0auto + 0 + 0 + auto + 0 + 0 + 200 = 600 ==> 0 + 0 + 0 + 600 + 0 + 0 + 200 = 800``200 + 0 + 0 + auto + 0 + 0 + auto = 600 ==> 200 + 0 + 0 + 600 + 0 + 0 + 0 = 800``auto + 0 + 0 + auto + 0 + 0 + auto = 600 ==> 0 + 0 + 0 + 800 + 0 + 0 + 0 = 8003.如果外边距都为auto,则auto的外边距会自动均分以使等式成立auto + 0 + 0 + 200 + 0 + 0 + auto = 600 ==> 300 + 0 + 0 + 200 + 0 + 0 + 300 = 800

示例

<style> .box1 {width: 200px;height: 200px;background-color: #bfa;border: 10px orange solid;/* 下列条件等价于 margin: 0 auto */margin-left: auto;margin-right: auto;} </style>
<div class="box1"></div> 

效果

6、垂直方向布局

元素溢出

子元素是在父元素的内容区中排列的,如果子元素的大小超过了父元素,则子元素会从父元素中溢出

使用overflow/overflow-x/overflow-y属性来设置父元素如何处理溢出的子元素

可选值:visible/hidden/scroll/auto

visible 溢出内容会在父元素外部位置显示,默认值

示例

<style> .box1 {width: 200px;height: 200px;background-color: #bfa;border: 10px orange solid;overflow: visible; /* 默认值 */} </style>
<div class="box1">Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores aspernaturillo inventore deleniti laudantium quaerat excepturi sed quidem tempore?Eaque, cumque porro. Fuga quam error cupiditate quasi eveniet in numquam!
</div> 

效果

hidden 溢出内容会被裁剪,不会显示

示例

<style> .box1 {width: 200px;height: 200px;background-color: #bfa;overflow: hidden; /* 隐藏溢出内容 */} </style>
<div class="box1">Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores aspernaturillo inventore deleniti laudantium quaerat excepturi sed quidem tempore?Eaque, cumque porro. Fuga quam error cupiditate quasi eveniet in numquam!
</div> 

效果

scroll 生成两个滚动条,通过滚动条来查看完整的内容

示例

<style> .box1 {width: 200px;height: 200px;background-color: #bfa;overflow: scroll;} </style>
<div class="box1">Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores aspernaturillo inventore deleniti laudantium quaerat excepturi sed quidem tempore?Eaque, cumque porro. Fuga quam error cupiditate quasi eveniet in numquam!
</div> 

效果

<style> .box1 {width: 200px;height: 200px;background-color: #bfa;overflow: auto;} </style>
<div class="box1">Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores aspernaturillo inventore deleniti laudantium quaerat excepturi sed quidem tempore?Eaque, cumque porro. Fuga quam error cupiditate quasi eveniet in numquam!
</div> 

效果

边距折叠

垂直外边距的重叠(折叠):相邻的垂直方向外边距会发生重叠现象

兄弟元素

兄弟元素间的相邻,垂直外边距会取两者之间的较大值(两者都是正值)

特殊情况:

  • 如果相邻的外边距一正一负,则取两者的和
  • 如果相邻的外边距都是负值,则取两者中绝对值较大的

示例

.box1,
.box2 {width: 200px;height: 200px;font-size: 100px;
}

.boxl {background-color: #bfa;/*设置一个下外边距*/margin-bottom: 100px;
}

.box2 {background-color: orange;/*设置一个上外边距*/margin-top: 100px;
} 

效果

疑问

当浏览器缩放比例是 100%时,我们使用FastStone Capture工具自带的刻度尺测量,发现“兄弟”之间似乎没有我们想象的那么“亲近”

两者的垂直方向间距是 125px,我们明明上下元素设置的都是 100px 啊,这是为什么呢?

在网页布局中,通过谷歌浏览器或火狐浏览器预览时,发现我们定义的盒模型 width,height,margin,padding 值都是不准确的

谷歌、火狐浏览器 缩放为 80% 时,margin 值才正确[2]

总结

兄弟元素之间的外边距的重叠,对于开发是有利的,所以我们不需要进行处理

父子元素

父子元素间相邻外边距,子元素会传递给父元素(上外边距)

示例

.box3{
width:200px;height:200px;background-color: #bfa;
}

.box4{width: 100px;height: 100px;background-color: orange;/* margin-top: 100px; */
} 

效果

不加 margin-top

加 margin-top

父子外边距的折叠会影响到页面的布局,必须要进行处理

处理方式 1

1、我们转换思路,将对子元素的调整转为对父元素的调整

.box3 {width: 200px;height: 200px;background-color: #bfa;padding-top: 100px; /* 不调整子元素的margin,而是转而调整父元素的padding */
}

.box4 {width: 100px;height: 100px;background-color: orange;/* margin-top: 100px; */
} 

效果

可以看到父元素位置虽然正确了,但是高度却被“撑大了”。我们之前说过,padding 属性会影响元素的大小

2、这里我们还需要计算并手动调整下父元素的高度

.box3 {width: 200px;height: 100px; /* height: 200px; */background-color: #bfa;padding-top: 100px;
}

.box4 {width: 100px;height: 100px;background-color: orange;
} 

效果

处理方式 2

1、我们仍然保留子元素的margin-top属性,但是给父元素加一个上边框

.box3 {width: 200px;height: 200px;background-color: #bfa;border-top: 1px rebeccapurple solid; /* 在父元素上加一个border-top(上边框) */
}

.box4 {width: 100px;height: 100px;background-color: orange;margin-top: 100px; /* 不删除,保留 */
} 

效果

2、但是因为加了 1px 的边框,所以父元素盒子的高度也增加了 1px。那我们就需要手动调整父元素的高度,同时让边框颜色与父元素盒子颜色保持一致

.box3 {width: 200px;height: 199px; /* height: 200px; */background-color: #bfa;border-top: 1px #bfa solid;
}

.box4 {width: 100px;height: 100px;background-color: orange;margin-top: 100px;
} 

但是我们没有发现一个问题不难发现一个问题,子元素也往下移动了 1px 的距离

因为父元素高度少了 1px,而子元素的 margin-top 是从边框下面开始算的

所以,凭借大家朴素的情感,哪个应该怎么判? 应该怎么改?

改法也很简单,margin-top 减去一个像素即可

.box3 {width: 200px;height: 199px;background-color: #bfa;border-top: 1px #bfa solid;
}

.box4 {width: 100px;height: 100px;background-color: orange;margin-top: 99px; /* margin-top: 100px; */
} 

效果

同时,我们用刻度尺测量,父子元素底部是在一条水平线上的

脱离文档流

上述示例 2 中,使用了 border 属性,就让子元素的外边距不去传递给父元素了,这是为什么呢?

margin (子元素远离父元素边框)[3]

如果父盒子没有设置 border 框着,那么他的子元素无法利用 margin-top 来远离父元素的上边框

如果使用了 margin-top 会使子元素和父元素一起往下移

(子想离,父不设置 border 边框 则离得是流 不是父盒子)

应该是 border 让元素脱离了文档流(margin 塌陷)

好吧好吧,至于什么是 margin 塌陷,我也是问了度娘,有兴趣的可以自行百度,这里就不再赘述了

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

牛客java刷题知识点总结(八)

方法调用 类中变量&#xff1a; 除了private权限外&#xff0c;其他权限的变量&#xff08;没有表示默认default&#xff09;&#xff0c;均可以用“对象.变量名”来调用。对于private变量&#xff0c;即使使用static&#xff0c;也不能用“类.变量名”来调用私有变量。只能通过…

UID走私:一种在线跟踪用户的新技术

©网络研究院 几十年来&#xff0c;广告商和网络追踪者已经能够在用户访问的所有网站上汇总用户信息&#xff0c;主要是通过在用户的浏览器中放置第三方cookies。 两年前&#xff0c;几个优先考虑用户隐私的浏览器开始默认屏蔽所有用户的第三方cookies。 对于那些代表其…

2022年转行编程选哪门语言?这份报告给你答案!

本报告展示了 JetBrains &#xff08;IntelliJ IDEA的开发公司&#xff09;于2021年进行的第五次年度开发者生态系统调查的综合结果。来自 183 个国家或地区的 31,743 名开发者帮助我们绘制了开发者社区版图。 本文将摘录部分个人觉得有价值的报告&#xff0c;从全球视角以国内…

AI-多模态-2021:Stable Diffusion【根据文本生成图像】【开源】【目前开源模型中最强】

最近大火的Stable Diffusion也开源了(20220823); 我也本地化测试了一下效果确实比Dall-E mini强太多了&#xff0c;对于我们这些玩不上Dall-E2的这个简直就是就是捡钱的感觉&#xff0c;当然后期跑起来&#xff0c;稍微不注意显存就炸了。 这里我写一下安装过程&#xff0c;具…

Fabric.js 限制边框宽度缩放

本文简介 点赞 关注 收藏 学会了 使用 fabric.js 在某些情况下你可能需要固定元素边框的宽度&#xff0c;仔细看文档你会发现 fabric.js 已经为我们提供了这个功能。本文简单介绍一下这个功能。 实现方法 先揭晓答案&#xff0c;将元素的 strokeUniform 属性设置为 true 后…

适合贵校的核心营销讯息

香港 (Xinwengao.com) — 优秀的学校具备策略来提升形象、提高学生的成功率、改善收生&#xff08;和重新入学&#xff09;的成果。这包括为你的学校定下营销讯息。大多数学校都具备自己的营销策略&#xff0c;但很少有营销讯息。一个有力的营销讯息可大大地支援营销策略。 即…

避坑细节拉满!阿里p8技术官私传:MyBatis源码全解析,全彩版附代码分享

摘要 MyBatis是一款优秀的持久层框架&#xff0c;它支持自定义SQL&#xff0c;存储过程以及高级映射&#xff0c;越来越多的企业已经将MyBatis使用到了正式的生产环境&#xff0c;而国内Mybatis流行的原因就在于绝大部分项目都是面向表结构编程的&#xff0c;把Java对象仅当成…

【敏捷研发系列】前端DevOps流水线实践

一、背景现状 软件开发从传统的瀑布流方式到敏捷开发&#xff0c;将软件交付过程中开发和测试形成快速的迭代交付&#xff0c;但在软件交付客户之前或者使用过程中&#xff0c;还包括集成、部署、运维等环节需要进一步优化交付效率。因此Devops的产生将敏捷的相关理念扩展到运…

认识操作系统

操作系统 1 OS 简史 1.1 批处理操作系统 1946-02-04 世界上第一台公认的通用计算机ENIAC在 宾夕法尼亚大学 诞生。1956 年实现 GM-NAA I/O 系统具备批处理特性。 1.2 从专用走向通用 1964 年&#xff0c;美国IBM公司发布 IBM System/360 的大型机。将计算机架构和实现分开…

【Java入门基础第10天】Java常用的转义字符

Java常用的转义字符1、\t:一个制表位,实现对齐功能2、\n:换行符3、\\:转义字符 一个4、\":一个"5、\:一个6、\r:一个回车 System.out.println("学刑法\r有钱途")7、应用实例(Exercise&#xff09;1、\t:一个制表位,实现对齐功能 \t:一个制表位,实现对齐功…

从文科生到前端专家 - 在转行时我想过的问题

▐ 在学习编程之前 在高中时&#xff0c;因为学不会物理和化学&#xff0c;我选择了文科&#xff0c;这也意味着计算机专业类对我关上了大门&#xff0c;不过在当时我也没有想到自己在未来会喜欢上写代码并以此为生。 现在回想起来&#xff0c;与编程有关的只有两件事情。 一是…

java学习day65(乐友商城)实现搜索、分页、排序

1.索引库数据导入 昨天我们学习了Elasticsearch的基本应用。今天就学以致用&#xff0c;搭建搜索微服务&#xff0c;实现搜索功能。 1.1.创建搜索服务 创建module&#xff1a; Pom文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <…

【软件测试】瓶颈?资深测试聊测试开发的瓶颈在哪?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试开发的发展是不…

嵌入式C语言面向对象编程 --- 封装

大部分使用 C 语言进行开发的工程师,在接触更高级的编程语言之前,都认为 C 语言是面向过程的。事实也是如此,对于一些小规模的单片机应用程序,一般都是使用“面向过程”的思维进行单片机C语言编程开发。 但是,如果是需要用C语言开发一些规模比较大的软件的时候,比如操作…

pycharm 中sqlite升级方法

sqlite 3.21升级到3.40 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> help Type help()…

小哥用Python兼职月入过万,用Python做项目有多赚钱?

问&#xff1a;请问用Python可以接哪些兼职的活赚钱&#xff1f; 1 兼职费用足够学费生活费 恰巧上学期间接过一些外包&#xff0c;恩&#xff0c;足够我和我媳妇的学费以及生活费&#xff0c;以及xx各种费用。 主要干过以下几种&#xff1a; 游戏外挂&#xff1a;主要开发…

Jetpack Compose中的导航路由

Jetpack Compose中的导航库是由Jetpack库中的Navigation组件库的基础上添加的对Compose的扩展支持&#xff0c;使用需要单独添加依赖&#xff1a; implementation "androidx.navigation:navigation-compose:$nav_version" Jetpack库中的Navigation使用起来还是比较麻…

毕业时就已26,工作4年就已大龄,码农出路在哪?

边工作边迷茫这可能是我们大多数职场人的常态。一边觉得这份工作不适合自己&#xff0c;另一边又不知道能去做什么。喜欢的工作&#xff0c;却又不知道如何提升。长此以往&#xff0c;内心难免产生焦躁&#xff0c;尤其随着年龄的增长&#xff0c;内心更是希望能够在事业上有所…

MySQL数据库的安装、创建库、创建表、创建测试数据及连接取数

安装MySQL数据库MySQL数据库简介安装MySQL数据库下载安装包安装MySQLMySQL创建一个新的数据库&#xff0c;并在其中创建新的数据表&#xff0c;填充测试数据并查看mysql>模式下输入的每句sql语句都要以;结尾&#xff1b;若多行语句无;&#xff0c;则被默认为一条语句未输入完…

设计好接口的36个锦囊

前言 大家好&#xff0c;我是捡田螺的小男孩。作为后端开发&#xff0c;不管是什么语言&#xff0c;Java、Go还是C&#xff0c;其背后的后端思想都是类似的。后面打算出一个后端思想的技术专栏&#xff0c;主要包括后端的一些设计、或者后端规范相关的&#xff0c;希望对大家日…