Ich habe ein Bild für diese Frage erstellt, um das Verständnis zu erleichtern.
Ist es möglich, eine Ellipse auf einer <div>
mit einer festen Breite und mehreren Linien zu erstellen ?
Ich habe hier und da einige jQuery-Plugins ausprobiert, kann aber das gesuchte nicht finden. Irgendeine Empfehlung? Ideen?
javascript
jquery
html
css
Edward
quelle
quelle
Antworten:
Nur eine kurze Grundidee.
Ich habe mit folgendem Markup getestet:
Und CSS:
Durch Anwenden dieser jQuery wird das gewünschte Ergebnis erzielt:
Es wird wiederholt versucht, das letzte Wort des Textes zu entfernen, bis die gewünschte Größe erreicht ist. Wegen des Überlaufs: versteckt; Der Prozess bleibt unsichtbar und auch bei ausgeschaltetem JS bleibt das Ergebnis "visuell korrekt" (natürlich ohne das "...").
Wenn Sie dies mit einer sinnvollen Kürzung auf der Serverseite kombinieren (die nur einen geringen Overhead hinterlässt), wird es schneller ausgeführt :).
Auch dies ist keine vollständige Lösung, sondern nur eine Idee.
UPDATE: Eine jsFiddle-Demo wurde hinzugefügt .
quelle
li
und innen auf jedem gibt es ein.block
und ein.block h2
und ich muss dies auf dash2
Innere anwenden,.block
aber ich konnte es nicht zum Laufen bringen. Ist es anders, wenn es mehr als eine gibt.block h2
?height*3
einige Pixel kleiner als die Zeile . Einfache Lösung ist, einfach ein paar Pixel hinzuzufügendivh
while
Zeile hinzu:if(!$p.text().match(/\W*\s(\S)*$/)) break;
while ((upper-lower)>1) {let middle=((lower+upper)/2)|0 /*|0 is quick floor*/; if (test(words.slice(0,middle)+'...')) {lower=middle;} else {upper=middle;}}
. Wie @KrisWebDev herausgefunden hat, möchten Sie auch nach einem riesigen Wort suchen.Probieren Sie das Plugin jQuery.dotdotdot aus .
quelle
Javascript-Bibliotheken für "Line Clamping"
Beachten Sie, dass "Linienklemmung" auch als "Ellipse auf Block mit mehreren Linien" oder "vertikale Ellipse" bezeichnet wird.
github.com/BeSite/jQuery.dotdotdot
github.com/josephschmitt/Clamp.js
Hier sind noch einige, die ich noch nicht untersucht habe:
CSS-Lösungen für die Linienklemmung
Es gibt einige CSS-Lösungen, aber die einfachste Verwendung
-webkit-line-clamp
mit schlechter Browserunterstützung . Siehe Live-Demo auf jsfiddle.net/AdrienBe/jthu55v7/Viele Menschen haben große Anstrengungen unternommen, um dies nur mit CSS zu erreichen. Siehe Artikel und Fragen dazu:
Was ich empfehlen würde
Halte es einfach. Entscheiden Sie sich für die einfachste und getestete Lösung: einfaches CSS oder eine gut getestete Javascript-Bibliothek, es sei denn, Sie haben viel Zeit, um sich dieser Funktion zu widmen.
Entscheiden Sie sich für etwas Schickes / Komplexes / Hochindividuelles und Sie werden den Preis dafür später zahlen.
Was andere tun
Ein Ausblenden wie bei Airbnb könnte eine gute Lösung sein. Es handelt sich wahrscheinlich um einfaches CSS in Verbindung mit einfachem jQuery. Eigentlich scheint es dieser Lösung auf CSSTricks sehr ähnlich zu sein
Oh, und wenn Sie nach Designinspirationen suchen:
quelle
In HTML gibt es keine solche Funktion, und das ist sehr frustrierend.
Ich habe eine Bibliothek entwickelt, um damit umzugehen.
Auf meiner Website finden Sie Screenshots, Tutorials und Download-Links.
quelle
Reine JS-Lösung basierend auf der Lösung von bažmegakapa und einige Bereinigungen, um Personen zu berücksichtigen, die versuchen, eine Höhe / maximale Höhe anzugeben, die kleiner als die Linie des Elements ist.
quelle
Ich habe eine Lösung, die gut funktioniert, aber stattdessen verwendet eine Ellipse einen Farbverlauf. Die Vorteile sind, dass Sie keine JavaScript-Berechnungen durchführen müssen und dies für Container mit variabler Breite einschließlich Tabellenzellen funktioniert. Es verwendet ein paar zusätzliche Divs, ist aber sehr einfach zu implementieren.
http://salzerdesign.com/blog/?p=453
Edit: Sorry, ich wusste nicht, dass der Link nicht genug ist. Die Lösung besteht darin, ein Div um den Text zu setzen und das Div so zu gestalten, dass der Überlauf gesteuert wird. Fügen Sie innerhalb des Div ein weiteres Div mit einem "Fade" -Gradienten ein, der mithilfe von CSS oder einem Bild (für den alten IE) erstellt werden kann. Der Farbverlauf reicht von transparent bis zur Hintergrundfarbe der Tabellenzelle und ist etwas breiter als eine Ellipse. Wenn der Text lang ist und überläuft, wird er unter dem Div "Fade" angezeigt und sieht "Faded Out" aus. Wenn der Text kurz ist, ist die Überblendung unsichtbar, sodass kein Problem besteht. Die beiden Container können so angepasst werden, dass eine oder mehrere Zeilen angezeigt werden, indem die Höhe des Containers als Vielfaches der Textzeilenhöhe festgelegt wird. Das "Fade" -Div kann so positioniert werden, dass es nur die letzte Zeile abdeckt.
quelle
Hier ist eine reine CSS-Methode, um dies zu erreichen: http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/
Hier ist eine Zusammenfassung:
quelle
Sie können
-webkit-line-clamp
Eigenschaft mit verwendendiv
.-webkit-line-clamp: <integer>
Dies bedeutet, dass Sie die maximale Anzahl von Zeilen festlegen, bevor Sie den Inhalt abschneiden, und(…)
am Ende der letzten Zeile eine Ellipse anzeigen .quelle
Hier ist eine Vanille-JavaScript-Lösung, die Sie zur Not verwenden können:
Sie können damit im Codepen unten herumspielen. Versuchen Sie, die Schriftgröße im CSS-Bereich zu ändern, und nehmen Sie im HTML-Bereich eine geringfügige Änderung vor (z. B. fügen Sie irgendwo einen zusätzlichen Platz hinzu), um die Ergebnisse zu aktualisieren. Unabhängig von der Schriftgröße sollte der mittlere Absatz immer auf die Anzahl der Zeilen im zweiten Parameter gekürzt werden, der an limitLines () übergeben wird.
Codepen: http://codepen.io/thdoan/pen/BoXbEK
quelle
BEARBEITEN: Kam über Shave, das JS-Plugin, das das mehrzeilige Abschneiden von Text basierend auf einer bestimmten maximalen Höhe sehr gut macht. Es verwendet die binäre Suche, um den optimalen Haltepunkt zu finden. Auf jeden Fall eine Untersuchung wert.
URSPRÜNGLICHE ANTWORT:
Ich musste eine Vanille-JS-Lösung für dieses Problem finden. In dem Fall, an dem ich gearbeitet hatte, musste ich einen langen Produktnamen in eine begrenzte Breite und über zwei Zeilen einpassen. bei Bedarf durch Auslassungspunkte abgeschnitten.
Ich habe Antworten aus verschiedenen SO-Posts verwendet, um etwas zu erfinden, das meinen Bedürfnissen entspricht. Die Strategie lautet wie folgt:
Codebeispiel:
PS:
PPS: Ich habe gerade festgestellt, dass dies dem von @DanMan und @ st.never vorgeschlagenen Ansatz sehr ähnlich ist. Überprüfen Sie die Codefragmente auf ein Implementierungsbeispiel.
quelle
Sehr einfache Javascript-Lösung. Divs muss gestylt werden, z.
Und JS:
quelle
Keine genaue Antwort auf die Frage, aber ich bin auf diese Seite gestoßen, als ich versucht habe, etwas sehr Ähnliches zu tun, aber einen Link zum "Mehr anzeigen" hinzufügen wollte, anstatt nur eine einfache Ellipse. Dies ist eine jQuery-Funktion, die einen "Mehr" -Link zu Text hinzufügt, der einen Container überläuft. Persönlich benutze ich dies mit Bootstrap, aber natürlich wird es ohne funktionieren.
Legen Sie Ihren Text wie folgt in einen Container:
Wenn die folgende jQuery-Funktion hinzugefügt wird, werden alle Divs, die größer als der Wert für die Anpassungshöhe sind, abgeschnitten und ein Link "Mehr" hinzugefügt.
Basierend darauf, aber aktualisiert: http://shakenandstirredweb.com/240/jquery-moreless-text
quelle
Das erwähnte dotdotdot jQuery Plugin funktioniert gut mit eckigen:
Das entsprechende Markup wäre:
quelle
Reine JS-Demo (ohne jQuery und 'while'-Schleife)
Als ich nach einer Lösung für ein mehrzeiliges Ellipsenproblem suchte, war ich überrascht, dass es ohne jQuery keine gute gibt. Es gibt auch einige Lösungen, die auf der 'while'-Schleife basieren, aber ich denke, sie sind nicht effektiv und gefährlich, da die Möglichkeit besteht, in die Endlosschleife zu gelangen. Also habe ich diesen Code geschrieben:
quelle
Vielleicht ziemlich spät, aber mit SCSS können Sie eine Funktion deklarieren wie:
Und benutze es wie:
Dadurch wird der Text auf eine Zeile gekürzt und Sie wissen, dass er 1,4 Zeilen hoch ist. Die erwartete Ausgabe ist Chrom, mit dem
...
am Ende gerendert werden soll, und FF mit etwas kühlem Fade am EndeFeuerfuchs
Chrom
quelle
Diese kurze CSS- Lösung wurde in Adrien Be's Antwort gefunden :
Ab März 2020 beträgt die Browserunterstützung 95,3% und wird in IE und Opera Mini nicht unterstützt. Funktioniert mit Chrome, Safari, Firefox und Edge.
quelle
Sie können es wahrscheinlich (derzeit?) Ohne eine Schriftart mit fester Breite wie Courier nicht tun. Bei einer Schriftart mit fester Breite nimmt jeder Buchstabe den gleichen horizontalen Raum ein, sodass Sie wahrscheinlich die Buchstaben zählen und das Ergebnis mit der aktuellen Schriftgröße in ems oder exs multiplizieren können. Dann müssten Sie nur noch testen, wie viele Buchstaben in eine Zeile passen, und sie dann aufteilen.
Alternativ können Sie für nicht festgeschriebene Schriftarten möglicherweise eine Zuordnung für alle möglichen Zeichen (wie i = 2px, m = 5px) erstellen und dann rechnen. Eine Menge hässlicher Arbeit.
quelle
So erweitern Sie die Lösung von @ DanMan: Wenn Schriftarten mit variabler Breite verwendet werden, können Sie eine durchschnittliche Schriftbreite verwenden. Dies hat zwei Probleme: 1) Ein Text mit zu vielen W würde überlaufen und 2) ein Text mit zu vielen I würde früher abgeschnitten.
Oder Sie könnten einen Worst-Case-Ansatz wählen und die Breite des Buchstabens "W" verwenden (was meiner Meinung nach am breitesten ist). Dies beseitigt das obige Problem 1, verschärft jedoch das Problem 2.
Ein anderer Ansatz könnte sein: Lassen Sie
overflow: clip
das Div und fügen Sie einen Auslassungsabschnitt (möglicherweise ein anderes Div oder Bild) mitfloat: right; position: relative; bottom: 0px;
(ungetestet) hinzu. Der Trick besteht darin, das Bild über dem Ende des Textes erscheinen zu lassen.Sie können das Bild auch nur anzeigen, wenn Sie wissen, dass es überlaufen wird (z. B. nach etwa 100 Zeichen).
quelle
overflow: clip
? Und was würden Sie von CSS erwartenfloat
?Mit diesem Code ist kein zusätzliches Wrapper-Div erforderlich, wenn die Höhe des Elements durch einen Stil mit maximaler Höhe begrenzt ist.
Außerdem wird der Originaltext in einem Datenattribut gespeichert, das nur mit Stilen angezeigt werden kann, z. mit der Maus über:
quelle
In meinem Szenario konnte ich keine der oben genannten Funktionen ausführen, und ich musste der Funktion auch mitteilen, wie viele Zeilen angezeigt werden sollen, unabhängig von der Schriftgröße oder der Containergröße.
Ich habe meine Lösung auf die Verwendung der Canvas.measureText- Methode (eine HTML5- Funktion) gestützt, wie hier von Domi erläutert , sodass sie nicht vollständig browserübergreifend ist.
Sie können sehen, wie es auf dieser Geige funktioniert .
Dies ist der Code:
Und das HTML, um es zu verwenden, wäre wie folgt:
Der Code zum Abrufen der Schriftfamilie ist recht einfach und funktioniert in meinem Fall. In komplexeren Szenarien müssen Sie möglicherweise etwas in diese Richtung verwenden .
In meinem Fall sage ich der Funktion auch, wie viele Zeilen verwendet werden sollen, aber Sie können berechnen, wie viele Zeilen entsprechend der Containergröße und der Schriftart angezeigt werden sollen.
quelle
Ich habe eine Version gemacht, die das HTML intakt lässt. jsfiddle Beispiel
jQuery
CSS
jsfiddle Beispiel
quelle
Ich habe eine Winkelkomponente geschrieben, die das Problem löst. Es teilt einen bestimmten Text in span-Elemente auf. Nach dem Rendern werden alle überlaufenden Elemente entfernt und die Auslassungspunkte direkt nach dem letzten sichtbaren Element platziert.
Anwendungsbeispiel:
Stackblitz-Demo: https://stackblitz.com/edit/angular-wfdqtd
Die Komponente:
quelle
Hier habe ich eine weitere Bibliothek mit schnellerem Algorithmus erstellt. Bitte prüfen:
https://github.com/i-ahmed-biz/fast-ellipsis
So installieren Sie mit einer Laube:
So installieren Sie mit npm:
Ich hoffe dir gefällt es!
quelle
Ich bin mir nicht sicher, ob dies das ist, wonach Sie suchen. Es wird die Mindesthöhe anstelle der Höhe verwendet.
quelle
Sehr einfache Funktion reicht aus.
Richtlinie:
Aussicht:
quelle
iiiiiiiiii
vsMMMMMMMMMM
(wobei die aktuelle Schriftart jedoch nicht so sichtbar ist: D).