CSS盒模型

news2024/12/28 18:26:42

目录

  • 盒子区域
  • 包含块/containing block
    • 包含块的确定
    • 包含块的影响
  • 行盒/line-boxes
    • 行盒的特性
    • vertical-align
  • BFC
    • FC
    • BFC的创建
    • BFC的作用
  • 关于BFC解决margin折叠问题
  • 关于设置overflow:auto解决浮动塌陷问题
    • BFC解决塌陷问题的两个条件
    • BFC计算高度规则

盒子区域

浏览器在展示每一个元素时,都会生成一个它的盒子
一个盒子通常会被分为四个区域
最外层是外边距(margin)区
其次是边框(border)区
之后是内边距(padding)区
最内层的是内容(content)区

包含块/containing block

在网页中,一个元素盒子的大小和位置通常是根据一个特殊矩形来计算的,这个特殊矩形就是它的包含块

包含块的确定

包含块的确定有着如下规则:

  1. 一般而言,一个元素盒子的包含块是离他最近的父级块元素盒子的内容区域(如block,inline-block)
    如下,此时p元素的包含块为div
<div>
	<p>123</p>
</div>
  1. 如果是根元素html的话它的包含块是一个名叫初始包含块的矩形,它的大小通常与视口一致

  2. 如果一个元素的position属性值为relative或者是static
    参照第一条
    如下,p元素的包含块依旧是div

	<style>
	p {
		position:relative;
	}
	</style>
	<div>
		<p>123</p>
	</div>
  1. 如果一个元素的position属性值为absolute
    包含块为离他最近的position属性值为relativeabsolutefixed的父级块元素的内边距区
    如下,p元素的包含块为box1的内边距区,而不是box2
<style>
box1 {
	position:relative;
}
p {
	position:absolute;
}
</style>
<div class="box1">
	<div class="box2">
		<p>123</p>
	</div>
</div>

  1. 如果一个元素的position属性值为fixed
    包含块参照第二条
	<style>
	p {
		position:fixed;
	}
	</style>
	<div>
		<p>123</p>
	</div>

包含块的影响

具体来说,包含块会影响很多属性,如height,width等等,当他们的值为百分比时并不是依据父级元素来计算,而是根据包含块来进行计算,认识包含块以及寻找包含块有时候十分有必要的

行盒/line-boxes

简单来说,行盒就是包裹一行的盒子
我们知道行内盒子与行内盒子是能在同一行显示
这些盒子所占据的一行被称为行盒
我们的元素其实由无数个行盒组成

行盒的特性

