ChatGPT解决这个技术问题 Extra ChatGPT

在 CSS 中设置最大字符长度

我正在为学校制作响应式网站,我的问题是:

如何在我的网站上设置句子的最大字符长度(使用 CSS)(比如 75 个字符),当我有一个非常大的屏幕时,句子不会超过 75 个字符。

我尝试了最大宽度,但这弄乱了我的布局。我正在使用 flexbox 和媒体查询来使其具有响应性。

如果您使用 textareainput,则它们有一个最大长度(maxlength="50" 这在 HTML 中)属性,否则您将不得不使用 Javascript。另外我想我看错了,设置宽度会迫使句子在到达结尾时下降到下一行。这是默认行为。
看看这个:stackoverflow.com/questions/20552957/… - 这是 CSS 省略号,它可能会对您有所帮助
虽然您不能单独使用 CSS 来执行此操作,但您可以按照 Darren 的建议限制使用 CSS 显示的字符数量。您需要将文本容器设置为空白:不换行、文本溢出:省略号和溢出:隐藏。然后只需设置容器的大小。
设置这样的限制是什么意思?超过了应该怎么办? “句子”是什么意思?它不是 CSS 概念。你打算如何识别或标记句子?还是您实际上是指行长?如果你这样做,你的问题是什么?通常文本会自动换行,除非您采取特殊措施来防止它发生。

l
leonheess

您始终可以通过像这样设置 max-width 和溢出 ellipsis 来使用截断方法

p {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 200px;
}

一个例子:

.wrapper { 填充:20px;背景:#eaeaea;最大宽度:400px;边距:50px 自动; } .demo-1 { 溢出:隐藏;显示:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:垂直; } .demo-2 { 溢出:隐藏;空白:nowrap;文本溢出:省略号;最大宽度:150px; }

引领痛苦本身很重要,接下来会去脂肪。就像在仇恨,快乐,错误的时代一样,这里的区别,这是腐败者的选择,但痛苦!让发明者找出奉承之道,让他摆脱长辈的束缚。就像在仇恨,快乐,错误的时代一样,这里的区别,这是腐败者的选择,但痛苦!让他找出年长者想要从他那里得到的奉承方式。

对于多行截断,请查看 flex 解决方案。截断 3 行的示例。

p {
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
}

一个例子:

p {空白:nowwrap;溢出:隐藏;文本溢出:省略号;最大宽度:200px; }

Lorem Ipsum Dolor Sit Amet,Consectetur Adipisicing Elite。 Deserunt rem audit quis quaerat。在痛苦的证词中,这种后果性的暨不可能逃脱干燥的 voluptas 和可能的 voluptatibus!


谢谢,我了解省略号的使用,但我不明白这如何解决我的问题。我认为省略号适用于屏幕变小的时候,但当它变大时,我希望它在 75 个字符时将其截断。所以正如@Jean-luc 所说,只有javascript才有可能?抱歉,我是编码新手
您可以根据您的排版查看 75 个字符出现的空间,并据此设置最大宽度。不幸的是,您不能设置 CSS 属性来根据字符截断句子。或者,您可以使用 flex truncate 方法,其好处是您可以根据行指定 truncate 方法。
这会影响段落宽度,而不是句子长度。 200px 可以是任何字符(它甚至取决于你是否有很多 i 或很多 W,以及字体和大小)。
你是对的。检查 Paulie_D 答案似乎是您解决方案的正确答案
@VangelTzo 这仅适用于单行。这可以为多行完成吗?谢谢
c
challet

有一个 ch 的 CSS“长度值”。

From MDN

该单位表示元素字体中字形“0”(零,Unicode 字符 U+0030)的宽度,或者更准确地说是提前量度。

这可能近似于您所追求的。

{ 溢出:隐藏;最大宽度:75ch; }

疼痛本身很重要,接下来会去脂肪化。他讨厌他正在寻找什么。在当下的痛苦中,他希望它是他逃离追随快乐的结果,这样我们就可以放弃快乐,除非它发生!但是,快乐或痛苦的痛苦似乎来自于拒绝。我将至少解释需要做什么,而不是减轻任何否认的痛苦。


这是否已被任何浏览器实现?对我来说似乎根本不起作用。编辑:仍是草稿 dev.w3.org/csswg/css-values/#lengths
我想我会接受你的回答,我认为如果我设置 max-width: 30em;对我来说已经足够近了。谢谢!
不确定 MDN 的兼容性表...但是这个(ch 单元)在 Chrome 50、IE11 或 FF45 中对我来说似乎不起作用(如预期的那样)?!
是的,我的结果与@w3dk 相同。我只是设置了 heightoverflow:hidden。我确实喜欢省略号,但只有设置 white-space:no-wrap 才能让它工作。在我的情况下,文本可以换行,只是不超过其容器内的某个字符限制。
不知道为什么这有这么多赞成票,因为它显然不完整并且不能使用提供的代码。您需要添加 white-space: nowrap;
V
V K Singh

在将其设置为最大宽度后尝试截断字符。在这种情况下,我使用了 75ch

p {空白:nowrap;溢出:隐藏;文本溢出:省略号;最大宽度:75ch; }

Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Proin nisi ligula、dapibus a volutpat sat amet、mattis 等。Lorem ipsum dolor sit amet、consectetur adipiscing elit。 Proin nisi ligula、dapibus a volutpat sat amet、mattis 等。

对于多行截断,请点击链接。

一个例子:https://codepen.io/srekoble/pen/EgmyxV

我们将为此使用 webkit css。简而言之,WebKit 是一个用于 Safari/Chrome 的 HTML/CSS Web 浏览器渲染引擎。这可能是特定于浏览器的,因为每个浏览器都由渲染引擎支持以绘制 HTML/CSS 网页。


文本也应该是等宽的,现在您要在 93 个字符后截断文本:codepen.io/anon/pen/bRELeb
最佳答案在这里。特别是因为您甚至提到了多行截断;)顺便说一句,如果要使用多行选项,您也可以将 max-width:100%; 用于包装器 div。所以你有一个响应截断。
H
Hossein Jafari

