想法是让更像一个,因此它的高度会扩展以包含当前值。没有一个简单的本机解决方案几乎很奇怪,不是吗?现在我得到了一个非常好的本地解决方案。如果你只是想要一个工作示例,这里是演示Auto-GrowingText:.grow-wrap{/*将元素堆叠在一起并根据最高元素的高度调整大小的简单方法。*/display:grid;}.grow-wrap::after{/*注意奇怪的空格!需要防止弹跳行为*/content:attr(data-replicated-value)"";/*这就是textarea文本的样子*/white-space:pre-wrap;/*从视图、点击和屏幕阅读器中隐藏*/visibility:hidden;}.grow-wrap>textarea{/*你可以保留它,但它会在用户调整大小后中断自动调整*/resize:none;/*Firefox显示一个不断增长的滚动条,你可以这样隐藏。*/overflow:hidden;}.grow-wrap>textarea,.grow-wrap::after{/*需要相同的样式!*/border:1px纯黑色;填充:0.5rem;字体:继承;/*彼此重叠*/grid-area:1/1/2/2;}正文{保证金:2rem;font:1rem/1.4system-ui,sans-serif;}label{display:block;}效果诀窍是你必须将的内容准确地复制到一个自动扩展高度并匹配其大小的元素中。所以你有一个不能自动扩展高度的。相反,您可以在另一个元素中完全复制该元素的外观、内容和位置,并隐藏复制的元素。现在,所有三个元素都相互关联。无论哪个孩子最高,都会将父母推到那个高度,另一个孩子会跟随。这意味着的最小高度将成为“基本”高度,但如果复制的文本元素恰好更高,所有内容也会更高。太聪明了,我非常喜欢它。您需要确保复制的元素具有完全相同的字体、相同的填充、相同的边距、相同的边框……一切。这是一个相同的副本,只是在视觉上隐藏了可见性:隐藏;;如果它不完全相同,那么一切都不会完全正确地一起生长。我们还需要white-space:pre-wrap;在复制的文本上,因为这就是文本区域的行为方式。这是最奇怪的部分在我的演示中,我使用::after来复制文本。我不确定这是否是最好的方法。我觉得很干净,但我想知道使用是否对屏幕阅读器更安全?或可见性:隐藏;足够的?无论如何,这不是奇怪的部分。这是奇怪的部分:content:attr(data-replicated-value)"";因为我使用的是伪元素,它是从元素中取出数据属性并将内容呈现到具有额外空间的页面的行(这是奇怪的部分)。如果你不这样做,最终的结果会让人觉得“跳跃”。我不能说我完全理解它,但它似乎更尊重textarea和文本元素之间的环绕行为。如果你不想使用伪元素,嘿,我很好,只要注意弹跳行为。
自动增长Textareas的最简洁技巧相关文章