CSS 浮动布局

news2025/1/15 20:51:24

浮动的设计初衷

float: left/right/both;

浮动是网页布局最古老的方式。

浮动一开始并不是为了网页布局而设计,它的初衷是将一个元素拉到一侧,这样文档流就能够包围它

常见的用途是文本环绕图片:

在这里插入图片描述

浮动元素会被移出正常文档流,并被拉到容器边缘

清除浮动的原因及方法

浮动元素的高度不会追加到父元素上

如果浮动的元素比容器高,那么就可能发生容器折叠现象:

在这里插入图片描述

这时,我们就需要清除浮动。

清除浮动不太优雅的方式:在容器末尾添加一个空 div,设置 clear: both,清除两边浮动,使得容器会向下扩展包含它。

<div style="clear: both;"></div>

既然是添加一个 div 元素,不如使用伪元素 ::after 来实现。

.clearfix::after{
	display: block;
	content: " ";
	clear: both;
}

这个 clearfix 类是添加到包含浮动元素的元素上,而不是浮动元素本身。

使用 display: block 的原因:默认情况下,伪元素是内联元素,而不是块级元素。为了确保伪元素占据一整行并且在浮动元素之后换行,我们需要将其设置为块级元素。更重要的是,clear 属性只对块级元素生效。

设置 content: " " 的原因:解决一些旧版浏览器的 Bug。


清除浮动后的另一个问题:浮动元素的外边距不会折叠到清除浮动后的容器外部,但是非浮动元素会

对此,解决该问题的clearfix的修改版如下:

.clearfix::after,
.clearfix::before{
    display: table;
    content: " ";
}

.clearfix::after{
    clear: both;
}

为什么使用 display:table 而不是 display: block :外边距无法通过单元格元素折叠。


浮动陷阱:浏览器会将浮动元素尽可能地放在靠上的地方

如果众多的浮动元素高度不一致,最后导致布局会千变万化。哪怕是 1px 的高度差距也会导致浮动陷阱。

解决方法:给每一行的第一个元素清除左浮动

假设每行有 m 个元素:

.floatElement::nth-child(mn+1){
	clear: left
}

浮动布局示例解析:古诗欣赏

初始源代码如下:

index.html

<div class="container">
	<header>
		<h1>古诗欣赏</h1>
	</header>
	<main class="main clearfix">
		<h3>五言绝句</h3>
		<div>
			<div class="media">
				<img class="media-image" src="相思.png">
				<div class="media-body">
					<h4>相思·王维</h4>
					<p>
						红豆生南国,春来发几枝。
						愿君多采撷,此物最相思。
					</p>
				</div>
			</div>
			<div class="media">
				<img class="media-image" src="听筝.png">
				<div class="media-body">
					<h4>听筝·李端</h4>
					<p>
						鸣筝金粟柱,素手玉房前。
						欲得周郎顾,时时误拂弦。
					</p>
				</div>
			</div>
			<div class="media">
				<img class="media-image" src="江雪.png">
				<div class="media-body">
					<h4>江雪·柳宗元</h4>
					<p>
						千山鸟飞绝,万径人踪灭。
						孤舟蓑笠翁,独钓寒江雪。
					</p>
				</div>
			</div>
			<div class="media">
				<img class="media-image" src="春晓.png">
				<div class="media-body">
					<h4>春晓·孟浩然</h4>
					<p>
						春眠不觉晓,处处闻啼鸟。
						夜来风雨声,花落知多少。
					</p>
				</div>
			</div>
		</div>
	</main>
</div>

style.css

:root {
    box-sizing: border-box; /* 修改盒模型 */
}

*,
::before,
::after {
    box-sizing: inherit; /* 继承 box-sizing */
}

body {
    background-color: aliceblue;
    font-family: Arial, Helvetica, sans-serif;
}

/* 猫头鹰选择器 */

body * + *{
    margin-top: 1.5em;
}

header{
    padding: 1em 2em;
    background-color: antiquewhite;
    border-radius: .5em;
    margin-bottom: 2em;
}

