Seleccione todos los 'tr' excepto el primero


257

¿Cómo puedo seleccionar todos los trelementos excepto el primero tren una tabla con CSS?

Intenté usar este método, pero descubrí que no funcionaba.


1
¿Con qué navegadores debe ser compatible?
Pekka


La pregunta de @Pekka es importante, porque no se me ocurre ninguna forma de hacerlo utilizando CSS estándar que funcione con varias versiones de IE. Si necesita admitir IE, la única solución viable es una clase para la primera <tr>y una clase diferente para el resto.
Spudley

No estoy preocupado por IE, pero funcionará en FF y GC

Respuestas:


466

Al agregar una clase al primero tro al siguiente trs. No hay forma de navegador cruzado de seleccionar las filas que desea solo con CSS.

Sin embargo, si no le importa Internet Explorer 6, 7 u 8:

tr:not(:first-child) {
    color: red;
}

18
También me gustaría señalar tr:not(:first-of-type)como una posible solución, si está buscando la primera instancia de un selector específico en lugar del primer hijo generalizado.
Joshua Burns

2
Creo que en 2019 hemos terminado con IE (menos del 0.5% de los usuarios de IE6 a IE10
Webwoman

227

Me sorprende que nadie haya mencionado el uso de combinadores hermanos, que son compatibles con IE7 y versiones posteriores:

tr + tr /* CSS2, adjacent sibling */
tr ~ tr /* CSS3, general sibling */

Ambos funcionan exactamente de la misma manera (en el contexto de las tablas HTML de todos modos) como:

tr:not(:first-child)

1
Espera ... ¿cómo debería ser esta la respuesta aceptada? No puede obtener "todos menos primero" de esa declaración, que es lo que OP está pidiendo. tr + tr te dará un solo elemento. Supongo que tr ~ tr los atrapará a todos (supongo que algo así como padre: primer hijo ~ tr), pero no de manera sintáctica tan legible como no:
hairbo

55
@hairbo: tr + tr te dará cualquier tr que siga directamente a otro tr. Si tiene una tabla con tres filas, la tercera fila sigue directamente a la segunda fila, por lo que también coincidirá. Solo obtendrá un único elemento si utiliza tr: first-child + tr en su lugar. La única diferencia entre + y ~ es que ~ permite cualquier número de otros elementos entre los dos mencionados.
BoltClock

Solo quería agregar, elem + elemes una excelente solución general para cuando los elementos que desea orientar no son los únicos hijos. Por ejemplo, si a <h2>va seguido de varias <p>etiquetas, la primera <p>no es la primera hija en ese caso.
DisgruntledGoat

27

solución ideal pero no compatible con IE

tr:not(:first-child) {css}

La segunda solución sería diseñar todos los tr y luego anular con css para el primer hijo:

tr {css}
tr:first-child {override css above}

10

parece que la "primera línea" de la que estás hablando es el encabezado de la tabla, por lo que realmente deberías pensar en usar theady tbodyen tu marcado (haz clic aquí ) lo que daría como resultado un mejor marcado (semánticamente correcto, útil para cosas como lectores de pantalla ) y posibilidades más fáciles de usar para todos los navegadores para css-selection ( table thead ... { ... })


3

Aunque la pregunta ya tiene una respuesta decente, solo quiero enfatizar que la :first-childetiqueta va en el tipo de elemento que representa a los niños.

Por ejemplo, en el código:

<div id"someDiv">
     <input id="someInput1" /> 
     <input id="someInput2" />
     <input id="someInput2" />
</div

Si desea afectar solo los dos segundos elementos con un margen, pero no el primero, debería hacer lo siguiente:

#someDiv > input {
     margin-top: 20px;
}
#someDiv > input:first-child{
     margin-top: 0px;
}

es decir, dado que los inputs son los hijos, los colocaría first-childen la parte de entrada del selector.


1

Lo siento, sé que esto es antiguo, pero ¿por qué no diseñar todos los elementos tr de la manera que desea, excepto el primero y usar la clase psuedo: first-child donde revoca lo que especificó para todos los elementos tr.

Mejor descrito por este ejemplo:

http://jsfiddle.net/DWTr7/1/

tr {
    border-top: 1px solid;
}
tr:first-child {
    border-top: none;   
}

/ Patrik


1

Como tr:not(:first-child)no es compatible con IE 6, 7, 8. Puede usar la ayuda de jQuery. Puedes encontrarlo aquí



0

Puede que alguien pueda beneficiarse, a continuación es lo que usé

ol li:not(:first-child) {
    background: black;
    color: white;
}

-1

También podría usar un selector de pseudoclase en su CSS como este:

.desc:not(:first-child) {
    display: none;
}

Eso no aplicará la clase al primer elemento con la clase .desc.

Aquí hay un JSFiddle con un ejemplo: http://jsfiddle.net/YYTFT/ , y esta es una buena fuente para explicar los pseudo-selectores de clase: http://css-tricks.com/pseudo-class-selectors/


1
Esto no aplicará el estilo al primer elemento, punto. first-childignora las clases.
Fez Vrasta

-3

Puede crear una clase y usarla cuando defina todos los futuros que desea (o no quiere) que el CSS seleccione.

Esto se haría escribiendo

<tr class="unselected">

y luego en su css teniendo las líneas (y usando el comando text-align como ejemplo):

unselected {
  text-align:center;
}



selected {
  text-align:right;
}

2
por favor, comprenda la pregunta antes de responder
Ammar Bozorgvar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.