html - 浮动元素位置更改元素对齐方式
问题描述
我有一些奇怪的行为float
,认为这可能很简单,但我是 css 的新手,正在学习为什么和如何问题。
在这里,当我将浮动元素应用于button
它时,它会将元素的水平中心对齐方式更改为顶部,不知道为什么。
任何帮助将非常感激。
<h2>Image Text</h2>
<p>Center text in image:</p>
<div style="border: 1px solid red;">
Text on left
<span><button style="height:40px;">test</button></span>
</div>
现在添加
<span ><button style="height:40px;float:right">test</button></span>
我知道这个问题可以通过多种方式解决,我只是想知道这些元素与 float 的奇怪行为。
问候 MK
解决方案
要了解发生了什么,您需要考虑默认垂直对齐baseline
是创建第一个输出的事实。
这是查看基线的更好说明:
.box {
position:relative;
}
.box:before {
content:"";
position:absolute;
bottom:14px;
height:1px;
background:blue;
left:0;
right:0;
}
<div style="border: 1px solid red;" class="box">
Text on left
<span><button style="height:40px;">test</button></span>
</div>
如您所见,两个文本的对齐方式相同,并且按钮以某种方式定义了基线。您的文本不像您想象的那样居中。
增加font-size
看看会发生什么:
.box {
position:relative;
}
.box:before {
content:"";
position:absolute;
bottom:14px;
height:1px;
background:blue;
left:0;
right:0;
}
<div style="border: 1px solid red;" class="box">
<span >Text on left</span>
<span><button style="height:40px;">test</button></span>
</div>
<div style="border: 1px solid red;" class="box">
<span style="font-size:20px;">Text on left</span>
<span><button style="height:40px;">test</button></span>
</div>
<div style="border: 1px solid red;" class="box">
<span style="font-size:30px;">Text on left</span>
<span><button style="height:40px;">test</button></span>
</div>
我们仍然有相同的基线逻辑,而不是中心逻辑。
另一个按钮高度较小的示例
.box {
position:relative;
}
.box:before {
content:"";
position:absolute;
bottom:9px;
height:1px;
background:blue;
left:0;
right:0;
}
<div style="border: 1px solid red;" class="box">
<span style="font-size:40px;">Text on left</span>
<span><button style="height:20px;">test</button></span>
</div>
仍然是相同的基线。
您可以通过更改垂直对齐来更改此行为。
<div style="border: 1px solid red;" class="box">
Text on left
<span><button style="height:40px;vertical-align:bottom">test</button></span>
</div>
<div style="border: 1px solid red;" class="box">
Text on left
<span><button style="height:40px;vertical-align:top">test</button></span>
</div>
<div style="border: 1px solid red;" class="box">
Text on left
<span><button style="height:40px;vertical-align:sub">test</button></span>
</div>
现在,如果您将按钮浮动到右侧,它将成为块级元素,并且不会再影响文本的对齐方式,这就是您获得以下输出的原因:
<div style="border: 1px solid red;" class="box">
Text on left
<span><button style="height:40px;float:right;">test</button></span>
</div>
即使您清除浮动以修复高度问题,文本仍将保留在顶部,并且更精确地对齐其行内的基线。
.box {
overflow:auto;
}
<div style="border: 1px solid red;" class="box">
Text on left
<span><button style="height:40px;float:right;">test</button></span>
</div>
现在将红色块内的文本居中是一项常见的工作,您可以找到很多与此相关的问题。像另一个答案中所述的一种解决方案是设置line-height
它将简单地增加线条的大小并围绕中心移动文本的基线。
一些相关问题以获得更多示例和详细信息:
Vertical-align 对齐除 self 之外的所有其他内容
另一个需要注意的重要事情是按钮是如何移动到其跨度容器之外的。添加边框以查看此内容:
.box {
overflow:auto;
}
<div style="border: 1px solid red;" class="box">
Text on left
<span style="border:2px solid blue;"><button style="height:40px;">test</button></span>
</div>
<div style="border: 1px solid red;" class="box">
Text on left
<span style="border:2px solid blue;"><button style="height:40px;float:right;">test</button></span>
</div>
另一个相关的问题来理解为什么:你能浮动到跨度的右边吗?
推荐阅读
- java - JavaFX 11 部署失败:无法创建任务或键入 javafx:com.sun.javafx.tools.ant:fileset
- c# - 向我的画布添加项目时,我的对象无法转换
- asp.net-core-signalr - signalr core (2.1) JWT authentication hub/negotiate 401 Unauthorized
- optimization - 如何用 lpSolve 解决简单的线性规划问题
- sql-server - 如何在不使用调试器的情况下调试存储过程
- php - 使用php将两个数字数组合并为一个
- node.js - 设置输入或输出上下文对话流 nodejs v2
- c++ - 如果我的 C++ 程序显示的注册表值与实际值不同,如何修复它?
- c# - 为什么使用两个任务执行两个长计算会降低性能?
- ssl - 禁用 TLS 但 SSL 在线分析器发现它已启用。为什么?