Points de suspension de dépassement de texte sur deux lignes

117

Je sais que vous pouvez utiliser une combinaison de règles CSS pour que le texte se termine par des points de suspension (...) quand il est temps de déborder (sortir des limites des parents).

Est-il possible (n'hésitez pas à dire non) d'obtenir le même effet, mais laissez le texte s'enrouler sur plus d'une ligne?

Voici une démo .

div {
  width: 300px; 
  height: 42px; 
  overflow: hidden; 
  text-overflow: ellipsis; 
  white-space: nowrap;
}

Comme vous pouvez le voir, le texte se termine par des points de suspension lorsqu'il dépasse la largeur du div. Cependant, il y a encore suffisamment d'espace pour que le texte s'habille sur une deuxième ligne et continue. Ceci est interrompu par white-space: nowrap, ce qui est nécessaire pour que les points de suspension fonctionnent.

Des idées?

PS: Pas de solutions JS, pur CSS si possible.

Tony Bogdanov
la source
Qu'est-ce qui détermine «il y a de l'espace»? Tout est-il, y compris la hauteur de la police, en pixels définis? Que se passerait-il si un utilisateur final augmentait la taille de la police dans son navigateur?
Joel Etherton
@JoelEtherton Je suppose que c'est au navigateur de décider et oui, tout est en pixels dans mon cas.
Tony Bogdanov
Cela peut être une bonne solution: stackoverflow.com/questions/6222616/…
ivy
C'est une très belle lecture hackingui.com/front-end
...

Réponses:

31

Je ne sais pas si vous avez vu CECI , mais l'excellent CSS-Tricks.com de Chris Coyier a publié un lien vers ceci il y a quelque temps et c'est une solution CSS pure qui accomplit exactement ce que vous cherchez.

(Cliquez pour afficher sur CodePen)

HTML:

<div class="ellipsis">
    <div>
        <p>
            Call me Ishmael. Some years ago – never mind how long precisely – having
            little or no money in my purse, and nothing particular to interest me on
            shore, I thought I would sail about a little and see the watery part of the
            world. It is a way I have of driving off the spleen, and regulating the
            circulation. Whenever I find myself growing grim about the mouth; whenever it
            is a damp, drizzly November in my soul; whenever I find myself involuntarily
            pausing before coffin warehouses, and bringing up the rear of every funeral I
            meet; and especially whenever my hypos get such an upper hand of me, that it
            requires a strong moral principle to prevent me from deliberately stepping
            into the street, and methodically knocking people's hats off – then, I account
            it high time to get to sea as soon as I can.
        </p>
    </div>
</div>

CSS:

html,body,p {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
}
.ellipsis {
    overflow: hidden;
    height: 200px;
    line-height: 25px;
    margin: 20px;
    border: 5px solid #AAA;
}
.ellipsis:before {
    content: "";
    float: left;
    width: 5px;
    height: 200px;
}
.ellipsis > *:first-child {
    float: right;
    width: 100%;
    margin-left: -5px;
}
.ellipsis:after {
    content: "\02026";
    box-sizing: content-box;
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    float: right;
    position: relative;
    top: -25px;
    left: 100%;
    width: 3em;
    margin-left: -3em;
    padding-right: 5px;
    text-align: right;
    background-size: 100% 100%;/* 512x1 image,gradient for IE9. Transparent at 0% -> white at 50% -> white at 100%.*/
    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAMAAACfZeZEAAAABGdBTUEAALGPC/xhBQAAAwBQTFRF////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wDWRdwAAAP90Uk5TgsRjMZXhS30YrvDUP3Emow1YibnM9+ggOZxrBtpRRo94gxItwLOoX/vsHdA2yGgL8+TdKUK8VFufmHSGgAQWJNc9tk+rb5KMCA8aM0iwpWV6dwP9+fXuFerm3yMs0jDOysY8wr5FTldeoWKabgEJ8RATG+IeIdsn2NUqLjQ3OgBDumC3SbRMsVKsValZplydZpZpbJOQco2KdYeEe36BDAL8/vgHBfr2CvTyDu8R7esU6RcZ5ecc4+Af3iLcJSjZ1ivT0S/PMs3LNck4x8U7wz7Bv0G9RLtHuEq1TbJQr1OtVqqnWqRdoqBhnmSbZ5mXapRtcJGOc4t2eYiFfH9AS7qYlgAAARlJREFUKM9jqK9fEGS7VNrDI2+F/nyB1Z4Fa5UKN4TbbeLY7FW0Tatkp3jp7mj7vXzl+4yrDsYoVx+JYz7mXXNSp/a0RN25JMcLPP8umzRcTZW77tNyk63tdprzXdmO+2ZdD9MFe56Y9z3LUG96mcX02n/CW71JH6Qmf8px/cw77ZvVzB+BCj8D5vxhn/vXZh6D4uzf1rN+Cc347j79q/zUL25TPrJMfG/5LvuNZP8rixeZz/mf+vU+Vut+5NL5gPOeb/sd1dZbTs03hBuvmV5JuaRyMfk849nEM7qnEk6IHI8/qn049hB35QGHiv0yZXuMdkXtYC3ebrglcqvYxoj1muvC1nDlrzJYGbpcdHHIMo2FwYv+j3QAAOBSfkZYITwUAAAAAElFTkSuQmCC);
    background: -webkit-gradient(linear,left top,right top,
        from(rgba(255,255,255,0)),to(white),color-stop(50%,white));
        background: -moz-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -o-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -ms-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
    }

Bien sûr, être une solution CSS pure signifie que c'est aussi une solution assez compliquée, mais cela fonctionne proprement et élégamment. Je suppose que Javascript est hors de question car c'est beaucoup plus facile à réaliser (et sans doute plus dégradable) avec Javascript.

En prime, il y a un fichier zip téléchargeable du processus complet (si vous voulez le comprendre et tout), mais aussi un fichier mixin SASS afin que vous puissiez le plier dans votre processus easy-peasy.

J'espère que cela t'aides!

http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/

Dashard
la source
Je viens de cliquer sur votre lien Codepen sur un téléphone Android et cela a fonctionné dans Firefox. Sur quelle plate-forme / navigateur ne fonctionne-t-il pas?
dashard
uploady.com/#!/download/kAwBXv1CqXg/PU68wrP6QzGgydlS J'utilise chrome et il n'y a pas d'ellipse dans l'aperçu. Continuez à ajouter des lignes de texte, rien ne se passe. Après combien de lignes commencera-t-il à afficher des points de suspension?
coding_idiot
Dans le lien uploady que vous avez posté, le texte n'avait clairement pas encore débordé dans le conteneur. Le texte doit être trop important pour que le conteneur fixe s'affiche avant que les ellipses n'apparaissent. Continuez simplement à ajouter du texte pour voir l'effet.
dashard
@ MarcosPérezGude - ne me surprend pas. On y fait allusion avec >> "Bien sûr, être une solution CSS pure signifie que c'est aussi une solution assez compliquée…" <<
dashard
137

Les propriétés CSS simples peuvent faire l'affaire. Ce qui suit est pour une ellipse de trois lignes.

display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
pxthxk
la source
15
cela ne fonctionne pas dans Firefox. seulement chrome, safari et opéra
anyavacy
1
selon caniuse , il indique qu '"il est peu probable que d'autres navigateurs prennent en charge la propriété telle quelle". Alors attention.
Matan Bobi
mec lisse .. très utile
Valentino Pereira
4
Fonctionne aussi avec gr8 dans Firefox
Nisharg Shah
4
Semble avoir un excellent soutien maintenant: caniuse.com/#search=line-clamp
Joao
52

Jetez un œil à cette version css pure: http://codepen.io/martinwolf/pen/qlFdp

display: -webkit-box;
max-width: 400px;
height: 109.2px;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.625;
amcdnl
la source
7
C'est vraiment cool, dommage que ce soit uniquement du webkit. Voici un article intéressant à ce sujet: css-tricks.com/line-clampin
Tony Bogdanov
Pourquoi déclarez-vous deux text-overflowet displayrègles?
j08691
Un grand WoooW. Je n'ai jamais vu de pince de ligne auparavant
Mike Aron
1
Juste pour info, cela fonctionne également bien dans Firefox de nos jours. Excellente solution!
Athoxx
une seule question, quand j'ai une ou deux lignes de texte, je les veux centrées, comment puis-je faire cela, si j'ajoute un écran flexible, je perds les points de suspension, il semble que cela ne fonctionne que si display: -webkit box est défini
PirateApp
10

Css ci-dessous devrait faire l'affaire.

Après la deuxième ligne, le texte contiendra ...

line-height: 1em;
max-height: 2em;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
anandharshan
la source
cela fonctionnait bien mais je devais ajouteroverflow:hidden
timhysniu
3

Utilisez ceci si ci-dessus ne fonctionne pas

 display: block;
 display: -webkit-box;
 max-width: 100%;
 margin: 0 auto;
 -webkit-line-clamp: 2;
 /* autoprefixer: off */
 -webkit-box-orient: vertical;
 /* autoprefixer: on */
 overflow: hidden;
 text-overflow: ellipsis;
Vikas Verma
la source
2

Ma solution réutilise celle d'amcdnl, mais ma solution de secours consiste à utiliser une hauteur pour le conteneur de texte:

.my-caption h4 {
    display: -webkit-box;
    margin: 0 auto;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;

    height: 40px;/* Fallback for non-webkit */
}
VincentPerrin.com
la source
-webkit-line-clampne fonctionne pas pour IE11, Edge ou Firefox.
Gaʀʀʏ
@Garry, vous avez raison, à l'époque vous auriez eu besoin d'un correctif JS, mais cela fonctionne maintenant très bien. caniuse.com/#search=webkit-line-clamp
VincentPerrin.com
1

Sur la base d'une réponse que j'ai vue dans stackoveflow, j'ai créé ce mixin MOINS ( utilisez ce lien pour générer le code CSS ):

.max-lines(@lines: 3; @line-height: 1.2) {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: @lines;
  line-height: @line-height;
  max-height: @line-height * @lines;
}

Usage

.example-1 {
    .max-lines();
}

.example-2 {
    .max-lines(3);
}

.example-3 {
    .max-lines(3, 1.5);
}
Nabil Kadimi
la source
1

Cela semble plus élégant en combinant deux classes. Vous pouvez supprimer la two-linesclasse si une seule ligne a besoin de voir:

.ellipse {
          white-space: nowrap;
          display:inline-block;
          overflow: hidden;
          text-overflow: ellipsis;
       }
      .two-lines {
          -webkit-line-clamp: 2;
          display: -webkit-box;
          -webkit-box-orient: vertical;
          white-space: normal;
      }
      .width{
          width:100px;
          border:1px solid hotpink;
      }
        <span class='width ellipse'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>

       <span class='width ellipse two-lines'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>

Renversement de la jeunesse
la source
1

Restreindre à quelques lignes fonctionnera dans presque tous les navigateurs, mais les points de suspension (3 points) ne seront pas affichés dans Firefox et IE. Démo - http://jsfiddle.net/ahzo4b91/1/

div {
width: 300px;
height: 2.8em;
line-height: 1.4em;
display: flex;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden; 
}
Nikith Reddy
la source
0
          text-overflow: ellipsis;
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box;
          line-height: 36px;
          max-height: 18px;
          -webkit-line-clamp: 2;
          -webkit-box-orient: vertical;

J'ai trouvé une combinaison de travaux de serrage de ligne et de hauteur de ligne: D

jimmyNames
la source
0

Dans mon application angulaire, le style suivant a fonctionné pour moi pour obtenir des points de suspension sur le débordement de texte sur la deuxième ligne :

 <div style="height:45px; overflow: hidden; position: relative;">
     <span class=" block h6 font-semibold clear" style="overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box; 
        line-height: 20px; /* fallback */
        max-height: 40px; /* fallback */
        -webkit-line-clamp: 2; /* number of lines to show */
        -webkit-box-orient: vertical;">
        {{ event?.name}} </span>
 </div>

J'espère que ça aide quelqu'un.

Nodirabegimxonoyim
la source
0

Pour ceux qui travaillent dans scss , vous devez ajouter !autoprefixerau début du commentaire afin qu'il soit conservé pour postcss:

J'ai rencontré ce problème, c'est pourquoi le publier ici

line-height: 1em;
max-height: 2em;
display: -webkit-box;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

Référence

Awais
la source
0

Vous pouvez utiliser un effet dissous au lieu d'ellipse, du CSS pur et un look plus professionnel:

    <div style="width: 293px; height:48px; overflow: hidden; ">
        More than two line of text goes here-More than two line of text goes here
    </div>
    <div style="position: relative; top: -24px; width: 293px; height:24px; 
             background: linear-gradient(90deg, rgba(255,0,0,0) 40%, rgba(255,255,255,1) 99%);">
    </div>

Ici, j'ai supposé que votre couleur d'arrière-plan est le blanc.

Mahan Lamei
la source
-1

C'est un hack total, mais cela fonctionne:

http://jsfiddle.net/2wPNg/

div {
    width: 30%;
    float: left;
    margin-right: 2%;
    height: 94px;
    overflow: hidden;
    position: relative;
}

div:after {
     display: block;
      content: '...';
      width: 1em;
  height: 1.5em;
  background: #fff;
  position: absolute;
  bottom: -6px;
  right: 0;
    }

Il a des problèmes ... il pourrait couper une lettre maladroitement, et il aura probablement des résultats étranges sur un site réactif.

Morgan Kay
la source
5
Ce ne sera pas la bonne solution car si le contenu est plus petit, il ajoute également «...» à la fin. Fiddle: jsfiddle.net/2wPNg
Sachin
-1

Voici un script simple pour gérer les points de suspension à l'aide de jQuery. Il inspecte la hauteur réelle de l'élément et crée un nœud d'origine caché et un nœud tronqué. Lorsque l'utilisateur clique, il bascule entre les deux versions.

L'un des grands avantages est que les "points de suspension" sont proches du dernier mot, comme prévu.

Si vous utilisez des solutions CSS pures, les trois points semblent distants du dernier mot.

function manageShortMessages() {

        $('.myLongVerticalText').each(function () {
            if ($(this)[0].scrollHeight > $(this)[0].clientHeight)
                $(this).addClass('ellipsis short');
        });

        $('.myLongVerticalText.ellipsis').each(function () {
            var original = $(this).clone().addClass('original notruncation').removeClass('short').hide();
            $(this).after(original);

            //debugger;
            var shortText = '';
            shortText = $(this).html().trim().substring(0, 60) + '...';
            $(this).html(shortText);
        });
        
        $('.myLongVerticalText.ellipsis').click(function () {
            $(this).hide();

            if ($(this).hasClass('original'))
            {
                $(this).parent().find('.short').show();
            }
            else
            {
                $(this).parent().find('.original').show();
            }
        });
    }
	
  manageShortMessages();
div {
 border:1px solid red;
 margin:10px;
}

div.myLongVerticalText {
  height:30px;
  width:450px;
}

div.myLongVerticalText.ellipsis {
 cursor:pointer;
}

div.myLongVerticalText.original {
  display:inline-block;
  height:inherit;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="myLongVerticalText">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sit amet quam hendrerit, sagittis augue vel, placerat erat. Aliquam varius porta posuere. Aliquam erat volutpat. Phasellus ullamcorper malesuada bibendum. Etiam fringilla, massa vitae pulvinar vehicula, augue orci mollis lorem, laoreet viverra massa eros id est. Phasellus suscipit pulvinar consectetur. Proin dignissim egestas erat at feugiat. Aenean eu consectetur erat. Nullam condimentum turpis eu tristique malesuada.

Aenean sagittis ex sagittis ullamcorper auctor. Sed varius commodo dui, nec consectetur ante condimentum et. Donec nec blandit mi, vitae blandit elit. Phasellus efficitur ornare est facilisis commodo. Donec convallis nunc sed mauris vehicula, non faucibus neque vehicula. Donec scelerisque luctus dui eu commodo. Integer eu quam sit amet dui tincidunt pharetra eu ac quam. Quisque tempus pellentesque hendrerit. Sed orci quam, posuere eu feugiat at, congue sed felis. In ut lectus gravida, volutpat urna vitae, cursus justo. Nam suscipit est ac accumsan consectetur. Donec rhoncus placerat metus, ut elementum massa facilisis eget. Donec at arcu ac magna viverra tincidunt.
</div>


<div class="myLongVerticalText">
One Line Lorem ipsum dolor sit amet.  
</div>
</body>

Matteo Conta
la source
Si vous refusez cette solution, veuillez expliquer pourquoi ici, je l'apprécierai.
Matteo Conta
1
OP a demandé une solution CSS et vous avez proposé jQuery?
dashard
J'ai manqué que c'était une exigence forte l'absence de javascript, dans mon cas la solution CSS pure présentait des problèmes de rendu, la solution jQuery m'a donné plus de contrôle sur le rendu final et la position des points de suspension.
Matteo Conta
Tout à fait d'accord. Dans ma réponse, j'ai noté que c'était infiniment plus facile à réaliser avec JS.
dashard
-3

Vous ne savez pas quelle est votre cible, mais voulez-vous que le texte apparaisse sur la deuxième ligne?

Voici votre jsFiddle: http://jsfiddle.net/8kvWX/4/ vient de supprimer ce qui suit:

     white-space:nowrap;  

Je ne sais pas si c'est ce que vous recherchez ou non.

Cordialement,

Mee

Mee
la source
1
Il veut les points de suspension à la fin de la deuxième ligne, ce qui n'est pas si simple à faire sans JavaScript ...
Marc Audet
@MarcAudet exactement :)
Tony Bogdanov
Bien, car j'ai trouvé une autre personne demandant d'avoir les lignes sur la deuxième ligne et son CSS était à peu près le même que le vôtre, mais la classe pointait plutôt vers une balise ul. Bref, désolé Tony. Je vais y jeter un œil à nouveau et mettre à jour ma réponse si je réussis.
Mee le
eh bien je pense que la meilleure solution est celle de @Itay Gal. D'après ce que j'ai vu, celui-ci fonctionne.
Mee le