Définition d'une longueur de caractère maximale en CSS

182

Je crée un site Web réactif pour l'école et ma question est:

Comment définir une longueur maximale de caractères des phrases (avec CSS) sur mon site Web (comme 75 caractères) pour que, lorsque j'ai un très grand écran, les phrases ne dépassent pas 75 caractères.

J'ai essayé une largeur maximale mais cela gâche ma mise en page. J'utilise flexbox et les requêtes multimédias pour le rendre réactif.

Sharif1111
la source
1
Si vous utilisez textareaou inputs'il y a une maxlength="50"propriété de longueur maximale ( c'est dans le HTML) pour eux ou vous devrez utiliser Javascript. De plus, je pense que j'ai mal lu cela, définir une largeur forcera la phrase à passer à la ligne suivante lorsqu'elle atteindra la fin. Il s'agit du comportement par défaut.
Ruddy
2
Jetez un œil à ceci: stackoverflow.com/questions/20552957/… - ce sont des points de suspension CSS, cela pourrait vous aider
Darren Sweeney
Bien que vous ne puissiez pas utiliser CSS seul pour ce faire, vous pouvez limiter le nombre de caractères affichés en utilisant CSS comme Darren l'a suggéré. Vous devez définir votre conteneur de texte sur white-space: no-wrap, text-overflow: ellipsis et overflow: hidden. Ensuite, définissez simplement la taille de votre conteneur.
Patrick Lyver
1
Que voulez-vous dire en fixant une telle limite? Que doit-il se passer quand il est dépassé? Qu'entendez-vous par «phrase»? Ce n'est pas un concept CSS. Comment comptez-vous reconnaître ou baliser les phrases? Ou voulez-vous dire la longueur de la ligne ? Si vous le faites, quel est votre problème avec cela? Normalement, le texte s'enroule automatiquement, sauf si vous faites des choses spéciales pour l'empêcher.
Jukka K. Korpela

Réponses:

254

Vous pouvez toujours utiliser une méthode tronquée en définissant un max-widthet un débordement ellipsiscomme celui-ci

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

Un exemple: http://jsfiddle.net/3czeyznf/

Pour une troncature multi-lignes, regardez une flexsolution. Un exemple avec troncature sur 3 lignes.

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

Un exemple: https://codepen.io/srekoble/pen/EgmyxV

Vangel Tzo
la source
1
Merci, je comprends l'utilisation des points de suspension mais je ne vois pas comment cela résout mon problème. Je pense que les points de suspension sont parfaits pour quand un écran devient plus petit, mais quand il s'agrandit, je veux qu'il le coupe à 75 caractères. comme le dit @ Jean-luc, c'est uniquement possible avec javascript? désolé, je suis nouveau dans le codage
Sharif1111
Vous pouvez voir quel espace se produit 75 caractères en fonction de votre typographie et définir une largeur maximale en fonction de cela. Malheureusement, vous ne pouvez pas définir une propriété CSS pour tronquer une phrase en fonction des caractères. Vous pouvez également utiliser une méthode flex truncate avec l'avantage de pouvoir spécifier la méthode truncate en fonction des lignes.
Vangel Tzo
1
Cela affecte la largeur du paragraphe, pas la longueur de la phrase. Et 200px peut être n'importe quoi en termes de caractères (cela dépend même de savoir si vous avez beaucoup de i ou beaucoup de W, et de la face et de la taille de la police).
Jukka K. Korpela
Vous avez raison à ce sujet. Vérifiez que la réponse de Paulie_D semble être la bonne pour votre solution
Vangel Tzo
@VangelTzo Ceci est uniquement pour une seule ligne. Cela peut-il être fait pour plusieurs lignes? Merci
Biswas
108

Il existe une «valeur de longueur» CSS de ch.

De MDN

Cette unité représente la largeur, ou plus précisément la mesure d'avance, du glyphe '0' (zéro, le caractère Unicode U + 0030) dans la police de l'élément.

Cela peut se rapprocher de ce que vous recherchez.

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>

Paulie_D
la source
2
Cela a-t-il été implémenté par des navigateurs? Cela ne semble pas du tout fonctionner pour moi. Edit: Toujours brouillon dev.w3.org/csswg/css-values/#lengths
Navet
Je pense que je vais aller avec votre réponse, je pense que ce serait la même chose si je définissais une largeur maximale: 30em; C'est assez proche pour moi. Merci!
Sharif1111
Pas sûr des tables de compatibilité chez MDN ... mais cette ( chunité) ne semble pas fonctionner (comme prévu) pour moi dans Chrome 50, IE11 ou FF45?!
MrWhite
Oui, j'ai le même résultat que @ w3dk. Je viens de définir un heightet overflow:hidden. J'ai aimé les points de suspension, mais je n'ai pu le faire fonctionner que si je définissais white-space:no-wrap. Dans mon cas, le texte peut s'habiller, mais ne pas dépasser une certaine limite de caractères dans son conteneur.
Chris22
1
Je ne sais pas pourquoi cela a tant de votes, car il est clairement incomplet et ne fonctionne pas avec le code fourni. Vous devez ajouterwhite-space: nowrap;
Kevin M
48

