CSS:浮动

CSS:浮动

    • 浮动效果
    • 浮动方式 float
    • 浮动特性
      • 标准流
      • 脱标
        • 脱标的影响
        • 脱标的影响范围
    • 清除浮动
      • 清除浮动原理 clear
        • 基于clear的清除浮动方式
          • 额外标签法
          • :afert伪元素法
          • 双伪元素法
      • 清除浮动原理 BFC
        • BFC定义
        • BFC布局规则
        • 创建一个BFC
        • 基于BFC的清除浮动方式
          • 父级添加overflow法


浮动效果

盒子模型有三种主要类型:blockinlineinline-block。我们回顾一下三者的特性,请问如何让两个盒子既可以设置宽高,又能在同一行摆放?
block类型的盒子,会独占一行;inline类型的盒子不能设置宽度;好像只有inline-block满足要求了。但是inline-block有一个缺点,基于inline-block在同一行摆放的盒子,会有固定的间隙,且无法通过修改外边距消除:示例:
在这里插入图片描述
在示例中,我们将三个div设为了inline-block,并且使它们的外边距为0。可是最后我们的盒子依然有间隙,此时就需要使用浮动了。
我们先展示一下浮动的效果:
在这里插入图片描述
可以看到,我们不仅将块级元素直接放在了同一行,而且它们之间没有间隙。


浮动方式 float

float属性用于创建浮动框,被浮动的元素会被移到一边,直到触及边缘,或者触及到另一个浮动元素的边缘。

属性值:

属性值描述
none元素不浮动(默认值)
left元素向左浮动
right元素向右浮动

浮动的基本使用其实非常简单,无非就是向左浮动还是向右浮动。
向左浮动:
在这里插入图片描述
三个小盒子依次挨着浏览器的左侧

向右浮动:
在这里插入图片描述
三个小盒子依次挨着浏览器的右侧。

对比一下两张图片,有一个小细节,三个盒子的顺序反转了,这是为什么?
首先,我们的代码从上往下的顺序是蓝,粉,黄。浮动会根据代码顺序,依次进行浮动,什么意思呢?

对于左浮动:
由于蓝色盒子在代码最上方,于是蓝色盒子第一个靠向左边,贴紧了浏览器左边;
当轮到粉色盒子时,它第二个浮动,于是它会向左靠近,直到遇到蓝色盒子的边缘;
当轮到黄色盒子时,它第三个浮动,于是它会向左靠近,直到遇到粉色盒子的边缘;
最后从左到右就是蓝,粉,黄。

对于右浮动:
由于蓝色盒子在代码最上方,于是蓝色盒子第一个靠向右边,贴紧了浏览器右边;
当轮到粉色盒子时,它第二个浮动,于是它会向右靠近,直到遇到蓝色盒子的边缘;
当轮到黄色盒子时,它第三个浮动,于是它会向右靠近,直到遇到粉色盒子的边缘;
最后从左到右就是黄,粉,蓝。

我们也可以对不同盒子设置不同方向的浮动:
在这里插入图片描述
设置左浮动的盒子就靠着左边,设置右浮动的盒子就靠着右边了。

以上就是浮动的基本用法,是不是效果很好?
但是其也会带来不少麻烦,本博客只有1/4讲解浮动的使用,剩下的3/4就是讲解如何处理浮动带来的麻烦了。


浮动特性

标准流

所谓的标准流,就是标签按照规定好的默认方式排列,即遵循以下规则:

1.块级元素会独占一行,从上向下顺序排列
2.行内元素会按照顺序,从左向右排列,碰到父级元素边缘则自动换行

我们在之前学到的布局方式,就是标准流布局,这也是最基本的布局方式。


脱标

脱标的影响

被设置了浮动的元素,会脱离标准流,按照浮动的规则排列。

由于浮动的元素脱离了标准流,它不会占用标准流的位置

也许你无法很好理解刚才的话,我们用案例来解释:
在这里插入图片描述

首先,我们有三个盒子,它们目前都没有设置浮动,都处于标准流中,接下来我们对蓝色和粉色盒子设置浮动:
在这里插入图片描述

可以看到,最终效果并不是单纯的蓝色盒子与粉色盒子向左侧浮动,而黄色盒子的布局也受到了影响。
在这个布局中,蓝色盒子与粉色盒子脱离了标准流,而黄色盒子依然处于标准流中。此时蓝色盒子与粉色盒子不会保留其原先在标准流中的位置,所以黄色盒子就跑到了它们的下面,看起来就好像蓝色和粉色盒子浮起来了。这就是脱标。

脱标的影响范围

浮动的盒子只会影响浮动盒子后面的标准流,不会影响前面的标准流

