Auslassungspunkte für Überlauftext in Dropdown-Feldern

75

Ich behebe die Breite eines meiner Dropdown-Felder (ja, ich weiß, dass es dabei browserübergreifende Probleme gibt).

Gibt es eine Möglichkeit, überlaufenden Text abzuschneiden und Ellipsen anzuhängen? Textüberlauf: Auslassungspunkte funktionieren nicht für <select>Elemente (zumindest in Chrome).

select, div {
    width:100px; 
    overflow:hidden; 
    white-space:nowrap; 
    text-overflow:ellipsis;
}
<!--works for a div-->
<div>
    A long option that gets cut off
</div>

<!--but not for a select-->
<select>
    <option>One - A long option that gets cut off</option>
    <option>Two - A long option that gets cut off</option>
</select>

Beispiel hier: http://jsfiddle.net/t5eUe/

Pepsi
quelle
funktioniert in Chrome 64.0.3282.167
Pranav Singh
@ JamesKhoury Was meinst du, nichts wird abgeschnitten? Wenn Sie die Dropdown-Liste öffnen, wird natürlich der vollständige Text angezeigt. Wenn es geschlossen ist, wird es abgeschnitten, z. B. wird nur so etwas wie "One - A long" angezeigt.
Daniel Warmuth

Antworten:

38

HINWEIS: Funktioniert ab Juli 2020 text-overflow: ellipsisfür <select>Chrome

HTML ist in den Angaben für Formularsteuerelemente begrenzt. Dies lässt den Betriebssystem- und Browserherstellern Raum, das zu tun, was sie auf dieser Plattform für angemessen halten (wie das iPhone-Modal, selectdas im geöffneten Zustand völlig anders aussieht als das herkömmliche Popup-Menü).

Wenn es Sie stört, können Sie einen anpassbaren Ersatz wie Chosen verwenden , der sich vom nativen unterscheidet select.

Oder melden Sie einen Fehler bei einem wichtigen Betriebssystem oder Browser. Nach allem, was wir wissen, könnte die Art und Weise, wie Text in selects abgeschnitten wird , das Ergebnis eines jahrelangen Versehens sein, das jeder kopiert hat, und es könnte Zeit für eine Änderung sein.

s4y
quelle
39

Wenn Sie diese Frage finden, weil Sie einen benutzerdefinierten Pfeil in Ihrem Auswahlfeld haben und der Text über Ihren Pfeil geht, habe ich eine Lösung gefunden, die in einigen Browsern funktioniert. Fügen Sie einfach etwas Polsterung selectauf der rechten Seite hinzu.

Vor:

Geben Sie hier die Bildbeschreibung ein

Nach:

Geben Sie hier die Bildbeschreibung ein

CSS:

select {
    padding:0 30px 0 10px !important;
    -webkit-padding-end: 30px !important;
    -webkit-padding-start: 10px !important;
}

iOS ignoriert die paddingEigenschaften, verwendet jedoch -webkit-stattdessen die Eigenschaften.

http://jsfiddle.net/T7ST2/4/

Alex W.
quelle
10
Gibt es eine Möglichkeit, dem Dropdown am Grenzwert eine Ellipse hinzuzufügen?
Blake
2
Ich fühle mich ehrlich dumm, wenn ich nicht daran denke. Danke Alex!
Chris Lees
Ich kann nicht glauben, dass ich fast eine jquery <select> -Ersatzbibliothek verwendet habe, um dies zu erreichen (facepalem) ... im Zweifelsfall ... suchen Sie es heraus.
GreaterKing
3
@ Blake versuchenoverflow: hidden; white-space: nowrap;text-overflow: ellipsis;
GreaterKing
iOS (mindestens v9.3.5) scheint den Standard zu erfüllen padding(dh ohne -webkitVarianten).
Conan
11

Die einfachste Lösung könnte darin bestehen, die Anzahl der Zeichen im HTML-Code selbst zu begrenzen. Rails hat einen Helfer zum Abschneiden (Zeichenfolge, Länge) , und ich bin sicher, dass das von Ihnen verwendete Backend etwas Ähnliches bietet.

