【问题标题】:How to make an element fill the remaining space of the last line of a multi-line paragraph with CSS?如何让一个元素用CSS填充多行段落最后一行的剩余空间?
【发布时间】:2022-01-13 09:54:21
【问题描述】:

关于如何用 CSS 填充空间有很多问题,this 是我认为的主要问题。如今,flexbox 提供了一个很棒且简单的解决方案。但是,它不允许您填充多行段落的剩余空间。明确地说,这就是我想要的:

Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Quisque vel scelerisque purus, et ultricies sapien。 Donec mi augue, pulvinar at mauris sat amet, ultricies molestie nisi。 Cras et nisi lobortis。 从这里填写到最后 ->

我找到了one question asking the same,但是它使用 CSS content 规则填充空间,我需要能够用一个元素(特别是 <input>,如果这很重要的话)填充它。

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Quisque vel scelerisque purus, et ultricies sapien. Donec mi
augue, pulvinar at mauris sit amet, ultricies molestie nisi.
Cras et nisi lobortis.
<input type="text">
</p>

我目前的解决方案是在文本末尾和&lt;input&gt; 之间添加一个跨度,测量它的位置,然后手动设置宽度,但这需要我监听浏览器调整大小事件并重新计算宽度。如果可以完全在 CSS 中做到这一点,那就太好了。如果必须添加额外的元素,那很好。

【问题讨论】:

  • 你能加个minimal reproducible example吗?
  • @sallf 你的意思是这样,添加我想要样式的HTML? (虽然如果必须添加额外的元素也没关系。)
  • 我认为仅使用 css 是不可能的。如果您将段落中的每个字符包装在&lt;span&gt; 中,则可能有一种很奇怪的方法。你会对这样的答案感兴趣吗?
  • 我对任何事情都持开放态度,尽管这可能有点太老套了。我之前想过类似的事情,使用 flexbox,但使用的是单词而不是字符,但我不确定我是否真的能做到。

标签: html css width


【解决方案1】:

将每个单词包装在span 中也可以——甚至可能是一种更好的方法。有很多方法可以进行包装,这里是一个纯 javascript 的方法。

本质上,由于每个单词都是一个 span,flexbox 可以确定最后一个单词末尾的剩余间距。只需将flex-grow: 1 添加到input 即可填充剩余空间。

请注意,您需要将padding-right 添加到每个跨度以在单词之间添加一个空格。

const p = document.getElementById("p");
const str = p.innerText.replace(/\S+/g, "<span>$&</span>");

p.innerHTML = str;
p.innerHTML += '<input class="input" type="text" />';
p {
  display: flex;
  flex-wrap: wrap;
}

p span {
  padding-right: 3px; /* space size */
}

input {
  width: 0;
  flex-grow: 1;
}
<p id="p">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vel scelerisque purus, et ultricies sapien. Donec mi augue, pulvinar at mauris sit amet, ultricies molestie nisi. Cras et nisi lobortis.
</p>

【讨论】:

  • 如果拆分但包含空格,则不需要填充,对吧?
  • 我已经通过 JS 添加了文本,所以这对我来说只是 CSS。非常感谢!
  • 我认为 flexbox 会摆脱空白,因为它不会将空白视为内容。虽然不是 100% 肯定。如果是这种情况,您可以使用p span { min-width: 3px } 而不是padding-right 来达到基本相同的效果。这是假设您将每个空间放入自己的跨度&lt;span&gt; &lt;/span&gt;...实际上您甚至不需要空间。
  • 我已经在使用white-space: pre-wrap;,所以空间折叠可能不是问题?我会对此进行测试并找到一些可行的方法,但总体思路对我来说看起来很完美!
猜你喜欢
  • 2017-12-18
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多