¿Cómo puedo hacer que funcione esta anulación de decoración de texto CSS?


Algunos días juro que me estoy volviendo loco. Este es uno de esos días. Pensé que mi CSS era bastante sencillo aquí, pero simplemente no parece estar funcionando. ¿Qué me estoy perdiendo?

Mi CSS se ve así:

ul > li {
    text-decoration: none;
}
ul > li.u {
    text-decoration: underline;
}
ul > li > ul > li {
    text-decoration: none;
}
ul > li > ul > li.u {
    text-decoration: underline;
}

Y mi HTML se ve así:

<ul>
  <li>Should not be underlined</li>
  <li class="u">Should be underlined
    <ul>
      <li>Should not be underlined</li>
      <li class="u">Should be underlined</li>
    </ul>
  </li>
</ul>

Sin embargo, aparece así:

Imagen

Author: BoltClock, 2009-12-01

5 answers

text-decoration no se comporta igual que otros estilos relacionados con fuentes/texto como font-weight. Aplicar text-decoration también afectará a todos los elementos anidados.

Mira esto: http://www.w3.org/TR/CSS21/text.html#propdef-text-decoration

Extracto:

Las decoraciones de texto en cajas en línea son dibujado a través de todo el elemento, va a través de cualquier elemento descendiente sin prestando atención a sus presencia. El "texto-decoración" propiedad sobre descendiente los elementos no pueden tener cualquier efecto en la decoración de el elemento
. . . .
Algunos agentes de usuario han implementado la decoración de texto por propagando la decoración a la elementos descendientes en oposición a simplemente dibujando la decoración a través de los elementos descritos anteriormente. Este fue posiblemente permitido por el perdedor texto en CSS2.

Tengo la información de: http://csscreator.com/node/14951

 40
Author: o.k.w,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 00:55:09

Te deshaces de text-decoration aplicado a un elemento padre en esos casos:

  • Fuera de flujo elementos, tales como flotados y absolutamente posicionados

    li {
      float: left; /* Avoid text-decoration propagation from ul */
      clear: both; /* One li per line */
    }
    ul { overflow: hidden; } /* Clearfix */
    

    ul {
      overflow: hidden; /* Clearfix */
    }
    li {
      float: left; /* Avoid text-decoration propagation from ul */
      clear: both; /* One li per line */
    }
    li.u {
      text-decoration: underline;
    }
    <ul>
      <li>Should not be underlined</li>
      <li class="u">Should be underlined
        <ul>
          <li>Should not be underlined</li>
          <li class="u">Should be underlined</li>
        </ul>
      </li>
    </ul>
  • Elementos atómicos de nivel inline, como bloques inline y tablas inline

    Pero si usas li{display:inline-block}, entonces no tienes balas (pierdes display:list-item) y los elementos aparecen uno al lado de los otros.

    Entonces, para tener un elemento por línea, puede utilizar

    li {
      display: inline-block; /* Avoid text-decoration propagation from ul */
      width: 100%;           /* One li per line */
    }
    

    Y para añadir las viñetas, puede utilizar ::before pseudo-elementos. Sin embargo, las viñetas no deben estar subrayadas, por lo que tendrás que sacarlas de flujo o hacerlas de nivel atómico en línea también.

    li {
      display: inline-block; /* Avoid text-decoration propagation from ul */
      width: 100%;           /* One li per line */
    }
    li:before {
      content: '• ';         /* Insert bullet */
      display: inline-block; /* Avoid text-decoration propagation from li */
      white-space: pre-wrap; /* Don't collapse the whitespace */
    }
    li.u {
      text-decoration: underline;
    }
    <ul>
      <li>Should not be underlined</li>
      <li class="u">Should be underlined
        <ul>
          <li>Should not be underlined</li>
          <li class="u">Should be underlined</li>
        </ul>
      </li>
    </ul>

    li {
      display: inline-block; /* Avoid text-decoration propagation from ul */
      width: 100%;           /* One li per line */
    }
    li:before {
      content: '•';          /* Insert bullet */
      position: absolute;    /* Avoid text-decoration propagation from li */
      margin-left: -.75em;
    }
    li.u {
      text-decoration: underline;
    }
    <ul>
      <li>Should not be underlined</li>
      <li class="u">Should be underlined
        <ul>
          <li>Should not be underlined</li>
          <li class="u">Should be underlined</li>
        </ul>
      </li>
    </ul>

Este comportamiento se especifica en CSS 2.1 y Nivel de Módulo de Decoración de texto CSS 3:

Tenga en cuenta que las decoraciones de texto no se propagan a cualquier fuera de flujo descendientes, ni al contenido de descendientes atómicos de nivel en línea tales como bloques en línea y tablas en línea.

 25
Author: Oriol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-29 13:53:58

La razón por la que estás viendo lo que estás viendo es que tu regla

ul > li.u

Tiene preferencia sobre:

ul > li > ul > li

Como se especifica una clase y que tiene más peso que los selectores de elemento juntos.

Edit: Lo que podrías intentar es:

.u ul {
        text-decoration: none;
}
.u {
        text-decoration: underline;
}

Y juega con eso (tal vez tengas que usar li.u en lugar de solo .u ).

Sin embargo , dependiendo del contenido, es posible que desee envolver las partes subrayadas en q, em o strong etiquetas y estilo estas etiquetas en lugar de usar una clase. De esa manera estaría describiendo su contenido, así como estilizarlo.

 2
Author: jeroen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 15:25:01

La respuesta de okw anterior explica perfectamente por qué no puedes hacer lo que estás pidiendo sin algunos otros cambios. ¡No, no te vas a volver loco!

Posibles soluciones:

  • intenta border-bottom?
  • ¿envolver el texto que desea subrayar en una etiqueta span class="u"? (para evitar que la decoración de texto adorne elementos anidados)
  • si no puede cambiar el marcado, puede agregar algo de scripting para lograr lo mismo que mi sugerencia anterior.

Lo mejor de suerte!

 1
Author: Funka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:32:29
.u {text-decoration: underline;}
 -2
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 00:41:56