.main{
    padding: 0 1.5em;
    background-color: white;
    border-radius: .5em;
}

.container{
    max-width: 800px; /* 自动适配宽度 */
    margin: 0 auto; /* 双容器模式 水平居中 */
}

.media{
    float: left;
    margin: 0 1.5em 1.5em 0; /* 重置 margin */
    width: calc(50% - 1.5em); /* 从宽度里减去 1.5em */
    padding: 1.5em;
    background-color:rgb(238, 245, 247);
    border-radius: .5em;
}

.media-image{
    width: 60px;
    height: 60px;
}

/* 清除浮动 */

/* .clearfix::after{
	display: block;
	content: " ";
	clear: both;
} */

/* 清除浮动修改版 */

.clearfix::after,
.clearfix::before{
    display: table;
    content: " ";
}

.clearfix::after{
    clear: both;
}

/* 解决浮动陷阱 */

.media:nth-child(odd){
    clear: left;
}

效果图:

在这里插入图片描述

实现图片被文字环绕

.media-image{
    width: 100px;
    height: 100px;
    float: left; /* 左浮动 */
}

.media-body{
    margin-top: 0; /* 覆盖猫头鹰选择器 */
}

.media-body h4{
    margin-top: 0; /* 覆盖用户代理样式表 */
}

效果:

在这里插入图片描述

实现图片在左文字在右

在这里插入图片描述

如上,图片被包含在了相邻的同级元素 media-body 中。

如果想实现图片在左文字在右,可以为文字创建一个块级格式上下文(block formatting context,BFC)。

BFC 将内部与外部隔绝开,内外互不影响。

创建 BFC 的方式:

  1. float 不为 none。
  2. overflow 不为 visible。
  3. display 为 inline-block、table-cell、table-caption、flex、inline-flex、grid、inline-grid。
  4. position 为 absolute 或 fixed。

网页的根元素就是一个顶级的 BFC。

CSS 修改如下:

.media-image{
    width: 60px;
    height: 60px;
    float: left;
    margin-right: 1.5em; /* 图片与文字间增加一定间距 */
}

.media-body{
    margin-top: 0; /* 覆盖猫头鹰选择器 */
    overflow: auto; /* 创建 BFC */
}

效果图:

在这里插入图片描述

注意:使用浮动或 display: inline-block创建BFC的元素的宽度会变为 100%

基于浮动实现网格系统

在这里插入图片描述

大部分的 CSS 框架都实现了自己的网格系统:在一个行容器内放置若干列容器,列的宽度由列容器的类决定

<div class="row">
	<div class="column-1"></div>
	<div class="column-1"></div>
	<div class="column-1"></div>
	<div class="column-1"></div>
	<div class="column-1"></div>
	<div class="column-1"></div>
	<div class="column-3"></div>
	<div class="column-3"></div>
</div>

使用网格系统可以提高代码的可复用性。

网格系统不参与行列元素的视觉样式,只负责设置宽度和定位。在行列内的元素就不必再考虑宽度和定位了。

/* 网格系统 */

.row::after{
    display: block;
    content: " ";
    clear: both;
}

[class*="column-"]{
    float: left;
    padding: 0 0.75em; /* 左右设置内边距 */
    margin-top: 0; /* 去掉顶部外边距 */
}

.column-1{
    width: 8.333%;
}
.column-2{
    width: 16.6667%;
}
.column-3{
    width: 25%;
}
.column-4{
    width: 33.3333%;
}
.column-5{
    width: 41.6667%;
}
.column-6{
    width: 50%;
}
.column-7{
    width: 58.333%;
}
.column-8{
    width: 66.6667%;
}
.column-9{
    width: 75%;
}
.column-10{
    width: 83.333%;
}
.column-11{
    width: 91.6667%;
}
.column-12{
    width:100%;
}

完整 CSS:

:root {
    box-sizing: border-box; /* 修改盒模型 */
}

*,
::before,
::after {
    box-sizing: inherit; /* 继承 box-sizing */
}

body {
    background-color: aliceblue;
    font-family: Arial, Helvetica, sans-serif;
}

/* 猫头鹰选择器 */