示例代码:

.limited-text{ 空白:nowrap;宽度:400px;溢出:隐藏;文本溢出:省略号; }

Lorem ipsum dolor sit amet,consectetur adipisicing elit。 Ut odio temporibus voluptas error distinctio hic quae corrupti vero doloribus optio! Inventore ex quaerat modi blanditiis soluta maiores illum, ab velit。


K
Khado Mikhal

使用 Chrome,您可以使用 "-webkit-line-clamp" 设置显示的行数:

     display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;  /* Number of lines displayed before it truncate */
     overflow: hidden;

所以对我来说,它是在扩展中使用,所以它是完美的,更多信息在这里:https://medium.com/mofed/css-line-clamp-the-good-the-bad-and-the-straight-up-broken-865413f16e5


J
Jean-Luc

这在 CSS 中是不可能的,你必须使用 Javascript。尽管您可以将 p 的宽度设置为最多 30 个字符,并且下一个字母会自动下降,但这又不会那么准确,并且如果字符是大写的,则会有所不同。


更好的是你需要检查@VangelTzo的答案
你完全正确 Jean-Luc,@VangelTzo 是一种解决方法,但根本不提供任何 cout 控制。
这是正确的答案——你不能通过 CSS 中的字符数来调整。你需要使用JS。
h
hatef

HTML

<div id="dash">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis et dui. Nunc porttitor accumsan orci id luctus. Phasellus ipsum metus, tincidunt non rhoncus id, dictum a lectus. Nam sed ipsum a urna ac
quam.</p>
</div>

jQuery

var p = $('#dash p');
var ks = $('#dash').height();
while ($(p).outerHeight() > ks) {
  $(p).text(function(index, text) {
    return text.replace(/\W*\s(\S)*$/, '...');
  });
}

CSS

#dash {
  width: 400px;
  height: 60px;
  overflow: hidden;
}

#dash p {
  padding: 10px;
  margin: 0;
}

结果

Lorem ipsum dolor sit amet, consectetur adipiscing elit。 Proin nisi ligula, dapibus a volutpat sat amet, mattis et...

Jsfiddle


您好,欢迎来到 SO!我编辑了您的答案,将代码添加到正文中。以供将来参考,请在提供 jsfiddle 链接旁边的答案中包含您的代码!
这是最好的答案,因为它还解决了高度而不仅仅是宽度。好工作!
这个问题要求一个CSS解决方案。
M
Muhammad Rehan Saeed

现代 CSS 网格答案

查看 CodePen 上的完整工作代码。给定以下 HTML:

<div class="container">
    <p>Several paragraphs of text...</p>
</div>

您可以使用 CSS Grid 创建三列,并告诉容器为包含我们段落的中间列采用最大 70 个字符的宽度。

.container
{
  display: grid;
  grid-template-columns: 1fr, 70ch 1fr;
}

p {
  grid-column: 2 / 3;
}

这就是它的样子(查看 CodePen 以获得完整的示例):

https://i.stack.imgur.com/OcDJK.png

这是另一个示例,您可以使用 minmax 设置值范围。在小屏幕上,宽度将设置为 50 个字符宽,在大屏幕上将设置为 70 个字符宽。

