Je veux créer des options select2 à plusieurs niveaux avec indentation mais je ne veux pas utiliser les éléments optgroup
pour cela parce que je veux permettre de sélectionner également les catégories principales. Existe-t-il un moyen de styliser si pour select2?
Ma sélection HTML brute ressemble à ceci:
<select class="js-select-multiple">
<option class="l1">Option 1</option>
<option class="l2">Suboption 1</option>
<option class="l2">Suboption 2</option>
<option class="l2">Suboption 3</option>
<option class="l1">Option 2</option>
...
</select>
<script>$(".js-select-multiple").select2({maximumSelectionLength: 5});</script>
Donc, sans utiliser Select2, je peux ajouter text-indent
propriété à .l2
classe. Cependant, il semble que Select2
n'utilise pas les classes utilisées pour l'option, donc le style de ces classes ne fonctionnera pas.
Y a-t-il une solution pour cela?
Vous avez raison de reconnaître que Select2 ne transporte pas les classes CSS des balises <option>
Vers la liste de résultats. Cela a principalement à voir avec le fait de ne pas lier explicitement la liste des résultats aux balises <option>
Existantes, et d'avoir également un ensemble de valeurs par défaut sensibles. Il est plus facile d'ajouter la possibilité de transférer des classes par la suite que de les supprimer.
Vous pouvez le faire en remplaçant templateResult
et en obtenant l'option d'origine de data.element
(Où data
est le premier paramètre).
$('.select2').select2({
templateResult: function (data) {
// We only really care if there is an element to pull classes from
if (!data.element) {
return data.text;
}
var $element = $(data.element);
var $wrapper = $('<span></span>');
$wrapper.addClass($element[0].className);
$wrapper.text(data.text);
return $wrapper;
}
});
.l2 {
padding-left: 1em;
}
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js"></script>
<select class="select2" style="width: 200px">
<option class="l1">Option 1</option>
<option class="l2">Suboption 1</option>
<option class="l2">Suboption 2</option>
<option class="l2">Suboption 3</option>
<option class="l1">Option 2</option>
</select>
Notez que j'utilise également padding-left
Au lieu de text-indent
, Qui est généralement utilisé par Select2 pour les options imbriquées.