¿Qué significa el selector CSS "~" (tilde / squiggle / twiddle)?

858

Buscar el ~personaje no es fácil. Estaba mirando un poco de CSS y encontré esto

.check:checked ~ .content {
}

Qué significa eso?

Akshat
fuente
3
Verifique la demostración que comprenderá Aquí hay una lista de selectores CSS
Dipak,
@TylerH, eso es algo muy común en las publicaciones de Stack Overflow, tómalo con calma, no estaba destinado a hacerlo sentir peor.
Arsen Khachaturyan
@ArsenKhachaturyan Quizás no entiendas bien; la sintaxis de comillas de bloque es para indicar una cita , que es cuando un usuario indica que algo (texto, imagen, código, etc.) no es su propio trabajo o palabras, sino que se copia de otro lugar. Como todo formato, tiene un propósito semántico; no es algo que se agregue de ninguna manera. Del mismo modo, no agregue resaltado en negrita al azar a las palabras. Debe usarse para enfatizar, con moderación.
TylerH
@TylerH Entiendo que su nombre es "cita" y también lo que significa "cita" en sí. Sin embargo, en algún momento cuando realmente desea distinguir las preguntas del texto ordinario, puede probar algunas técnicas de énfasis como lo hice yo. Para el uso de negrita, también es obvio usarlo cuando desea enfatizar cosas, como palabras clave o términos conocidos. Por lo general, no me gusta cuando las personas usan negrita por razones desconocidas, pero a veces puede usarse para que las personas encuentren fácilmente información relacionada con el tema.
Arsen Khachaturyan
@ArsenKhachaturyan Por favor, no hagas eso. >es solo para citas , nunca debe usarse para ningún otro propósito. Tampoco debe poner nombres en negrita de tecnologías aleatorias en la pregunta. Podemos ver qué tecnologías son relevantes a través de etiquetas.
Meagar

Respuestas:

1372

De ~hecho, el selector es el combinador de hermanos general (renombrado como combinador de hermanos posteriores en los selectores de nivel 4 ):

El combinador de hermanos general está hecho del carácter "tilde" (U + 007E, ~) que separa dos secuencias de selectores simples. Los elementos representados por las dos secuencias comparten el mismo padre en el árbol del documento y el elemento representado por la primera secuencia precede (no necesariamente inmediatamente) al elemento representado por la segunda.

Considere el siguiente ejemplo:

.a ~ .b {
  background-color: powderblue;
}
<ul>
  <li class="b">1st</li>
  <li class="a">2nd</li>
  <li>3rd</li>
  <li class="b">4th</li>
  <li class="b">5th</li>
</ul>

.a ~ .b coincide con el cuarto y quinto elemento de la lista porque:

  • Son .belementos
  • Son hermanos de .a
  • Aparecer después .aen orden de origen HTML.

Del mismo modo, .check:checked ~ .contentcoincide con todos los .contentelementos que son hermanos .check:checkedy aparecen después de él.

Salman A
fuente
13
"No necesariamente de inmediato" es la parte clave de esta descripción.
PanicBus
1
¿Existe también un selector para todos los elementos con el mismo padre?
Nick N.
1
@NickN. quieres decir .parent > *?
Salman A
@SalmanA no exactamente, esperaba que hubiera un selector que pueda usar, si no conoce al padre.
Nick N.
8
@ NickN. No, no lo hay. CSS se hace con la propuesta de que el analizador CSS nunca mira hacia atrás en el DOM para hacer una coincidencia. Esa es la misma razón por la que no hay un selector principal.
Yunzen
192

Es bueno verificar también los otros combinadores de la familia y volver a cuál es este específico.

  • ul li
  • ul > li
  • ul + ul
  • ul ~ ul

Ejemplo de lista de verificación:

  • ul li- Mirar hacia adentro : selecciona todos los lielementos colocados (en cualquier lugar) dentro de ul; Selector descendiente
  • ul > li- Mirar hacia adentro : selecciona solo los li elementos directos de ul; es decir, solo seleccionará hijos directos lide ul; Selector de niños o selector de combinador de niños
  • ul + ul- Mirar hacia afuera : selecciona el ulsiguiente inmediatamente ul; No está mirando hacia adentro, sino mirando hacia afuera para el elemento inmediatamente siguiente; Selector de hermanos adyacentes
  • ul ~ ul- Mirar hacia afuera : selecciona todo lo ulque sigue ul, no importa dónde esté, pero ambos uldeben tener el mismo padre; Selector general de hermanos

El que estamos viendo aquí es el Selector general de hermanos

Lijo Joseph
fuente
2
Este tenía más sentido. La terminología de Layman al rescate otra vez. Ahora puedo leer la documentación técnica.
TheRealChx101
2
¿Existe un selector de hermanos para TODOS los hermanos, no solo los que siguen?
Elijah Mock
1
@EliTheHuman, no. Consulte esta publicación SO para obtener más detalles - stackoverflow.com/a/11813469/6830901
Lijo Joseph
174

Combinador general de hermanos

El selector general del combinador de hermanos es muy similar al selector adyacente del combinador de hermanos. La diferencia es que el elemento que se selecciona no necesita suceder inmediatamente al primer elemento, sino que puede aparecer en cualquier lugar después de él.

Más información

Rohit Azad
fuente
31

Está General sibling combinatory se explica muy bien en la respuesta de @ Salaman.

Lo que sí extrañé es Adjacent sibling combinatorcuál está +y está estrechamente relacionado ~.

ejemplo sería

.a + .b {
  background-color: #ff0000;
}

<ul>
  <li class="a">1st</li>
  <li class="b">2nd</li>
  <li>3rd</li>
  <li class="b">4th</li>
  <li class="a">5th</li>
</ul>
  • Coincide con elementos que son .b
  • Son adyacentes a .a
  • Después .aen HTML

En el ejemplo anterior marcará el 2do lipero no el 4to.

   .a + .b {
     background-color: #ff0000;
   }
<ul>
  <li class="a">1st</li>
  <li class="b">2nd</li>
  <li>3rd</li>
  <li class="b">4th</li>
  <li class="a">5th</li>
</ul>

JSFiddle

Matas Vaitkevicius
fuente