.container
{
  display: grid;
  grid-template-columns: 1fr minmax(50ch, 70ch) 1fr;
}

p {
  grid-column: 2 / 3;
}

没有意识到您可以在列上使用 ch。迷人的。
此外,考虑到主题,您的笔的 ID 是 rrdOvr 真是太好了。 ;)
B
Benny Thadikaran

截断多行字符的纯 CSS 解决方案

我遇到了类似的问题,并从 Hackingui.com 中找到了这个出色的纯 CSS 解决方案。您可以阅读文章以获取信息,但以下是主要代码。

我测试了它,它工作得很好。希望有人在选择 JS 或服务器端选项之前发现它很有用

  /* styles for '...' */ 
.block-with-text {
  /* hide text if it more than N lines  */
  overflow: hidden;
  /* for set '...' in absolute position */
  position: relative; 
  /* use this value to count block height */
  line-height: 1.2em;
  /* max-height = line-height (1.2) * lines max number (3) */
  max-height: 3.6em; 
  /* fix problem when last visible word doesn't adjoin right side  */
  text-align: justify;  
  /* place for '...' */
  margin-right: -1em;
  padding-right: 1em;
}

/* create the ... */
.block-with-text:before {
  /* points in the end */
  content: '...';
  /* absolute position */
  position: absolute;
  /* set position to right bottom corner of block */
  right: 0;
  bottom: 0;
}

/* hide ... if we have text, which is less than or equal to max lines */
.block-with-text:after {
  /* points in the end */
  content: '';
  /* absolute position */
  position: absolute;
  /* set position to right bottom corner of text */
  right: 0;
  /* set width and height */
  width: 1em;
  height: 1em;
  margin-top: 0.2em;
  /* bg color = bg color under block */
  background: white;
}

C
Clement

这篇文章是针对 CSS 解决方案的,但是这篇文章已经很老了,所以以防万一其他人偶然发现它并使用了 Angular 4+ 等现代 JS 框架,有一种简单的方法可以通过 Angular Pipes 做到这一点,而无需乱用 CSS。

也可能有“React”或“Vue”的方式来做到这一点。这只是为了展示如何在框架内完成。

截断-text.pipe.ts

/**
 * Helper to truncate text using JS in view only.
 *
 * This is pretty difficult to do reliably with CSS, especially when there are
 * multiple lines.
 *
 * Example: {{ value | truncateText:maxLength }} or {{ value | truncateText:45 }}
 *
 * If maxLength is not provided, the value will be returned without any truncating. If the
 * text is shorter than the maxLength, the text will be returned untouched. If the text is greater
 * than the maxLength, the text will be returned with 3 characters less than the max length plus
 * some ellipsis at the end to indicate truncation.
 *
 * For example: some really long text I won't bother writing it all ha...
 */
@Pipe({ name: 'truncateText' })
export class TruncateTextPipe implements PipeTransform {
  transform(value: string, ...args: any[]): any {
    const maxLength = args[0]
    const maxLengthNotProvided = !maxLength
    const isShorterThanMaximumLength = value.length < maxLength
    if (maxLengthNotProvided || isShorterThanMaximumLength) {
      return value
    }
    const shortenedString = value.substr(0, maxLength - 3)
    return `${shortenedString}...`
  }
}

app.component.html

<h1>{{ application.name | truncateText:45 }}</h1>

C
Claude Dumont

https://i.stack.imgur.com/OdFb5.png

完全支持所有浏览器。


d
dev

用 2 种不同的方式尝试我的解决方案。

<div class="wrapper">
      <p class="demo-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut odio temporibus voluptas error distinctio hic quae corrupti vero doloribus optio! Inventore ex quaerat modi blanditiis soluta maiores illum, ab velit.</p>
</div>

<div class="wrapper">
  <p class="demo-2">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut odio temporibus voluptas error distinctio hic quae corrupti vero doloribus optio! Inventore ex quaerat modi blanditiis soluta maiores illum, ab velit.</p>
</div>

.wrapper {
  padding: 20px;
  background: #eaeaea;
  max-width: 400px;
  margin: 50px auto;
}

.demo-1 {
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
}

.demo-2 {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  max-width: 150px;
}

D
Don't Know What I'm Doing

您始终可以查看字体的宽度并获取平均字符像素大小。然后只需将其乘以您想要的字符数。这有点俗气,但它可以作为一个快速修复。


N
Niels Bom

75 个字符

我尝试了最大宽度,但这弄乱了我的布局。

使用 max-width: 75ch,然后创建一个在您超过此宽度时不会混乱的布局。