Aufgrund der browserübergreifenden Probleme, mit denen Sie bereits in Bezug auf die Breite der Auswahlfelder vertraut sind, scheint mir dies die einfachste und am wenigsten fehleranfällige Option zu sein.

<select>
  <option value="1">One</option>
  <option value="100">One hund...</option>
<select>
pbyrne
quelle
4
Ich bin mir nicht sicher, warum du so hart herabgestimmt wurdest, aber das ist eine vernünftige Lösung. Vielleicht nicht ideal, aber dennoch eine anständige Lösung.
Adamj
@adamj Wahrscheinlich abgelehnt, weil er eine Rails-spezifische Lösung vorgeschlagen hat, als die Frage nach einer HTML-, CSS-Lösung gestellt wurde, die unabhängig von Rendering, Templating oder Server ist.
mohamed.ahmed
1
@ mohamed.ahmed Nun, er hat folgendes gesagt. [...] and I'm certain that whichever backend you're using provides something similar.Und die meisten Sprachen haben eine truncateMethode, so dass seine Lösung immer noch vernünftig ist.
Adamj
3
Die Lösung ist immer noch ziemlich schlecht, da Sie in vielen Fällen ein ansprechendes Layout haben und die Breite der Formularfelder variieren kann. Warum sollten Sie die Option auf eine Handvoll Zeichen kürzen, wenn das Feld auf einem HD-Bildschirm 200 Pixel breit ist (nur als Beispiel)?
lxg
6

Sie können dies verwenden:

select {
    width:100px; 
    overflow:hidden; 
    white-space:nowrap; 
    text-overflow:ellipsis;
}
select option {
    width:100px;
    text-overflow:ellipsis;
    overflow:hidden;
}
div {
    border-style:solid; 
    width:100px; 
    overflow:hidden; 
    white-space:nowrap; 
    text-overflow:ellipsis;
}
Hariharasudan
quelle
9
Dies ist nur in Firefox behoben, ich habe immer noch dieses Problem in Chrome und IE-Browsern
Hariharasudan
4

Fand diesen absoluten Hack, der eigentlich ganz gut funktioniert:

https://codepen.io/nikitahl/pen/vyZbwR

Nicht nur CSS.

In .select-containerdiesem Fall ist es wichtig, einen Container in der Dropdown-Liste zu haben . Dieser Container ist so ::beforeeingerichtet, dass er contentbasierend auf seinem data-contentAttribut / Datensatz zusammen mit allen overflow:hidden; text-overflow: ellipsis;erforderlichen Größen und Größen angezeigt wird, damit die Auslassungspunkte funktionieren.

Wenn sich die Auswahl ändert, weist Javascript den Wert (oder Sie können den Text der Option aus der select.optionsListe abrufen) dem Datensatzinhalt des Containers zu, und voila!

Kopieren Sie den Inhalt des Codepens hier:

var selectContainer = document.querySelector(".select-container");
var select = selectContainer.querySelector(".select");
select.value = "lingua latina non penis canina";

selectContainer.dataset.content = select.value;

function handleChange(e) {
  selectContainer.dataset.content = e.currentTarget.value;
  console.log(select.value);
}

select.addEventListener("change", handleChange);
span {
  margin: 0 10px 0 0;
}

.select-container {
  position: relative;
  display: inline-block;
}

.select-container::before {
  content: attr(data-content);
  position: absolute;
  top: 0;
  right: 10px;
  bottom: 0;
  left: 0;
  padding: 7px;
  font: 11px Arial, sans-serif;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  text-transform: capitalize;
  pointer-events: none;
}

.select {
  width: 80px;
  padding: 5px;
  appearance: none;
  background: transparent url("https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-arrow-down-b-128.png") no-repeat calc(~"100% - 5px") 7px;
  background-size: 10px 10px;
  color: transparent;
}

