Ausblenden von Text beim Überlaufen mit CSS, wenn der Text größer als zulässig ist

74

Ich versuche, einen Textausblendeffekt zu erzeugen, wenn die Textmenge größer ist, als die Zeile verarbeiten kann. Ich Erreichung dieses Ziels mit der Mischung aus max-height, overflowund linear-gradient. Etwas wie das.

max-height:200px;
overflow:hidden;
text-overflow: ellipsis;
background: -webkit-linear-gradient(#000, #fff);

Die volle Geige ist verfügbar . Ich versuche einen ähnlichen Effekt zu erzielenGeben Sie hier die Bildbeschreibung ein

und ich bin irgendwie nah. Das Problem ist, dass in meinem Fall der Text von Anfang an ausgeblendet wird und ich möchte, dass er nur dann ausgeblendet wird, wenn er wirklich nahe an der maximalen Größe liegt. Nehmen wir an, Sie beginnen mit dem Ausblenden, wenn es bereits 150 Pixel groß ist. Außerdem verwende ich nur -webkitPräfixe und gehe davon aus, dass es möglicherweise andere Präfixe gibt, die ich für andere Rendering-Engines hinzufügen kann.

Gibt es eine Möglichkeit, dies in reinem CSS zu tun?

Salvador Dali
quelle
1
Es ist unmöglich zu erkennen, wann der Überlauf in CSS auftritt, es sei denn, wir müssen einen Layout-Trick in Kombination mit CSS verwenden. Wenn Sie meinen, dass der Überlauf auftritt, wenn die Höhe etwa 150 Pixel erreicht, sollte der Text ausgeblendet werden. Hier ist die Lösung für Sie. Hierbei wird eine Verlaufsebene über dem Text verwendet. Dies funktioniert für alle Browser, die Linear unterstützen. Ich denke, es ist besser als Ihre Lösung, -webkit-background-clip:textdie nur von Webkit-basierten Browsern unterstützt wird (glaube ich): jsfiddle.net/b9vtW/1
King King

Antworten:

116

Es sieht so aus, als ob Sie lediglich den Text ab einer bestimmten Höhe (ca. 150 Pixel) ausblenden müssen. Der Text (falls vorhanden), der in dieser Höhe angezeigt wird, wird als Überlauf betrachtet. Sie können also versuchen, eine transparente lineare Verlaufsebene über dem Textbereich zu verwenden. Mit dem folgenden Pseudoelement können wir dies auf saubere Weise erreichen :before:

.row:before {
  content:'';
  width:100%;
  height:100%;    
  position:absolute;
  left:0;
  top:0;
  background:linear-gradient(transparent 150px, white);
}

Geige

König König
quelle
27
Sehr schön. Ich musste mich auch position:relativeauf die setzen .row. Ein Problem war jedoch, dass das überlagerte Pseudoelement es unmöglich machte, auf Links innerhalb des ursprünglichen Elements zu klicken. Um dies zu beheben, habe ich pointer-events: nonedas Styling des Pseudoelements erweitert.
Joeytwiddle
@joeytwiddle - danke für den pointer-eventsTipp. Als Randnotiz pointer-eventsund linear-gradientswerden in IE9 + und :beforein IE8 + unterstützt, sodass IE8-Benutzer das Pseudo-Element erhalten, aber den Farbverlauf nicht sehen und nicht in der Lage sind, darauf zu klicken. Es kann ratsam sein, IE8 zu erkennen und das Pseudo-Element zu entfernen.
TheCarver
7
Wenn Sie sich fragen, warum dies unter iOS Safari nicht funktioniert, transparentist dies dort nicht zulässig. Verwenden Sie rgba(255,255,255,0)stattdessen gemäß diesem SO-Beitrag: stackoverflow.com/questions/16816648/…
Mark Bao
1
Ich wollte nur auf ein paar Dinge hinweisen: Die Deckkraft in rgba-Werten (der letzte Wert) stammt aus dem 0 - 1.0Fall, dass Sie nicht möchten, dass sie vollständig ausgeblendet wird, und wenn Sie Links wie einen weiteren Link unter dem Text möchten, können Sie diese verwenden das obige Styling zum Beispiel ein pTag anstelle des.row
user3791372
1
Dieser Textüberlauf: Auslassungspunkte; Inhalt: ""; Nicht nützlich in Ihrer Klassenreihe
Matohawk
14

Ich würde so etwas vorschlagen:

Wenden Sie den Farbverlauf auf ein absolut positioniertes :afterPseudoelement ( ) an, das mit einer Höhe von 40 Pixel bei etwa 160 Pixel von oben positioniert wird. Auf diese Weise wird es in kürzeren Feldern (aufgrund der max-heightKombination mit overflow:hidden) überhaupt nicht angezeigt . Und der Farbverlauf selbst reicht von vollständig transparent ( rgba(0,0,0,0)) bis fest schwarz.

.row{
    position:relative;
    /* … */
}
.row:after {
    content:"";
    position:absolute;
    top:160px;
    left:0;
    height:40px;
    width:100%;
    background: linear-gradient(rgba(0,0,0,0), #000);
}

http://jsfiddle.net/b9vtW/2/

CBroe
quelle
Schön, aber wenn Sie bottom:0;stattdessen verwenden top:160px;, wird es universeller sein. Der Verlauf belegt nur den unteren Rand des übergeordneten Elements mit heightder Höhe des Verlaufs.
Nux
@nux, das unten statt oben verwendet, funktioniert nicht wie erwartet, wenn das Element eine maximale Höhe und keine Höhe hat. Wenn Sie bottom: 0 verwenden, wird der Farbverlauf angewendet, auch wenn der Text nur eine Zeile belegt, wenn er nur den Farbverlauf in der letzten Zeile haben sollte (könnte 3., 4. usw. sein)
jbdeguzman
5

Ich denke du suchst so etwas, oder?

http://jsfiddle.net/QPFkH/

.text {
    position:relative;
    width:200px;
    max-height:10em;
    overflow:hidden;
}
.shadow {
    position:absolute;
    top:8em;
    width:100%;
    height:2em;
    background: -webkit-linear-gradient(transparent, white);
    background: -o-linear-gradient(transparent, white);
    background: -moz-linear-gradient(transparent, white);
    background: linear-gradient(transparent, white);
}
Ripaz
quelle
4

Ihr Code ist korrekt, nur der prozentuale Gradient des Liners muss eingestellt werden

background: -webkit-linear-gradient(top,#000 70%, #fff);

Probieren Sie den Geigenlink aus

http://jsfiddle.net/ShinyMetilda/kb4fL/1/

Sie können es auch in Pixel wie diesem angeben

 background: -webkit-linear-gradient(top,#000 140px, #fff);

Beides funktioniert gleich

ShinyJos
quelle
2

Ich empfehle Ihnen, http://www.colorzilla.com/gradient-editor/ zu verwenden .

Was Sie suchen, kann sein:

background: -moz-linear-gradient(top,  rgba(255,255,255,0) 0%, rgba(255,255,255,0) 80%, rgba(0,0,0,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0)), color-stop(80%,rgba(255,255,255,0)), color-stop(100%,rgba(0,0,0,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top,  rgba(255,255,255,0) 0%,rgba(255,255,255,0) 80%,rgba(0,0,0,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top,  rgba(255,255,255,0) 0%,rgba(255,255,255,0) 80%,rgba(0,0,0,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top,  rgba(255,255,255,0) 0%,rgba(255,255,255,0) 80%,rgba(0,0,0,1) 100%); /* IE10+ */
background: linear-gradient(to bottom,  rgba(255,255,255,0) 0%,rgba(255,255,255,0) 80%,rgba(0,0,0,1) 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#000000',GradientType=0 ); /* IE6-9 */

und wenn Sie nicht wie gewünscht arbeiten, kopieren Sie diese CSS, fügen Sie sie in die URL (CSS-Fenster) ein und ändern Sie sie nach Belieben.

Alvaro Menéndez
quelle
Das Problem ist, dass ich den Startpunkt in Pixel angeben muss, nicht in Prozent. mit Prozent, wenn der Text zu klein ist, wird er immer noch ausgeblendet. Und anscheinend erlaubt die von Ihnen vorgeschlagene Syntax von Befehlen dies nicht.
Salvador Dali
Gut. Sie können diese Lösung verwenden, die in allen Browsern funktioniert (außer nach Pseudoelementen ): jsfiddle.net/b9vtW/3 . Fügen Sie einfach ein absolut positioniertes Div mit der Höhe hinzu, die Sie in Ihrem Wrap wünschen, und richten Sie es mit dem Gradienten als nach unten aus Hintergrund. einfach und sicher
Alvaro Menéndez
1

Ich hatte ein ähnliches Problem mit einer Bootstrap-Schaltfläche, die einen vertikalen Verlauf und auch eine Änderung des Verlaufs beim Schweben aufweist. Das hat bei mir funktioniert.

<button class="btn btn-success" style="width:250px">
      <div class="faderflow">
         SOME TEXT THAT'S TOO LONG FOR THE BUTTON
      </div>
</button>



.faderflow {
    overflow: hidden;

   /* same color as text (white) */
    background: linear-gradient(to right, rgb(255, 255, 255) 80%,rgba(255, 255, 255, 0) 100%);
    background-clip: border-box;
    -webkit-background-clip: text;
    -webkit-text-fill-color: #fff0;

   /* overwrite the bootstrap text shadow  */
    text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.2);
}

https://codepen.io/andyg2/pen/qGmKKN

Andy Gee
quelle
Vielen Dank für diese Antwort, es ist in der Tat der richtige Weg, wenn Sie Bild / Farbverlauf im Hintergrund haben. Das einzige Problem ist, wenn Sie Text in mehreren Farben haben ...
Adrian
1
bekam besseren Ansatz -mask-image: linear-gradient(to bottom, white, transparent);
Adrian
0

Ich habe diese Methode verwendet, um den Boden transparent zu machen.

http://jsfiddle.net/IAMCHIEF/x7qLon18/4/

.row{
    position:relative;
    width: 300px;
    margin-bottom: 5px;
    padding-bottom: 5px;
    border-bottom: 3px solid #777;
    max-height:200px;
    overflow:hidden;
    color:#fff;
    background:#000;
}
.row:after {
  content: "";
position: absolute;
top: 137px;
left: 0;
height: 40px;
width: 100%;
background: -webkit-linear-gradient(rgba(255, 255,255, .4), rgba(255, 255, 255, 1));
}
<div class="row">
	Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
<div class="row">
	Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
<div class="row">
	Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
</div>

Arun Prasad ES
quelle