Advertisement
  1. Web Design
  2. Responsive Web Design

Navegação Simples, Responsiva e para Dispositivos Móveis Primeiro

Scroll to top
Read Time: 14 min

Portuguese (Português) translation by Hugo Carlos Borges Pinto (you can also view the original English article)

Nós vamos desenvolver uma navegação simples e responsiva para um web site. Nossa solução vai nos ajudar a colocar ênfase no conteúdo da nossa página, sem dúvidas a prioridade máxima em design para dispositivos móveis. Não usaremos JavaScript, e nós vamos partir de um enfoque primeiramente para dispositivos móveis.

Navegação para Dispositivos Móveis

Se você leu o texto de Luke Wroblewski Primeiro Dispositivos Móveis você vai estar familiarizado com sua afirmação de que:

Como regra geral, o conteúdo tem precedência sobre navegação em dispositivos móveis.

O que ele quer dizer com isso é que usuários de dispositivos móveis estão normalmente procurando respostas imediatas; eles querem chegar ao conteúdo que eles procuram, não mais opções de navegação.

Muitos web sites, mesmo os responsivos, se apegam à convenção de que a navegação pertence ao topo de qualquer página. Este enfoque pode causar problemas de usabilidade em dispositivos móveis porque os usuários normalmente tem falta de duas coisas: área útil de tela (a partir de agora tratada como 'viewport') e tempo. Se a navegação primária está no topo da página, existe uma grande chance de que ela vá ocupar inteiramente uma tela de dispositivos móveis. O problema é exacerbado ainda mais por links grandes otimizados para toque, forçando usuários a rolar além da navegação para chegar a qualquer conteúdo relevante.

Veja este exemplo da London & Partners:

Um design responsivo perfeitamente decente, mas em uma viewport comum em dispositivos móveis (320px x 480px) tudo que você realmente vê é o menu de navegação. Com certeza, tendo acabado de chegar na página inicial, eu quero ver algo mais do que isto? Não é só a London & Partners que demonstra isto - é uma prática vista em muitos designs responsivos pela web.

Então Quais são as Soluções?

Nós vimos algumas maneiras de contornar isto, normalmente se apoiando em jQuery para arrumar as coisas para nós. Considere a explicação de Chris Coyier sobre o menu dropdown responsivo da Five Simple Steps.


Grande tela, pequena tela.

Usando jQuery, uma cópia do menu é criada na forma de um dropdown <select>, inicialmente oculto usando CSS. Quando alguma media query detecta uma tela menor, elas tornam o dropdown visível e a navegação original invisível. Isto é perfeito para dispositivos móveis já que dropdowns ocupam espaço real mínimo e fazem uso da Interface de Usuário do próprio dispositivo (como a barra de rolagem do iPhone).

Alternativamente, você pode ocultar sua navegação, mas fazê-la aparecer com uma transição quando um botão 'menu' é clicado. Você pode ver este efeito em ação na última Bootstrap do Twitter.

Telas menores escondem os links de navegação e mostram um ícone de 'lista' (rapidamente sendo aceito como significando 'menu') que revela a navegação quando clicado. Novamente, visitantes de dispositivos móveis são apresentados ao máximo de conteúdo possível, mas tem as opções de navegação disponíveis caso necessitem delas.

Solução CSS Pura

Nós vamos utlizar uma técnica discutida pelo Luke, que faz uso de CSS e enfoque Dispositivos Móveis Primeiro. O que queremos dizer com um enfoque Dispositivos Móveis Primeiro? Em poucas palavras, nós vamos fazer o design de um layout para dispositivos móveis direto, então progressivamente melhorar este design para telas maiores. Nós vamos usar media queries que detectam regularmente tamanhos de telas maiores, adicionando estilos e funções de acordo.