这句话又是啥意思?我们依然用案例来解释:
在这里插入图片描述
请注意:上面的粉色盒子是设置了浮动的!
为什么我们的粉色的盒子设置了浮动和没设置浮动的位置一样呢?
这是因为,蓝色盒子处于标准流中,虽然粉色盒子脱标了,但是其无法影响到其上方的标准流。
这也就是我们的影响范围导致的结果,虽然粉色盒子脱标后,其按照浮动规则排列,向左侧靠,直到遇到了浏览器的边缘。
而蓝色盒子是标准流中的块级元素,具有独占一行的属性,由于粉色盒子无法影响到其上方的标准流,所以最后其按照标准流独占一行。

我们在把黄色盒子加回来:
在这里插入图片描述
可以看到,由于黄色盒子是粉色盒子后面的元素,它会被粉色盒子的浮动影响,最后到了粉色盒子的下方。这也证明了粉色盒子确实浮动了。

最后我提一个问题:如果我现在在黄色盒子下方加一个浮动的绿色盒子,请问它会出现在粉色盒子的右侧,还是黄色盒子的下方?
在这里插入图片描述
答案是黄色盒子的下方,一样的规则:
由于黄色盒子是标准流,而绿色盒子为浮动,绿色盒子的浮动无法影响到其上方的标准流,所以绿色盒子会在黄色盒子下方按照浮动规则排列。

所以在一个范围内,要浮动就最好全部浮动,避免带来标准流与浮动的错乱,这种堆叠关系完全可以依靠盒子里面嵌套盒子来完成,而不是依靠脱标的特性。
我们浮动的目的,是让盒子遵循浮动的规则并排排列,而不是为了让其他元素跑到它下面!


清除浮动

我们先依靠一个案例来引入问题:
现在我们有一个大盒子father,以及四个小盒子,四个小盒子全部浮动,目前效果是这样的:
在这里插入图片描述
接下来我们去掉father的高:
在这里插入图片描述
我们可以看到,父级元素的高度没有了,只剩下一个宽度600px的边框。
浮动的盒子,由于其脱标的特性,相当于父级盒子中不存在这些浮动的盒子,导致无法撑开父级元素的高度
你会说,那我们直接给父亲高度不就好了,但是很多时候,我们父亲的高度是不确定的,比如这是一个淘宝的商品栏目,当我需要添加商品的时候,还要去再设置一次高度,这不是很麻烦吗?
我们理想中的状态是:子级盒子可以依照浮动的规则排列,但是又能撑开标准流中父级元素的高度
想要达到这个效果,就需要清除浮动


清除浮动原理 clear

clear是CSS的一个属性值,其用于清除浮动对自身的影响。
属性值:

属性值效果
none允许周围有浮动元素(默认值)
left自身必须低于所有左浮动元素
right自身必须低于所有右浮动元
both自身必须低于所有左浮动或右浮动元素

通过案例来讲解规则:
在这里插入图片描述
现在我们有一个左浮动的蓝色盒子,右浮动的粉色盒子,以及标准流中的黄色盒子。
接下来我们对黄色盒子设置clear: left
在这里插入图片描述
我们的黄色盒子出现在了蓝色盒子的下方,因为蓝色盒子是左浮动的,黄色盒子设置了clear: left后,就会低于所有左浮动元素,这里就是低于蓝色盒子。
那么我们改成clear: right会咋样?
那么黄色盒子就会低于所有右浮动元素,也就是低于粉色盒子了:
在这里插入图片描述
可以看到,黄色盒子此时就低于粉色盒子的下方了。
那么clear: both就是,既要低于左浮动盒子,也要低于右浮动盒子:
请添加图片描述
在上图中,黄色盒子要同时低于左右浮动的盒子,所以不论是粉色盒子低了,还是蓝色盒子低了,黄色盒子都要往下走。

讲了这么多,我们的最终目的还是要让浮动的盒子把标准流的父亲撑开
在上面的案例中,有一个非常非常非常重要的点,那就是黄色盒子处于标准流中!!!
这说明了,黄色盒子是可以撑开父亲高度的!
那么我们回到最初的案例:
在这里插入图片描述

现在我们在前四个浮动盒子的末尾加上一个10×10的小盒子,并设置clear: both,此时小盒子就会低于所有盒子:
在这里插入图片描述
可以看到,我们的父亲盒子被撑开了!!!
这就是clear清除浮动的基本原理!


基于clear的清除浮动方式
额外标签法

其实我们刚刚最后的案例,就是额外标签法。
刚刚只是为了方便大家理解,我们为最后一个div设置了10×10的大小。但是其实这个div可以没有大小,但是依然存在:
在这里插入图片描述
通过这种方式,我们就可以得到一个盒子,其没有大小,又真实存在,而且出现在所有浮动盒子的下方,最后撑开了父亲的高度。


