Festlegen einer maximalen Zeichenlänge in CSS


181

Ich mache eine reaktionsschnelle Website für die Schule und meine Frage ist:

Wie stelle ich eine maximale Zeichenlänge der Sätze (mit CSS) auf meiner Website ein (z. B. 75 Zeichen), damit die Sätze bei einem sehr großen Bildschirm nicht weiter als 75 Zeichen gehen.

Ich habe versucht, eine maximale Breite zu erreichen, aber das bringt mein Layout durcheinander. Ich verwende Flexbox- und Medienabfragen, um darauf zu reagieren.


1
Wenn Ihr mit textareaoder inputgibt es eine maximale Länge ( das maxlength="50"ist in der HTML) Eigenschaft für sie oder würden Sie Javascript verwenden. Ich glaube auch, dass ich das falsch verstanden habe. Wenn Sie eine Breite festlegen, wird der Satz gezwungen, in die nächste Zeile zu fallen, wenn er das Ende erreicht. Dies ist das Standardverhalten.
Ruddy

2
Schauen Sie sich das an: stackoverflow.com/questions/20552957/… - das ist eine CSS-Ellipse, es könnte Ihnen helfen
Darren Sweeney

Obwohl Sie CSS nicht alleine verwenden können, können Sie die Anzahl der Zeichen, die mit CSS angezeigt werden, begrenzen, wie von Darren vorgeschlagen. Sie müssen Ihren Textcontainer auf Leerzeichen einstellen: No-Wrap, Textüberlauf: Auslassungspunkte und Überlauf: Versteckt. Dann stellen Sie einfach die Größe für Ihren Container ein.
Patrick Lyver

1
Was meinst du mit einem solchen Limit? Was soll passieren, wenn es überschritten wird? Was meinst du mit "Satz"? Es ist kein CSS-Konzept. Wie wollen Sie Sätze erkennen oder markieren? Oder meinst du eigentlich Zeilenlänge ? Wenn ja, was ist Ihr Problem damit? Normalerweise wird Text automatisch umgebrochen, es sei denn, Sie tun spezielle Maßnahmen, um dies zu verhindern.
Jukka K. Korpela

Antworten:


254

Sie können jederzeit eine Methode zum Abschneiden verwenden, indem Sie a max-widthund einen solchen Überlauf ellipsisfestlegen

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

Ein Beispiel: http://jsfiddle.net/3czeyznf/

Schauen Sie sich für eine mehrzeilige Kürzung eine flexLösung an. Ein Beispiel mit Kürzung in 3 Zeilen.

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

Ein Beispiel: https://codepen.io/srekoble/pen/EgmyxV


1
Danke, ich verstehe die Verwendung von Auslassungspunkten, aber ich sehe nicht, wie dies mein Problem löst. Ich denke, Ellipsen sind richtig, wenn ein Bildschirm kleiner wird, aber wenn er größer wird, möchte ich, dass er bei 75 Zeichen abgeschnitten wird. Also, wie @ Jean-luc sagt, ist es nur mit Javascript möglich? Entschuldigung, ich bin neu in der Codierung
Sharif1111

Sie können sehen, welcher Speicherplatz je nach Typografie 75 Zeichen enthält, und entsprechend eine maximale Breite festlegen. Leider können Sie keine CSS-Eigenschaft festlegen, um einen Satz nach Zeichen abzuschneiden. Alternativ können Sie eine Flex-Truncate-Methode verwenden, mit dem Vorteil, dass Sie die Truncate-Methode nach Zeilen angeben können.
Vangel Tzo

1
Dies wirkt sich auf die Absatzbreite und nicht auf die Satzlänge aus. Und 200px kann in Bezug auf Zeichen einfach alles sein (es hängt sogar davon ab, ob Sie viele i oder viele W haben und ob Schriftfläche und Schriftgröße).
Jukka K. Korpela

Da hast du recht. Überprüfen Sie Paulie_D Antwort scheint die richtige für Ihre Lösung zu sein
Vangel Tzo

@VangelTzo Dies ist nur für eine einzelne Zeile. Kann dies für mehrere Zeilen durchgeführt werden? Danke
Biswas

109

Es gibt einen CSS-Längenwert von ch.

Von MDN

Diese Einheit repräsentiert die Breite oder genauer das Vorwärtsmaß des Glyphen '0' (Null, das Unicode-Zeichen U + 0030) in der Schriftart des Elements.

Dies kann ungefähr das sein, wonach Sie suchen.

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
Wurde dies von einem Browser implementiert? Scheint für mich überhaupt nicht zu funktionieren. Bearbeiten: Noch Entwurf dev.w3.org/csswg/css-values/#lengths
Rübe

Ich denke, ich werde mit Ihrer Antwort gehen, ich denke, das wäre das gleiche, wenn ich eine maximale Breite festlegen würde: 30em; Es ist nah genug für mich. Vielen Dank!
Sharif1111

Sie sind sich nicht sicher über die Kompatibilitätstabellen bei MDN ... aber dieses ( chGerät) scheint bei Chrome 50, IE11 oder FF45 nicht (wie erwartet) für mich zu funktionieren?!
MrWhite