Isto significa que o mínimo de CSS e recursos serão carregados quando nosso design é visto em um dispositivo móvel. Isto também significa que versões antigas do IE (que não reconhecem media queries) vão receber a versão móvel do site. Dê uma olhada no artigo de Joni Korpi, Deixando Internet Explorer Antigos para trás para mais informações sobre este assunto.

Passo 1: Markup

Eu vou explicar as ideias por trás desta solução enquanto vamos avançando, então por enquanto vamos juntar algum markup, começando com um documento HTML5 em branco.

1
<html lang="en">
2
<head>
3
4
	<meta charset="utf-8">
5
	<title>Mobile First Responsive Navigation</title>
6
	<meta name="description" content="CSS only mobile first navigation">
7
	<meta name="author" content="Ian Yates">
8
9
	<!--Mobile specific meta goodness :)-->
10
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
11
12
	<!--css-->
13
	<link rel="stylesheet" href="styles.css">
14
15
	<!--[if lt IE 9]>

16
		<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>

17
	<![endif]-->
18
19
	<!-- Favicons-->
20
	<link rel="shortcut icon" href="img/favicon.ico">
21
22
</head>
23
<body id="home">
24
25
	
26
</body>
27
</html>

Nota: Não Esqueça da Meta Tag Viewport!

Feito isto, vamos adicionar estrutura à página. Coisas diretas para os propósitos da nossa demonstração. Eu usei texto do Holy Grail do Monty Python de exemplo (obrigado Chris Valleskey) que é uma boa maneira de colocar um sorriso em seu rosto enquanto você está trabalhando :)

1
<body id="home">
2
3
	<div class="wrapper">
4
	
5
		<header>
6
		
7
			<h1 class="logo"><a href="">Nav</a></h1>
8
		
9
		</header>
10
		
11
		<article>
12
		
13
			<h2>Blue. No, yel&hellip;</h2> 
14
			
15
			<p>Shut up! Will you shut up?! But you are dressed as one&hellip; Camelot! You don't vote for kings.</p> 
16
		
17
		</article>
18
		
19
		<article>
20
			
21
			<h2>We want a shrubbery!!</h2> 
22
			
23
			<p>Look, my liege! Shut up! But you are dressed as one&hellip;</p> 
24
			
25
			<ul> 
26
				<li>The nose?</li> 
27
				<li>Shh! Knights, I bid you welcome to your new home. Let us ride to Camelot!</li> 
28
				<li>Look, my liege!</li> 
29
			</ul> 
30
		
31
		</article>
32
		
33
		<article>
34
			
35
			<h2>Help, help, I'm being repressed!</h2> 
36
			
37
			<p>Why? Listen. Strange women lying in ponds distributing swords is no basis for a system of government. Supreme executive power derives from a mandate from the masses, not from some farcical aquatic ceremony. Be quiet! A newt?</p> 
38
		
39
		</article>
40
		
41
		<footer>
42
		
43
			<p>Copyright &copy;2012 Ian Yates <a href="http://webdesign.tutsplus.com">Webdesigntuts+</a></p>
44
		
45
		</footer>
46
	
47
	</div><!--end wrapper-->
48
	
49
</body>

Passo 2: Markup de Navegação

Nós juntamos uma página html básica, então agora é hora da atração principal; nossa navegação primária..

1
		
2
<nav id="primary_nav">
3
		
4
	<ul>
5
	
6
		<li><a href="">Portfolio</a></li>
7
	
8
		<li><a href="">About Me</a></li>
9
	
10
		<li><a href="">Nonsense</a></li>
11
	
12
		<li><a href="">Services</a></li>
13
	
14
		<li><a href="">Contact</a></li>
15
	
16
		<li><a href="#home">Top</a></li>
17
	
18
	</ul>
19
20
</nav><!--end primary_nav-->

Sim, você viu isto corretamente, nós adicionamos isto na linha 68, depois do último artigo. Não se esqueça que nós estamos fazendo o design para dispositivos móveis agora, nós vamos cuidar de desktop depois. Nós posicionamos a navegação no final da página para que ela fique totalmente fora do caminho. Nós agora vamos colocar um link no topo da página para que os usuários possam achar a navegação caso eles desejem.