:afert伪元素法

刚刚那个方法有一个小毛病,就是我们每一个父亲盒子都要去写一个这样的尾部盒子,会略有些繁琐。在此我们可以利用:after伪元素,它是一个不存在于文档树中的元素,但是真实存在于页面中,它的用法不具体展开讲解伪元素本身的用法,而是讲解伪元素在此处的用法。
其功能就是,在一个盒子的最末尾添加一个元素。

在这里插入图片描述
其最终效果也是相当于在箭头指向处添加了一个看不见,又真实存在的元素。
它的使用比较方便,只需要在父级元素调用clearfix这个类即可,不需要再写额外的标签了。
代码:

<style>
            .clearfix:after {
                content: "";
                display: block;
                height: 0;
                clear: both;
                visibility: hidden;
            }
</style>

双伪元素法

双伪元素和:after伪元素是基本一致的,只是额外加了一个:before伪元素。
在这里插入图片描述
其最终效果相当于在父级盒子的头尾各自存在一个看不见的元素,撑开了父亲的高度。
代码:

<style>
            .clearfix:before,
            .clearfix:after {
                content: "";
                display: table;
            }
            .clearfix:after {
                clear: both;
            }
</style>

清除浮动原理 BFC

BFC定义

BFC(Block Formatting Context),块级格式化上下文,它规定了内部的块级元素的布局方式,默认情况下只有根元素(即body)一个块级上下文。

BFC布局规则

BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素;外面的元素也不会影响到容器里面的子元素;
计算BFC的高度时,浮动元素也参与计算

创建一个BFC

首先我们要知道怎样创建BFC,一个BFC可以被显式触发,只需满足以下条件之一:

float的值不为none;
overflow的值不为visible;
position的值为fixed / absolute;
display的值为table-cell / table-caption / inline-block / flex / inline-flex。


基于BFC的清除浮动方式

其实刚刚的内容你看不太懂也没关系,只需要记住我高亮标注的那句话:BFC是会把浮动元素当作自己的内容的
另外,你也需要知道,我刚刚列举的,哪些情况下元素会变成BFC。
现在我们只需要将父级元素变成BFC,我们的浮动元素的大小就会被计算进去,父级元素自然就会被撑开了。

父级添加overflow法

在以把父亲撑开为目的情况下,我们最常使用的是overflow,只需对父级元素添加一个overflow属性,且属性值不为visible,那么其大小就会被撑开了,我们平常使用的属性值为hidden:
在这里插入图片描述
这就是最后一种清除浮动的方式了。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络编程——Socket编程步骤及常用API

Sockt服务器和客户端的开发步骤 TCP connect()最好建立在listen()后&#xff0c;一旦监听到就建立连接。 UDP 常用API 包含头文件 #include<sys/types.h> #include<sys/socket.h>创建套接字&#xff08;连接协议&#xff09; 作用 用于根据指定的地址族、数据…

最新AI创作系统ChatGPT系统源码+DALL-E3文生图+AI绘画+GPT语音对话功能

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

openai最新探索:超级对齐是否可行?

前言 今天来介绍一篇openai最新的paper&#xff1a;弱到强的对齐。 openai专门成立了一个团队来做大模型的超级对齐即superhuman model&#xff0c;之前chatgpt取得成功依赖RLHF即依赖人类反馈&#xff0c;但是作者期望的superhuman model将会是一个能够处理各种复杂问题的强…

关键字:protected关键字

在 Java 中&#xff0c;protected 是一个访问修饰符&#xff0c;用于修饰类成员&#xff08;成员变量、成员方法和构造方法&#xff09;。当一个类成员被声明为 protected 时&#xff0c;它可以在同一包中的其他类以及子类中被访问。 以下是 protected 关键字的解析&#xff1a…

异方差 的 BP检验 方法及原理详解

异方差 的 BP检验详解            文章目录 1. `BP`检验的步骤2. 场景示例步骤 ①步骤 ②BP检验,也称为Breusch-Pagan检验,是一种用于检验线性回归模型中异方差性(即误差项方差不恒定)的统计方法。该方法由Trevor S. Breusch和Adrian R. Pagan在1980年提出。 1.…

C++ map和vector向量使用方法

C map用法 C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的,如下图&#xff1a;每一对中的第一个值称之为关键字(key)&#xff0c;每个关键字只能在 map 中出现一次&#xff1b;第二个称之为该关键字的对应值。 map的使用 需要导入头文件 #include …

.Net 访问电子邮箱-LumiSoft.Net,好用