我们拿几种具体的例子来举例说明

  1. 只有文字时,行盒如何包裹内容
    `

     <style>
        div {
            background-color: red;
        }
    </style>
    
    
    <div>
        123
    </div>
    

    只有文字

    行盒会包裹文字

  2. 图片,有文字时,行盒如何包裹内容

    <style>
        div {
            background-color: red;
        }
    
        img {
            height: 300px;
        }
    </style>
    
    <div>
        123
        <img src="./素材.jpg" alt="">
    </div>
    

    文字图片

    行盒会包裹文字和图片并且图片和文字的基线对齐

  3. 情况三:有图片,有文字,有行内级盒子(比图片要大)如何包裹内容

        <style>
        div {
            background-color: red;
        }
    
        img {
            height: 300px;
        }
    
        span {
            display: inline-block;
            height: 400px;
            width: 200px;
            background-color: aqua;
        }
    </style>
    
    <div>
        gfj
        <img src="./素材.jpg" alt="">
        <span></span>
    </div>
    

    文字图片块
    行盒会包裹文字和图片和行内级盒子并且图片以及行内级盒子和文字的基线对齐

  4. 图片,有文字,有行内级盒子(比图片要大)而且设置了margin-bottom,如何包裹内容

        <style>
        div {
            background-color: red;
        }
    
        img {
            height: 300px;
        }
    
        span {
            margin-bottom: 30px;
            display: inline-block;
            height: 400px;
            width: 200px;
            background-color: aqua;
        }
    </style>
    
    <div>
        gfj
        <img src="./素材.jpg" alt="">
        <span></span>
    </div>
    

    margin-b
    行盒会包裹文字和图片和行内级盒子并且图片和文字的基线对齐

  5. 情况五:有图片文字行内级盒子(比图片要大)而且设置了margin-bottom并且有文字,如何包裹内容

        <style>
        div {
            background-color: red;
        }
    
        img {
            height: 300px;
        }
    
        span {
            margin-bottom: 30px;
            display: inline-block;
            height: 400px;
            width: 200px;
            background-color: aqua;
        }
    </style>
    
    <div>
        gfj
        <img src="./素材.jpg" alt="">
        <span>gfj</span>
    </div>
    

    行内级盒子文字

    行盒会包裹文字和图片和行内级盒子并且图片与行内级盒子的文字基线对齐

由此我们可以得到总结:

  1. 一个div没有设置高度没有内容时没有高度,有内容时由内容的行高撑开
  2. 行盒一定会包裹主这一行的所有内容
  3. 行盒的默认对齐方式为基线对齐
  4. 文本的基线是字母x的下方
  5. 行内级盒子默认的基线是margin-bottom的底部
  6. 行内级盒子有文字时,基线为行内级盒子中最后一行文字的基线,参见第四条

vertical-align

vertical-align可以更改行盒中的对齐方式
常见的取值有:

  1. baseline
    基线对齐,也是vertical-align默认对齐方式
  2. top
    行内级盒子的顶部跟行盒顶部对齐
  3. middle
    行内级盒子中心与行盒中心对齐
  4. bottom
    行内级盒子的底部跟l行盒底部对齐

BFC

BFCBlock Formatting Context 块格式化上下文
在了解BFC之前我们需要知道FC

FC

FCFormatting Context 格式化上下文
我们网页中的元素都属于FC的一部分
他规定了网页中元素是怎样布局的
块级元素属于BFC
行内级元素属于IFC
FC是BFC和IFC的并集

BFC的创建

W3C中规定了几种创建BFC的方式

  1. 根元素
  2. 浮动元素
  3. 绝对定位元素(元素的positionabsolutefixed
  4. 行内块元素
  5. 格单元格(元素的displaytable-cellHTML表格单元格默认为该值),表格标题(元素的 displaytable-captionHTML表格标题默认为该值)
  6. 匿名表格单元格元素(元素的displaytabletable-rowtable-row-grouptable-header-grouptable-footer-group(分别是HTML tablerowtbodyheadtfoot 的默认属性)或 inline-table
  7. overflow不为visible的块元素
  8. 弹性元素
  9. 网格元素
  10. display值为flow-root的元素

BFC的作用

BFC规定了块级盒子是如何在页面中排布的
具体有以下几个规则:

  1. BFC中盒子是在垂直方向上一个挨着一个排布
  2. 垂直方向上的间距由margin决定
  3. 同一个BFC中两个相邻的盒子的margin会发生折叠
  4. 每个盒子的左边缘都是紧挨在包含块的左边缘的

关于BFC解决margin折叠问题

    <style>
        .box1 {
            margin-bottom: 200px;
            height: 200px;
            background-color: red;
        }

        .box2 {
            margin-top: 200px;
            height: 200px;
            background-color: aqua;
        }
    </style>

    <div class="box1"></div>
    <div class="box2"></div>

折叠
我们可以看到这里发生了margin的折叠问题,因为W3C规定在同一个BFC中相邻两个盒子之间的margin会发生折叠
解决方案就是让他们两个盒子不出在同一个BFC

    <style>
        .box1 {
            margin-bottom: 200px;
            height: 200px;
            background-color: red;
        }

        .box2 {
            margin-top: 200px;
            height: 200px;
            background-color: aqua;
        }

        .box3 {
            overflow: auto;   //这里可以选用上面其中一种方式来创建BFC
        }
    </style>

    <div class="box3">
        <div class="box1"></div>
    </div>
    <div class="box2"></div>

解决方案
使两个盒子不在同一个BFC中就不会发生折叠问题了

关于设置overflow:auto解决浮动塌陷问题

在我们以前的学习中也曾遇到过使用浮动导致高度塌陷问题,我们也学习了很多种解决方法,其中一种就是父元素设置overflow:auto来解决
我们现在知道当设置了overflow:auto时便创建了一个新的BFC,因为在一个新的BFC中塌陷问题就解决了,但很少有人能说清楚为什么能解决

BFC解决塌陷问题的两个条件

  1. 浮动元素的父元素需要是一个BFC
  2. 父元素的高度必须为auto即不设置或设置为auto

只有达成这两个条件BFC才能解决塌陷问题

BFC计算高度规则

  1. 如果只有行内级盒子,是行高的顶部和底部的距离
  2. 如果有块级盒子,是最底层的块上边缘和最底层块盒子的下边缘之间的距离
  3. 如果有绝对定位元素,将被忽略
  4. 如果有浮动元素,那么会增加高度以包括这些浮动元素的下边缘

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

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

相关文章

N-121基于微信小程序网上书城系统

开发工具&#xff1a;IDEA、微信小程序 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;vue、uniapp 服务端技术&#xff1a;springbootmybatisredis 本系统分微信小程序和管理后台两部分&a…

(23)目标检测算法之YOLOv6 (1)全流程指南:环境安装、模型配置、训练及推理

目标检测算法之YOLOv6 (1)全流程指南&#xff1a;环境安装、模型配置、训练及推理 本文向将介绍 YOLOv6 的整体框架&#xff0c;并提供详细的教程链接。官方论文 ☞ YOLOv6: A Single-Stage Object Detection Framework for Industrial Applicationsv3.0版本论文更新 ☞ YOLOv…

综合评价算法 | Matlab实现基于AHP层次分析法的综合评价算法

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 综合评价算法 | Matlab实现基于AHP层次分析法的综合评价算法 研究内容 AHP的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因 素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作…

测试四—测试分类

一、按测试对象划分 1.1 界面测试 界面测试&#xff08;简称UI测试)&#xff0c;指按照界面的需求&#xff08;一般是UI设计稿&#xff09;和界面的设计规则&#xff0c;对我们软件界面所展示的全部内容进行测试和检查&#xff0c;一般包括如下内容&#xff1a; 验证界面内容…

解决:在微服务中一个服务访问另一个服务的类或方法出现的问题

我的需求&#xff1a; 我需要在用户模块使用公共模块的service和mapper和实体类&#xff0c;出现以下错误 ​ springboot启动错误如下&#xff1a; 报错结果&#xff1a;需要一个类型为“com.buba.yka.mapper.salesmanMapper”的bean&#xff0c;但找不到该bean Error starti…

接口自动化面试题【思路分享】

文末免费领资料 接口自动化流程怎么做的&#xff0c;框架怎么搭建的&#xff1f; 流程&#xff1a; 1、分析需求&#xff0c;确定测试范围 2、搭建自动化测试环境、准备相关测试数据 3、工具选型&#xff0c;搭建测试框架 4、编写用例 5、执行用例&#xff0c;生成测试报…

记录好项目D19

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个网上商城管理系统 一、系统介绍 需求设计主要参考天猫商城的购物流…

【Linux】—— 进程的环境变量

序言&#xff1a; 在上期我们已经对进程PCB以及进程状态进行了详细的解释说明。今天&#xff0c;我将带领大家学习的是关于进程的环境变量的问题。 目录 &#xff08;一&#xff09;孤儿进程 1、基本介绍 2、代码演示 &#xff08;二&#xff09;环境变量 1、基本概念 2…

使用git管理matlab代码

matlab使用git管理代码 设置 Git 源代码管理 - MATLAB & Simulink - MathWorks 中国 在 R2020b 之前&#xff0c;必须安装命令行 Git 客户端&#xff0c;才能使用 Git 合并 MATLAB 中的分支。有关详细信息&#xff0c;请参阅安装命令行 Git 客户端。 1.在 Git 中注册二进…

Groovy系列三 Java SpringBoot 整合 Groovy

目录 一、概述 一、在Java中使用Groovy&#xff1a; 二、在Groovy中使用Java&#xff1a; 三、几种范式的不同、优缺点 Java调用Groovy的类和方法&#xff1a; Groovy调用Java的类和方法&#xff1a; 使用GroovyShell执行Groovy脚本&#xff1a; 使用GroovyClassLoader加…

4.0ORBSLAM3之局部建图线程概述

1.简介 局部建图线程是ORBSLAM3的核心线程之一&#xff0c;在初始化SLAM系统时被创建和启动&#xff0c;主要作用是为跟踪线程(跟踪局部地图)以及回环检测线程(回环检测)服务&#xff0c;并进行局部地图优化以及时消除轨迹的累计误差。局部建图线程主要维护一个由共视图Covisi…

JSP网上订餐管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 网上订餐管理系统是一套完善的web设计系统&#xff0c;对理解JSP java SERLVET mvc编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&a…

java压测工具 Jmeter初使用

一. 下载及安装教程 1. 有博主总结的很好&#xff0c;这里直接放传送门&#xff1a; 【Jmeter】win 10 / win 11&#xff1a;Jmeter 下载、安装、汉化、新机迁移、版本更新&#xff08;Jmeter 4 以上版本均适用&#xff09; 2. Jmeter 自定义创建桌面快捷方式 3. JMeter插件…

手写vue-diff算法(三)updateChildren

前文回顾 上一篇提到&#xff0c;新老儿子节点比对可能存在的 3 种情况及对应的处理方法&#xff1a; 情况 1&#xff1a;老的有儿子&#xff0c;新的没有儿子 处理方法&#xff1a;直接将多余的老dom元素删除即可&#xff1b; 情况 2&#xff1a;老的没有儿子&#xff0c;…

基础知识--客户端·服务端·代理

目录 一、客户端 1.什么是客户端 2.客户端分类 二、服务端 1.什么是服务器 2.服务器的作用 3.服务器工作原理 4.服务器的组成 服务器硬件 服务器软件 5.补充 三、代理 1.代理的分类 正向代理 反向代理 两者的区别与联系 2.总结 一、客户端 1.什么是客户端 …

【八股】【C++】(二)函数、类、模板

这里写目录标题 形参与实参的区别函数调用过程指针和引用当函数参数回调函数友元函数重载匹配运算符重载直接初始化与拷贝初始化函数指针C中struct&#xff08;结构&#xff09;和class&#xff08;类&#xff09;的区别C有哪几种构造函数构造函数的执行顺序析构函数的执行顺序…

设计消息模块的业务层Web层

目录 业务层 一、定义Message业务接口 二、定义Message业务实现类 Web层 一、获取分页消息列表 二、根据ID查询消息 三、把未读消息更新成已读消息 四、删除消息 业务层 一、定义Message业务接口 创建 MessageService.java 类 public interface MessageService {pub…

mybatis-plus使用@Delete注解批量删除实战

使用Delete注解批量删除 1、控制器调用 // test // http://localhost:3000/function/test // 删除操作按钮权限 Transactional GetMapping("/test") public JSONObject testBatch() {// Arrays.asList(1, 2, 3)JSONObject result new JSONObject();try {functionM…

Django+vue3权限菜单rabc设计和动态路由

本次是基于Django和vue实现 github源码&#xff1a;nineaiyu/xadmin-server: xadmin-基于Djangovue3的rbac权限管理系统 (github.com) 服务器设计及部分代码 权限控制的话&#xff0c;可以基于Django的permission进行控制&#xff0c;并通过访问api的URL操作 核心代码如下 …

stable-diffusion使用openpose报错

依据教程 &#xff1a; https://post.smzdm.com/p/awz2l2xg/ 使用 stable-diffusion教学之ControlNetlora换脸 报错&#xff1a; urllib.error.URLError: <urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。> File "E:\ai\sd-webui-aki-v4\ext…