CSS 垂直对齐:表格、表单和 div 的基线

发布于 2024-12-11 15:27:46 字数 379 浏览 0 评论 0原文

我正在尝试构建一个包含输入、文本区域和块元素的表单,每个元素都有一个标签。为了获得灵活的网格,我使用了表格。为了使标签和输入/文本区域匹配垂直对齐,我设置了 vertical-align: benchmark; 这对于输入和文本区域效果很好。但不适用于 div(请参阅此 jsFiddle)。因此,div 的标签在单元格的底部对齐,但我希望它在顶部,即基线应该在顶部。

如何在不更改 div 内容或不必区分输入/文本区域和 div 标签的情况下实现此目的?有什么方法可以强制不可见的基线位于表格单元格的顶部吗?

也许我没有从正确的角度处理这个问题,任何见解都会受到赞赏。

I'm trying to build a form that contains inputs, textareas and block elements, each with a label. In order to get a flexible grid, I'm using a table. For a matching vertical alignment of the labels and the inputs/textarea I set vertical-align: baseline; which works fine for inputs and textareas. But not for divs (see this jsFiddle). The label for the div is consequently aligned at the bottom of the cell, but I want it on the top, i.e. the baseline should be on the top.

How can I achieve this without changing the contents of the div or having to differ between labels for inputs/textareas and divs? Is there any way to force an invisible baseline to be at the top of a table cell?

Maybe I'm not approaching the problem from the right side, any insight is appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浪漫人生路 2024-12-18 15:27:46

使用下面的代码来解决您的问题:

  td, label, textarea {
            vertical-align: top;
        }

Use the code below for your problem:

  td, label, textarea {
            vertical-align: top;
        }
⒈起吃苦の倖褔 2024-12-18 15:27:46

您的 div 必须至少有一个字符(例如  )。


对于文本区域,“垂直对齐:基线;”仅适用于壁虎。

正如 developer.mozilla.org 所说

HTML 规范没有定义

我找到了解决方法,但它改变了 HTML。
我将vertical-align: text-top设置为textarea,并且为了修复由border-top和textarea的padding顶部的高度引起的间隙,我将其设置为负margin-top。为了避免文本区域与其上方的所有元素重叠,我在文本区域周围放置了一个 div,并使用 padding-top 来平衡间隙。

HTML:

<div class="textarea-wrapper"><textarea id="b">nice vertical alignment</textarea></div>

CSS:

.textarea-wrapper {
    display: inline-block;
    padding-top: 1px; /* - margin-top of textarea */
}
.textarea-wrapper textarea {
    vertical-align: text-top;
    margin-top: -1px; /* - (border-top-width + padding-top) */
}

我更新了您的 jsFiddle

Your div must have at least one character (for example a  ).


For textareas, "vertical-align: baseline;" only works for Gecko.

As developer.mozilla.org said,

The HTML specification doesn't define where the baseline of a <textarea> is.

I found a workaround for that, but it changes the HTML.
I set vertical-align: text-top to the textarea, and to fix the gap caused by the height of the border-top and the padding top of the textarea, I set it a negative margin-top. And to avoid having the textarea overlapping all elements above it, I put a div around the textarea with a padding-top to counterbalance the gap.

HTML:

<div class="textarea-wrapper"><textarea id="b">nice vertical alignment</textarea></div>

CSS:

.textarea-wrapper {
    display: inline-block;
    padding-top: 1px; /* - margin-top of textarea */
}
.textarea-wrapper textarea {
    vertical-align: text-top;
    margin-top: -1px; /* - (border-top-width + padding-top) */
}

I updated your jsFiddle.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文