Olvidé dónde lo vi por primera vez, pero en realidad puedes incrustar tus etiquetas en un contenedor en otro lugar siempre que tengas el for=
atributo establecido. Entonces, veamos una muestra en SO:
* {
padding: 0;
margin: 0;
background-color: #262626;
color: white;
}
.radio-button {
display: none;
}
#filter {
display: flex;
justify-content: center;
}
.filter-label {
display: inline-block;
border: 4px solid green;
padding: 10px 20px;
font-size: 1.4em;
text-align: center;
cursor: pointer;
}
main {
clear: left;
}
.content {
padding: 3% 10%;
display: none;
}
h1 {
font-size: 2em;
}
.date {
padding: 5px 30px;
font-style: italic;
}
.filter-label:hover {
background-color: #505050;
}
#featured-radio:checked~#filter .featured,
#personal-radio:checked~#filter .personal,
#tech-radio:checked~#filter .tech {
background-color: green;
}
#featured-radio:checked~main .featured {
display: block;
}
#personal-radio:checked~main .personal {
display: block;
}
#tech-radio:checked~main .tech {
display: block;
}
<input type="radio" id="featured-radio" class="radio-button" name="content-filter" checked="checked">
<input type="radio" id="personal-radio" class="radio-button" name="content-filter" value="Personal">
<input type="radio" id="tech-radio" class="radio-button" name="content-filter" value="Tech">
<header id="filter">
<label for="featured-radio" class="filter-label featured" id="feature-label">Featured</label>
<label for="personal-radio" class="filter-label personal" id="personal-label">Personal</label>
<label for="tech-radio" class="filter-label tech" id="tech-label">Tech</label>
</header>
<main>
<article class="content featured tech">
<header>
<h1>Cool Stuff</h1>
<h3 class="date">Today</h3>
</header>
<p>
I'm showing cool stuff in this article!
</p>
</article>
<article class="content personal">
<header>
<h1>Not As Cool</h1>
<h3 class="date">Tuesday</h3>
</header>
<p>
This stuff isn't nearly as cool for some reason :(;
</p>
</article>
<article class="content tech">
<header>
<h1>Cool Tech Article</h1>
<h3 class="date">Last Monday</h3>
</header>
<p>
This article has awesome stuff all over it!
</p>
</article>
<article class="content featured personal">
<header>
<h1>Cool Personal Article</h1>
<h3 class="date">Two Fridays Ago</h3>
</header>
<p>
This article talks about how I got a job at a cool startup because I rock!
</p>
</article>
</main>
Uf. Eso fue mucho para una "muestra", pero creo que realmente lleva a casa el efecto y el punto: ciertamente podemos seleccionar una etiqueta para un control de entrada verificado sin que sea un hermano. El secreto radica en mantener las input
etiquetas de un niño solo para lo que necesitan ser (en este caso, solo el body
elemento) .
Como el label
elemento en realidad no utiliza el :checked
pseudo selector, no importa que las etiquetas estén almacenadas en el header
. Tiene el beneficio adicional de que, dado que header
es un elemento hermano, podemos usar el ~
selector de hermanos genérico para pasar del input[type=radio]:checked
elemento DOM al header
contenedor y luego usar los selectores descendientes / hijos para acceder a los label
mismos, lo que permite la posibilidad de diseñarlos cuando Se seleccionan las respectivas casillas de radio / casillas de verificación .
No solo podemos diseñar las etiquetas, sino también diseñar otro contenido que pueda ser descendiente de un contenedor hermano en relación con todos los input
s. Y ahora, por el momento que todos han estado esperando, ¡el JSFIDDLE ! Ve allí, juega con él, haz que funcione para ti, descubre por qué funciona, rómpelo, ¡haz lo que haces!
Esperemos que todo tenga sentido y responda completamente la pregunta y posiblemente cualquier seguimiento que pueda surgir.
<label for="rad1">Radio 1</label><input id="rad1" type="radio" name="rad">