在CSS中设置最大字符长度


181

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

如何在我的网站上设置句子的最大字符长度(使用CSS)(例如75个字符),当我的屏幕很大时,句子的长度不能超过75个字符。

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


1
如果您使用textareainput有一个最大长度(maxlength="50"在HTML中)属性,或者您必须使用Javascript。同样,我认为我读错了这一点,设置宽度会迫使句子在到达末尾时下降到下一行。这是默认行为。
2014年

2
看一下这个:stackoverflow.com/questions/20552957/…-这是CSS省略号,可能会对您有所帮助
Darren Sweeney 2014年

虽然不能单独使用CSS来完成此操作,但是可以按照Darren的建议限制使用CSS来显示的字符数。您需要将文本容器设置为空白:不换行,文本溢出:省略号和溢出:隐藏。然后只需设置容器的大小即可。
Patrick Lyver 2014年

1
设置这样的限制是什么意思?超出限制时该怎么办?您所说的“句子”是什么意思?这不是CSS概念。您打算如何识别或标记句子?还是您实际上是指行长?如果这样做,您的问题是什么?通常情况下,文本会自动换行,除非您采取特殊措施来阻止它。
Jukka K.

Answers:


255

您总是可以通过设置a max-widthellipsis类似这样的溢出来使用截断方法

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

范例:http//jsfiddle.net/3czeyznf/

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

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

例如:https//codepen.io/srekoble/pen/EgmyxV


1
谢谢,我理解省略号的用法,但我看不到如何解决我的问题。我认为省略号适用于屏幕变小的情况,但是当屏幕变大时,我希望将其切成75个字符。因此,正如@ Jean-luc所指出的那样,它只能使用javascript吗?抱歉,我是编码
新手

您可以根据您的排版看到75个字符,并根据该字体设置最大宽度。不幸的是,您无法设置CSS属性来根据字符截断句子。另外,您可以使用flex truncate方法,其好处是可以根据行指定truncate方法。
Vangel Tzo 2014年

1
这会影响段落宽度,而不是句子长度。200px可以是任何字符(甚至取决于您有很多i还是很多W,以及字体的字体和大小)。
Jukka K. Korpela 2014年

你是对的。检查Paulie_D答案似乎是适合您的解决方案的方式
Vangel Tzo 2014年

@VangelTzo这仅适用于单行。可以为多行完成吗?谢谢
Biswas

109

CSS的“长度值”为ch

从MDN

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

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

p {
  overflow: hidden;
  max-width: 75ch;
}
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt rem odit quis quaerat. In dolorem praesentium velit ea esse consequuntur cum fugit sequi voluptas ut possimus voluptatibus deserunt nisi eveniet!Lorem ipsum dolor sit amet, consectetur
  adipisicing elit. Dolorem voluptates vel dolorum autem ex repudiandae iste quasi. Minima explicabo qui necessitatibus porro nihil aliquid deleniti ullam repudiandae dolores corrupti eaque.</p>


2
所有浏览器都实现了吗?似乎根本不适合我。编辑:仍然起草dev.w3.org/csswg/css-values/#lengths
萝卜

我想我会同意你的回答,我认为如果我将max-width设置为30em,那将是一样的。它对我来说足够近了。谢谢!
2014年

不确定MDN的兼容性表...但是ch在Chrome 50,IE11或FF45中,这个(单位)似乎对我不起作用(按预期)?
怀特先生

是的,我得到的结果与@ w3dk相同。我只设置了heightoverflow:hidden。我确实喜欢省略号,但只有在设置好之后才能使用它white-space:no-wrap。就我而言,文本可以包装,但不能超过其容器内的特定char限制。
克里斯22年

1
不知道为什么会有这么多的赞成票,因为它显然是不完整的,并且无法使用提供的代码。您需要添加white-space: nowrap;
Kevin M

47

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

p {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 75ch;
}
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis etc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis etc.</p>

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

例如:https//codepen.io/srekoble/pen/EgmyxV

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


1
文本也应该等距,现在您要在93个字符之后截断文本:codepen.io/anon/pen/bRELeb
Fabrizio

最好的答案在这里。特别是因为您甚至提到了多行截断;)顺便说一句,如果要使用多行选项,则也可以max-width:100%;将w用于包装div。因此,您有一个响应迅速的截断。
xarlymg89

20

示例代码:

.limited-text{
    white-space: nowrap;
    width: 400px;
    overflow: hidden;
    text-overflow: ellipsis;
}
<p class="limited-text">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>

    



4

CSS无法做到这一点,您将不得不使用Javascript。尽管您可以将p的宽度设置为最多30个字符,并且下一个字母会自动下降,但是这又不太准确,并且如果这些字符以大写形式显示,则会有所不同。


1
更好的是,您需要检查@VangelTzo的答案
Benjamin

您完全正确的让·卢克(Jean-Luc),@ VangelTzo是一种解决方法,但完全不提供任何cout控制功能。
纪尧姆·菲

这是正确的答案-您无法通过CSS中的字符数进行调整。您需要使用JS。
serraosays,2013年

3

的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坐下,一直保持良好状态。Proin nisi ligula,dapibus avolutpat,amet,mattis等...

Jsfiddle


2
嗨,欢迎来到SO!我编辑了您的答案,将代码添加到正文中。供将来参考,请在答案中包括您的代码,并提供jsfiddle的链接!
hatef '17

这是最好的答案,因为它也可以解决高度问题,而不仅仅是宽度问题。做得好!
Grasper '18年

1
问题要求一个CSS解决方案。
dryleaf '19

1

截断多行字符的纯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;
}

1

现代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以获得完整的示例):

在此处输入图片说明

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

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

p {
  grid-column: 2 / 3;
}

1
没有意识到您可以ch在列上使用。可爱。
威尔

另外,考虑到主题,笔的ID是rrdOvr。;)
威尔

1

这篇文章是针对CSS解决方案的,但是这篇文章已经很老了,以防万一其他人迷失了方向,并使用了现代JS框架(例如Angular 4+),有一种简单的方法可以通过Angular Pipes进行操作,而无需与CSS混为一谈。

也可能有“反应”或“ Vue”方法。这只是为了展示如何在框架内完成。

truncate-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>

0

用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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.