序言&#xff1a; 网上找了很多关于.Net如何访问电子邮箱的方法&#xff0c;但是大多数都达不到想要的需求&#xff0c;只有一些 收发邮件。因此 花了很大功夫去看 LumiSoft.Net.dll 的源码&#xff0c;总算做出自己想要的结果了&#xff0c;果然学习诗人进步。 介绍&#xff…

swing快速入门(二十四)绘画板-可调色

注释很详细&#xff0c;直接上代码 上一篇 Look here~ 听我说完再继续看更容易理解&#xff1a; 如果说用之前的绘图方法写一个绘画板你会怎么做&#xff1f;重绘会让之前的内容消失呀&#xff0c;用各种数据结构记录每个像素点的位置或颜色&#xff1f;嘶&#xff0c;感觉很麻…

【数据结构】递归与分治

一.递归 1.递归的概念&#xff1a; 子程序&#xff08;或函数&#xff09;. 接调用自己或通过一系列调用语句间接调用自己&#xff0c;成为递归。 递归是一种描述问题和解决问题的基本方法。 重复地把问题转化为与原问题相似的新问题&#xff0c;直到问题解决为止。 2.递归…

MyBatis 架构分析

文章目录 三层架构一、基础支撑层1.1 类型转换模块1.2 日志模块1.3 反射工具模块1.4 Binding 模块1.5 数据源模块1.6 缓存模块1.6 解析器模块1.7 事务管理模块 二、核心处理层2.1 配置解析2.2 SQL 解析与 scripting 模块。2.3 MyBatis 中的 scripting 模块就是负责动态生成 SQL…

111基于matlab的粒子滤波进行锂离子电池的循环寿命预测

基于matlab的粒子滤波进行锂离子电池的循环寿命预测&#xff0c;输出实验、粒子滤波及自然预测数据结果。程序已调通&#xff0c;可直接运行。 111matlab锂离子电池寿命预测 (xiaohongshu.com)

Git安装和使用教程,并以gitee为例实现远程连接远程仓库

文章目录 1、Git简介及安装2、使用方法2.1、Git的启动与配置2.2、基本操作2.2.1、搭建自己的workspace2.2.2、git add2.2.3、git commit2.2.4、忽略某些文件不予提交2.2.5、以gitee为例实现git连接gitee远程仓库来托管代码 1、Git简介及安装 版本控制&#xff08;Revision cont…

C/C++ 连接访问 MySQL数据库

前面我们已经讲述了MySQL的基础使用&#xff0c;现在我们来看一下如何使用语言来操作数据库。在实际开发中&#xff0c;语言连接MySQL是为了能够在编程语言中与MySQL数据库进行交互和操作。大部分情况我们都是通过语言连接MySQL&#xff0c;建立与MySQL数据库的连接&#xff0c…

springboot实现发送邮件开箱即用

springboot实现发送邮件开箱即用 环境依赖包yml配置Service层Controller层测试 环境 jdk17 springboot版本3.2.1 依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><ver…

分布式系统架构设计之分布式数据管理

随着互联网时代的不断发展&#xff0c;分布式系统架构成为支撑大规模用户和高并发访问的基础。在构建分布式系统时&#xff0c;分布式系统有着一系列的要求以及对应的核心技术&#xff0c;涉及到数据管理、通信安全性、性能优化、可扩展性设计以及架构演进与版本管理等很多方面…

N字形变换(麻烦的方法)

class Solution:def convert(self, s: str, numRows: int) -> str:#先判断z有多少隔开s_new""index_now0if len(s)<numRows or numRows1:return sfor i in range(numRows-1,-1,-1):exchange0index_exchangeindex_nows_news[index_now]#计算每一层的差距gap_but…

【零基础入门Python】Python参数

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门Pythonhttps://blog.csdn.net/arthas777/category_12455877.html 目录 print&#xff08;&#xff09;中的Python结束参数 print&#xff08;&#xff09;中的Python|sep参数 Python的格式转换规则 使用格式…

Vue如何请求接口——axios请求

1、安装axios 在cmd或powershell打开文件后&#xff0c;输入下面的命令 npm install axios 可在项目框架中的package.json中查看是否&#xff1a; 二、引用axios import axios from axios 在需要使用的页面中引用 三、get方式使用 get请求使用params传参,本文只列举常用参数…

java中线程相关的面试题

什么是线程安全&#xff0c;造成线程安全的本质是什么&#xff1f; 什么是线程安全呢&#xff1f; 咱们初步去理解话记住一句话就行&#xff1a;如果一个对象可以安全地被多个线程同时使用&#xff0c;那它就是线程安全的。 为什么并发编程会导致线程不安全&#xff1f; 可见…