81 votes

Ellipses pour le texte de débordement dans les listes déroulantes

Je corrige la largeur d'une de mes listes déroulantes (oui, je sais que cela pose des problèmes de compatibilité entre navigateurs).

Existe-t-il un moyen non-js de couper le texte qui déborde et d'ajouter des ellipses ? text-overflow:ellipsis ne fonctionne pas pour <select> (du moins dans 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>

Exemple ici : http://jsfiddle.net/t5eUe/

0 votes

Fonctionne dans Chrome 64.0.3282.167

0 votes

@JamesKhoury Que voulez-vous dire, rien n'est coupé ? Bien sûr, lorsque vous ouvrez la liste déroulante, le texte complet s'affiche. Mais lorsqu'il est fermé, il est coupé, par exemple, seul quelque chose comme "One - A long" est affiché.

45voto

Alex W Points 11502

Si vous trouvez cette question parce que vous avez une flèche personnalisée dans votre boîte de sélection et que le texte passe par-dessus votre flèche, j'ai trouvé une solution qui fonctionne dans certains navigateurs. Il suffit d'ajouter un peu de rembourrage à l'élément select sur le côté droit.

Avant :

enter image description here

Après :

enter image description here

CSS :

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

iOS ignore le padding mais utilise les propriétés -webkit- à la place.

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

12 votes

Existe-t-il un moyen d'ajouter une ellipse dans la liste déroulante au point de coupure ?

2 votes

Honnêtement, je me sens stupide de ne pas y avoir pensé. Merci Alex !

0 votes

Je n'arrive pas à croire que j'ai failli utiliser une bibliothèque de remplacement de jquery <select> pour y parvenir (facepalem)... dans le doute... cherchez-le.

43voto

Sidnicious Points 15187

NOTE : A partir de juillet 2020, text-overflow: ellipsis travaille pour <select> sur Chrome

Le HTML est limité dans ce qu'il spécifie pour les contrôles de formulaires. Cela laisse le champ libre aux fabricants de systèmes d'exploitation et de navigateurs pour faire ce qu'ils pensent être approprié sur cette plateforme (comme les contrôles modaux de l'iPhone). select qui, lorsqu'il est ouvert, a un aspect totalement différent du menu contextuel traditionnel).

Si cela vous dérange, vous pouvez utiliser un substitut personnalisable, comme Choisi qui se distingue de l'indigène select .

Ou encore, déposez un bogue contre un système d'exploitation ou un navigateur majeur. Pour autant que nous le sachions, la façon dont le texte est coupé en select est peut-être le résultat d'un oubli vieux de plusieurs années que tout le monde a copié, et il est peut-être temps de changer.

9voto

pbyrne Points 334

La solution la plus simple pourrait être de limiter le nombre de caractères dans le HTML lui-même. Rails dispose d'un truncate(string, length) et je suis certain que quel que soit le backend que vous utilisez, il fournit quelque chose de similaire.

Compte tenu des problèmes liés aux navigateurs croisés que vous connaissez déjà concernant la largeur des boîtes de sélection, cette option me semble la plus simple et la moins sujette aux erreurs.

<select>
  <option value="1">One</option>
  <option value="100">One hund...</option>
<select>

4 votes

Je ne sais pas pourquoi vous avez été rétrogradé si durement, mais c'est une solution raisonnable. Ce n'est peut-être pas l'idéal, mais c'est quand même une bonne solution.

0 votes

@adamj a probablement été déclassé parce qu'il a proposé une solution spécifique à Rails alors que la question portait sur une solution HTML, CSS indépendante du rendu, du templating ou du serveur.

1 votes

@mohamed.ahmed Eh bien, il a dit ce qui suit [...] and I'm certain that whichever backend you're using provides something similar. Et la plupart des langues ont un truncate donc sa solution reste raisonnable.

2voto

dougajmcdonald Points 6231

Quirksmode a une bonne description de la propriété "text-overflow", mais vous devrez peut-être appliquer d'autres propriétés comme "white-space : nowrap".

Bien que je ne sois pas sûr de la façon dont cela se comportera dans un objet sélectionné, cela peut valoir la peine d'essayer d'abord :

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

1voto

harmputman Points 27

Vous pouvez utiliser le css3 appearance propriété :

select {
  overflow: hidden; 
  white-space: nowrap; 
  text-overflow: ellipsis;
  -webkit-appearance: none;
}

Cela désactivera le style du domaine de l'ombre et le style de l'ombre. overflow: ellipsis fonctionnera. Cependant, cela désactivera tous les styles par défaut (donc plus de bouton fléché, etc.), et vous aurez toujours à faire face à d'autres navigateurs (non webkit).

Pour une démonstration : http://jsfiddle.net/t5eUe/179/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X