Zeichenfolge basierend auf der Pixelbreite abschneiden

Lesezeit: 4 Minuten

Benutzeravatar von Michel Ayres
Michel Ayres

Ich versuche, eine Zeichenfolge in einen bestimmten Bereich passen zu lassen (td) ohne Zeilenumbruch. Das Problem ist: Es muss …

  • Beim Ändern der Größe anpassen
  • Sich einfügen N Arten der Auflösung
  • Hinzufügen ... am Ende, wenn es nötig ist (und nicht, wenn es nicht nötig ist)
  • Akzeptiere die Änderung von font-size, font-weightUnd font-family

Basierend auf den Antworten auf Novons Frage habe ich den folgenden Code erstellt:

CSS (// Ich füge nur ein paar Stile hinzu, um die Grenze zu durchbrechen)

.truncated { display:inline-block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

jQuery (// Alle td finden, die a enthalten .truncated Element. Ermitteln der tatsächlichen Breite (durch Entfernen des Inhalts und erneutes Hinzufügen) des td. Anwenden von minWidth bei Bedarf auf die td)

jQuery('.truncated').closest('td').each(function() {
    var text = jQuery(this).text();
    var widthOriginal = jQuery(this).width();
    var widthEmpty = jQuery(this).text('').width();
    jQuery(this).text(text);
    if(widthOriginal >= widthEmpty){
        var width = (parseInt(widthEmpty) - 10) + 'px';
        jQuery(this).css('maxWidth', width);
        jQuery(this).text(text + '...');
    }
});

Das Ergebnis (wie vom obigen Code erwartet) ist:

Ergebnis

aber es sollte sein:

wie es sein sollte


Ich dachte, vielleicht versuche ich, den ersten zu finden line des Strings entfernen und den Rest entfernen, habe aber keine Möglichkeit gefunden, das zu tun (und für meinen Geschmack ist das eine Menge „Workaround“). Gibt es einen besseren Weg, das zu tun?

  • Diese Frage kann hilfreich sein

    – Sterling Archer

    24. September 2014 um 14:49 Uhr

  • Haben Sie versucht, den verfügbaren Platz zu ermitteln und ihn dann durch einen Faktor zu dividieren, der auf der Pixelbreite des durchschnittlichen Zeichens basiert?

    – Marcus Rommel

    24. September 2014 um 14:50 Uhr

  • @MarcusRommel mit dem var widthOriginal = jQuery(this).width(); Ich bekomme den verfügbaren Platz. Wie könnte ich diese Abteilung erstellen?

    – Michel Ayres

    24. September 2014 um 14:59

  • @SterlingArcher Das Problem besteht darin, dass die Antworten auf die von Ihnen verlinkte Frage auf der Anzahl der Zeichen basieren (if (string.length > 5)). Was ich brauche, ist, es basierend auf der Größe (Pixel) zu tun.

    – Michel Ayres

    24. September 2014 um 15:02 Uhr


  • Für die Division probieren Sie einfach einige Teiler manuell aus (4,5,6…) und verwenden Sie, was passt. Sie wissen dann, wie viele Zeichen eine Zeile füllen, und können Ihre Zeichenfolgen so kürzen, dass sie so lang werden.

    – Marcus Rommel

    24. September 2014 um 16:19 Uhr

Das Abschneiden einzeiliger Texte kann einfach mit CSS erreicht werden text-overflow Eigenschaft, die von allen gängigen Browsern unterstützt wird, einschließlich IE seit Version 6.

Die Sache ist, dass text-overflow allein bringt nicht viel. Es definiert nur, was passieren wird wenn es welche gibt Text läuft über den Container. Um also Ergebnisse zu sehen, müssen wir den Text zunächst überlaufen lassen, indem wir ihn auf eine einzelne Zeile zwingen. Es ist auch wichtig, die einzustellen overflow Eigenschaft des Containers:

.truncated {
    display: block;
    white-space: nowrap; /* forces text to single line */
    overflow: hidden;
    text-overflow: ellipsis;
}

jsFiddle-Beispiel: https://jsfiddle.net/x95a4913/

Dokumentation zum Textüberlauf: https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow

Caio Kawasakis Benutzeravatar
Caio Kawasaki

Sie können dies mit reinem CSS tun, siehe diesen Link als Referenz:

Leitungsklemmung

Fügen Sie diese zu Ihrem CSS hinzu:

.truncated {
  display: -webkit-box;
  -webkit-line-clamp: 1; // amount of line you want
  -webkit-box-orient: vertical;  
}

Oder Sie können es mit clamp.js versuchen

https://github.com/josephschmitt/Clamp.js

  • Könnten Sie Ihrer Antwort eine Quelle hinzufügen? Im Falle einer Unterbrechung/Änderung des Links oder dem Verlust der auf dem Link enthaltenen Informationen.

    – Michel Ayres

    24. September 2014 um 15:00 Uhr

text-overflow: ellipsis

scheint eine reine CSS-Lösung zu sein
http://www.w3schools.com/cssref/css3_pr_text-overflow.asp

  • Wirklich netter Ansatz 🙂 Wusste/bemerkte diese Eigenschaft nicht overflow CSS-Stil. Danke =D

    – Michel Ayres

    23. Februar 2015 um 11:13 Uhr

  • Nur um darauf hinzuweisen, dass es so sein sollte, damit es richtig funktioniert white-space: nowrap; overflow: hidden; text-overflow: ellipsis;

    – Michel Ayres

    13. März 2015 um 13:40 Uhr


  • Ich hatte keine Ahnung, dass es das gibt!

    – Stevo

    7. März 2016 um 8:43

  • WICHTIG: Du muss enthalten white-space: nowrap Und overflow: hidden damit das funktioniert.

    – Lukas

    7. März 2016 um 22:26


Wenn Sie das Tabellenlayout auf „Fest“ setzen und das td Überlauf als hiddenkönnten Sie Auslassungspunkte als Float-Right voranstellen div wenn das tdDie Scrollbreite von ist größer als die Clientbreite.

Hier ist das CSS, das Stile enthält, um ein Durchscheinen in der Tabelle zu verhindern:

table {
  table-layout:fixed;
  white-space:nowrap;
  width:500px;
  border-spacing: 0px;
  border-collapse: separate;    
}

td {
  overflow:hidden;
  border:1px solid #ddd;
  padding:0px;
}

.hellip {
  padding-left:0.2em;
  float:right;
  background:white;
  position:relative;
}

jQuery:

$('td').each(function() {
  if($(this)[0].scrollWidth > $(this).width()) {
    $(this).prepend('<div class="hellip"">&hellip;</div>');
  }
});

Demo unter: http://jsfiddle.net/5h798ojf/3/

Benutzeravatar von skobaljic
skobaljic

Um dies zu erreichen, brechen Sie den Text zweimal um:

<style type="text/css">

.relative_wrap {
    height: 1em;
    position: relative;
}

.absolute_wrap {
    position: absolute;
    left: 0px;
    right: 0px;
    bottom: 0px;
    overflow: hidden;
    text-overflow: ellipsis;
    top: 0px;
    white-space: nowrap;
}

</style>


<table>
    <tbody>
        <tr>
            <td>
                <div class="relative_wrap">
                    <div class="absolute_wrap">
                            LONG TEXT HERE
                    </div>
                </div>
            </td>
        </tr>
    </tbody>
</table>

Da Sie jQuery verwenden, ist es einfach:

$('.truncated').wrap('<div class="relative_wrap"><div class="absolute_wrap"></div></div>');

1451840cookie-checkZeichenfolge basierend auf der Pixelbreite abschneiden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy