Tengo un menú de navegación jerárquico en mi barra lateral que usa listas anidadas (etiquetas <ul> y <li>). Estoy usando un tema prefabricado que ya tiene estilos para los elementos de la lista, pero quiero modificar el estilo de los elementos de nivel superior pero NO aplicarlo a los subelementos. ¿Existe una manera fácil de aplicar estilos a la etiqueta del elemento de la lista de nivel superior SIN tener esos estilos en cascada hacia los elementos de la lista secundaria? Entiendo que puedo agregar explícitamente estilos primordiales a los subelementos, pero realmente me gustaría evitar tener que duplicar todo ese código de estilo si hay una manera fácil de decir "aplicar estos estilos a esta clase y NO en cascada hasta los elementos secundarios ". Aquí está el html que estoy usando:
<ul id="sidebar">
<li class="top-level-nav">
<span>HEADING 1</span>
<ul>
<li>sub-heading A</li>
<li>sub-heading B</li>
</ul>
</li>
<li class="top-level-nav">
<span>HEADING 2</span>
<ul>
<li>sub-heading A</li>
<li>sub-heading B</li>
</ul>
</li>
</ul>
Entonces, el CSS tiene estilos para #sidebar ul
y #sidebar ul li
ya, pero me gustaría agregar estilos adicionales a #sidebar .top-level-nav
eso NO en cascada hacia sus sub-hijos. ¿Hay alguna forma de hacer esto simplemente o necesito reorganizar todos los estilos para que los estilos que estaban #sidebar ul
activados ahora sean específicos para ciertas clases?
Respuestas:
Hasta el momento, no hay selectores principales (o como los llama Shaun Inman , selectores calificados ), por lo que tendrá que aplicar estilos a los elementos de la lista secundaria para anular los estilos de los elementos de la lista principal.
La cascada es una especie de todo el objetivo de las hojas de estilo en cascada, de ahí el nombre.
fuente
O usa el selector de niños
Entonces usando
#parent > child
Hará que solo se apliquen los estilos a los niños de primer nivel. Desafortunadamente, IE6 no es compatible con el selector de niños.
De lo contrario, puede usar
#parent child child
Para establecer otros estilos específicos para los niños que están más de un nivel por debajo.
fuente
Hay una propiedad llamada
all
en el módulo de herencia CSS3 . Funciona así:#sidebar ul li { all: initial; }
A partir de 2016-12, todos los navegadores excepto IE / Edge y Opera Mini admiten esta propiedad.
fuente
default
y lo nuevounset
, pero ahora mismo ' No tengo tiempo para investigar más. Siéntase libre de editar la respuesta para actualizarla.Puede usar el selector * para cambiar los estilos secundarios a los predeterminados
ejemplo
#parent { white-space: pre-wrap; } #parent * { white-space: initial; }
fuente
<div id="parent" style="white-space:pre-wrap;*white-space:initial;"/>
Envolver con iframe hace que el CSS padre sea obsoleto.
fuente
iframe
hizo que mi componente secundario fuera invisible. PensamientosLa respuesta corta es: No, no es posible evitar la herencia de CSS. Solo puede anular los estilos establecidos en los padres. Ver la especificación:
Además de anular todas las propiedades heredadas. También puede utilizar
initial
palabras clave, por ejemplocolor: initial;
. También se puede utilizar junto conall
, por ejemploall: initial;
, que restablecerá todas las propiedades a la vez. Ejemplo:.container { color: blue; font-style: italic; } .initial { all: initial; }
<div class="container"> The quick brown <span class="initial">fox</span> jumps over the lazy dog </div>
Tablas de soporte del navegador según ¿Puedo usar ...
all
(Actualmente no hay soporte en IE y Edge, otros son buenos)initial
(Actualmente no hay soporte en IE, otros son buenos)Puede resultarle útil si utiliza el selector de hijos directos
>
en algunos casos. Ejemplo:.list > li { border: 1px solid red; color: blue; }
<ul class="list"> <li> <span>HEADING 1</span> <ul> <li>sub-heading A</li> <li>sub-heading B</li> </ul> </li> <li> <span>HEADING 2</span> <ul> <li>sub-heading A</li> <li>sub-heading B</li> </ul> </li> </ul>
El estilo de borde se ha aplicado solo a los hijos directos
<li>
, ya queborder
es una propiedad no heredada. Pero el color del texto se ha aplicado a todos los elementos secundarios, ya quecolor
es una propiedad heredada.Por lo tanto, el
>
selector solo sería útil con propiedades no heredadas, cuando se trata de prevenir la herencia.fuente
Puede usar algo como jQuery para "deshabilitar" este comportamiento, aunque no creo que sea una buena solución ya que obtiene la lógica de visualización en css y javascript. Aún así, dependiendo de sus requisitos, es posible que las utilidades css de jQuery le hagan la vida más fácil que probar hacky css, especialmente si está tratando de que funcione para IE6.
fuente
Por ejemplo, si tiene dos div en un documento XHTML.
<div id='div1'> <p>hello, how are you?</p> <div id='div2'> <p>I am fine, thank you.</p> </div> </div>
Entonces intente esto en CSS.
#div1 > #div2 > p{ color: red; }
afecta solo el párrafo 'div2'.
#div1 > p { color: red; }
afecta solo al párrafo 'div1'.
fuente
No necesita la referencia de clase para el
li
s. En lugar de tener CSS comoli.top-level-nav { color:black; }
puedes escribir
ul#sidebar > li { color:black; }
Esto aplicará el estilo solo a los
li
mensajes que descienden inmediatamente de la barra lateralul
.fuente
simplemente configúrelos de nuevo a sus valores predeterminados en el selector "#sidebar ul li"
fuente