1
		
2
<header>
3
		
4
	<h1 class="logo"><a href="">Nav</a></h1>
5
	
6
	<a class="to_nav" href="#primary_nav">Menu</a>
7
8
</header>

Passo 3: Reset CSS

Dependendo de como você normalmente começa projetos web, este passo pode ser diferente do seu fluxo de trabalho usual. Eu sempre achei o reset do Eric Meyer uma base sólida a partir da qual posso trabalhar, especialmente já que ele a alterou recentemente. Nós vamos adicionar as regras de reset dele para iniciar nosso CSS:

1
/* http://meyerweb.com/eric/tools/css/reset/ 

2
   v2.0b1 | 201101 

3
   NOTE: WORK IN PROGRESS

4
   USE WITH CAUTION AND TEST WITH ABANDON */
5
6
html, body, div, span, applet, object, iframe,
7
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
8
a, abbr, acronym, address, big, cite, code,
9
del, dfn, em, img, ins, kbd, q, s, samp,
10
small, strike, strong, sub, sup, tt, var,
11
b, u, i, center,
12
dl, dt, dd, ol, ul, li,
13
fieldset, form, label, legend,
14
table, caption, tbody, tfoot, thead, tr, th, td,
15
article, aside, canvas, details, figcaption, figure, 
16
footer, header, hgroup, menu, nav, section, summary,
17
time, mark, audio, video {
18
	margin: 0;
19
	padding: 0;
20
	border: 0;
21
	outline: 0;
22
	font-size: 100%;
23
	font: inherit;
24
	vertical-align: baseline;
25
}
26
/* HTML5 display-role reset for older browsers */
27
article, aside, details, figcaption, figure, 
28
footer, header, hgroup, menu, nav, section {
29
	display: block;
30
}
31
body {
32
	line-height: 1;
33
}
34
ol, ul {
35
	list-style: none;
36
}
37
blockquote, q {
38
	quotes: none;
39
}
40
blockquote:before, blockquote:after,
41
q:before, q:after {
42
	content: '';
43
	content: none;
44
}
45
46
/* remember to highlight inserts somehow! */
47
ins {
48
	text-decoration: none;
49
}
50
del {
51
	text-decoration: line-through;
52
}
53
54
table {
55
	border-collapse: collapse;
56
	border-spacing: 0;
57
}

Passo 4: Estilos Básicos

No momento nossa página está sem inspiração..

..então vamos melhorar as coisas adicionando alguns estilos simples.

1
/*begin our styles*/
2
3
body {
4
	font: 16px/1.4em 'PT Sans', sans-serif;;
5
	color: #1c1c1c;
6
}
7
8
p,
9
ul {
10
	margin: 0 0 1.5em;
11
}
12
13
ul {
14
	list-style: disc;
15
	padding: 0 0 0 20px;
16
}
17
18
a {
19
	color: #1D745A;
20
}
21
22
h1 {
23
24
}
25
26
h2 {
27
	font-family: 'PT Serif', serif;
28
	font-size: 32px;
29
	line-height: 1.4em;
30
	margin: 0 0 .4em;
31
	font-weight: bold;
32
}
33
34
/*layout*/
35
36
.wrapper {
37
}
38
39
article {
40
	border-bottom: 1px solid #d8d8d8;
41
	padding: 10px 20px 0 20px;
42
	margin: 10px 0;
43
}
44
45
/*header*/
46
47
header {
48
	background: #1c1c1c;
49
	padding: 15px 20px;
50
}
51
52
		/*shorter clearfix http://nicolasgallagher.com/micro-clearfix-hack/*/
53
		header:before,
54
		header:after {
55
		    content:"";
56
		    display:table;
57
		}
58
		
59
		header:after {
60
		    clear:both;
61
		}
62
		
63
		/* For IE 6/7 (trigger hasLayout) */
64
		header {
65
		    zoom:1;
66
		}
67
68
h1.logo a {
69
	color: #d8d8d8;
70
	text-decoration: none;
71
	font-weight: bold;
72
	text-transform: uppercase;
73
	font-size: 20px;
74
	line-height: 22px;
75
	float: left;
76
	letter-spacing: 0.2em;
77
}
78
79
a.to_nav {
80
	float: right;
81
	color: #fff;
82
	background: #4e4e4e;
83
	text-decoration: none;
84
	padding: 0 10px;
85
	font-size: 12px;
86
	font-weight: bold;
87
	line-height: 22px;
88
	height: 22px;
89
	text-transform: uppercase;
90
	letter-spacing: 0.1em;
91
	-webkit-border-radius: 2px;
92
	-moz-border-radius: 2px;
93
	border-radius: 2px;
94
}
95
96
a.to_nav:hover,
97
a.to_nav:focus {
98
	color: #1c1c1c;
99
	background: #ccc;
100
}

Isto é tudo coisa básica (fontes, line-heights, cores etc.), o que é crucial até agora é que eu estilizei o botão 'menu' para flutuar para a direita dentro do <header>, onde você normalmente espera encontrar a navegação.

Se você pairar o mouse sobre ele verá o estado de foco - não necessário para dispositivos com telas de toque obviamente, mas esta experiência vai também ser entregue para versões não cooperativas do Internet Explorer. O que nós definimos para o benefício de usuários de dispositivos móveis é um estado de :focus. É o mesmo que um estado de :hover, mas vai oferecer um feedback crucial para dispositivos com telas de toque. Nossos usuários vão saber que eles tocaram com sucesso o botão de menu.

De todo modo, clique nele e você será levado para a navegação, super.

Agora vamos estilizar este botão de menu um pouco.

Passo 5: Estilos de Navegação

Nós vamos na verdade estilizar nossa navegação primária muito como o exemplo da London & Partners mostrado mais cedo, exceto que desta vez ela estará obviamente no final da página..

1
/*navigation*/	
2
3
#primary_nav ul {
4
	list-style: none;
5
	background: #1c1c1c;
6
	padding: 5px 0;
7
}
8
9
#primary_nav li a {
10
	display: block;
11
	padding: 0 20px;
12
	color: #fff;
13
	text-decoration: none;
14
	font-weight: bold;
15
	text-transform: uppercase;
16
	letter-spacing: 0.1em;
17
	letter-spacing: 0.1em;
18
	line-height: 2em;
19
	height: 2em;
20
	border-bottom: 1px solid #383838;
21
}
22
23
#primary_nav li:last-child a {
24
	border-bottom: none;
25
}
26
27
#primary_nav li a:hover,
28
#primary_nav li a:focus {
29
	color: #1c1c1c;
30
	background: #ccc;
31
}
32
33
/*footer*/
34
35
footer {
36
	font-family: 'PT Serif', serif;
37
	font-style: italic;
38
	text-align: center;
39
	font-size: 14px;
40
}

Bem melhor. Nós colocamos os links do menu grandes e bonitos (leia mais sobre Tamanhos de Alvos para Toque no blog do Luke Wroblewski) e mais uma vez determinamos um estado de :focus para o feedback para o usuário.

Também ficou claro que nós incluímos um link 'topo' que vai levar os usuários de volta para o topo da página se necessário.

Passo 6: Aumentando o Tamanho

OK, nós lidamos com nosso layout móvel simples, então agora é a hora de algumas melhorias progressivas. Nós vamos usar media queries para determinar quando nosso layout móvel não será mais apropriado.