body * + *{
    margin-top: 1.5em;
}

header{
    padding: 1em 2em;
    background-color: antiquewhite;
    border-radius: .5em;
    margin-bottom: 2em;
}

.main{
    padding: 0 1.5em 1.5em;
    background-color: white;
    border-radius: .5em;
}

.container{
    max-width: 800px; /* 自动适配宽度 */
    margin: 0 auto; /* 双容器模式 水平居中 */
}

/* 媒体对象的样式 */

.media{
    padding: 1.5em;
    background-color:rgb(238, 245, 247);
    border-radius: .5em;
}

.media-image{
    width: 60px;
    height: 60px;
    float: left;
    margin-right: 1.5em;
}

.media-body{
    margin-top: 0; /* 覆盖猫头鹰选择器 */
    overflow: auto; /* 创建 BFC */
}

.media-body h4{
    margin-top: 0; /* 覆盖用户代理样式表 */
}

/* 清除浮动 */

/* .clearfix::after{
	display: block;
	content: " ";
	clear: both;
} */

/* 清除浮动修改版 */

.clearfix::after,
.clearfix::before{
    display: table;
    content: " ";
}

.clearfix::after{
    clear: both;
}

/* 网格系统 */

.row::after{
    display: block;
    content: " ";
    clear: both;
}

[class*="column-"]{
    float: left;
    padding: 0 0.75em; /* 左右设置内边距 */
    margin-top: 0; /* 去掉顶部外边距 */
}

.column-1{
    width: 8.333%;
}
.column-2{
    width: 16.6667%;
}
.column-3{
    width: 25%;
}
.column-4{
    width: 33.3333%;
}
.column-5{
    width: 41.6667%;
}
.column-6{
    width: 50%;
}
.column-7{
    width: 58.333%;
}
.column-8{
    width: 66.6667%;
}
.column-9{
    width: 75%;
}
.column-10{
    width: 83.333%;
}
.column-11{
    width: 91.6667%;
}
.column-12{
    width:100%;
}

效果图如下:

在这里插入图片描述

与前面的相比,这个导致了内容出现了错位,没有对齐标题。

使用负 margin 拉伸行元素解决该问题:

/* 网格系统 */

.row{
    margin-left: -0.75em;
    margin-right: -0.75em;
}

...
...

效果图:

在这里插入图片描述

最终代码。

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

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

相关文章

Redis集群总结

Redis&#xff0c;作为一款开源的、内存中的数据结构存储系统&#xff0c;以其出色的性能和丰富的数据结构在业界赢得了广泛的认可。然而&#xff0c;当我们面临大量数据和高并发请求时&#xff0c;单个 Redis 实例可能无法满足我们的需求。这时&#xff0c;我们就需要使用到 R…

Kubernetes实践:从入门到实践

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

认识Git的工作区、暂存区与版本库

使用 git init 命令在 gitcode 文件夹下创建如下图所示的Git仓库。现在思考这样一个问题&#xff1a;gitcode目录下创建的README文件可以直接被git管理和追踪吗&#xff1f; 答案是否定的&#xff0c;因为只有 Git 本地仓库中的文件才可以被版本控制。什么&#xff1f;难道当前…

内网隧道代理技术(二十七)之 DNS隧道介绍

DNS隧道介绍 DNS协议介绍 域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符…

第二篇------Virtual I/O Device (VIRTIO) Version 1.1

上篇文章&#xff1a;https://blog.csdn.net/Phoenix_zxk/article/details/132917657 篇幅太大&#xff0c;所以分开写&#xff0c;接下来续上 4.3.3.2.1 设备要求&#xff1a;Guest->Host 通知 设备必须忽略 GPR2 的位 0-31&#xff08;从左边数&#xff09;。这样可以使…

Eclipse开源代码下载

当前插件开发&#xff0c;需要修改eclipse源码&#xff0c;如需要修改remote相关的代码&#xff0c;所以需要下载相关源码。网上大多资料都说的不清不楚的&#xff0c;也可能我太小白&#xff0c;不明白&#xff0c;反正就是折腾了一两天才感觉有点思路&#xff0c;改如何找源码…

