Saltar al contenido

¿Cómo cambiar el CSS de color de las etiquetas select2?

El paso a paso o código que encontrarás en este post es la resolución más rápida y válida que encontramos a esta inquietud o problema.

Solución:

Para formatear las etiquetas, puede utilizar la función formatSelectionCssClass.

$("#mySelect").select2(
    formatSelectionCssClass: function (data, container)  return "myCssClass"; ,
);

O puede agregar una clase css basada en la identificación de la opción:

$("#mySelect").select2(
    formatSelectionCssClass: function (data, container)  return data.id; ,
);

Recuerde que deberá anular tanto filter como background_color en su clase css

Primero, una advertencia de que esto significa que está anulando el CSS que es interno a select2, por lo que si el código de select2 cambia en una fecha posterior, también tendrás que cambiar tu código. No hay formatChoiceCSS método en este momento (aunque sería útil).

Para cambiar el color predeterminado, deberá anular las diversas propiedades CSS de la etiqueta que tiene esta clase CSS:

.select2-search-choice 
    background-color: #56a600;
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
    background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
    -moz-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
    box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
    color: #333;
    border: 1px solid #aaaaaa;

Para cambiar la clase de cada etiqueta según el texto o la opción # de esa etiqueta, deberá agregar un evento de cambio:

$("#select2_element").on("change", function(e)  
      if (e.added) 
          // You can add other filters here like
          // if e.val == option_x_of_interest or
          // if e.added.text == some_text_of_interest
          // Then add a custom CSS class my-custom-css to the 
  • added $('.select2-search-choice:not(.my-custom-css)', this).addClass('my-custom-css'); );
  • Y puede definir un color de fondo personalizado, etc.en esta clase:

    li.my-custom-css 
           background-color: // etc etc
    
    

    En mi caso, necesitaba mostrar la diferencia entre las etiquetas que estaban “seleccionadas” y las que se estaban agregando.

    La ayuda aquí fue para las versiones anteriores de select2, y no fue de mucha utilidad. Usando la versión 4.0 actual (con su documentación terriblemente escasa) pude lograr esto usando las funciones de la plantilla y un poco de ‘inteligencia’.

    El primer paso es hacer una plantilla de los resultados (debe tenerse en cuenta que en cada acción de selección o eliminación, esto se activa para cada selección en el cuadro). Esto normalmente devuelve SOLO el texto que irá en el LI resultante … sin embargo, queremos envolver ese texto en un intervalo (y decirle a S2 que no elimine el HTML devolviendo un objeto) con una clase CSS personalizada para nuestro tipo. En mi ejemplo utilizo el selected propiedad para determinar esto:

    $('.select2_sortable').select2(
        tags: true,
        templateSelection: function(selection) 
            if(selection.selected) 
                return $.parseHTML('' + selection.text + '');
            
            else 
                return $.parseHTML('' + selection.text + '');
            
        
    );
    

    El HTML resultante después de seleccionar un elemento debería ser algo como esto:

    • × John Doe
    • × fdfsdfds

    Pero esto no es suficiente, ya que necesitamos acceder al LI padre, no al hijo span. Y dado que CSS no permite selectores de padres, tenemos que ejecutar jQuery para que esto suceda. Debido a que estos se vuelven a dibujar, querremos ejecutar esta función tanto en el select y remove eventos del elemento Select2:

    $('.select2_sortable').on("select2:select", function (ev) 
        updateSelectedParents();
    );
    $('.select2_sortable').on("select2:removed", function (ev) 
        updateSelectedParents();
    );
    
    function updateSelectedParents() 
        $('.im_selected').closest('li').addClass('im_connected_item');
        $('.im_writein').closest('li').addClass('im_writein_item');
    
    

    Finalmente resultando en:

    • × John Doe
    • × fdfsdfds

    Y le permite diseñar sus elementos en función de la im_writein_item y im_connected_item Clases CSS.

    Agradecemos que quieras favorecer nuestro estudio exponiendo un comentario o valorándolo te damos la bienvenida.

    ¡Haz clic para puntuar esta entrada!
    (Votos: 0 Promedio: 0)



    Utiliza Nuestro Buscador

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *