Construindo uma Navegação Off-Canvas Com Grade do CSS
() translation by (you can also view the original English article)
O padrão off-canvas é uma abordagem clássica para navegação responsiva. Quando a área de visualização é pequena suficiente para usá-la, toda a navegação é escondida "fora" e apenas mostrada quando pedido.
Hoje, construiremos uma navegação off-canvas, usando CSS para a alternação (sem JavaScript) e nossa amiga Grade para criar a estrutura da página. Eis a demo completa da página que criaremos.
Estrutura Básica da Página
Comecemos criando a página básica, onde buscamos algo assim:
É uma estrutura semântica de página bem típica. Veremos que tudo se empilha em uma únic coluna em áreas de visualização pequenas e, então, ajusta-se em áreas maiores. O elemento <nav>
está em azul por clareza.
Eis a marcação:
1 |
<header role="banner"> |
2 |
<h1>Header</h1> |
3 |
</header>
|
4 |
|
5 |
<nav id="nav" role="navigation"> |
6 |
<ul>
|
7 |
<li>
|
8 |
<a href="#">Item 1</a> |
9 |
</li>
|
10 |
<li>
|
11 |
<a href="#">Item 2</a> |
12 |
</li>
|
13 |
<li>
|
14 |
<a href="#">Item 3</a> |
15 |
</li>
|
16 |
</ul>
|
17 |
</nav>
|
18 |
|
19 |
<section role="main"> |
20 |
<article>
|
21 |
<h2>Article</h2> |
22 |
<p>Curabitur orci lacus, auctor ut facilisis nec, ultricies quis nibh. Phasellus id diam sollicitudin, malesuada turpis id, gravida erat. Maecenas placerat elit vel hendrerit convallis. Sed in mauris ut justo vulputate viverra feugiat ac dui. Fusce feugiat arcu in vehicula vehicula. Donec varius justo at nulla aliquet volutpat.</p> |
23 |
<p>Ut id rutrum eros. Nulla tristique, magna et mattis vulputate, mi eros suscipit turpis, nec bibendum turpis nunc feugiat sapien. Nunc arcu est, lacinia id diam quis, sagittis euismod neque. Nullam fringilla velit sed porta gravida. Proin eu vulputate libero. Ut a lacinia enim. Etiam venenatis mauris et orci tempor congue. Sed tempor eros et ultricies congue. Aenean sed efficitur orci. Nulla vel tempus mi.</p> |
24 |
<p>Ut cursus suscipit augue, id sagittis nibh faucibus eget. Etiam suscipit ipsum eu augue ultricies, at rhoncus mi faucibus. In et tellus vitae leo scelerisque fringilla nec at nunc.</p> |
25 |
</article>
|
26 |
</section>
|
27 |
|
28 |
<aside>
|
29 |
<h3>Aside</h3> |
30 |
</aside>
|
31 |
|
32 |
<footer>
|
33 |
<h3>Footer</h3> |
34 |
</footer>
|
Agora, adicionemos alguns estilos visuais e regras de Grade.
Usando as Grades
Comecemos envolvendo nossos elementos estruturais em um elemento recipiente–ele será o container da nossa Grade. Usaremos <div class="container"></div>
.
Agora, adicionemos estilos básicos de grade:
1 |
.container { |
2 |
display: grid; |
3 |
grid-template-columns: 1fr; |
4 |
grid-gap: 10px; |
5 |
}
|
Aqui, declaramos que o container deve ter display: grid;
, que deve ter uma única coluna de uma única unidade fracional (não estritamente necessário agora, mas adicionamos por robustez), e que o espaçamento entre os itens da grade deve ser 10px.
Depois, mais elementos visuais para deixar mais conciso:
1 |
.container > * { |
2 |
color: #353535; |
3 |
font-size: 1.2em; |
4 |
line-height: 1.5; |
5 |
padding: 20px; |
6 |
background: #d0cfc5; |
7 |
}
|
8 |
|
9 |
.container nav { |
10 |
background: #136fd2; |
11 |
}
|
12 |
|
13 |
nav ul { |
14 |
list-style: none; |
15 |
margin: 0; |
16 |
padding: 0; |
17 |
}
|
18 |
|
19 |
nav a { |
20 |
color: #d0cfc5 |
21 |
}
|
22 |
|
23 |
nav a:hover { |
24 |
text-decoration: none; |
25 |
}
|
Tornando Responsivo
Adicionemos uma consulta de mídia para quando a área de visualização tiver certo tamanho (ex: 600px) o layout mude:
1 |
@media only screen and (min-width: 600px) { |
2 |
|
3 |
/* grid */
|
4 |
.container { |
5 |
grid-template-columns: repeat(4, 1fr); |
6 |
}
|
7 |
|
8 |
/* specific item styles */
|
9 |
|
10 |
.container header, |
11 |
.container nav, |
12 |
.container footer { |
13 |
grid-column: span 4; |
14 |
}
|
15 |
.container section { |
16 |
grid-column: span 3; |
17 |
}
|
18 |
|
19 |
}
|
Agora, em telas grandes, a declaração da grade será grid-template-columns: repeat(4, 1fr);
. Isso dá quatro colunas de mesma largura, então precisamos declarar o quão largo os elementos estruturais serão. O header
, nav
e footer
tomarão 4 espaços (4 colunas) enquanto section
tomará apenas 3, deixando o espaço de uma coluna para o aside
preencher automaticamente.
Por fim, alguns estilos para alterar o visual da navegação:
1 |
/* nav styles */
|
2 |
nav ul li { |
3 |
display: inline-block; |
4 |
padding: 0 20px 0 0; |
5 |
}
|
Eis o que temos até agora:
Aventurando-se no Off-Canvas
Eis um exemplo perfeito do posicionamento do CSS que funciona em elementos estruturais mesmo numa Grade. Pegaremos a nav, removermo-na do fluxo do documento e a colocaremos fora. Os outros itens da grade ocuparão o resto sem problemas.
Comecemos com outra consulta de mídia. Já temos a min-width
mas, dessa vez, só queremos estilizar elementos até max-width
. Até agora, nossa área alcança os 600px mágicos que queremos a nav posicionada fora.
1 |
@media only screen and (max-width: 599px) { |
2 |
|
3 |
#nav { |
4 |
position: fixed; /* or choose `absolute` depending on desired behavior*/ |
5 |
top: 0; |
6 |
bottom: 0; |
7 |
width: 300px; |
8 |
left: -340px; |
9 |
transition: left .3s ease-in-out; |
10 |
}
|
11 |
|
12 |
}
|
Demos uma largura fixa à nav, posicionando-a suficientemente à esquerda para escondê-la. Usamos position: fixed;
também embora possamos usar absolute
, dependendo se queremos que ela role com a janela ou não.
Também percebamos a regra transitions
que entrará em efeito ao criar os controles de alternação.
Alternando
Tendo feito a nav desaparecer, precisamos de controles pra fazê-la aparecer quando preciso. Adicionemos um link ativador e um fechador.
Adicionemos isso ao cabeçalho:
1 |
<a class="toggle open" href="#nav">open</a> |
E isso à nav:
1 |
<a class="toggle close" href="#">close</a> |
2 |
<!-- you might also want to use a “×” -->
|
Não precisamos do link ativador visível em áreas maiores, então esconderemos elementos .toggle na consulta min-width:
1 |
.toggle { |
2 |
display: none; |
3 |
}
|
:target
O importante dos links acima é a presença de um "identificador de fragmento" (o #nav
no href). Eles são usados pelo navegador para navegar diretamente a elementos específicos na página. Nesse caso, miramos qualquer elemento que case com o id "nav" e uma vez focado, podemos estilizá-lo usando a pseudo-classe :target
. Sem JavaScript!
Adicionemos o seguinte à consulta de mídia max-width:
1 |
#nav:target { |
2 |
left: 0; |
3 |
}
|
É isso! É o nosso alternador.
Eis o que temos, agora:
É preciso ver a página inteira da demo para apreciar completamente o que foi feito.
Conclusão
E terminamos! Criamos o mínimo de estilos para não atrapalhar, mas somos livres para deixar exatamente como quisermos.
Também podemos usar um alternador JavaScript ao invés do :target
e, para esse caso, tudo já está no lugar para caso queiramos usá-lo.
Esperamos que tenham curtido esse pequeno exercício de Grade e fiquem de olho para mais!
Recursos Úteis
- Série Entendendo o Layout em Grade do CSS na Tuts+
- Examinando Navegação Responsiva: Padrões Off-Canvas, por Steven Bradley
- Inscreva-se no csslayout.news