Essayez ceci pour tronquer les caractères après l'avoir défini sur max-width. J'ai utilisé 75ch dans ce cas

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>

Pour la troncature multiligne, veuillez suivre le lien.

Un exemple: https://codepen.io/srekoble/pen/EgmyxV

Nous utiliserons webkit css pour cela. En bref, WebKit est un moteur de rendu de navigateur Web HTML / CSS pour Safari / Chrome. Cela peut être spécifique au navigateur car chaque navigateur est soutenu par un moteur de rendu pour dessiner la page Web HTML / CSS.

VK Singh
la source
1
le texte doit également être monospace, en ce moment vous tronquez le texte après 93 caractères: codepen.io/anon/pen/bRELeb
Fabrizio Calderan
Meilleure réponse ici. Surtout parce que vous mentionnez même la troncature multiligne;) Au fait, si vous optez pour une option multiligne, vous pouvez également utiliser a max-width:100%;pour le div wrapper. Vous avez donc une troncature réactive.
xarlymg89
20

code d'exemple:

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

    

Hossein Jafari
la source
4

Ce n'est pas possible avec CSS, vous devrez utiliser le Javascript pour cela. Bien que vous puissiez définir la largeur du p jusqu'à 30 caractères, les lettres suivantes tomberont automatiquement, mais encore une fois, ce ne sera pas aussi précis et variera si les caractères sont en majuscules.

Jean-Luc
la source
1
mieux vous devez vérifier avec la réponse de @ VangelTzo
Benjamin
vous avez parfaitement raison Jean-Luc, @VangelTzo est une solution de contournement mais ne fournit aucun contrôle de cout du tout.
Guillaume Fe
C'est la bonne réponse - vous ne pouvez pas modifier le nombre de caractères en CSS. Vous devez utiliser JS.
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;
}

RÉSULTAT

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

Jsfiddle

imtaher
la source
2
Salut, bienvenue à SO! J'ai édité votre réponse en ajoutant le code au corps. Pour référence future, veuillez inclure votre code dans la réponse à côté de donner le lien vers jsfiddle!
hatef
c'est la meilleure réponse car elle traite également de la hauteur et pas seulement de la largeur. Bon travail!
Grasper
1
La question demande une solution css.
dryleaf
1

Solution CSS pure pour tronquer les caractères multi-lignes

J'ai eu un problème similaire et j'ai trouvé cette excellente solution css uniquement de Hackingui.com . Vous pouvez lire l'article pour plus d'informations mais vous trouverez ci-dessous le code principal.

Je l'ai testé et cela fonctionne parfaitement. Espérons que quelqu'un le trouve utile avant d'opter pour les options JS ou côté serveur

  /* 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;
}
Benny Thadikaran
la source
1

Réponse de grille CSS moderne

Affichez le code entièrement fonctionnel sur CodePen . Compte tenu du code HTML suivant:

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

Vous pouvez utiliser CSS Grid pour créer trois colonnes et indiquer au conteneur de prendre une largeur maximale de 70 caractères pour la colonne du milieu qui contient notre paragraphe.

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

p {
  grid-column: 2 / 3;
}

Voici à quoi cela ressemble (Checkout CodePen pour un exemple pleinement fonctionnel):

entrez la description de l'image ici

Voici un autre exemple où vous pouvez utiliser minmax pour définir une plage de valeurs. Sur les petits écrans, la largeur sera fixée à 50 caractères de large et sur les grands écrans, elle sera de 70 caractères.

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

p {
  grid-column: 2 / 3;
}
Muhammad Rehan Saeed
la source
1
Je ne savais pas que vous pouviez utiliser chsur les colonnes. Charmant.
Sera
De plus, compte tenu du sujet, il est assez agréable que l'identifiant de votre stylo soit rrdOvr. ;)
Sera
1

Ce message est pour une solution CSS, mais le message est assez ancien, donc juste au cas où d'autres trébucheraient dessus et utiliseraient un framework JS moderne tel que Angular 4+, il existe un moyen simple de le faire via Angular Pipes sans avoir à le faire. déconner avec CSS.

Il existe probablement des moyens "React" ou "Vue" de faire cela aussi. C'est juste pour montrer comment cela pourrait être fait dans un cadre.

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>
Clément
la source
0

Essayez ma solution de 2 manières différentes.

<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;
}
Super modèle
la source