Todos CSS hover ativado acordeão com estado padrão

O kicker é o estado padrão. Você deseja que uma seção específica do acordeão seja aberta se o próprio acordeão não estiver sendo interagido.

O truque são os estados de flutuação aninhados.

A marcação

<div class="accordion">
<section>
<h1>Section 1</h1>
<div class="accordion_content">
<p>Content for section 1</p>
</div>
</section>
<section>
<h1>Section 2</h1>
<div class="accordion_content">
<p>Content for section 2</p>
</div>
</section>
<section class="default">
<h1>Section 3</h1>
<div class="accordion_content">
<p>Content for section 3</p>
<p>This is my default state.</p>
</div>
</section>
<section>
<h1>Section 4</h1>
<div class="accordion_content">
<p>Content for section 4</p>
</div>
</section>
</div>

O CSS

Código para o estado estático (por exemplo, quando nada está sendo pairado) e sem padrão.

.accordion section > .accordion_content {
height
: 0;
overflow
: hidden;
transition
: height .25s;
}

Em seguida, adicione o estilo de estado de foco.

.accordion section:hover > .accordion_content {
height
: 6em;
}

Agora temos um acordeão funcionando. Isso não é tão impressionante assim. Queremos um com um painel especificado aberto como padrão. Um que sempre estará aberto se o usuário não estiver passando o mouse sobre um painel diferente.

Observe que o estilo do estado de foco é o mesmo do estado padrão. Portanto, vamos adicionar esse seletor à regra.

.accordion section:hover > .accordion_content,
.accordion section.default > .accordion_content {
height
: 6em;
}

Ok, agora temos um estado padrão, mas esse nunca fecha quando estamos interagindo com os outros painéis. Precisamos de uma regra que reduza o estado padrão se passarmos o mouse sobre um painel diferente. Poderíamos tentar usar o seletor irmão geral (~), mas teremos problemas se quisermos um estado aberto padrão para qualquer painel diferente do último.

Poderíamos tentar um grande conjunto complicado de seletores e regras, mas não tenho certeza se funcionaria realmente e, de qualquer forma, vamos manter o código conciso.

A mágica

O truque é usar a natureza em cascata do CSS, bem como estados aninhados: hover.

Primeiro, queremos fechar TODOS os painéis ao passar o mouse sobre o contêiner do acordeão.

.accordion:hover > .accordion_content {
height
: 0;
}

Em seguida, queremos abrir o painel específico sobre o qual estamos pairando, lembrando que já estamos pairando sobre o contêiner do acordeão.

.accordion:hover > .accordion_content:hover {
height
: 6em;
}

Bem, isso funciona, mas temos mais linhas de código aqui do que precisamos. Vamos limpar.

Podemos combinar o seletor de foco do contêiner acordeão com nosso estilo anterior para os painéis que não são nosso padrão

.accordion section > .accordion_content,
.accordion:hover > .accordion_content {
height
: 0;
overflow
: hidden;
transition
: height .25s;
}

Também podemos substituir a regra de funcionalidade de foco anterior pelo seletor de foco aninhado. Eles são funcionalmente equivalentes.

.accordion:hover section:hover > .accordion_content,
.accordion section.default > .accordion_content {
height
: 6em;
}

Bam! Aqui está. Um acordeão conciso, totalmente CSS, ativado por foco com um estado padrão.

.accordion:hover section:hover > .accordion_content,
.accordion section.default > .accordion_content {
height
: 6em;
}

.accordion section > .accordion_content,
.accordion:hover section > .accordion_content {
height
: 0;
overflow
: hidden;
transition
: height .25s;
}

Tudo depois disso é estética.

Checkout da demonstração Codepen