【问题标题】:CSS - Align Text, Input and Image in DIVCSS - 在 DIV 中对齐文本、输入和图像
【发布时间】:2020-07-30 00:51:39
【问题描述】:
我正在尝试对齐一些文本、输入字段和大约 25x25 像素的图像
我得到的是 div 顶部的文本和图像,输入略低。
如何对齐它们,使它们彼此垂直水平。
这是我目前所拥有的:
div.block {overflow:hidden; border:1px solid #000 }
div.block label {width:150px; display:block; float:left; text-align:left; vertical-align:middle; }
div.block.input {margin-left:4px; float:left; vertical-align:middle; }
https://jsfiddle.net/a3cmfpzL/
谢谢
【问题讨论】:
标签:
html
css
image
input
alignment
【解决方案1】:
这是水平的:
.block{
display:flex;
}
label{
border:1px solid red;
}
img{
height:25px;
width:25px;
}
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890'/>
<img src='http://placekitten.com/301/301'/>
</div>
如果您正在寻找垂直方向,那么:
*{
border:0;
padding:0;
}
.block{
display:flex;
flex-direction:column;
}
label{
border:1px solid red;
width:100px;
}
img{
height:25px;
width:25px;
}
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890'/>
<img src='http://placekitten.com/301/301'/>
</div>
【解决方案2】:
尝试在 div.block 中添加 position:absolute 和 display:flex。
如果我正确理解您的问题,那应该可以解决问题。
【解决方案3】:
我强烈建议你使用 flexbox。
一开始可能会有点混乱,但是一旦你掌握了它,你就会爱上它。
在这里你可以找到完美的使用指南。
https://css-tricks.com/snippets/css/a-guide-to-flexbox/
类似这样的东西(只是写在我的脑海里,所以未经测试)
请先尝试删除您的课程。
你的 CSS
.flex {
display: flex;
flex-direction: column;
justify-content: space-between; // only use this if you don't justify-self the elements
}
.border {
border:1px solid #000;
}
img {
width: 25px;
height: 25px;
justify-self: top; // if you don't use flex-direction on .flex
}
input {
justify-self: top; // if you don't use flex-direction on .flex
}
你的 HTML
<div style="flex border">
<img src='image.png'/>
<label>Test Label</label>
<input type='text' value='1234567890'/>
</div>
【解决方案4】:
几个问题
- 这个
div.block.input 没有选择任何东西,所以所有这些样式都没有被使用
- 您将标签设置为块级元素,因此它不会响应
vertical-align 属性。
<input> 和 <img> 是内联元素,因此它们将共享它们所在的同一行框,它们的垂直对齐方式将由 vertical-align 属性设置。
vertical-align 属性的默认值为基线:
将框的基线与父框的基线对齐。如果框没有基线,则将底部边距边缘与父级的基线对齐。
在这种情况下,我们有一个没有基线的<img>,因此它将根据它的底部边距对齐,在我们的例子中,img 没有边距,所以它基本上是底部边缘。
<input> 不过有一个基线,所以它的基线会和它旁边的img的底边对齐。
演示
div.block {
overflow: hidden;
border: 1px solid #000
}
div.block label {
width: 150px;
display: block;
float: left;
text-align: left;
vertical-align: middle;
}
div.block.input {
margin-left: 4px;
float: left;
vertical-align: middle;
}
div {
position: relative;
}
div:after {
content: '';
position: absolute;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(red, red) 0 24.5px/ 100% 1px no-repeat
}
<p>red line is the baseline</p>
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890' />
<img src='https://i.picsum.photos/id/527/25/25.jpg' />
</div>
解决方案
我稍微清理了代码并删除了不必要的样式。
- 浮点数不是必需的
- 如果您对标签应用宽度,请改用
display:inline-block;
1) 垂直对齐:中间;
* {
padding: 0;
margin: 0;
}
div.block {
overflow: hidden;
border: 1px solid #000
}
label {
width: 150px;
display: inline-block;
vertical-align: middle;
background: brown;
}
input {
vertical-align: middle;
border: 0;
background: red;
}
img {
vertical-align: middle;
}
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890' />
<img src='https://i.picsum.photos/id/527/25/25.jpg' />
</div>
项目将相对于最高项目的中间对齐,即 img。
2) 如果您希望元素共享相同的高度
知道<img> 是最高的和它的高度,我们可以简单地将相同的高度应用到其他元素,我们仍然需要应用vertical-align:top 来根据元素的上边缘而不是基线对齐元素
* {
padding: 0;
margin: 0;
/* because we defined a height on the element,
we need to ensure that any extra space should be
calculated within that height */
box-sizing: border-box;
}
div.block {
overflow: hidden;
border: 1px solid #000;
font-size:0;
}
label {
display: inline-block;
width: 150px;
height: 25px;
font-size:16px;
vertical-align: top;
line-height:25px;
background:brown;
}
input {
height: 25px;
vertical-align: top;
border:0;
background:red;
}
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890' />
<img src='https://i.picsum.photos/id/527/25/25.jpg' />
</div>
3) 弹性盒
哪个是最简单的,我不会介绍,因为它已经在其他答案中介绍过。