Ja, ich habe das gleiche Ergebnis wie @ w3dk. Ich habe gerade ein heightund gesetzt overflow:hidden. Ich mochte die Auslassungspunkte, aber ich konnte sie nur zum Laufen bringen, wenn ich sie einstellte white-space:no-wrap. In meinem Fall kann der Text umbrochen werden, wobei ein bestimmtes Zeichenlimit in seinem Container nicht überschritten wird.
Chris22

@ 1N5818 Wie funktioniert es nicht? Wenn Sie ein bestimmtes Problem nicht lösen können, müssen Sie möglicherweise eine separate Frage stellen.
Paulie_D

46

Versuchen Sie dies, um Zeichen abzuschneiden, nachdem Sie sie auf die maximale Breite eingestellt haben. Ich habe in diesem Fall 75ch verwendet

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>

Zum mehrzeiligen Abschneiden folgen Sie bitte dem Link.

Ein Beispiel: https://codepen.io/srekoble/pen/EgmyxV

Wir werden dafür Webkit CSS verwenden. Kurz gesagt, WebKit ist eine HTML / CSS-Webbrowser-Rendering-Engine für Safari / Chrome. Dies kann brower-spezifisch sein, da jeder Browser von einer Rendering-Engine zum Zeichnen der HTML / CSS-Webseite unterstützt wird.


1
Der Text sollte auch monospaced sein, jetzt schneiden Sie den Text nach 93 Zeichen ab: codepen.io/anon/pen/bRELeb
Fabrizio Calderan

Beste Antwort hier. Vor allem, weil Sie sogar das mehrzeilige Abschneiden erwähnen;) Übrigens, wenn Sie sich für eine mehrzeilige Option entscheiden, können Sie auch ein max-width:100%;für den Wrapper div verwenden. Sie haben also ein reaktionsschnelles Abschneiden.
xarlymg89

19

Beispielcode:

.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

Mit CSS ist das nicht möglich, dafür müssen Sie das Javascript verwenden. Sie können die Breite des p zwar auf bis zu 30 Zeichen einstellen und die nächsten Buchstaben werden automatisch angezeigt, aber auch dies ist nicht so genau und variiert, wenn die Zeichen in Großbuchstaben geschrieben sind.


1
Besser, Sie müssen mit @ VangelTzos Antwort
Benjamin

Sie haben vollkommen recht, Jean-Luc. @VangelTzo ist eine Problemumgehung, bietet jedoch überhaupt keine Cout-Steuerung.
Guillaume Fe

Dies ist die richtige Antwort - Sie können die Anzahl der Zeichen in CSS nicht anpassen. Sie müssen JS verwenden.
Serraosays

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;
}

ERGEBNIS

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

Jsfiddle


2
Hallo, willkommen bei SO! Ich habe Ihre Antwort bearbeitet und den Code zum Text hinzugefügt. Zum späteren Nachschlagen geben Sie bitte Ihren Code in die Antwort ein und geben Sie den Link zu jsfiddle an!
Hatef

Dies ist die beste Antwort, da sie auch die Höhe und nicht nur die Breite berücksichtigt. Gut gemacht!
Grasper

1
Die Frage fragt nach einer CSS-Lösung.
Dryleaf

1

Reine CSS-Lösung zum Abschneiden mehrzeiliger Zeichen

Ich hatte ein ähnliches Problem und fand diese ausgezeichnete CSS-Lösung von Hackingui.com . Sie können den Artikel zur Information lesen, aber unten ist der Hauptcode.

Ich habe es getestet und es funktioniert perfekt. Hoffentlich findet es jemand nützlich, bevor er sich für JS- oder serverseitige Optionen entscheidet

  /* 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

Moderne CSS-Grid-Antwort

Zeigen Sie den voll funktionsfähigen Code auf CodePen an . Angesichts des folgenden HTML:

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

Sie können CSS Grid verwenden, um drei Spalten zu erstellen und den Container anzuweisen, für die mittlere Spalte, die unseren Absatz enthält, eine maximale Breite von 70 Zeichen zu verwenden.

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

p {
  grid-column: 2 / 3;
}

So sieht es aus (Checkout CodePen für ein voll funktionsfähiges Beispiel):

Geben Sie hier die Bildbeschreibung ein

Hier ist ein weiteres Beispiel, in dem Sie mit minmax einen Wertebereich festlegen können. Auf kleinen Bildschirmen wird die Breite auf 50 Zeichen und auf großen Bildschirmen auf 70 Zeichen eingestellt.

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

p {
  grid-column: 2 / 3;
}

1
Wusste nicht, dass Sie chfür Spalten verwenden können. Schön.
Wird

In Anbetracht des Themas ist es auch ziemlich süß, dass die ID Ihres Stifts ist rrdOvr. ;)
Will

1

Dieser Beitrag ist für eine CSS-Lösung gedacht, aber der Beitrag ist ziemlich alt. Für den Fall, dass andere darauf stoßen und ein modernes JS-Framework wie Angular 4+ verwenden, gibt es eine einfache Möglichkeit, dies über Angular Pipes zu tun, ohne dies zu tun mit CSS herumspielen.

Es gibt wahrscheinlich auch "React" - oder "Vue" -Methoden, um dies zu tun. Dies ist nur, um zu zeigen, wie es innerhalb eines Rahmens gemacht werden könnte.

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

Probieren Sie meine Lösung auf zwei verschiedene Arten aus.

<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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.