Mas a partir de qual ponto ele se torna inapropriado? Existem várias maneiras de lidar com media queries, mas nós vamos trabalhar com a assunção de que uma viewport móvel é 320px x 480px. Possui largura de 320px quando vista em retrato, largura de 480px quando vista em paisagem, então nós podemos justificadamente estabelecer nossa primeira media query para detectar telas mais largas do que 480px.

Entretanto, nosso próximo passo é sem dúvida os tablets. O iPad tem uma resolução de 980px x 768px, então nós podemos assumir com segurança que qualquer coisa menor que 768px é apropriada para nosso layout móvel. Qualquer coisa além de 768px pode lidar com nosso layout de navegação para desktop.

Nós podemos então começar a adicionar regras, então vamos criar uma media query:

1
2
/*media queries*/
3
4
@media only screen and (min-width: 768px) {
5
6
}

Esta media query vai rodar todos os estilos contidos nela quando a viewport alcançar ao menos 768px de largura. Note a inclusão da palavra-chave only, que garante que o Internet Explorer 8 não fique confuso e tente processar a query. Veja minha explicação anterior para mais detalhes.

Vamos continuar fazendo nosso botão 'menu' desaparecer:

1
		
2
@media only screen and (min-width: 768px) {
3
4
	a.to_nav {
5
		display: none;
6
	}
7
8
}

Com o navegador um pouco mais largo, o botão menu não é mais mostrado.

Passo 7: Deslocando a Navegação

Agora precisamos trazer nossa navegação primária para o topo da página. Nós vamos fazer isto a removendo do fluxo do documento, posicionando-a absolutamente no topo.

1
 
2
@media only screen and (min-width: 768px) {
3
4
	a.to_nav {
5
		display: none;
6
	}
7
	
8
	.wrapper {
9
		position: relative;
10
		width: 768px;
11
		margin: auto;
12
	}
13
	
14
	#primary_nav {
15
		position: absolute;
16
		top: 5px;
17
		right: 10px;
18
		background: none;
19
	}
20
	
21
	#primary_nav li {
22
		display: inline;
23
	}
24
	
25
	#primary_nav li a {
26
		float: left;
27
		border: none;
28
		padding: 0 10px;
29
		-webkit-border-radius: 2px;
30
		-moz-border-radius: 2px;
31
		border-radius: 2px;
32
	}
33
34
}

Para que isto seja possível nós devemos primeiro colocar o seu pai (wrapper) posicionado relativamente. Nós podemos tanto fazer isso aqui na media query, ou determinar isto no começo da nossa stylesheet.

Uma vez que o menu esteja posicionado absolutamente, nós temos que remover alguns dos estilos de âncoras. Não há muita coisa a fazer, mas nós precisamos que os itens da lista sejam exibidos em linha, e nós precisamos remover as bordas e o padding exagerado do elemento âncora. Os estados de foco que nós ditamos antes estão adequados, então não vamos precisar modificá-los.

Passo 8: Uma Última Coisa

Se você está prestando atenção notou que nós ainda temos um link 'topo' na navegação - nós não precisamos realmente dele agora não é?

Nós podemos remover isto de várias maneiras, mas para ter certeza do que está acontecendo vamos primeiro adicionar uma classe ao item da lista:

1
				
2
<li class="top"><a href="#home">Top</a></li>

Então nós podemos nos livrar dele dentro da nossa media query:

1
			
2
#primary_nav li.top {
3
	display: none;
4
}

Conclusão

É isso! Existem inúmeras maneiras de executar esta ideia (implementar um ícone de lista sendo apenas uma delas) e, claro, você pode continuar a adicionar media queries para atender telas maiores. Espero que você agora tenha as fundações para fazer isto. Nós criamos uma navegação simples, responsiva, adaptada a toque, com um enfoque em dispositivos móveis primeiro e ao mesmo tempo demos ênfase ao conteúdo e usabilidade. Quem precisa pedir mais?!

Recursos Adicionais

Alguns links úteis mencionados neste tutorial, todos juntos em uma lista grande e prática (em inglês):

Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.