Linux安全加固:保护你的服务器

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

基于springboot+vue的问卷调查系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

聊天机器人

收集窗帘相关的数据 可以用gpt生成&#xff0c;也可以用爬虫 图形化界面 gradio 向量数据库 faiss python代码 import gradio as gr import random import timefrom typing import Listfrom langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstor…

央媒发稿不能改?媒体发布新闻稿有哪些注意点

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 “央媒发稿不能改”是媒体行业和新闻传播领域的普遍理解。央媒&#xff0c;即中央主要媒体&#xff0c;是权威性的新闻源&#xff0c;当这些媒体发布新闻稿或报道时&#xff0c;其他省、…

服务器监控工具:选择与应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

积木报表 JimuReport v1.6.2-GA5版本发布—高危SQL漏洞安全加固版本

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

活锁 死锁

一、活锁&#xff08;liveLock&#xff09; 活锁是指线程间资源冲突激烈&#xff0c;引起线程不断的尝试获取资源&#xff0c;不断的失败。活锁有点类似于线程饥饿&#xff0c;虽然资源并没有被别人持有&#xff0c;但由于各种原因而无法得到。最常见的原因是进程组的执行顺序…

gRpc入门和springboot整合

gRpc入门和springboot整合 一、简介 1、gprc概念 gRpc是有google开源的一个高性能的pc框架&#xff0c;Stubby google内部的rpc,2015年正式开源&#xff0c;云原生时代一个RPC标准。 tips:异构系统&#xff0c;就是不同编程语言的系统。 2、grpc核心设计思路 grpc核心设计…

【C++深入浅出】日期类的实现

目录 一. 前言 二. 日期类的框架 三. 日期类的实现 3.1 构造函数 3.2 析构函数 3.3 赋值运算符重载 3.4 关系运算符重载 3.5 日期 /- 天数 3.6 自增与自减运算符重载 3.7 日期 - 日期 四. 完整代码 一. 前言 通过前面两期类和对象的学习&#xff0c;我们已经对C的…

MFC读取obj格式文件2

前文读取了obj格式文件中顶点相关的数量信息&#xff0c;下面读取显示obj格式文件中顶点相关的坐标信息&#xff1b;使用前面的立方体obj文件&#xff1b; void CObjtest2View::OnDraw(CDC* pDC) {CObjtest2Doc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw co…

【无公网IP内网穿透】Windows搭建Web站点

什么是cpolar&#xff1f; cpolar是一个非常强大的内网穿透工具&#xff0c;开发调试的必备利器。 它可以将本地内网服务器的HTTP、HTTPS、TCP协议端口映射为公网地址端口&#xff0c;使得公网用户可以轻松访问您的内网服务器&#xff0c;无需部署至公网服务器。支持永久免费使…

redis 主存复制

1. 前言 Redis的持久化机制&#xff0c;它很好的解决了单台Redis服务器由于意外情况导致Redis服务器进程退出或者Redis服务器宕机而造成的数据丢失问题。 在一定程度上保证了数据的安全性&#xff0c;即便是服务器宕机的情况下&#xff0c;也可以保证数据的丢失非常少。 通常…

【python量化】挖掘股价中的图关系:基于图注意力网络的股价预测模型

写在前面 近些年&#xff0c;图神经网络在时间序列预测领域发挥了重要的作用。其中&#xff0c;图注意力网络&#xff08;GAT&#xff09;是一种基于注意力机制的图神经网络&#xff0c;能够捕捉图结构数据中节点之间的复杂关系&#xff0c;从而在许多领域中取得了突出的性能。…

STM32窗口看门狗 WWDG

目录 1.什么是窗口看门狗&#xff1f; 2.窗口看门狗工作原理 3.WWDG框图 4.控制寄存器&#xff08;WWDG_CR&#xff09; 5.配置寄存器&#xff08;WWDG_CFR&#xff09; 6.状态寄存器&#xff08;WWDG_SR&#xff09; 7.超时时间计算 8.窗口看门狗实验 9.独立看门狗和…