.regular {
  display: inline-block;
  margin: 10px 0 0;
  .select {
    color: #000;
  }
}
<span>Hack:</span><div class="select-container" data-content="">
  <select class="select" id="words">
    <option value="lingua latina non penis canina">Lingua latina non penis canina</option>
    <option value="lorem">Lorem</option>
    <option value="ipsum">Ipsum</option>
    <option value="dolor">Dolor</option>
    <option value="sit">Sit</option>
    <option value="amet">Amet</option>
    <option value="lingua">Lingua</option>
    <option value="latina">Latina</option>
    <option value="non">Non</option>
    <option value="penis">Penis</option>
    <option value="canina">Canina</option>
  </select>
</div>
<br />

<span>Regular:</span>
<div class="regular">
  <select style="width: 80px;">
    <option value="lingua latina non penis canina">Lingua latina non penis canina</option>
    <option value="lorem">Lorem</option>
    <option value="ipsum">Ipsum</option>
    <option value="dolor">Dolor</option>
    <option value="sit">Sit</option>
    <option value="amet">Amet</option>
    <option value="lingua">Lingua</option>
    <option value="latina">Latina</option>
    <option value="non">Non</option>
    <option value="penis">Penis</option>
    <option value="canina">Canina</option>
  </select>
</div>

Will P.
quelle
2

quirksmode enthält eine gute Beschreibung der Eigenschaft "Textüberlauf". Möglicherweise müssen Sie jedoch einige zusätzliche Eigenschaften wie "Leerraum: Nowrap" anwenden.

Obwohl ich nicht zu 100% weiß, wie sich dies in einem ausgewählten Objekt verhält, könnte es sich lohnen, dies zuerst zu versuchen:

http://www.quirksmode.org/css/textoverflow.html

Dougajmcdonald
quelle
2

CSS-Datei

.selectDD {
 overflow: hidden;
 white-space: nowrap;
 text-overflow: ellipsis;     
}

JS-Datei

$(document).ready(function () {
    $("#selectDropdownID").next().children().eq(0).addClass("selectDD");
});
chri3g91
quelle
1

Sie können diese jQuery-Funktion anstelle des Plus-Bootstrap-Tooltips verwenden

function DDLSToolTipping(ddlsArray) {
    $(ddlsArray).each(function (index, ddl) {
        DDLToolTipping(ddl)
    });
}

function DDLToolTipping(ddlID, maxLength, allowDots) {
    if (maxLength == null) { maxLength = 12 }
    if (allowDots == null) { allowDots = true }

    var selectedOption = $(ddlID).find('option:selected').text();

    if (selectedOption.length > maxLength) {
        $(ddlID).attr('data-toggle', "tooltip")
                .attr('title', selectedOption);

        if (allowDots) {
            $(ddlID).prev('sup').remove();
            $(ddlID).before(
            "<sup style='font-size: 9.5pt;position: relative;top: -1px;left: -17px;z-index: 1000;background-color: #f7f7f7;border-radius: 229px;font-weight: bold;color: #666;'>...</sup>"
               )
        }
    }

    else if ($(ddlID).attr('title') != null) {
        $(ddlID).removeAttr('data-toggle')
                .removeAttr('title');
    }
}
Mohammad Abdalhaleem
quelle
1

Ich habe diesen Ansatz kürzlich in einem Projekt verwendet und war ziemlich zufrieden mit dem Ergebnis:

.select-wrapper {
    position: relative;
    &::after {
        position: absolute;
        top: 0;
        right: 0;
        width: 100px;
        height: 100%;
        content: "";
        background: linear-gradient(to right, transparent, white);
        pointer-events: none;
    }
}

Wickeln Sie die Auswahl grundsätzlich in ein div ein und fügen Sie ein Pseudoelement ein, um das Ende des Textes zu überlagern und das Erscheinungsbild zu erzeugen, das der Text ausblendet.

Geben Sie hier die Bildbeschreibung ein

David Jones
quelle
Interessant, sieht aber ohne zusätzliches Styling nicht so gut aus: jsfiddle.net/zb84v6m2
Paul
Ich liebe diese Idee!
Chantal
@Paul Ja, die Annahme ist, dass Sie das Stock-Browser-Styling bereits mit einem typischen Wrapper-Ansatz überschreiben würden, der immer der Ansatz ist, den ich verfolge.
David Jones