<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tableless &#187; CSS</title>
	<atom:link href="http://tableless.com.br/categoria/client-side/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://tableless.com.br</link>
	<description>Boas práticas de Desenvolvimento com Padrões Web</description>
	<lastBuildDate>Wed, 08 Feb 2012 13:23:50 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Introdução aos padrões de codificação</title>
		<link>http://tableless.com.br/introducao-a-padroes-de-codificacao/</link>
		<comments>http://tableless.com.br/introducao-a-padroes-de-codificacao/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 11:28:41 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[cotidiano]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[Na Prática]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=5286</guid>
		<description><![CDATA[É mais importante para o time concordar em um único estilo de código do que encontrar o estilo perfeito. ]]></description>
			<content:encoded><![CDATA[<p>Como os idiomas reais, cada linguagem de programação tem suas respectivas regras, individualidades, pontuações, pausas e pontos em comum com outras linguagens. Você precisa conhecer essas peculiaridades para falar fluentemente ou no mínimo ser entendido. Nas linguagens de para web ou qualquer outra linguagem de programação, precisamos seguir algumas regras básicas para que o código não vire uma língua estrangeira no meio do projeto.</p>
<p>Definir padrões é normal para que a equipe inteira escreva o código da mesma maneira. Esse assunto é longo e muito importante para todas as equipes de desenvolvimento. Programadores já quiseram me matar várias vezes porque eu uso TABS em vez de ESPAÇOS em arquivos Python/PHP. Programadores gostam de espaços. Eu não. Mas não é o nosso gosto que vai definir quais os padrões de código que devemos seguir.</p>
<p>Quando definimos padrões e boas práticas, garantimos que todos da equipe conseguirão ter o mínimo de entendimento do código daquele projeto que está na empresa a tempos. Se alguém da equipe adoecer ou precisar ir para o Canadá, outro integrante pode assumir o seu lugar sem precisar se preocupar em aprender novas regras, porque elas devem ser as mesmas do projeto anterior.</p>
<p>É importante que os integrantes da equipe sejam sempre fiéis aos acordos firmados no momento em que combinam esses padrões. É importante também que, caso eles encontrem um integrante fora da lei, que eles forcem o meliante a seguir as regras. Já vi gente perdendo o trabalho de uma semana por que estava trabalhando diretamente pelo FTP e o projeto não estava no GIT. O programador simplesmente APAGOU o projeto da pessoa. Nunca mais ela resolveu editar os arquivos fora do controle de versão. Esse tipo de atitude é perigosa mas muito necessárias às vezes. Devemos forçar as regras num ambiente onde todos devem quem, quando e como as linhas de código do projeto foram escritas.</p>
<p>Alguns pontos para se pensar e combinar:</p>
<h6>Identação</h6>
<p>Como devemos identar o código? Com espaços ou tabs? Se for com espaços quantos? </p>
<h6>Espaços em brancos (Whitespaces)</h6>
<p>Espaços devem ser incluídos depois de uma operação condicional? Espaços devem ser colocados entre o seletor e as chaves? E no final de cada linha, precisa?</p>
<h6>Nomenclatura</h6>
<p>Como as classes, ids e variáveis devem ser nomeadas? E as funções? Vamos usar <a href="http://en.wikipedia.org/wiki/CamelCase">CamelCase</a>?</p>
<h6>Comentários</h6>
<p>Como faremos com os comentários? Como serão os delimitadores do comentário? O comentário deve ser completo ou precisa ser algo mais resumido?</p>
<h6>Arquivos</h6>
<p>Como os arquivos, que não fazem parte da estrutura padrão do CMS, Framework e etc deverão ser chamados? E o nome das pastas? Como as páginas serão chamadas?</p>
<h6>Chaves e ponto/vírgula</h6>
<p>As chaves deverão ser abertas na mesma linha ou devemos quebrar linhas? Vamos sempre usar ponto/vírgula? Vamos usar o padrão <a href="http://en.wikipedia.org/wiki/Indent_style#K.26R_style">K&#038;R ou Allman</a>?</p>
<p>Quando definimos estas pequenas coisas, diminuímos muitos percalços no meio do caminho. Já vi projetos atrasarem meses por que um palerma abriu e salvou arquivos com o charset diferente do que já tinha sido combinado no início.</p>
<p>&#8220;It&#8217;s more important for people on a team to agree to a single coding style than it is to find the perfect style.&#8221; <a href="http://www.amazon.com/gp/product/0596102356/ref=as_li_ss_tl?ie=UTF8&#038;tag=tableless-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0596102356">Building Scalable Web Sites: Building, Scaling, and Optimizing the Next Generation of Web Applications</a><br />
Indico este livro sobre esse e outros assuntos sobre a construção, desenvolvimento e manutenção de websites</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/agora-e-a-vez-dos-desenvolvedores/" title="Agora é a vez dos desenvolvedores">Agora é a vez dos desenvolvedores</a></li><li><a href="http://tableless.com.br/epub-aprenda-a-criar-um-livro-digital/" title="ePub: Aprenda a criar um livro digital">ePub: Aprenda a criar um livro digital</a></li><li><a href="http://tableless.com.br/introducao-das-premissas-dos-controles-de-versao/" title="Introdução das premissas dos controles de versão">Introdução das premissas dos controles de versão</a></li><li><a href="http://tableless.com.br/boas-praticas-de-acessibilidade/" title="Boas práticas de Acessibilidade">Boas práticas de Acessibilidade</a></li><li><a href="http://tableless.com.br/css1k/" title="CSS1K">CSS1K</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/introducao-a-padroes-de-codificacao/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Introdução ao CSS 3D &#8211; Flip Card</title>
		<link>http://tableless.com.br/introducao-ao-css-3d-flip-card/</link>
		<comments>http://tableless.com.br/introducao-ao-css-3d-flip-card/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 12:00:10 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Lab]]></category>
		<category><![CDATA[Na Prática]]></category>
		<category><![CDATA[Tecnologia e Tendências]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[tecnicascss]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4792</guid>
		<description><![CDATA[Entenda como funciona o CSS 3D e suas aplicações.]]></description>
			<content:encoded><![CDATA[<p>O CSS 3D é sem dúvida uma das features do CSS mais aguardadas por todas as crianças do Brasil. Fala a verdade! Fazer efeitozinhos com sombra, gradientes, transparências e etc já foi um dia na vida do desenvolvimento algo bacana. Hoje é muito fora de moda. Carne de vaca, sabe? Por isso o CSS 3D é tão esperado. Ele trará para a web efeitos visuais para layout que antes só viamos em sistemas que rodam em smartphones, tipo um iPhone ou nos sistemas operacionais mais populares como Linux e OSX.</p>
<p>Mas não se anime muito. Eu sei que você está ansioso para sair por aí colocando efeitos 3D de CSS em tudo quanto é aplicação. Mas calma&#8230; entenda que o CSS foi feito para estilizar documentos. Você o utiliza para melhorar a experiência dos usuários nos diversos dispositivos e não para enfeitar seu website como se fosse uma penteadeira. Lembra-se dos websites cheios de gifs animados? Pois é, cuidado para não cair no mesmo erro. Você estará utilizando o CSS 3D da maneira certa se seus efeitos passarem desapercebidos pelo usuário ao utilizar seu sistema. Encher seu sistema com efeitos a cada clique ou a cada ação pode fazer com que o usuário perca tempo e a paciência.</p>
<p>Mas vamos ao que interessa. </p>
<h3>O suporte</h3>
<p>Infelizmente isso ainda está restrito para browsers. O Internet Explorer não tem suporte ainda e nem tem data para tal. Todos os exercícios que você ver neste post são feitos para browsers que tem WebKit como motor de renderização. Por isso teste em seu Chrome ou no seu Safari. Eu testei no Chrome porque o Safari mostrou algumas inconsistências. O Opera está esperando as especificações de CSS Transforms amadurecerem para adicionar este recurso. Testei no Firefox 8.0.1 e o exercício não funcionou. </p>
<p>A degradação do CSS 3D para os browsers que não o suportam é um pouco infeliz. Sugiro que se você for utilizar essas features, tente fazê-lo em projetos restritos para que não haja problemas com usuários de browsers antigos. Se ainda assim você quiser arriscar, crie soluções especifica para seu projeto, fazendo com que a experiência do seu cliente não seja muito prejudicada.<br />
Sugiro que <a href="http://tableless.com.br/utilizando-a-biblioteca-modernizr/" title="Utilizando a Biblioteca Modernizr">utilize a biblioteca Modernizr</a> para identificar os browsers que não entendem o CSS 3D.</p>
<h3>Tudo é uma questão de perspectiva</h3>
<p>Para falar de 3D, precisamos falar sobre perspectiva. Para ativar uma área 3D o elemento precisará de perspectiva.<br />
Você pode aplicar a perspectiva ao elemento de duas formas: utilizando diretamente a propriedade <strong>perspective</strong> ou adicionando um valor <strong>perspective()</strong> na propriedade <strong>transform</strong>.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">div <span style="color: #00AA00;">&#123;</span><br />
&nbsp; -webkit-perspective<span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">600</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Ou:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">div <span style="color: #00AA00;">&#123;</span><br />
&nbsp; -webkit-transform<span style="color: #00AA00;">:</span> perspective<span style="color: #00AA00;">&#40;</span><span style="color: #cc66cc;">600</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Estes dois formatos são os gatilhos que ativam a área 3D onde o elemento irá trabalhar.</p>
<p>O valor da perspectiva determina a intensidade do efeito. Imagine como se fosse a distância de onde vemos o objeto. Quanto maior o valor, mais perto o elemento estará, logo, menos intenso será o visual 3D. Logo, se colocarmos um valor de <i>2000</i>, o objeto não terá tantas mudanças visuais e o efeito 3D será suave. Se colocarmos <i>100</i>, o efeito 3D será muito visível, como se fosse um inseto olhando um objeto gigante.</p>
<p>Você também precisa entender sobre o <a href="http://pt.wikipedia.org/wiki/Perspectiva_(gráfica)" title="Wikipedia: sobre ponto de fuga">ponto de fuga</a>. O ponto de fuga por padrão está posicionado no centro. Você pode modificar essa posição com a propriedade <strong>perspective-origin</strong>, que é muito parecido com a propriedade <strong>transform-origin</strong>, que define onde a ação de transformação do objeto acontecerá, nesse caso <a href="http://tableless.github.com/exemplos/cssanimation.html">quando falamos de ações 2D</a>. A propriedade <strong>perspective-origin</strong> afeta os eixos X e Y do elemento filho.</p>
<p><a href="http://tableless.github.com/exemplos/css3d/cardflip/propriedade-perspective.html">Veja um exemplo com dois elementos</a>: um com pouca perspectiva e outra com muita perspectiva. </p>
<h3>CSS 3D Transforms</h3>
<p>Se você ainda não leu sobre CSS Transforms você pode <a href="http://tableless.com.br/introducao-ao-css-animation/" title="Introdução ao CSS Animation">ler algo aqui</a> e <a href="http://tableless.github.com/exemplos/csstransforms/">ver em ação aqui</a>. As propriedades são praticamente iguais, mas aplicadas para os princípios de 3D e não 2D.</p>
<p>Você deve estar acostumado a trabalhar com os eixos X e Y no CSS padrão. No CSS 3D podemos manipular também o eixo Z, que representa a profundidade.<br />
<a href="http://tableless.github.com/exemplos/css3d/cardflip/propriedade-transform.html">Veja um exemplo utilizando os valores <strong>rotateY, rotateX e translateZ</strong></a>. Perceba que no <strong>translateZ</strong> eu utilizei valores negativos e positivos. Quando utilizo o valor negativo, o objeto fica &#8220;mais longe&#8221;, se coloco valores positivos, o objeto fica &#8220;mais perto&#8221;.</p>
<p>Abaixo segue uma imagem do resultado do exemplo:<br />
<a href="http://tableless.github.com/exemplos/css3d/cardflip/propriedade-transform.html"><img src="http://tableless.com.br/wp-content/uploads/2011/12/img-transform3d.png" alt="" title="img-transform3d" width="801" height="706" class="alignnone size-full wp-image-4795" /></a></p>
<p>Nós podemos utilizar também alguns atalhos para estes valores onde podemos definir as três dimensões de uma vez:</p>
<ul>
<li>translate3d(x,y,z)</li>
<li>scale3d(x,y,z)</li>
<li>rotate3d(x,y,z,angle)</li>
</ul>
<p>Muito importante: ao utilizar as propriedades resumidas, os browsers ativam automaticamente a aceleração por hardware no Safari para que as animações tenham uma melhor performance. </p>
<h2>Fazendo o efeito de Card Flip</h2>
<p>O efeito de Card Flip é muito conhecido entre os usuários de iPhone. Para ter ideia de como é o efeito <a href="http://tableless.github.com/exemplos/css3d/cardflip/cardflip.html" title="Exemplo de efeito card flip com CSS 3 3D" target="_blank">veja o exemplo final</a>.</p>
<p>A estrutura HTML é esta:</p>
<div class="codecolorer-container html4strict mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;section <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;geral&quot;</span>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;carta&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;figure <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;frente&quot;</span>&gt;&lt;<a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">img</span></a> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;card-front.jpg&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span>figure&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;figure <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;atras&quot;</span>&gt;&lt;<a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">img</span></a> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;card-back.jpg&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span>figure&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>section&gt;</span></div></td></tr></tbody></table></div>
<p>O elemento <i>.geral</i> é onde iniciaremos o ambiente 3D. O elemento <i>.carta</i> age como container dos objetos 3D. Cada face da carta está separada por um elemento <strong>figure</strong>, com uma imagem.</p>
<p>Para começar, precisamos aplicar a perspectiva para o elemento <i>.geral</i> iniciar o espaço 3D.</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.geral { <br />
&nbsp; &nbsp; width: 200px;<br />
&nbsp; &nbsp; height: 293px;<br />
&nbsp; &nbsp; position: relative;<br />
&nbsp; &nbsp; margin:10% auto 0;<br />
&nbsp; &nbsp; -webkit-perspective: 500;<br />
}</div></td></tr></tbody></table></div>
<p>Defini uma largura e altura, coloquei um <strong>position: relative;</strong> para que os elementos dentro dele sejam posicionados se referenciando por ele. Coloquei uma margem só para separá-lo do topo do body a fim de conseguirmos ver melhor os efeitos.<br />
Por fim, coloquei a propriedade <strong>-webkit-perspective: 500;</strong> para aplicarmos o efeito 3D. O valor de 500 faz uma boa perspectiva.</p>
<p>Agora definiremos as dimensões da carta e suas propriedades.</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.carta {<br />
&nbsp; width: 100%;<br />
&nbsp; height: 100%;<br />
&nbsp; position: absolute;<br />
&nbsp; -webkit-transition: -webkit-transform 1s;<br />
}</div></td></tr></tbody></table></div>
<p>Largura e altura precisam ser de 100% para definir a área que o 3D irá aplicar. O <strong>position: absolute;</strong> é necessário para que as cartas fiquem relativas ao elemento <i>.geral</i>. A propriedade <strong>-webkit-transition: -webkit-transform 1s;</strong> define o tempo de transição do efeito, neste caso ele vai durar 1 segundo. </p>
<p>Formatando as cartas:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666ff;">.carta</span> figure <span style="color: #00AA00;">&#123;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">absolute</span><span style="color: #00AA00;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">;</span><br />
&nbsp; -webkit-backface-<span style="color: #000000; font-weight: bold;">visibility</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">hidden</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Vamos direto para a propriedade <strong>-webkit-backface-visibility: hidden;</strong> já que as outras dispensam comentários. Essa propriedade faz com que a face de trás da carta não apareça e nem se sobreponha no momento do efeito.<br />
E finalmente, para fazer com que a parte de trás da carta apareça no verso correto, nós temos que rotacioná-la.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666ff;">.atras</span><span style="color: #00AA00;">&#123;</span>-webkit-transform<span style="color: #00AA00;">:</span> rotateY<span style="color: #00AA00;">&#40;</span>180deg<span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>E feito se completa com o trigger para fazer a animação acontecer. Nesse caso farei com um hover no elemento <i>.carta</i>, onde iremos rotacioná-lo em -180 graus.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666ff;">.carta</span><span style="color: #3333ff;">:hover </span><span style="color: #00AA00;">&#123;</span><br />
&nbsp; -webkit-transform<span style="color: #00AA00;">:</span> rotateY<span style="color: #00AA00;">&#40;</span>-180deg<span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>E Voilá! Se quiser brincar um pouco, modifique a origem da transformação com a propriedade <strong>-webkit-transform-origin</strong>. Adicionando essa linha, a transformação acontece para a direita em vez de ser pelo centro, como é o padrão:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666ff;">.carta</span><span style="color: #3333ff;">:hover </span><span style="color: #00AA00;">&#123;</span><br />
&nbsp; -webkit-transform<span style="color: #00AA00;">:</span> rotateY<span style="color: #00AA00;">&#40;</span>-180deg<span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
&nbsp; -webkit-transform-origin<span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">right</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<h3>3Drollover.css</h3>
<p>Encontrei uma biblioteca muito interessante que nos permite fazer estes efeitos de forma fácil e de acordo com os princípios do OOCSS. É necessário apenas estruturar da forma correta e trocar as classes de acordo com o efeito que você quer fazer. Coisa muito simples.</p>
<p>O nome da biblioteca é <a href="https://github.com/codepo8/3drollovers.css">3Drollover</a>. Clone no seu computador e divirta-se. Dá para usar em projetos facilmente. Veja abaixo um vídeo que mostra os efeitos:</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/QcCW_1FkJ9o?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<h3>Para ler mais</h3>
<ul>
<li>Leia a <a href="http://dev.w3.org/csswg/css3-3d-transforms/">documentação oficial do W3C sobre CSS 3D Transforms</a>.</li>
<li>Pessoal do <a href="http://www.webkit.org/blog/386/3d-transforms/">WebKit explicando sobre outras propriedades do CSS 3D Transforms</a>.</li>
<li>Você pode <a href="http://desandro.github.com/3dtransforms/examples/perspective-03.html">brincar um pouco com as propriedades do CSS 3D aqui</a>.</li>
</ul>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/css3-modulo-template-layout/" title="CSS3 &#8211; Módulo Template Layout">CSS3 &#8211; Módulo Template Layout</a></li><li><a href="http://tableless.com.br/css3-animation-keyframe/" title="CSS3 &#8211; Animation e regra keyframe">CSS3 &#8211; Animation e regra keyframe</a></li><li><a href="http://tableless.com.br/css3-abas-com-a-pseudo-classe-target/" title="CSS3 &#8211; Abas com a pseudo-classe :target">CSS3 &#8211; Abas com a pseudo-classe :target</a></li><li><a href="http://tableless.com.br/epub-aprenda-a-criar-um-livro-digital/" title="ePub: Aprenda a criar um livro digital">ePub: Aprenda a criar um livro digital</a></li><li><a href="http://tableless.com.br/oocss-ou-css-do-jeito-certo/" title="OOCSS ou CSS do jeito certo">OOCSS ou CSS do jeito certo</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/introducao-ao-css-3d-flip-card/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>OOCSS ou CSS do jeito certo</title>
		<link>http://tableless.com.br/oocss-ou-css-do-jeito-certo/</link>
		<comments>http://tableless.com.br/oocss-ou-css-do-jeito-certo/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 13:49:45 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Na Prática]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[tecnicascss]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4713</guid>
		<description><![CDATA[O CSS é algo muito simples de ser escrito mas com apenas um deslize todo o código pode transformar o projeto em um inferno. Saiba como podemos evitar isso.]]></description>
			<content:encoded><![CDATA[<h2>O conceito</h2>
<p>Escrever CSS é fácil. Isto não deveria ser um problema, mas é. Por ser fácil os desenvolvedores acabam se esquecendo de princípios básicos, técnicas e metodologias que nos ajudam a manter o controle durante a produção. Entenda que algumas dessas metodologias não precisam ser aplicadas em sites pequenos. Por exemplo, aqui no Tableless eu não <a href="http://tableless.com.br/modulando-o-css/">modularizo o CSS em vários arquivos</a> por um ou dois motivos: <strong>1)</strong> Somente eu tenho acesso ao código. <strong>2)</strong> O site não é grande. Ele tem meia dúzia de páginas e funcionalidades. <br />
Mas quando falamos de sites grandes (em visitação e quantidade de páginas) existem algumas restrições: velocidade de carregamento, compatibilidade entre browsers, manutenção, flexibilidade para mudanças etc. Tudo isso deve ser pensado e planejado antes de colocarmos a mão na massa. É no planejamento que iremos estruturar como serão feitas as manutenções posteriores, como iremos mudar elementos principais sem interferir no layout como um todo.</p>
<p>O CSS Orientado a Objeto (em inglês OOCSS &#8211; Object Oriented CSS &#8211; Sendo sincero, esse nome é muito ruim) tem como conceito técnicas que já falamos durante muito tempo, mas que como o <a href="http://tableless.com.br/introducao-ao-responsive-web-design/" title="Artigo sobre responsive web design" target="_blank">Responsive Web Design</a>, está ganhando força somente agora.</p>
<h2>Princípios</h2>
<p>O OOCSS está baseado em dois pontos cruciais que são a separação da <strong>estrutura e do visual</strong> e a <strong>independência do container em relação ao conteúdo</strong>.</p>
<h3>Separação da estrutura e do visual</h3>
<p>A maioria dos elementos estilizados em uma página web tem diferentes características visuais que são repetidas em diferentes contextos e situações. Algumas características são fáceis de identificar como cores, títulos, gradientes, bordas etc. Essas são características visuais. Contudo, existem também as características de estrutura, que é onde nós &#8220;montamos&#8221; os elementos, definindo tamanhos, distâncias, medidas etc. Essas características também são repetidas em diversos elementos no decorrer do site. </p>
<p>A ideia é que nós separemos as características visuais das características estruturais, tornando-os modulares de forma que possamos reutilizá-los em diferentes elementos tendo resultados iguais.</p>
<p>Imagine 3 elementos diferentes, como um <strong>botão</strong>, uma <strong>caixa de chamada</strong> e um <strong>destaque</strong> que normalmente fica na lateral do site. Eles tem características estruturais diferentes, como width, height, paddings, margins etc. Mas as características visuais são iguais, como por exemplo o border-radius, background e o box-shadow. O CSS normal ficaria assim:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666ff;">.botao</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">100px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">50px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span><span style="color: #993333;">center</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span><span style="color: #993333;">bold</span> <span style="color: #933;">13px</span> verdana<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;border-radius<span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000; font-style: italic;">gradients.png</span><span style="color: #00AA00;">&#41;</span> repeat-X <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;box-shadow<span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">10px</span> rgba<span style="color: #00AA00;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0.5</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
<span style="color: #6666ff;">.chamada</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">250px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span><span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span><span style="color: #993333;">bold</span> <span style="color: #933;">23px</span> verdana<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;border-radius<span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000; font-style: italic;">gradients.png</span><span style="color: #00AA00;">&#41;</span> repeat-X <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;box-shadow<span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">10px</span> rgba<span style="color: #00AA00;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0.5</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
<span style="color: #6666ff;">.destaque</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">300px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">250px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;border-radius<span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000; font-style: italic;">gradients.png</span><span style="color: #00AA00;">&#41;</span> repeat-X <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;box-shadow<span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">10px</span> rgba<span style="color: #00AA00;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0.5</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Para reutilizar de forma inteligente as características iguais destes elementos e prevendo que talvez seria criado outros elementos com as mesmas características &#8211; já que o designer mantém sempre (quase sempre, né?) um padrão visual estético &#8211; é interessante que criemos uma classe que componha estas características e apliquemos essa classe nos elementos necessários. Assim:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666ff;">.botao</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">100px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">50px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span><span style="color: #993333;">center</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span><span style="color: #993333;">bold</span> <span style="color: #933;">13px</span> verdana<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
<span style="color: #6666ff;">.chamada</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">250px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span><span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span><span style="color: #993333;">bold</span> <span style="color: #933;">23px</span> verdana<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
<span style="color: #6666ff;">.destaque</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">300px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">250px</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
<span style="color: #6666ff;">.boxEffects</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;border-radius<span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000; font-style: italic;">gradients.png</span><span style="color: #00AA00;">&#41;</span> repeat-X <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;box-shadow<span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">10px</span> rgba<span style="color: #00AA00;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0.5</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Em cada elemento que necessitasse destas características visuais, basta inserir a classe .boxEffects ao elemento.</p>
<p>Entenda que o abuso dessa técnica pode trazer complicações. Você não vai criar uma classe para cada característica visuais e sair aplicando essas classes em tudo quanto é elemento. Você estaria voltando a 1999 onde tínhamos aquele velho problema de misturar as <a href="http://tableless.com.br/camadas-de-desenvolvimento-client-side/">camadas de formatação e informação</a>.</p>
<h3>Independência dos containers e do conteúdo</h3>
<p>Imagine que você crie algum estilo para a formatação de algum elemento como por exemplo um parágrafo e atrela este estilo para os parágrafos localizados no article principal:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">article p <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span><span style="color: #993333;">bold</span> <span style="color: #933;">13px</span> verdana<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">line-height</span><span style="color: #00AA00;">:</span><span style="color: #933;">18px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">letter-spacing</span><span style="color: #00AA00;">:</span><span style="color: #933;">1px</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Mas então surge a necessidade de ter um parágrafo com as mesmas características no rodapé, por exemplo, mas com o tamanho da fonte maior! Você pode fazer assim:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">article p<span style="color: #00AA00;">,</span> footer p <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span> <span style="color: #933;">13px</span> verdana<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">line-height</span><span style="color: #00AA00;">:</span><span style="color: #933;">18px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">letter-spacing</span><span style="color: #00AA00;">:</span><span style="color: #933;">1px</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
footer p <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span><span style="color: #933;">20px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>O que é ainda é ruim, mas é muito melhor do que fazer assim:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">article p<span style="color: #00AA00;">,</span> footer p <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span> <span style="color: #933;">13px</span> verdana<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">line-height</span><span style="color: #00AA00;">:</span><span style="color: #933;">18px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">letter-spacing</span><span style="color: #00AA00;">:</span><span style="color: #933;">1px</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
footer p <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span> <span style="color: #933;">20px</span> verdana<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">line-height</span><span style="color: #00AA00;">:</span><span style="color: #933;">18px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">letter-spacing</span><span style="color: #00AA00;">:</span><span style="color: #933;">1px</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Onde duplicamos desnecessariamente vários estilos.</p>
<p>Com o OOCSS nós devemos transformas estes estilos em módulos para serem reutilizados e não atrelando os estilos a um elemento específico. </p>
<p>Isso acontece também quando já fizemos uma classe onde carrega os estilos comuns. Se voltarmos ao exemplo anterior, alguém pode fazer assim:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">footer <span style="color: #6666ff;">.boxEffects</span> <span style="color: #00AA00;">&#123;</span>...<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Estamos aqui atrelando a classe que antes era para ser algo genérico ao elemento footer. Cuidado ao fazer isso. Tenha um bom motivo antes de ir adiante.</p>
<h2>Outras boas práticas</h2>
<p>Existem algumas boas práticas que fazem parte do OOCSS e que melhoram muito o planejamento e a prática do desenvolvimento web:</p>
<h3>Modularização de código CSS</h3>
<p>Não estou falando aqui sobre a modularização de <strong>arquivos</strong> CSS, mas sim do Código. Essa modularização é feita sob medida para cada um dos projetos. O objetivo é que o código CSS seja reutilizado em várias partes da produção evitando que você crie mais código. É aconselhável que se defina padrões de código para os principais elementos do layout. A equipe pode fazer isso ou delegar esse importante trabalho para um desenvolvedor, que será responsável em criar os métodos e os padrões estruturais dos elementos.</p>
<h3>Minimizar usos de seletores muito específicos</h3>
<p>Encontre o meio termo. Não faça seletores muito específicos ou seletores muito genéricos. O CSS trabalha com especificidade: quanto mais específico, mais certeiro você é ao capturar um elemento, mas seu CSS fica mais engessado e consequentemente você usa mais código. Quanto mais genérico, mais elementos do mesmo tipo você formata, mas o risco de conflito de estilos aumenta. O ideal é encontrar o meio termo, onde você é tão específico e nem tão genérico.</p>
<p>Dependendo da forma que você utiliza os seletores os browsers podem ser ou não mais rápidos ao renderizar seu site. <a href="http://tableless.com.br/melhorando-performance-css/" title="Performance do seu CSS" target="_blank">Já falamos disso aqui</a>.</p>
<h3>Formate elementos com classes modulares</h3>
<p>A ideia é que ao criar uma nova página, você não tenha que criar novo código CSS. Se a página tiver a estrutura diferente mas os elementos tem características visuais iguais, aí está uma boa oportunidade para modularizar o código visual dos objetos. </p>
<p>Um exemplo para demonstrar essa prática é ao fazer botões para diferentes ações. Normalmente utilizamos os mesmos botões com cores diferentes para definirmos visualmente ações diferentes que o usuário pode tomar. O botão de SALVAR tem o mesmo formato de CANCELAR, mas a cor dos dois é diferente, sendo que o primeiro é verde o segundo vermelho. O código seria assim:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666ff;">.botao</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span>inline-<span style="color: #993333;">block</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span><span style="color: #933;">10px</span> <span style="color: #933;">20px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span> verdana<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span><span style="color: #993333;">white</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Este código cria toda a estrutura do botão. Agora falta definir as cores de fundo. Eu farei isso criando duas classes: <strong>btVerde</strong> e <strong>btVermelho</strong>. Essas classes serão utilizadas em pareceria com a classe <strong>botao</strong></p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666ff;">.btVermelho</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">red</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span><br />
<span style="color: #6666ff;">.btVerde</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">green</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Agora, o HTML ficaria assim:</p>
<div class="codecolorer-container html4strict mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;botao btVermelho&quot;</span>&gt;</span>Cancelar<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;botao btVerde&quot;</span>&gt;</span>Salvar<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>Porque criei os nomes das classes btVermelho e btVerde em vez de btCancelar e btSalvar? Porque pode ser que exista algum botão que também seja verde, mas não tenha a ação de salvar. Assim deixo meu leque aberto para novas atribuições.</p>
<h3>Concluindo</h3>
<p>Seguir esses pequenos detalhes evitam uma série de problemas comuns no desenvolvimento client-side. A reutilização de código CSS se torna real, a velocidade do carregamento melhora e os problemas de manutenção são solucionados. A flexibilidade que teremos ao modificar o CSS será muito grande e não aumentaremos nosso código a cada modificação feita. A ideia é que seu código CSS fique sob controle. A utilização de <a href="http://tableless.com.br/biblioteca-css-ou-framework/" target="_blank">frameworks e bibliotecas podem ajudar em muitos momentos</a>.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/introducao-ao-css-3d-flip-card/" title="Introdução ao CSS 3D &#8211; Flip Card">Introdução ao CSS 3D &#8211; Flip Card</a></li><li><a href="http://tableless.com.br/css3-animation-keyframe/" title="CSS3 &#8211; Animation e regra keyframe">CSS3 &#8211; Animation e regra keyframe</a></li><li><a href="http://tableless.com.br/pontuacao-especificidade-css/" title="Pontuação de especificidade da CSS">Pontuação de especificidade da CSS</a></li><li><a href="http://tableless.com.br/css3-sombras-em-textos-e-elementos/" title="CSS3 &#8211; Sombras em textos e elementos">CSS3 &#8211; Sombras em textos e elementos</a></li><li><a href="http://tableless.com.br/css3-modulo-template-layout/" title="CSS3 &#8211; Módulo Template Layout">CSS3 &#8211; Módulo Template Layout</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/oocss-ou-css-do-jeito-certo/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>CSS dinâmico com LESS</title>
		<link>http://tableless.com.br/css-dinamico-com-less/</link>
		<comments>http://tableless.com.br/css-dinamico-com-less/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 23:48:52 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[less]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4191</guid>
		<description><![CDATA[Já imaginou poder declarar variáveis, implementar funções e mixins em suas folhas de estilo? Este é objetivo principal da biblioteca LESS: ampliar o funcionamento do CSS, tornando-o altamente dinâmico.]]></description>
			<content:encoded><![CDATA[<p>O desenvolvimento front-end nunca esteve tão dinâmico. Ferramentas como HAML, SASS e ZenCoding vêm revolucionando a maneira como trabalhamos. Em projetos onde qualquer coisa pode mudar a qualquer hora, flexibilidade é um ponto importantíssimo.</p>
<p>O <a href="http://lesscss.org/#-color-functions" title="">LESS</a> chega nesse barco, adicionando um alto nível de personalização e permitindo recursos de programação em folhas de estilo estáticas. Com a biblioteca, é possível utilizar recursos como variáveis, funções, operações e escopo dentro de simples regras CSS.</p>
<h2>Variáveis</h2>
<p>Uma das principais funcionalidades do LESS é a criação de variáveis.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a1a100;">@azul: #4ca5fe;</span><br />
<span style="color: #a1a100;">@cor_link: #df0d32;</span><br />
<span style="color: #a1a100;">@fonte_titulo: bold 25px/25px &quot;Georgia&quot;, &quot;Times New Roman&quot;, serif;</span></div></td></tr></tbody></table></div>
<p>Variáveis servem para definir valores padrões para seus projetos e facilitar a manutenção e alteração dos mesmos. As variáveis acima poderiam ser utilizadas em diferentes estilos, por exemplo:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666ff;">.titulo</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@azul;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@fonte_titulo;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
<span style="color: #6666ff;">.li</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@azul;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
<span style="color: #6666ff;">.li</span> a <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@cor_link;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<h2>Mixins</h2>
<p>Mixin é um conceito de programação orientada a objetos e basicamente representa a utilização de classes dentro de classes. Essas classes não são instanciadas e servem apenas para reaproveitamento de código.</p>
<p>No LESS, mixins são classes/declarações que serão utilizadas dentro de outras classes de estilo.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.fonte-titulo<span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">36px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> Helvetica<span style="color: #00AA00;">,</span> Arial<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#666</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">letter-spacing</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-2px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">700</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
h1 <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">text-transform</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">uppercase</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; .fonte-titulo<span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
h2 <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; .fonte-titulo<span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#000</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Variáveis e mixins são as principais ferramentas para evitar uma   terrível prática: repetição de código (no nosso caso, repetição de estilos).</p>
<h2>Funções</h2>
<p>Estendendo o conceito acima, funções são mixins que recebem parâmetros. Os parâmetros podem ter um valor padrão, como o exemplo <em>borda_arredondada</em> abaixo (6px), que será utilizado caso nenhum parâmetro seja passado.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.titulo<span style="color: #00AA00;">&#40;</span><span style="color: #a1a100;">@azul){</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@azul;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">dotted</span> <span style="color: #a1a100;">@azul;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
.borda_arredondada<span style="color: #00AA00;">&#40;</span><span style="color: #a1a100;">@radius: 6px){</span><br />
&nbsp; &nbsp; border-radius<span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@radius;</span><br />
&nbsp; &nbsp; -moz-border-radius<span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@radius;</span><br />
&nbsp; &nbsp; -webkit-border-radius<span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@radius;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
.thumbnail<span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#ccc</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; .borda_arredondada<span style="color: #00AA00;">&#40;</span><span style="color: #933;">10px</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
.foto_materia<span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#000</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">4px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; .borda_arredondada<span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<h2>Regra dentro de regra dentro de regra&#8230;</h2>
<p>Alguns desenvolvedores já aplicam essa técnica visualmente. No entanto, com LESS, as regras aninhadas também herdam os valores de seus &#8220;pais&#8221;.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #cc00cc;">#menu</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">letter-spacing</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-2px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@azul;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #6666ff;">.item</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &amp;<span style="color: #6666ff;">.inactive</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#666</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00AA00;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &amp;<span style="color: #3333ff;">:hover </span><span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">red</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00AA00;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #00AA00;">&#125;</span><br />
<br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Note o símbolo &#8220;&amp;&#8221; que representa a concatenação. O elemento não herda simplesmente os atributos de seu antecessor, ele também sobrescreve o novo valor. Essa regra é importantíssima para pseudo-elementos como :hover, :focus etc.</p>
<h2>Operações</h2>
<p>O LESS também permite operações com valores e cores. Por exemplo, é possível multiplicar uma cor hexa-decimal ou dividir uma certa quantidade em pixels.</p>
<p>As funções de cores englobam efeitos como dessaturação e fade.</p>
<p>Para valores compostos, como o border do div#conteudo abaixo, é obrigatório o uso de parênteses.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a1a100;">@borda_padrao: 6px;</span><br />
<span style="color: #a1a100;">@cor_padrao: #111;</span><br />
<br />
div<span style="color: #cc00cc;">#conteudo</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@cor_padrao * 2;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #00AA00;">&#40;</span><span style="color: #a1a100;">@borda_padrao / 3) solid #ccc;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
div<span style="color: #cc00cc;">#menu</span> <span style="color: #00AA00;">&#123;</span> <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> darken<span style="color: #00AA00;">&#40;</span><span style="color: #a1a100;">@cor_padrao, 10%);</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Na <a href="http://lesscss.org/#-color-functions" title="">documentação oficial do LESS</a> você encontra uma lista completa das funções para cores.</p>
<h2>Escopo &amp; Namespace</h2>
<p>Para quem já programa, os conceitos explicados até agora são familiares. O LESS nada mais é do que um framework que transforma o CSS em uma pseudo linguagem de programação.</p>
<p>Escopo é outro conceito importante em programação que também está presente no LESS.</p>
<p>Uma variável possui um escopo global e outro local, dentro de sua função/mixin. O LESS vai sempre procurar primeiro por varáveis no escopo local e depois em seus antecessores.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a1a100;">@variavel: 1px;</span><br />
<br />
div<span style="color: #cc00cc;">#conteudo</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a1a100;">@variavel: 2px;</span><br />
&nbsp; &nbsp; div<span style="color: #cc00cc;">#titulo</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; border-<span style="color: #000000; font-weight: bold;">size</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@variavel;</span><br />
&nbsp; &nbsp; <span style="color: #00AA00;">&#125;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
div<span style="color: #cc00cc;">#menu</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; border-<span style="color: #000000; font-weight: bold;">size</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@variavel;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Você também pode reutilizar apenas uma parte de um mixin aplicando um namespace para encapsular seu código.</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #cc00cc;">#titulo</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #6666ff;">.principal</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">36px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">letter-spacing</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-2px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #00AA00;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #6666ff;">.secundario</span> <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">24px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">letter-spacing</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-1.4px</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #00AA00;">&#125;</span><br />
<span style="color: #00AA00;">&#125;</span><br />
<br />
<span style="color: #cc00cc;">#header</span> h1 <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#df0d32</span><span style="color: #00AA00;">;</span><br />
&nbsp; &nbsp; <span style="color: #cc00cc;">#titulo</span> <span style="color: #00AA00;">&gt;</span> .principal<span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>O h1 do elemento #header herda apenas o .principal do #titulo.</p>
<h2>Implementações</h2>
<p>A implementação do LESS pode ser feita <em>on the fly</em>, com JavaScript. Esse método é recomendado para sites pequenos, com pouca audiência. Para sites mais visitados, pré-processe seus arquivos LESS, transformando-os em folhas de estilo estáticas.</p>
<p>Por exemplo, para aplicativos Ruby/Rails existe uma <a href="http://rubygems.org/gems/less" title="">gem</a> que converte arquivos LESS para CSS. Já o  o módulo <em>compressor</em> do Django oferece suporte nativo.</p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/09/less.jpg" alt="Screenshot do aplicativo LESS para Mac OS" width="620" height="354" class="aligncenter size-full wp-image-4535" /></p>
<p>Outra solução bacana é o <a href="http://incident57.com/less/" title="">aplicativo LESS para Mac</a>.</p>
<p>E se você procura elementos básicos já prontos, a dica é visitar o site <a href="http://lesselements.com/" title="">Less Elements</a>. Nele você encontra soluções para bordas, degradês e sombras.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/epub-aprenda-a-criar-um-livro-digital/" title="ePub: Aprenda a criar um livro digital">ePub: Aprenda a criar um livro digital</a></li><li><a href="http://tableless.com.br/experiencia-cross-device/" title="Experiência cross-device">Experiência cross-device</a></li><li><a href="http://tableless.com.br/introducao-ao-css-3d-flip-card/" title="Introdução ao CSS 3D &#8211; Flip Card">Introdução ao CSS 3D &#8211; Flip Card</a></li><li><a href="http://tableless.com.br/oocss-ou-css-do-jeito-certo/" title="OOCSS ou CSS do jeito certo">OOCSS ou CSS do jeito certo</a></li><li><a href="http://tableless.com.br/biblioteca-css-ou-framework/" title="Biblioteca CSS ou Framework?">Biblioteca CSS ou Framework?</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/css-dinamico-com-less/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Formulários e o Metawebdesign &#8211; Parte 1</title>
		<link>http://tableless.com.br/formularios-e-o-metawebdesign-parte-1/</link>
		<comments>http://tableless.com.br/formularios-e-o-metawebdesign-parte-1/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 11:06:00 +0000</pubDate>
		<dc:creator>Alysson Franklin</dc:creator>
				<category><![CDATA[Acessibilidade]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Tecnologia e Tendências]]></category>
		<category><![CDATA[design de interação]]></category>
		<category><![CDATA[design de interface]]></category>
		<category><![CDATA[metawebdesign]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4395</guid>
		<description><![CDATA[Como montar formulários quando você é o responsável pelo código e design.]]></description>
			<content:encoded><![CDATA[<p>O front-end é uma profissão de uma amplitude imensa. Temos profissionais montando mockups/PSDs, especialistas em acessibilidade, usabilidade, arquitetura da informação, integração com aplicações, designers de interface, application developers. Tem até SEO.</p>
<p>O background do profissional neste momento não importa muito, apenas a afirmação que ele está trabalhando na camada de <strong>front-end</strong>. Só isso basta para confirmar os papéis acima.</p>
<p>Em muitas empresas o front-end é trabalhado de maneira criteriosa, com <strong>separação de tarefas</strong> em maior ou menor intensidade, de modo que o <strong>processo</strong> esteja sempre azeitado e atento aos <strong>prazos</strong> dos outros times que dependem da interface. Em algumas outras, o responsável pelo código é o unico responsável por fazer tudo isso acima. E isso acontece com <strong>frequência</strong>.</p>
<p>É o famigerado exército-de-um-homem-só, que em um projeto normalmente é responsável por:</p>
<ul>
<li><strong>Pesquisa: </strong>Fornece dados e insights para o desenvolvimento de todo o projeto – sobre o usuário, suas características, hábitos e necessidades. Apesar de orientada a um projeto específico, essa pesquisa também deve ser constante, oferecendo atualização e embasamento para a criação de novas experiências.</li>
<li><strong>Arquitetura da informação:</strong> Organização de informação, entendendo o modelo mental do usuário, para que ele se reflita também no produto final.</li>
<li><strong>Design da interação: </strong>Desenhar a interação de forma que ela seja consistente, fácil e auto-explicativa. Entende ros requisitos de usabilidade criados na fase de <strong>pesquisa</strong> e dominar os padrões de interação que a aplicação deve ter, além de saber lidar com a multiplicidade de devices e plataformas onde a interação ocorre.</li>
<li><strong>Design Visual: </strong>Balanceando beleza e comunicação, domina tanto a direção de arte do produto que está sendo desenvolvido quanto o acabamento final dos pequenos detalhes da interface.</li>
<li><strong>Redação: </strong>Expressar as ideias, simples ou complexas que o cliente passou para o desenvolvedor em palavras simples e que sejam facilmente entendidas pelos usuários do produto. Este conteúdo vem do cliente, mas não é difícil acontecer  do desenvolvedor ser responsável por criar algum conteúdo, seja transformando a linguagem do cliente dentro de um contexto web, deixando-a mais dinâmica e convidativa a leitura, seja pequenos conteúdos que devem ditar padrões visuais para interações do usuário.</li>
<li><strong>Prototipagem:  </strong>Criação da UI. Isso serve tanto para o estágio inicial do projeto (com protótipos de papel, de baixa fidelidade) quanto para o estágio que precede o desenvolvimento, onde o produto já está mais amadurecido e mais próximo do final. Esta etapa pode ser a da criação das páginas em si, uma vez que os modelos de conceito e interação estão prontos e o design está criado ( sites tipicamente estáticos ou de menor porte ) ou pode ser a fase da criação dos protótipos que devem ir para a integração depois (back-end).<strong><br />
</strong></li>
<li><strong>Gerenciamento: </strong>Garantir o funcionamento de todas as áreas de entrega da melhor e mais produtiva maneira possivel. E ainda ser o ponto focal com cliente e usuário, quando necessário.</li>
</ul>
<p>Em um departamento multidisciplinar de UX, no melhor dos mundos, temos atribuições diferentes para diferentes profissionais. Muitas vezes, isso não acontece. Outros casos, não raros, a empresa não está interessada na matéria, ou apenas não tem profissionais que atuam nesta área que se preocupam com o código (e design) que entregam. Vai saber. Em empresas com atribuções de projeto mais estruturadas um departamento de UX conversa claramente com outros áreas, como Arquitetura, DBA, Requisitos, Integração, Testes e Gerência.</p>
<p>No <a href="http://frontinbh.com.br/blog/">FrontInBH</a>, conversando com os desenvolvedores no final do evento, e também em conversas com <em>devs</em> de todos os cantos, é fácil perceber que empresas com equipes de desenvolvimento reduzidas (SMB, agências, pequenos portais) mantém um ou dois especialistas que acabam fazendo todo o serviço. E estes profissionais acabam por andar entre duas profissões distintas: <strong>Designer de Interação e Interfaces </strong>ou o <strong>Desenvolvedor web</strong>.</p>
<p>Vale lembrar que estas duas profissões tem backgrounds muito diferentes. Enquanto os designers lidam com <strong>abstração</strong>, <em>devs</em> costumam lidar com a<strong>objetividade</strong> do código. Disciplinas que vão de <strong>Teoria de Cores</strong> à <strong>Orientação a objetos</strong> fazem parte do background destes profissionais, porém é com muito trabalho que são desenvolvidos as especialidades, devido a matérias tão antagônicas.</p>
<div id="attachment_4473" class="wp-caption alignnone" style="width: 610px"><a href="http://tableless.com.br/wp-content/uploads/2011/10/multidisciplinar.png"><img class="size-full wp-image-4473" src="http://tableless.com.br/wp-content/uploads/2011/10/multidisciplinar.png" alt="" width="600" height="308" /></a><p class="wp-caption-text">Algumas das disciplinas que um profissional de web hoje deve saber para atender demandas de projeto</p></div>
<p>Essa diferença de backgrounds acaba por oferecer barreiras que fazem com que o desenvolvimento e a integração das disciplinas seja muito difícil. E com isso temos profissionais que desenham interfaces e interações lindas, mas que não podem funcionar sob conceitos de acessibilidade, ou ainda websites perfeitamente acessíves e fluídos, mas que não tem um design tão impactante.</p>
<p>Diante deste cenário tenho trabalhado para desenvolver um conceito que chamo de <strong><a href="http://metawebdesign.org">Metawebdesign</a></strong>. A proposta é justamente encurtar estes espaços, sem incomodar profissões importantíssimas e já consolidadas, mas que por razões diversas em algumas vezes acabam por ser a mesma coisa no organograma de uma empresa.</p>
<p>Meu primeiro e segundo artigos sobre o assunto vão falar sobre <strong>formulários</strong>. Muito já foi falado, e não quero repetir o que já sabemos. Porém é importante mostrar como conceitos de <strong>design da interação</strong>,<strong> arquitetura da informação</strong> e <strong>código </strong>são usados para criar aplicações que oferecem uma experiência inesquecível para o usuário. Estes dois posts iniciais sobre o assunto se transformam em um toolkit muito útil aonde você poderá com a parte 1 e 2 escolher usando conceitos de design os melhores elementos de controle e depois entender como codificá-los de acordo com os padrões do W3C, mantendo usabilidade e acessibilidade.</p>
<h2><a name="h.ce7pzpue3djo"></a>Aplicando o Metawebdesign a formulários: o design da interface</h2>
<p>Cedo ou tarde, a aplicação que você esta criando vai precisar perguntar (ou pedir) ao usuário algum tipo de informação. E sob o ponto de vista do usuário, nesse momento a credibilidade de seu design de interação e código estarão em jogo, pois complexidade e simplicidade aqui separam o céu e o inferno.</p>
<p>Todos sabem como usar alguns <span class="c0">elementos de controle</span> como input texts, checkboxes, radio e dropdowns &#8211; e isso não somos nós desenvolvedores de aplicações web. Isso é consenso, domínio público: um <span class="c11">status quo </span>que todo usuário de computador aprendeu a identificar e saber operar. Mesmo novos usuários entendem estes elementos com uma rapidez impressionante. O problema é como agrupar todos eles em torno de um bem comum &#8211; o bem sucedido submit. Afinal de contas, fazer um formulário é simples, basta colocar um <span class="c11">bando </span>de informações ordenadas de maneira racional, colocá-las na página com alguma ordenação <span class="c8"><a href="http://en.wikipedia.org/wiki/Top%E2%80%93down_and_bottom%E2%80%93up_design">top-bottom</a></span> e é isso, correto?</p>
<p>Para começarmos a conversa, isso é o que os <span class="c0">usuários </span>esperam.</p>
<p>De acordo com o <span class="c8"><a href="http://www.w3.org/TR/html4/interact/forms.html#h-17.1">w3c</a></span>, um formulário HTML (form) é uma seção do documento HTML que pode conter <span class="c0">informação estática</span>, <span class="c0">elementos de controle</span> (os mesmos mecionados acima e alguns outros que vamos falar aqui) e <span class="c0">labels</span> que referenciam estes controles semanticamente. Tudo isso para permitir que o usuário possa responder (ou preencher) uma série de perguntas que a sua aplicação precisa para prosseguir com o fluxo. E o usuário interage com tudo isso <span class="c0">alterando</span> <span class="c0">elementos de controle</span>.</p>
<h3><a name="h.vz2ra8bmzqo4"></a>Bons e maus exemplos:</h3>
<p>Bons exemplos de formulário são fáceis: você mesmo deve conhecer vários; são aqueles que você usa diariamente sem gastar muito tempo ou que não entediam durante seu preenchimento. Maus exemplos são fáceis e estão por todos os cantos da internet, não é difícil encontrar um (na verdade não precisamos nem procurar). Só que não é ético questionar o trabalho de ninguém sem saber as variáveis que levaram aquela implementação. Sendo assim, olha que “bonito” esse <span class="c8"><a href="http://developer.apple.com/internet/webcontent/examples/bad_form.html">formulário que está no site da Apple como exemplo de um mau form</a></span>.</p>
<div id="attachment_4401" class="wp-caption alignnone" style="width: 789px"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image04.png"><img class="size-full wp-image-4401" src="http://tableless.com.br/wp-content/uploads/2011/10/image04.png" alt="" width="779" height="266" /></a><p class="wp-caption-text">Acredite: foi difícil até colocar tudo isso em um espaço visível. E ainda nao ficou bom.</p></div>
<p>&nbsp;</p>
<p>Antes de entrarmos de cabeça nos elementos e como formulários devem ser criados, precisamos entender alguns principios básicos de um design de form:</p>
<h2><a name="h.1a8j29a5szsl"></a>Form Design &#8211; O básico:</h2>
<ol start="1">
<li><strong>Tenha certeza que o usuário entende o que e o porque você está pedindo ou perguntando algo;</strong><br />
Escreva labels com palavras que seus usuários possam entender facilmente independente de serem usuários frequentes ou novos usuários, tenha cuidado com os jargões ou acrônimos utilizados. Se necessário, <span class="c11">desenhe </span>para o usuário.</li>
<ul>
<li><strong>exemplo 1 : </strong>antes de um grande formulário, tome algum espaço da tela para explicar como ele funciona e o porque você precisa de todas aquelas informações.</li>
<li><strong>exemplo 2: </strong>Se você precisa colocar um controle na tela que não é imediatamente óbvio dentro de um fluxo da tela, use uma tooltip ou outro tipo de ajuda que mostre ao usuário o que ele deve fazer em seguida.</li>
</ul>
<li><strong>Se puder, evite a redundância;<br />
</strong>Antes de colocar os campos em uma tela, analise a informação e o contexto de cada um deles e se possível, agrupe informações para minimizar o numero de campos a serem preenchidos. Mesmo no melhor dos cenários, gastar tempo preenchendo caixas de texto não é algo divertido.</li>
<ul>
<li><strong>exemplo 1: </strong>se o usuário já preencheu o endereço de entrega no formulário de checkout, você pode reutilizar esta informação para o endereço de cobrança. Basta adicionar um checkbox perguntando se o endereço de entrega e cobrança são os mesmos que em caso de positivo, você já atendeu aos requisitos.</li>
<li><strong>exemplo 2:</strong> Se 80% dos seus usuários estão no Brasil, 15% estão na Argentina e 3% nos Estados Unidos, você pode usar um &lt;select&gt; ao invés de uma &lt;input type=”text”&gt; para atender os requisitos de país. As opções seriam Brasil, Argentina, USA e logo após teríamos lista com a ordenação alfabética.</li>
<li><strong>exemplo 3:</strong> Para endereços no Brasil, no &lt;fieldset&gt; de localização, perguntando apenas o CEP podemos recuperar endereço, bairro, cidade e estado. Com isso faz sentido perguntar primeiramente o CEP, recuperar o valor via webservice e após o sucesso automaticamente preencher estes campos para o usuário.</li>
<li><strong>Existem também exceções:</strong> A <span class="c0">segurança</span> deve ser levada em conta ao ponderar sobre recursos de auto-completion. Não seria ético tampouco legal recuperar os dados do cartão de crédito do usuário para onerá-lo da tarefa de inputar seus dados bancários, uma das partes mais tediosas e passíveis de erro durante a transação de um checkout.</li>
<li><strong><br />
</strong></li>
</ul>
<li><strong>Informações de conhecimento público normalmente são mais acuradas que informações de conhecimento pessoal;</strong> Quando perguntamos algo ao usuário, temos que ter em mente que eles podem mentir (<span class="c8 c11"><a href="http://www.youtube.com/watch?v=nNOExDrsdbg">everybody lies</a></span>) ou mesmo errar. Podemos minimizar isso reduzindo problemas. O sistema de <span class="c11">auto-completion</span> com o CEP mencionado acima é um exemplo claro. Um erro simples de digitação pode causar um problemão na hora da entrega: a rua <span class="c0">Roda dos Ventos</span> pode virar rua <span class="c0">Rosa dos Ventos</span> em um clique. Probabilidade altíssima de problemas futuros que <span class="c0">você </span>pode evitar usando este tipo de abordagem.</li>
<li><strong>Tenha cuidado ao transformar os requisitos de design em forms;</strong><br />
A maioria dos forms é criada para manipular transações feitas com o banco de dados ou alterar objetos de uma tela. Explore as dependências entre os elementos, procure por similaridades que possam ser agrupadas graficamente, como <span class="c0">campos de endereço</span> ou i<span class="c0">nformações pessoais</span>. O exemplo do endereço de entrega versus o endereço de cobrança mencionado na regra #2 pode ser repetido aqui. Porque não habilitar em um form de inserir produto um drag-n-drop para definir a ordenação das imagens de descrição deste produto ao invés de subir as imagens em uma ordem pré definida ou ainda primeiro subir as imagens para só depois ordenar?<br />
<strong><br />
</strong></li>
<li><strong>Teste, teste novamente e quando achar que está tudo ok, teste de novo;</strong> Por alguma razão que nunca vamos descobrir, é incrivelmente fácil desenvolvedores e usuários terem idéias completamente diferentes quando o assunto é preencher um formulário. O <span class="c0">mesmo</span> form! Isso pode acontecer pelos mais variados modos:</li>
<ul>
<li>conhecimento prévio com interações passadas,</li>
<li>respostas possíveis,</li>
<li>fluxo de página que depende de um contexto que o usuário pode entender de maneira diferente dependo de variáveis externas.</li>
</ul>
</ol>
<p>Por isso é importante montar o formulário e se certificar que <span class="c0">todas </span>as possibilidades de interação do usuário com os elementos da tela estão garantidas:</p>
<ul>
<ul>
<li>preenchimento de campos;</li>
<li>clique/toque em botões e objetos de tela;</li>
<li>entrada de dados validados para atender requisitos de design da aplicação;</li>
<li>condições especiais de uso e interação do form.</li>
</ul>
</ul>
<p>Isso nos dá <strong>evidência empírica</strong> do que funciona e o que nao funciona em sua aplicação, além de claramente indicar o caminho a seguir no caso de identificar um problema.</p>
<ol class="c12" start="1">
<li><strong>Escolha sabiamente os elementos de controle:</strong> eles impactam a expectativa do usuário sobre o que ele está sendo perguntado e como deve responder a isso:</li>
</ol>
<ul>
<ul>
<li>Os usuários tendem a associar o tamanho e forma física dos campos a o que eles <span class="c0">imaginam </span>que seja o que estamos perguntando. Só depois desta associação é que os usuários lêem o que o label de um campo está pedindo.</li>
<li>Uma única radio button vai ser algo <span class="c11">ditatorial</span> pois sugere a existência de pelo menos <span class="c0">duas </span>opções na tela.</li>
<li>Após você estar acostumado com o processo de compra de sua loja online e seu formulário, automaticamente você irá suavizar sua atenção por não ser uma tarefa nova e sim uma repetição (e daí entendemos o porque a estrada para para erramos um formulário que preenchemos “todo dia” é tão curta)</li>
</ul>
</ul>
<h3><a name="h.bxu0ugomhbvf"></a>Escolhendo elementos de controle</h3>
<p>Quando estamos montando o design do nosso form temos que nos ater a algumas situações que impactam diretamente todo o formulário:</p>
<ol class="c13" start="1">
<li><strong>Espaço disponível na tela: </strong>não precisamos falar nada sobre isso. Cada pixel conta e sabemos disso muito bem, então escolha sabiamente como usar os elementos para tirar total proveito da sua área de exibição.</li>
<li><strong>Sofisticação no formulário deve respeitar uso geral dos forms: </strong>&lt;input type=”text”&gt; é algo que todos os usuários estão familiarizados a usar e vão fazê-lo bem, mas nem todo mundo estará confortável em usar um slider de range, com acionamento duplo.</li>
<li><strong>O form deve respeitar o conhecimento público nos domínios da sua app:</strong> É aceitável você usar um &lt;input type=”text”&gt; para um campo que aceita valores entre 0 e 1000. Mas isso iria requerer uma validação para certificar que numeros maiores ou negativos fossem inputados. Se a maior base dos seus usuários está confortável com esta regra, não existe o motivo de usarmos o mesmo slider de range mencionado acima, por todos os problemas de implementação, tempo, acessibilidade e principalmente, dificuldade de uso.</li>
<li><strong>Elementos externos criam expectativas que podem ser erradas:</strong> Temos o conhecimento que <span class="c0">negrito</span>, <span class="c11">itálico</span><span class="c11 c0"> </span>e <span class="c10">sublinhado</span><span class="c0"> </span>são iconografias que foram criadas para dar um destaque a alguma palavra. Fica fora de contexto utilizarmos estas formas para exibir labels por exemplo.<br />
<a href="http://tableless.com.br/wp-content/uploads/2011/10/image05.png"><img class="alignnone size-full wp-image-4402" src="http://tableless.com.br/wp-content/uploads/2011/10/image05.png" alt="" width="196" height="28" /></a><br />
<span class="c6 c0">Olha o fast-food “encostando uma arma na sua cabeça” ao perguntar o que é mais saudável.</span></li>
<li><span class="c0">Tecnologia disponível: </span>o HTML e suas APIs oferecem suporte a muitos elementos de controle, e para os que não são suportados nativamente, existe uma grande gama de toolkits e frameworks que vai te ajudar a implementar aparência e controle em situações específicas.</li>
</ol>
<h3><a name="h.2g3v8mmslxxw"></a>Elementos de controle de Formulários</h3>
<p>Para fazer o design de uma tela de formulário, precisamos de elementos de controle. No jargão do HTML, seriam elementos HTML, que nada mais é que o conteúdo que está dentro de uma tag, podendo inclusive ter outros elementos filho caso seja do interesse. Dito isso, fica muito mais fácil entender como o design trabalha com elementos de controle. Após escolher seus elementos na tabela abaixo, tudo que você precisa é codificá-los seguindo os padrões que já conhecemos.</p>
<p>Montar uma tela de formulário não é complicado. Estamos acostumados a fazer isso todos os dias. Porém existem mais coisas entre o céu e a terra do que pode imaginar a nossa vã filosofia. O tópico acima mostra algumas variáveis que as vezes podem passar desapercebido e podem ajudar &#8211; e muito na hora de montar o design da sua tela. Você consegue se imaginar trabalhando orientado ao <span class="c8"><a href="http://tableless.com.br/introducao-ao-responsive-web-design/">Responsive Webdesign</a></span> sem utilizar os conceitos básicos mostrados acima? Pode parecer óbvio, mas é importante manter isso em mente ao utilizar a tabela abaixo:</p>
<p>Elementos de controle em um formulário são divididos em:</p>
<table id="tblMain" class="tblGenFixed" style="font-size: 10px !important;font-family: verdana !important" border="0" cellspacing="2" cellpadding="2">
<tbody>
<tr>
<td class="s0">
<h3>Causa</h3>
</td>
<td class="s1">
<h3>Tipo de interação</h3>
</td>
<td class="s2">
<h3>Elementos aceitáveis</h3>
</td>
<td class="s1">
<h3>Prós</h3>
</td>
<td class="s1">
<h3>Contras</h3>
</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Checkbox</td>
<td class="s6">Simples e pouco espaço utilizado na tela</td>
<td class="s6">Checkbox podem ser usadas para múltiplas escolhas, coisa que usuários já estão acostumados ao visualizá-las. Isso pode levar ao erro, uma vez que é necessário entender que este checkbox único compreende uma escolha sim/não</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Radio button</td>
<td class="s6">Duas opções visíveis. Fácil entendimento do usuário</td>
<td class="s6">Espaço de tela usado maior que checkboxes únicas</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Dropdown</td>
<td class="s6">Duas opções visíveis. Pouco espaço utilizado na tela. Permite expansão para múltiplas opções facilmente utilizando pouco espaço da tela</td>
<td class="s6">Apenas uma opção é visualizada por vez. Requer alguma destreza no uso de formulários. Pode oferecer desafios de acessibilidade a pessoas com deficiência ou que preferem navegação pelo teclado.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Toggle Buttons Iconográficos</td>
<td class="s6">Mesmos prós do checkbox, desde que a opção seja mostrada como ícone visual</td>
<td class="s6">Mesmos contras o checkbox, além do fato que não é uma opção padrão para seleção de texto como checkboxes.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Menu com Radio button</td>
<td class="s6">Espaço mínimo utilizado na tela uma vez que o menu é encontrado em barras ocultas de menu ou lightboxes.</td>
<td class="s6">Requer muita destreza para encontrá-los e utilizá-los. Necessitam de indicações para que sejam fáceis de ser encontrados em uma tela.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Radio button</td>
<td class="s6">Todas as opções estão sempre disponíveis na tela.</td>
<td class="s6">Utiliza um espaço considerável na tela.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Dropdown</td>
<td class="s6">Pouco espaço utilizado na tela.</td>
<td class="s6">Enquanto o menu nao está expandido, mostra apenas uma das opções. Novamente requer alguma destreza para operá-lo e pode tambem oferecer desafios de acessibilidade.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Toggle Buttons Iconográficos</td>
<td class="s6">Pouco espaço utilizado na tela. Todas as opções estão visíveis na tela.</td>
<td class="s6">Os ícones podem precisar de tooltips para descrição, uma vez que a imagem pode não ser de fácil entendimento para todos os usuários.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Menu com Radio button</td>
<td class="s6">Espaço mínimo utilizado na tela uma vez que o menu é encontrado em barras ocultas de menu ou lightboxes.</td>
<td class="s6">Requer muita destreza para encontrá-los e utilizá-los. Necessitam de indicações para que sejam fáceis de ser encontrados em uma tela.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Listbox</td>
<td class="s6">Muitas opções podem ser visíveis. O frame de seleção pode ser reduzido para até 3 items, permitindo scroll</td>
<td class="s6">Espaço de tela usado maior que dropdowns ou spinners. Necessita aplicação de padrões de seleção, permitindo seleção única apenas.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Spinner</td>
<td class="s6">Pouco espaço utilizado na tela.</td>
<td class="s6">Apenas uma opção é visualizada por vez. Requer muita destreza no uso de formulários e conhecimento deste elemento, pouco utilizado até o lançamento dos novos input types no HTML5. Pode oferecer desafios de acessibilidade a pessoas com deficiência, que preferem navegação pelo teclado ou ainda usuários com ponteiros (mouse) já que a área de clique é mínima.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha 1 de N para muitas opções</td>
<td class="s5">Dropdown</td>
<td class="s6">Pouco espaço utilizado na tela.</td>
<td class="s6">Apenas uma opção é visualizada por vez. Requer muita destreza no uso de formulários. Pode oferecer desafios de acessibilidade a pessoas com deficiência, que preferem navegação pelo teclado ou ainda usuários com ponteiros (mouse) já que a área de scroll é mínima.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha 1 de N para muitas opções</td>
<td class="s5">Listbox</td>
<td class="s6">Muitas opções podem ser visíveis. O frame de seleção pode ser reduzido para alguns items de modo a ganhar espaço (permitindo scroll)</td>
<td class="s6">Espaço de tela usado maior que dropdowns. Necessita aplicação de padrões de seleção, permitindo seleção única apenas.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha 1 de N para muitas opções</td>
<td class="s5">Treeview</td>
<td class="s6">Muitas opções visíveis inicialmente, pode oferecer facilidades na cognição já que seus items estarão categorizados por níveis ou tipos (pastas)</td>
<td class="s6">Grande espaço utilizado na tela. Requer muita destreza no uso de formulários.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Array de checkboxes</td>
<td class="s6">Todas as opções estão sempre disponíveis na tela.</td>
<td class="s6">Grande espaço utilizado na tela.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Array de Toggle Buttons Iconográficos</td>
<td class="s6">Pouco espaço utilizado na tela. Todas as opções estão visíveis na tela.</td>
<td class="s6">Os ícones podem precisar de tooltips para descrição, uma vez que a imagem pode não ser de fácil entendimento para todos os usuários.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Menus com Checkboxes</td>
<td class="s6">Espaço mínimo utilizado na tela uma vez que o menu é encontrado em barras ocultas de menu ou lightboxes.</td>
<td class="s6">Requer muita destreza para encontrá-los e utilizá-los. Necessitam de indicações para que sejam fáceis de ser encontrados em uma tela.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Listbox</td>
<td class="s6">Muitas opções podem ser visíveis. O frame de seleção pode ser reduzido para alguns items de modo a ganhar espaço (permitindo scroll)</td>
<td class="s6">Todas as opções não estão disponíveis na tela, requerendo scroll. Usuário precisa de indicações de que a caixa permite múltiplas seleções. Requer muita destreza no uso de formulários. Pode oferecer desafios de acessibilidade.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Treeview</td>
<td class="s6">Muitas opções visíveis inicialmente, pode oferecer facilidades na cognição já que seus items estarão categorizados por níveis ou tipos (pastas)</td>
<td class="s6">Grande espaço utilizado na tela. Requer muita destreza no uso de formulários.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Listbuilder</td>
<td class="s6">Items selecionados são de fácil visualização. Pode permitir fácil expansão para escolha e ordenação de items. Lida facilmente com grandes listas.</td>
<td class="s6">Grande espaço utilizado na tela. Funciona bem para grandes listas com poucas seleções. Muitas seleções oferecem dificuldades na visualização.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Criando listas não ordenadas</td>
<td class="s5">Caixa com botão de adição/novo</td>
<td class="s6">Ação de adicionar registro é visível e óbvia para o usuário</td>
<td class="s6">Grande espaço utilizado na tela. Visualmente bagunçado quando usuário insere muitos items.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Criando listas não ordenadas</td>
<td class="s5">Caixa com edição in-place</td>
<td class="s6">Menor uso de tela. A adição é feita in-place, dentro da caixa</td>
<td class="s6">Ação de adição não é tão óbvia quanto a caixa com botão de adição</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Criando listas não ordenadas</td>
<td class="s5">Caixa com edição drag-n-drop</td>
<td class="s6">Visualmente elegante e de fácil entendimento, uma vez que arrastar é uma ação intuitiva</td>
<td class="s6">Necessita de indicações que mostram que na caixa existe uma área de arrastar.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Criando listas ordenadas</td>
<td class="s5">Caixa com botões acima/abaixo para ordenação</td>
<td class="s6">Ações de rearranjo sempre visíveis na página.</td>
<td class="s6">Grande espaço utilizado na tela.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Criando listas ordenadas</td>
<td class="s5">Caixa com drag-n-drop de items</td>
<td class="s6">Visualmente elegante e de fácil entendimento, uma vez que arrastar é uma ação intuitiva</td>
<td class="s6">Necessita de indicações que mostram que na caixa existe uma área de arrastar.</td>
</tr>
<tr>
<td class="s8" bgcolor="#3c78d8">Texto</td>
<td class="s9" bgcolor="#a4c2f4">Inputs para uma linha de texto</td>
<td class="s6">Textbox</td>
<td class="s6">&#8211;</td>
<td class="s6">&#8211;</td>
</tr>
<tr bgcolor="#eee">
<td class="s8" bgcolor="#3c78d8">Texto</td>
<td class="s10" bgcolor="#dfecf8">Múltiplas linhas de texto não formatado</td>
<td class="s6">Textarea</td>
<td class="s6">&#8211;</td>
<td class="s6">&#8211;</td>
</tr>
<tr>
<td class="s8" bgcolor="#3c78d8">Texto</td>
<td class="s9" bgcolor="#a4c2f4">Múltiplas linhas de texto formatado</td>
<td class="s6">Textarea que permite tags inline</td>
<td class="s6">Usuários avançados podem evitar o uso da toolbar inputando as tags diretamente</td>
<td class="s6">Não é realmente um editor WYSIWYG</td>
</tr>
<tr bgcolor="#eee">
<td class="s8" bgcolor="#3c78d8">Texto</td>
<td class="s9" bgcolor="#a4c2f4">Múltiplas linhas de texto formatado</td>
<td class="s6">Editor Rich text</td>
<td class="s6">Texto inputado já serve de preview.</td>
<td class="s6">Nao permite edição apenas pelo teclado. É necessário o uso da toolbar para adicionar as tags necessárias.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Números com qualquer tipo de formato</td>
<td class="s6">Textbox com máscaras</td>
<td class="s6">Visualmente elegante e permite qualquer tipo/formato de tipos de dado</td>
<td class="s6">Requer validação no back-end.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Números com qualquer tipo de formato</td>
<td class="s6">Textbox estruturado e com máscaras</td>
<td class="s6">Formato dos dados é explícito, facilitando preenchimento e entendimento do usuário</td>
<td class="s6">Pode requerer grande espaço na tela. Também não permite inputs diferentes dos previstos, mesmo que o usuário deseje isso.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Números com qualquer tipo de formato</td>
<td class="s6">Spinner</td>
<td class="s6">Permite input sem o uso de teclado caso deseje o usuário</td>
<td class="s6">Apenas uma opção é visualizada por vez. Requer muita destreza no uso de formulários e conhecimento deste elemento, pouco utilizado até o lançamento dos novos input types no HTML5. Pode oferecer desafios de acessibilidade a pessoas com deficiência, que preferem navegação pelo teclado ou ainda usuários com ponteiros (mouse) já que a área de clique é mínima.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s13" bgcolor="#ffd966">Números dentro de um limite pre-definido</td>
<td class="s6">Slider</td>
<td class="s6">Metáfora óbvia, valor é mostrado de acordo com a posição do marcador. Usuário não pode inputar números fora deste range</td>
<td class="s6">Pode requerer grande espaço na tela. Labels muito grandes podem se transformar em um problema também</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s13" bgcolor="#ffd966">Números dentro de um limite pre-definido</td>
<td class="s6">Spinner</td>
<td class="s6">Pouco espaço utilizado na tela, permite inputs direto pelo teclado e tambem via clique</td>
<td class="s6">Não é familiar para todos os usuários. Pode oferecer desafios de acessibilidade a pessoas com deficiência, que preferem navegação pelo teclado ou ainda usuários com ponteiros (mouse) já que a área de clique é mínima. Requer validação no back-end.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s13" bgcolor="#ffd966">Números dentro de um limite pre-definido</td>
<td class="s6">Textbox com validação pós-input</td>
<td class="s6">Familiar ao usuário, pouco espaço utilizado na tela, acesso via teclado.</td>
<td class="s6">Requer validação no back-end. Range não é visível para o usuário, requer indicações dos limites para input.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s13" bgcolor="#ffd966">Números dentro de um limite pre-definido</td>
<td class="s6">Slider com textbox</td>
<td class="s6">Permite inputs visuais(slide) e numéricos(input manual)</td>
<td class="s6">Complexo, requer validação dos inputs no textbox.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Criando um subrange dentro de um range maior</td>
<td class="s6">Slider duplo</td>
<td class="s6">Menor uso de tela quando comparado com 2 sliders.</td>
<td class="s6">Não é familiar para a maioria dos usuários. Problemas graves de acessibilidade porque não permite inputs via teclado.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Criando um subrange dentro de um range maior</td>
<td class="s6">2 Sliders</td>
<td class="s6">Utilização mais fácil que um slider duplo.</td>
<td class="s6">Grande espaço utilizado na tela. Problemas graves de acessibilidade porque não permite acesso via teclado.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Criando um subrange dentro de um range maior</td>
<td class="s6">2 Spinners</td>
<td class="s6">Pouco espaço utilizado na tela, permite inputs direto pelo teclado e tambem via clique</td>
<td class="s6">Não é familiar para todos os usuários. Requer validação no back-end. Não permite visualização do range maior.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Criando um subrange dentro de um range maior</td>
<td class="s6">Textbox com validação pós-input</td>
<td class="s6">Familiar para o usuário, ocupa menos espaço que sliders</td>
<td class="s6">Requer validação e é necessário informar o range de alguma maneira para o usuário.</td>
</tr>
<tr bgcolor="#eee">
<td class="s14" bgcolor="#6aa84f">Data / Horário</td>
<td class="s6">&#8211;</td>
<td class="s6">Textbox com máscaras</td>
<td class="s6">Visualmente simples, permite amplo range de formatos. Permite acesso via teclado</td>
<td class="s6">Requer validação back-end. Pode causar confusão no formato data/hora por não haver indicações explicitas.</td>
</tr>
<tr>
<td class="s14" bgcolor="#6aa84f">Data / Horário</td>
<td class="s6">&#8211;</td>
<td class="s6">Textbox estruturado e com máscaras</td>
<td class="s6">Formato dos dados é explícito, facilitando preenchimento e entendimento do usuário</td>
<td class="s6">Pode requerer grande espaço na tela. Também não permite inputs diferentes dos previstos, mesmo que o usuário deseje isso.</td>
</tr>
<tr bgcolor="#eee">
<td class="s14" bgcolor="#6aa84f">Data / Horário</td>
<td class="s6">&#8211;</td>
<td class="s6">Datepicker</td>
<td class="s6">Metáfora óbvia, calendário é exibido e a seleção do valor faz o input</td>
<td class="s6">Grande espaço utilizado na tela. Pode oferecer problemas de acessibilidade caso não se permita acesso via teclado.</td>
</tr>
</tbody>
</table>
<ol start="1">
<li>Seleções e listas:</li>
</ol>
<ul>
<li>Seleções binárias: sim/não, ativo/inativo, etc;</li>
<li>Escolha de <span class="c0">UM</span> item para <span class="c0">N</span> com poucas e muitas opções;</li>
<li>Escolha de <span class="c0">N </span>items para <span class="c0">N </span>com poucas e muitas opções;</li>
<li>Listas não-ordenadas;</li>
<li>Listas ordenadas.</li>
</ul>
<ol start="2">
<li>Texto:</li>
</ol>
<ul>
<li>uma linha de texto;</li>
<li>múltiplas linhas de texto não formatados e formatados</li>
</ul>
<ol start="3">
<li>Números:</li>
</ol>
<ul>
<li>com qualquer formato;</li>
<li>dentro de um range (limite);</li>
<li>subrange (sublimite);</li>
</ul>
<ol start="4">
<li>Data e hora.</li>
</ol>
<p>Use a tabela acima para escolher os melhores elementos de tela de acordo com sua necessidade. Você perceberá que as opções cobrem todas as necessidades atuais, alinhadas ao HTML5.</p>
<h3><a name="h.n0zdn6aco879"></a>Padrões para Elementos de Controle</h3>
<p>Os elementos de controle acima necessitam de padrões de funcionamento. Estes padrões mostram:</p>
<ol class="c13" start="1">
<li>Como combinar elementos;</li>
<li>definir relações estruturais entre elementos;</li>
<li>controlar mudanças de valores e como estes valores são alterados</li>
</ol>
<p>Alguns elementos de controle possuem requisitos de funcionamento que já estão aplicados ao elemento em si (spinners ou datepickers já possuem seu comportamento nativo no elemento graças ao HTML5). Outros necessitam de programação no back-end, seja para validação, seja para a criação de ranges, seja para outras necessidades específicas. Quanto mais versátil o elemento, maior a possibilidade de usá-los. Um bom exemplo seriam input type=”text” que com frequência possuem funcionalidades específicas, alem de aceitar <span class="c11">qualquer coisa textual.</span></p>
<ul>
<li><strong>Máscaras:</strong></li>
</ul>
<p>Máscaras permitem texto em qualquer formato ou sintaxe, fazendo com que o input do usuário seja interpretado de maneira inteligente, a medida que é digitado no campo.</p>
<p>Máscaras são usadas quando sua interface necessita de dados que usuários podem inputar usando qualquer tipo específico de conteúdo, porém não possuem a obrigação de conhecer estes formatos automaticamente:</p>
<ol class="c9" start="1">
<li>remover espaços,</li>
<li>inserir apenas números (ou texto),</li>
<li>texto sempre em caixa alta (ou caixa baixa),</li>
<li>abreviações, etc.</li>
</ol>
<p class="c4 c5">Usuários querem que a ação (submeter o formulário) aconteça, não querem (nem devem) se preocupar com formatos corretos e interfaces complexas. Jacob Nielsen já dizia que “Usabilidade na web passa pelo fato de que como desenvolvedores de interface, não podemos deixar o usuário pensar demais para fazer uma ação. Ele simplesmente tem que fazê-la de maneira cognitiva”. Máscaras podem inclusive remover a necessidade de <span class="c0">dicas no input</span> ou <span class="c0">dicas no prompt</span>.</p>
<ul>
<li><strong>Formato estruturado:</strong></li>
</ul>
<p>Estruturar um campo de input significa quebrar um campo em vários outros, de modo a facilitar o entendimento do que é esperado que o usuário faça. Um bom exemplo seria quebrar um campo <span class="c0">único</span> de CEP por exemplo em dois campos, um para os primeiros 5 números, e outro campo para os 3 restantes. Outros exemplos podem ser mencionados: <span class="c0">números de telefone</span>, <span class="c0">numeros de cartão de crédito</span> (cartões AMEX tem um numero de caracteres diferente de cartões VISA por exemplo).</p>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/image10.png"><img class="alignnone size-full wp-image-4407" src="http://tableless.com.br/wp-content/uploads/2011/10/image10.png" alt="" width="180" height="42" /></a></p>
<ul>
<li><strong>Fill-in-the-blanks:</strong> Combine um ou mais campos de modo a permitir que o usuário possa categorizar o que está inputando, facilitando a ação do usuário. Um bom exemplo seria um formulário de pesquisa em uma loja virtual:</li>
</ul>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/image07.png"><img class="alignnone size-full wp-image-4404" src="http://tableless.com.br/wp-content/uploads/2011/10/image07.png" alt="" width="534" height="169" /></a></p>
<p>Usar esta abordagem faz com que a interface seja auto-explicável. Ajuda ao usuário entender o que está acontecendo e o que foi pedido para ele.</p>
<ul>
<li><strong>Dicas no input:</strong> As dicas no input são importantes para fornecer um guideline ao usuário de como ele deve inputar valores dentro de um campo. O exemplo abaixo, retirado de um form do site dos correios para rastreamento de objetos ilustra bem isso.<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image08.png"><img class="alignnone size-full wp-image-4405" src="http://tableless.com.br/wp-content/uploads/2011/10/image08.png" alt="" width="315" height="98" /></a><br />
</span></li>
<li><strong>Placeholder no input:</strong> O placeholder é um texto adicionado <span class="c0">dentro</span> do input e que automaticamente desaparece quando o usuário posiciona o cursor da tela dentro do campo. Um bom exemplo pode ser visto no form de busca das páginas do portal globo.com.<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image01.png"><img class="alignnone size-full wp-image-4398" src="http://tableless.com.br/wp-content/uploads/2011/10/image01.png" alt="" width="464" height="93" /></a><br />
</span></li>
<li><strong>Auto complete:</strong> O nome é auto-explicativo. A medida que o usuário vai digitando caracteres, os termos são auto-completados, fazendo com que o input seja mais rápido caso o resultado esteja disponível no índice usado. Veja o form de search no site do google.com.br<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image01.png"><img class="alignnone size-full wp-image-4398" src="http://tableless.com.br/wp-content/uploads/2011/10/image01.png" alt="" width="464" height="93" /></a><br />
</span></li>
<li><strong>Dropdown chooser:</strong> Dropdowns podem ser usadas para acomodar seleções que podem utilizar um grande espaço na tela quando expandidas, porém não tem a necessidade direta de deixar todas as opções disponíveis (que usualmente são muitas). Um bom exemplo é a dropdown de seleção de cores no Google Docs.<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image09.png"><img class="alignnone size-full wp-image-4406" src="http://tableless.com.br/wp-content/uploads/2011/10/image09.png" alt="" width="214" height="291" /></a><br />
</span></li>
<li><strong>Seleção ilustrada:</strong> Em alguns casos descrever a opção não é suficiente. É necessário ilustrá-la com uma imagem para facilitar a seleção do usuário. Um bom exemplo é esta dropdown de seleção de papel de parede disponível no site do livro Designing with Progressive Enhancement.<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image03.png"><img class="alignnone size-full wp-image-4400" src="http://tableless.com.br/wp-content/uploads/2011/10/image03.png" alt="" width="199" height="210" /></a><br />
</span></li>
<li><strong>List Builder:</strong> Quando você precisa criar uma lista de items oriundos de uma outra lista, o listbuilder é o padrão ideal a ser usado. Duas textareas e programação fazem com que valores possam ser adicionados ou removidos, além de também poderem ser ordenados facilmente. Veja este exemplo de listbuilder para a configuração de uma toolbar:</li>
</ul>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/image02.png"><img class="alignnone size-full wp-image-4399" src="http://tableless.com.br/wp-content/uploads/2011/10/image02.png" alt="" width="541" height="209" /></a></p>
<ul>
<li><strong>Mensagens de erro:</strong><br />
Quando o usuário faz algo correto ele recebe um feedback de sucesso, informando que o formulario foi submetido sem problemas. Mas também é necessário informar de maneira clara quando algo dá errado. Mensagens de erro podem ser customizadas de modo a evitar deixar o usuário “no escuro” quando algum erro acontece. Campos obrigatórios precisam de validação (agora mais simples com o atributo <span class="c0">required </span>presente no HTML5), mas podem acontecer outros erros que necessitam de feedback claro para indicar quais os próximos passos a seguir.</li>
</ul>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/image06.png"><img class="alignnone size-full wp-image-4403" src="http://tableless.com.br/wp-content/uploads/2011/10/image06.png" alt="" width="262" height="174" /></a></p>
<p>Você pode usar o poster abaixo como referência para criar suas interfaces. Clique na imagem para vê-la em uma maior resolução.</p>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/elementos-de-controleBIG.png"><img class="alignnone size-full wp-image-4411" src="http://tableless.com.br/wp-content/uploads/2011/10/elementos-de-controleSMALL.png" alt="" width="600" height="447" /></a></p>
<p><strong>Na próxima semana, com a Parte 2, a abstração dá o lugar ao código para saber como montar os items que você selecionou para montar seus formulários, transformando os dois posts em um toolkit para o dia-a-dia. Namastê!</strong></p>
<h3><span class="c0 c17">Referências</span></h3>
<ol class="c13" start="1">
<li>Metawebdesign &#8211; Quando o Front-end se encontra com a experiência do usuário: <a href="http://www.slideshare.net/AlyssonFranklin/metawebdesign-frontend">http://www.slideshare.net/AlyssonFranklin/metawebdesign-frontend</a></li>
<li>O Metawebdesign &#8211; <a href="http://metawebdesign.org">http://metawebdesign.org</a></li>
<li>Designing Interfaces &#8211; Second Edition (Jenifer Tidwell- O&#8217;Reilly books) <a href="http://designinginterfaces.com/">http://designinginterfaces.com/</a></li>
<li>Top-down e bottom-up design:  <span class="c8"><a href="http://en.wikipedia.org/wiki/Top%E2%80%93down_and_bottom%E2%80%93up_design">http://en.wikipedia.org/wiki/Top%E2%80%93down_and_bottom%E2%80%93up_design</a></span></li>
<li>Everybody lies, uma frase do House: <span class="c8"><a href="http://www.youtube.com/watch?v=nNOExDrsdbg">http://www.youtube.com/watch?v=nNOExDrsdbg</a></span></li>
<li>W3C sobre formulários: <span class="c8"><a href="http://www.w3.org/TR/html4/interact/forms.html#h-17.1">http://www.w3.org/TR/html4/interact/forms.html#h-17.1</a></span></li>
<li><span class="c8"><a href="http://www.mhavila.com.br/topicos/web/controles.html">http://www.mhavila.com.br/topicos/web/controles.html</a></span></li>
<li>Spinner: <span class="c8"><a href="http://www.jgeppert.com/jquery-spinner/">http://www.jgeppert.com/jquery-spinner/</a></span></li>
<li>A Form of madness: <span class="c8"><a href="http://diveintohtml5.org/forms.html">http://diveintohtml5.org/forms.html</a></span></li>
<li>Responsive webdesign: <span class="c8"><a href="http://www.alistapart.com/articles/responsive-web-design/">http://www.alistapart.com/articles/responsive-web-design/</a></span></li>
<li>Composição de um time multidisciplinar de UX - <a href="http://itweb.com.br/blogs/a-composicao-de-um-time-multidisciplinar-de-ux/">http://itweb.com.br/blogs/a-composicao-de-um-time-multidisciplinar-de-ux/</a></li>
<li>UX Team of One - <a href="http://www.slideshare.net/ugleah/how-to-be-a-ux-team-of-one">http://www.slideshare.net/ugleah/how-to-be-a-ux-team-of-one</a></li>
</ol>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/o-que-e-nova-usabilidade-parte2/" title="Você sabe o que é a “nova usabilidade”? – parte II">Você sabe o que é a “nova usabilidade”? – parte II</a></li><li><a href="http://tableless.com.br/usabilidade-interfaces-dispositivos-moveis-parte2/" title="Usabilidade de interfaces para dispositivos móveis – parte II">Usabilidade de interfaces para dispositivos móveis – parte II</a></li><li><a href="http://tableless.com.br/estabelecendo-uma-metodologia-agil-para-avaliacao-de-usabilidade/" title="Estabelecendo uma metodologia ágil para avaliação de usabilidade">Estabelecendo uma metodologia ágil para avaliação de usabilidade</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/formularios-e-o-metawebdesign-parte-1/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Quando utilizar (ou não) frameworks CSS</title>
		<link>http://tableless.com.br/quando-utilizar-ou-nao-frameworks-css/</link>
		<comments>http://tableless.com.br/quando-utilizar-ou-nao-frameworks-css/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 13:08:36 +0000</pubDate>
		<dc:creator>Talita Pagani</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[css layout]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[modularizacao css]]></category>
		<category><![CDATA[tecnicas css]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4048</guid>
		<description><![CDATA[A utilização de frameworks HTML e/ou CSS ainda é um assunto que divide a opinião dos desenvolvedores.]]></description>
			<content:encoded><![CDATA[<p>Framework é um conjunto de componentes que provêm uma estrutura básica de elementos reutilizáveis, tendo uma arquitetura consistente de funcionalidade genérica sob a qual a aplicação será construída.</p>
<p>No caso de CSS, os frameworks constituem bibliotecas que visam permitir a codificação do CSS de modo mais fácil e compatível com padrões de estilos, agregando uma série de opções já prontas para projetar uma página web, como se fosse um esqueleto, reduzindo o tempo gasto com o desenvolvimento.</p>
<p>Os frameworks CSS geralmente apresentam definições de formatação os elementos mais comuns de uma página: formulários, cabeçalhos, estilos de textos e imagens. Alguns apresentar opções para a estruturação do conteúdo baseado em <em>grids</em>.</p>
<p>A utilização de frameworks HTML e/ou CSS ainda é um assunto que divide a opinião dos desenvolvedores, pois muitos consideram o framework como uma <strong>solução pronta </strong>e acreditam que ele tira o trabalho das mãos do designer/desenvolvedor e faz com que ele não aprimore os seus conhecimentos.</p>
<p><strong>Será que você, sem perceber, nunca criou o seu próprio framework?</strong> Pense em um arquivo CSS padrão (além do <em>reset</em>) que você criou para melhorar a produtividade de seus projetos.</p>
<p>É importante esclarecer que o uso de frameworks <strong>não substitui</strong> a necessidade do designer/ desenvolvedor de desenvolver o CSS do site. Ele apenas fornece uma base para a formatação de elementos comuns e otimiza o trabalho repetitivo.</p>
<h2>Para quem os frameworks são recomendados</h2>
<p>Utilizar um framework CSS não é uma prática recomendada para quem está começando, principalmente por privar a pessoa da prática e do conhecimento sobre o funcionamento do CSS. Além disso, se ela não compreender bem CSS, poderá ter problemas para resolver problemas de layout causados por incompatibilidade entre o framework e um código CSS específico que ela inseriu.</p>
<p>Portanto, é recomendável que frameworks sejam utilizados por quem possui um nível razoável de conhecimento e compreensão do código, mas tem a intenção de otimizar parte do trabalho com o uso de um framework. E isto serve não apenas para quem pretende utilizar um framework CSS, mas também qualquer tipo de framework.</p>
<h2>Quando é interessante utilizar?</h2>
<ul>
<li>Prototipação rápida em HTML</li>
<li>Sites de larga escala e com estruturas similares (como portais, blog/sites no estilo magazine)</li>
<li>Sites construídos através de plataformas de CMS</li>
<li>Projetos que tenham prazos curtos</li>
<li>Projetos realizados em equipe onde há diversas pessoas trabalhando no mesmo CSS, podendo ter um conjunto consistente de padrões de codificação</li>
</ul>
<h3>Vantagens</h3>
<ul>
<li>Padronização de código entre a equipe de desenvolvimento;</li>
<li>Arquivos modularizados;</li>
<li>Flexibilidade de estilos, classes genéricas que podem ser combinadas de diversas formas nos elementos da página;</li>
<li>Geralmente já possuem uma documentação, que pode ser consultada pela equipe em caso de dúvida ou necessidade de solucionar algum problema;</li>
<li>Compatibilidade cross-browser (na maioria dos casos);</li>
<li>Você pode melhorar suas habilidades estudando o framework;</li>
<li>Redução de tempo: o desenvolvedor/designer pode se concentrar mais nos aspectos particulares do site desenvolvido, pois a base está assegurada e não precisa desenvolvê-la do zero;</li>
<li>Reduz futuros esforços de manutenção caso seja necessário resposicionar elementos ou alterar características de renderização (fonte, margens, etc) em diversos elementos.</li>
</ul>
<h3>Desvantagens</h3>
<ul>
<li>Quantidade excessiva de modificações que devem ser feitas para adaptar o framework;</li>
<li>O framework pode conter códigos irrelevantes que nunca serão utilizados no projeto e serão carregados sem necessidade, podendo diminuir o desempenho da página;</li>
<li>Nem sempre o código é bem organizado;</li>
<li>Muitos frameworks apresentam classes pouco semânticas (ex.: span-5).</li>
</ul>
<h2>Algumas dicas para melhorar o uso do framework</h2>
<p>Como as classes geralmente não apresentam muita semântica, procure colocar IDs significativos nos elementos da página, quando possível.</p>
<p>Você também pode optar por utilizar somente uma parte do framework. Em projetos em que utilizei o <a title="Blueprint CSS" href="http://www.blueprintcss.org/" target="_blank">Blueprint CSS</a>, muitas vezes utilizava apenas algumas folhas de estilos do framework que se adequavam ao que eu necessitava.</p>
<p><strong>Dica:</strong> evite usar vários frameworks CSS em um mesmo projeto. Isto quebra a ideia de consistência, uma vez que cada framework tem o seu padrão de estruturação.</p>
<h2>Como escolher o framework?</h2>
<ul>
<li>Verificar se é realmente necessário o uso de um framework CSS no projeto;</li>
<li>Avaliar se o código do framework escolhido tem uma estrutura e organização;</li>
<li>Avaliar se há código excessivo que nunca será utilizado;</li>
<li>Conferir se há uma boa documentação;</li>
<li>Verificar se os recursos do framework são adequados ao que você necessita para o projeto. Não adianta utilizar um framework CSS focado em renderização quando seria mais útil um framework de grid.</li>
</ul>
<p>Frameworks CSS, se bem utilizados, podem trazer muitos benefícios para seus projetos, basta saber como explorar o potencial que eles possuem <img src='http://tableless.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Referências</h3>
<p>Why you should NOT use a web framework - <a href="http://checkedexception.blogspot.com/2010/04/why-you-should-not-use-web-framework.html">http://checkedexception.blogspot.com/2010/04/why-you-should-not-use-web-framework.html</a></p>
<p>To use a framework, or not to: that is the question - <a href="http://www.phparch.com/2010/04/to-use-a-framework-or-not-to-that-is-the-question/">http://www.phparch.com/2010/04/to-use-a-framework-or-not-to-that-is-the-question/</a></p>
<p>Please do not Use CSS Frameworks - <a href="http://mondaybynoon.com/2007/08/27/please-do-not-use-css-frameworks/">http://mondaybynoon.com/2007/08/27/please-do-not-use-css-frameworks/</a></p>
<p>Which CSS Grid Framework Should You Use for Web Design? - <a href="http://net.tutsplus.com/tutorials/html-css-techniques/which-css-grid-framework-should-you-use-for-web-design/">http://net.tutsplus.com/tutorials/html-css-techniques/which-css-grid-framework-should-you-use-for-web-design/</a></p>
<p>When to use CSS framework? - <a href="http://www.vcarrer.com/2008/08/when-to-use-css-framework.html">http://www.vcarrer.com/2008/08/when-to-use-css-framework.html</a></p>
<p>WHAT’S NOT TO LOVE ABOUT CSS FRAMEWORKS? - <a href="http://jeffcroft.com/blog/2007/nov/17/whats-not-love-about-css-frameworks/">http://jeffcroft.com/blog/2007/nov/17/whats-not-love-about-css-frameworks/</a></p>
<p>Frameworks for Designers - <a href="http://www.alistapart.com/articles/frameworksfordesigners">http://www.alistapart.com/articles/frameworksfordesigners</a></p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/biblioteca-css-ou-framework/" title="Biblioteca CSS ou Framework?">Biblioteca CSS ou Framework?</a></li><li><a href="http://tableless.com.br/escalabilidade-client-side/" title="Escalabilidade client-side">Escalabilidade client-side</a></li><li><a href="http://tableless.com.br/digest-0409-css-html-e-layout/" title="Digest 04/09: CSS, HTML e Layout">Digest 04/09: CSS, HTML e Layout</a></li><li><a href="http://tableless.com.br/criando-um-menu-horizontal-com-css/" title="Criando um Menu Horizontal com CSS">Criando um Menu Horizontal com CSS</a></li><li><a href="http://tableless.com.br/css-frameworks-ou-como-desaprender-css/" title="CSS Frameworks ou como desaprender CSS">CSS Frameworks ou como desaprender CSS</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/quando-utilizar-ou-nao-frameworks-css/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Nem só de client-side vive um site</title>
		<link>http://tableless.com.br/nem-so-de-client-side-vive-um-site/</link>
		<comments>http://tableless.com.br/nem-so-de-client-side-vive-um-site/#comments</comments>
		<pubDate>Sun, 28 Aug 2011 12:54:24 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[acessibilidade]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[revistawide]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=2859</guid>
		<description><![CDATA[É errado pensar que apenas por que você escreveu código HTML semântico seu site aparecerá em primeiro no Google ou ficará mais acessível para deficientes visuais. O código client-side é apenas a porta de entrada para uma série de outras pendências.
]]></description>
			<content:encoded><![CDATA[<p><small>Artigo publicado originalmente na revista Wide em Janeiro/Fevereiro de 2011.</small></p>
<p>Estou feliz porque o mercado de client-side tem amadurecido de forma inteligente no Brasil. Empresas mais espertas entenderam a importância do código HTML/CSS/ JavaScript bem escrito. O problema é que grande parte das empresas, clientes e desenvolvedores acham que o trio HTML/CSS/JavaScript faz milagres. É certo pensar que um código bem escrito traz grandes vantagens para o projeto, mas ele sozinho não faz milages.</p>
<p>É errado pensar que apenas por que você escreveu código HTML semântico seu site aparecerá em primeiro no Google ou ficará mais acessível para deficientes visuais. O código client-side é apenas a porta de entrada para uma série de outras tarefas.</p>
<h3>SEO</h3>
<p>Para criar um projeto de SEO é preciso seguir uma série de etapas que formam um grande pacote e que só então é possível perceber as vantagens do trabalho do SEO.<br />
O código client-side entrará como uma pequena parte do esforço. De forma bem simples, podemos listar alguns pontos importantes que precisamos tomar atenção além do HTML bem feito:</p>
<ul>
<li>Estudo de concorrentes;</li>
<li>Definição de diagramação e quantidade de texto nas diversas partes do site;</li>
<li>Estudo de palavras chave e termos de uso;</li>
<li>Planejamento de landing pages, entradas e saídas;</li>
<li>Criação de robot.txt e sitemap.xml;</li>
<li>Monitoramento de palavras, visitação e buscadores;</li>
<li>Estudo de funil e preparação de goals;</li>
</ul>
<p>Eu não sou um especialista do Google nem nada do gênero, mas sei que estes tópicos são importantes ao manter ou criar um website otimizado. O HTML certamente faz parte destes tópicos, mas ele não invalida nenhum dos outros pontos.<br />
Obviamente não adianta nada fazer um bom estudo de palavraschave e marcá-las de forma errada com HTML.</p>
<h3>Acessibilidade</h3>
<p>Como em projetos de SEO, o planejamento de Acessibilidade precisa de uma série de etapas funcionar corretamente. No caso da acessibilidade o HTML ocupa um grau de importância muito grande, contudo, há pequenos pontos que o HTML não pode resolver sozinho. Veja alguns exemplos:</p>
<ul>
<li>Contraste e cores do layout;</li>
<li>Estudo de atalhos de teclado;</li>
<li>Menu de navegação rápida;</li>
<li>Textos em tooltips, titles, alts de imagens etc;</li>
<li>Tamanho de botões e textos;</li>
<li>Arquitetura de Informação sensata e simples;</li>
</ul>
<p>Embora algumas das tarefas sejam resolvidas com HTML/CSS, as definições e metas são pensadas pelos desenvolvedores. Qual cor, tamanho de botões e etc são decididos pelo designer e não pelo HTML. Não é incomum acharmos que apenas porque o site tem um código bem estruturado e semântico ele será bem acessado por cegos com leitores de tela ou pessoas com outro tipo de necessidade. Há tópicos que se dependem meramente do bom senso.</p>
<p>Se analisarmos bem as disciplinas de Acessibilidade, Usabilidade e Arquitetura de Informação, perceberemos que elas comandam a forma com que o trio HTML/CSS/Javascript devem se comportar. Há várias etapas e decisões que tomamos antes de colocarmos a mão no código. Cada um tem sua importância. Muitos erros de HTML podem ser evitados com um planejamento de Arquitetura de Informação. Muito código CSS pode ser otimizado estudando os wireframes do projeto.</p>
<p>Lembre-se de que o HTML/CSS/Javascript serve o conteúdo e não contrário. Eles devem trabalhar para que a informação seja bem exibida, formatada e que chegue integralmente para o usuário.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/experiencia-cross-device/" title="Experiência cross-device">Experiência cross-device</a></li><li><a href="http://tableless.com.br/drops-5-responsabilidade-dev-front-end/" title="Drops 5 &#8211; Responsabilidade Dev Front-end">Drops 5 &#8211; Responsabilidade Dev Front-end</a></li><li><a href="http://tableless.com.br/melhorando-performance-css/" title="Performance do seu CSS">Performance do seu CSS</a></li><li><a href="http://tableless.com.br/convertidos-tableless/" title="Convertidos do Tableless">Convertidos do Tableless</a></li><li><a href="http://tableless.com.br/drops3-modular-css/" title="Drops 3 &#8211; Duas formas de modular seu CSS">Drops 3 &#8211; Duas formas de modular seu CSS</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/nem-so-de-client-side-vive-um-site/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Introdução ao Responsive Web Design</title>
		<link>http://tableless.com.br/introducao-ao-responsive-web-design/</link>
		<comments>http://tableless.com.br/introducao-ao-responsive-web-design/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 13:00:03 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[Acessibilidade]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Internet Móvel]]></category>
		<category><![CDATA[Tecnologia e Tendências]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[dispositivos moveis]]></category>
		<category><![CDATA[internetmovel]]></category>
		<category><![CDATA[mobiles]]></category>
		<category><![CDATA[mobilidade]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4029</guid>
		<description><![CDATA[Responsive Web Design é um nome bonito para um conceito antigo. Hoje seus usuários utilizam diversos dispositivos e meios de acesso para encontrar informação. Saiba como podemos entregar informação de forma eficaz e inteligente.]]></description>
			<content:encoded><![CDATA[<p>Você já deve ter ouvido falar sobre Responsive Web Design. Você pode ler sobre isso <a href=" http://bit.ly/pcrwxY">aqui</a> e <a href=" http://bit.ly/mSCRSD ">aqui</a>.<br />
Até pouco tempo atrás tínhamos praticamente apenas um meio de acessar a internet, que era pelo desktop. Podíamos acessar mal e porcamente a internet pelos celulares ou por outros aparelhos ligados a televisão etc, mas nenhum destes meios nos permitia acessar a internet com a facilidade que tínhamos quando utilizávamos um desktop. <br />
Hoje o cenário é totalmente diferente. Os smartphones tomaram conta. Até mesmo os celulares mais simples dispõem de browsers altamente eficazes e se não há algum browser instalado, o usuário pode facilmente baixar o <a href="http://www.opera.com/mobile/">Opera Mobile</a>. Há também as Tablets, que demoraram para aparecer, mas agora trazem flexibilidade para usuários que querem algo mais prático que um notebook e mais confortável que um smartphone. Não vai demorar muito para aparecer outros aparelhos diferentes ou que você acesse sem restrições a internet pela sua TV.  </p>
<p>Quando não restringimos os cenários a aparelhos temos um horizonte muito maior e mais frutífero. Entenda que a informação publicada na web pode e é totalmente reutilizada a qualquer momento. O Google faz isso com seu robô todos os dias, a todo momento. O robô do Google ou o de qualquer outro sistema de busca é um meio de acesso. O leitor de tela do usuário deficiente visual também é um meio de acesso. O leitor de RSS utilizado pelo seu celular, por mais simples que seja, é um meio de acesso. Podemos dizer então que qualquer dispositivo que o usuário utilize para consumir informação na web é um meio de acesso. Esse &#8220;qualquer coisa&#8221; pode ser um robô ou um sistema manipulado pelos visitantes de seu site.</p>
<h3>O que é Responsive Web Design</h3>
<p>Responsive Web Design é acima de tudo um conceito. Nós nos responsabilizamos a apresentar a informação de forma acessível e confortável para diversos meios de acesso. Muitos websites restringem o conceito a aparelhos com telas de diversos tamanhos, mas o conceito é muito mais abrangente. </p>
<p>Mesmo assim irei restringir os primeiros exemplos a dispositivos que tenham telas e que estão mais presentes atualmente. Não irei me estender muito a meios de acesso como leitores de tela, robôs de busca ou outros dispositivos.</p>
<h3>O problema de entregar conteúdo em diversos formatos</h3>
<p>Para fazer um website que seja acessível por qualquer dispositivo você geralmente tenta detectar o aparelho que o usuário está utilizando. Se for um desktop ou um notebook, você redireciona o acesso para um código CSS que formata seu site para o design mais confortável em grandes monitores. Se você detectar que o usuário está utilizando um dispositivo móvel, você o redireciona para uma versão que formatará o site para um formato compatível para este dispositivo. <br />
Essa ideia é simples e foi efetiva por algum tempo quando utilizávamos <a href=" http://bit.ly/r6Vr3P ">Media Types</a> do CSS. <br />
Com o advento dos novos aparelhos como tablets, smartphones e até mesmo as televisões LED e LCD, essa técnica se tornou muito obsoleta. <br />Entenda porque: os media types detectavam algumas características dos meios de acesso, por exemplo o valor <strong>handheld</strong> filtrava aparelhos com telas de tamanho pequeno e conexão com a internet  limitada. O valor <strong>screen</strong>, filtrava aparelhos com telas coloridas, normalmente terminais com monitores.<br />
Entende porque estas características estão obsoletas ou se confundem com a quantidade de aparelhos existentes? Hoje 100% dos smartphones suportam resoluções de tela maiores e com acesso a um número ilimitado de cores que os monitores antigos. Quase nenhum celular tem telas pequenas e conexão limitada com a internet. Logo, estes parâmetros ficaram totalmente inúteis.</p>
<p>Para termos uma ideia melhor, a tela do iPhone e do iPad suportam resoluções muito maiores do que os monitores antigos. Lembro que utilizava em meu antigo monitor de 13&#8221; resolução de 800&#215;600. A resolução do iPad é de 1024&#215;768 com 132ppp. Meu monitor de 13&#8221; até chegava nessa resolução, mas daquele jeito porco. Até o iPhone tem uma resolução melhor: 960&#215;640.</p>
<p>Agora entenda a regra primordial, que deve guiar todo o planejamento de design para diversos dispositivos: O que importa é a resolução e não o tamanho da tela.</p>
<p>Sabendo dessa regra, entenda que você não faz um layout para um determinado tipo de dispositivo, mas para aparelhos que tem uma determinada resolução.  Um exemplo clássico é o site do Itaú. Eles tem uma equipe sensacional e muito pioneira. Eu consigo acessar perfeitamente o bankline por disversos dispositivos. Mas há um problema. Troquei meu smartphone Android recentemente por um Windows Phone. Eles tem as mesmas características. Mas quando entrei no bankline do Itaú, curiosamente fui redirecionado para a versão WAP do bankline. Com um bom desenvolvedor que sou, não me conformei e peguei emprestado o iPhone da minha mulher, copiei o endereço que o site redireciona os usuários do iPhone e o utilizei no meu Windows Phone. Voilá! Mesma interface, mesma usabilidade, mesmo design.<br />
Eles detectaram o tipo de aparelho e não as características do aparelho. </p>
<p>Para nos ajudar a detectar as características dos aparelhos, bem como a resolução, utilizamos as Media Queries em detrimento aos Media Types.</p>
<h3>Media Queries</h3>
<p>Media Queries é a utilização de <a href=" http://bit.ly/qUeFq6 ">Media Types</a> com uma ou mais expressões envolvendo características de uma media para definir formatações para diversos dispositivos.</p>
<p>Em Media Types há um valor chamado SCREEN, como já vimos anteriormente. Este valor é utilizado quando queremos direcionar uma determinada formatação para aparelhos que tem telas coloridas. Bom, telas coloridas é algo muito genérico, qualquer coisa hoje em dia tem telas coloridas. É aí que as Media Queries nos ajudam: além de identificar aparelhos com telas coloridas, você consegue definir um range de tamanho de tela para que aquele CSS possa ser ativado.<br />
Veja um código de exemplo abaixo:</p>
<div class="codecolorer-container html4strict mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/link.html"><span style="color: #000000; font-weight: bold;">link</span></a> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;estilo.css&quot;</span> <span style="color: #000066;">media</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;screen and (color)&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></div></td></tr></tbody></table></div>
<p>Você já deve ter percebido o porque do QUERIES no nome. Você cria queries no valor do atributo <strong>media</strong> o elemento LINK.<br />
Neste exemplo, estamos capturando terminais com montiores e coloridos. Você pode capturar outros terminais com alguma saída visual, mas pode ser que o usuário esteja utilizando algum aparelho com saída de monitor monocromático, por isso temos que especificar o COLOR no valor.</p>
<p>Outro exemplo, onde restringimos a largura máxima da tela:</p>
<div class="codecolorer-container html4strict mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/link.html"><span style="color: #000000; font-weight: bold;">link</span></a> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;smartphones.css&quot;</span> <span style="color: #000066;">media</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;screen and (max-width:480px)&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></div></td></tr></tbody></table></div>
<p>Aqui estamos direcionando o código CSS para aparelhos que tenham uma largura máxima de tela de 480px. Ou seja, qualquer aparelho que tenha essa largura de tela, deverá utilizar o código CSS que está no arquivo especificado.</p>
<p>É aqui que a diversão começa: com essas queries você define uma série de ranges de larguras de tela, separando uma versão de CSS para cada grupo de aparelhos que se enquadradam nestas descrições. Você faz um formato para grandes telas, outro para telas de tablets e outro para telas de smartphones.</p>
<p>E lá vem uma pergunta para você: as telas dos Tablets hoje em dia utilizando uma resolução de 1024&#215;768. Muitos usuários utilizam esta mesma resolução de tela em seus computadores, com monitores maiores que as tablets. Como faz?</p>
<p>Entenda: se você criou uma versão  adaptável, confortável para resoluções de 1024&#215;768, pensando em tablets, será que essa mesma versão não seria confortável para monitores com essa resolução? E vice-versa. Se você definiu que a versão desktop será carregada a partir de uma largura de tela de 1000px. As tablets também verão essa versão. Lembre-se o que realmente importa é o tamanho da tela dos aparelhos, não o aparelho em si. Quando você especifica o aparelho, você limita os usuários, quando você específica a resolução, você amplia o número possíveis de visitantes.</p>
<p>Além do mais, vendo estatísticas por aí, a resolução de 1024&#215;768 está decaindo muito rápido. Com as novas TVs e novos monitores, as resoluções de tela tem aumentado bastante, levando todos a um novo patamar.<br />
O que nos leva ao próximo assunto.</p>
<h3>Outras decisões de interface</h3>
<p>O primeiro passo foi identificar os aparelhos e usuários que utilizam determinadas resoluções para conseguirmos entregar um CSS específico.<br />
O segundo passo é fazer com que o layout seja amigável. Para isso você precisa entender os dilemas dos seus layouts e resolvê-los sem que o design mude da água para o vinho, mantendo as mesmas características e histórias de uso. Para tanto você precisa estudar e aplicar algumas premissas em seu website. Vou mostrar alguns pontos aqui, mas cada projeto terá uma abordagem diferente.</p>
<h4>Layout fluido</h4>
<p>Layouts fluidos estão sendo utilizados desde os primórdios, mesmo assim de uma forma muito restrita porque dependendo do tamanho do site são bem difíceis de planejar. Veja o site da Amazon, ele ocupa todo o espaço do navegador e seu tamanho é adequado até uma determinada largura de tela. </p>
<p>O <a href="http://bit.ly/mSCRSD">A List a Part</a> tem um exemplo ótimo, por isso não vou fazê-lo perder tempo vendo outro exemplo. <a href=" http://www.alistapart.com/d/responsive-web-design/ex/ex-site-mini.html ">Veja este layout</a> com a tela maximizada e vá diminuindo a janela do seu browser e veja os efeitos.</p>
<p>Perceba ele se encaixa em qualquer tipo de tela. Dessa forma você entregou uma boa experiência de design para todos os públicos. Este é um ótimo exemplo para entender exatamente o que é Responsive Web Design.<br />
Quer <a href="http://www.bryanjamesdesign.co.uk/">outro ótimo exemplo</a>? Neste caso o designer mostra uma mensagem para o usuário, o alertando de que o site é melhor visualizado em grandes resoluções.</p>
<h4>Adaptando menus</h4>
<p>Menus de websites são indispensáveis. É por lá que o usuário descobre todos os segredos do seu website, por onde ele se apaixona ou se perde. O menu é um dos principais elementos do seu website. É muito comum que usemos menus na horizontal. E como você sabe, menus na horizontal não são quase impossíveis em telas pequenas como as dos smarphones. Ainda mais se você tiver uma grande quantidade de opções. Logo, você precisa adaptar se menu para que ele continue usável e ao mesmo tempo não ocupe tanto espaço na tela.</p>
<p>Há diversos caminhos que você pode tomar: você pode transformar o menu em um selectbox (ou combobox, como preferir), sumir com alguns ítens que podem não ser interessantes para usuários de mobiles ou reformatar seu design para que ele caixa de forma funcional em telas pequenas.</p>
<p>Veja alguns exemplos abaixo. Entre no site e diminua a janela do browser para ver os efeitos. Se preferir ver na vida real, visite o site pelo seu smartphone:</p>
<ul>
<li><a href=" http://www.highwayhurricanes.com/"> http://www.highwayhurricanes.com/</a></li>
<li><a href="http://www.citychoir.org.uk/">http://www.citychoir.org.uk/</a></li>
<li><a href="http://leica-explorer.com/">http://leica-explorer.com/</a></li>
</ul>
<h4>Diminuindo ou trocando imagens</h4>
<p>Não se preocupe se seu website trabalha utilizando grandes imagens, você trocar ou diminuir as imagens para que caibam em telas menores. Veja os exemplos abaixo:</p>
<ul>
<li><a href="http://www.ciscolondon2012.com/">http://www.ciscolondon2012.com/</a></li>
<li><a href="http://www.cujo.jp/">http://www.cujo.jp/</a></li>
<li><a href="http://spartanrobotics.org/">http://spartanrobotics.org/</a></li>
<li><a href="http://1pictureaday.com/">http://1pictureaday.com/</a></li>
</ul>
<h4>Media Queries &#8211; A Collection of sites using media queries</h4>
<p>Todos os exemplos de website que mostrei acima, retirei <a href="http://mediaqueri.es/">deste website</a>. A ideia é genial!<br />
O <a href="http://mediaqueri.es/">http://mediaqueri.es/</a> tem uma coleção impressionante de websites que utilizam de forma responsável as Media Queries. Veja os exemplos e entenda como você pode fazer um website adaptável para diversos cenários de uso.</p>
<h3>Cada meio de acesso tem sua característica</h3>
<p>Conversamos bastante sobre o problema das resoluções e larguras de tela. Mas no começo deste post eu disse que o Responsive Web Design pode ir muito além das telas e Media Queries. Há usuários podem visitar seu site e não utilizar uma tela, tablet ou smartphone. Em vez de ler as informações ele pode ouvi-las, como é o caso dos usuários de leitores de tela. </p>
<h4>CSS Aural</h4>
<p>Quero que você abra sua mente e entenda que mesmo você não tenho deficiencia visual, você pode ser um grande candidato a utilizar leitores de tela. Enganam-se aqueles que acham que programas que leem a tela só podem ser usados por pessoas com problemas de visão. E se você estiver dirigindo ou em qualquer outra situação em que não pode ficar o tempo inteiro com o celular na mão, mas mesmo assim quer ler um determinado artigo, site etc, como você faz? Nunca pensou em ouvir o artigo? Pois é.</p>
<p>Eu sei que os sistemas de leitura de tela hoje em dia precisam de uma repaginada total. Mas empresas como Apple  e Microsoft já estão fazendo isso para que seus sistemas mobiles e para desktops tenham a habilidade de ler bem as telas dos dispositivos. Isso é impressionante.</p>
<p>Se a informação vai ser consumida dessa forma ela precisa ser formatada também. Isso mesmo, formataremos o áudio! Como? Com <a href=" http://bit.ly/o25mf6">CSS Aural</a>.</p>
<p>O CSS Aural praticamente controla como o audio do leitor de tela irá se comportar. Você pode controlar volume, tipo da voz, qual caixa a voz sairá etc.<br />
Imagine que você tenha um artigo sobre uma entrevista, onde há o entrevistador e o entrevistado. Você pode: especificar que a voz do entrevistador sairá na caixa da esquerda e a do entrevistado na caixa de som da direita. Que a voz do entrevistador será masculina e que voz do entrevistador será feminina.<br />
Sensacional, não é?</p>
<h4>Especificação Touchscreen</h4>
<p>Já falei sobre a <a href="http://bit.ly/mGTiUF">Específicação Touchscreen</a>, abaixo segue um resumo, mas sugiro que você leia o artigo completo.</p>
<p>Estamos acostumados com a experiência de interação com a ajuda do mouse. Isso foi desde os primórdios e provavelmente ainda será por bastante tempo. Nós desenhamos interfaces para ações baseadas no mouse ou qualquer aparelho que controle a setinha da sua tela. Criar interfaces touch é algo relativamente novo. Nós trouxemos ideias da interação com mouse para os dispositivos touch, mas grande parte das interações precisaram ser reinventadas porque o modo, o ato, a forma de interagir com a informação é diferente. Na interface touch você não “coloca o mouse” em cima do elemento. Você não utiliza teclas de atalho para executar ações. Normalmente as ações importantes estão expostas na interface, facilitando o acesso rápido. Isso é muito importante porque nos ensina criar interfaces mais intuitivas, com a curva de aprendizado menor.</p>
<p>Há também o outro lado da moeda, onde detalhes das interfaces touch não podem ser portadas para interfaces baseadas em mouse. Lembre agora na forma de como você gira uma imagem em um dispositivo touch e como você gira essa mesma imagem utilizando um mouse. A interface muda, o seu comportamento muda.</p>
<p>Sabendo dessas limitações você deve entender que não podemos simplesmente portar o visual de um determinado site para um dispositivo touch. Você pode dizer que “hoje fazemos isso e até agora está funcionando muito bem”. Mas pense melhor… a grande maioria dos sites que você visita hoje no iPad ou qualquer outro tablet, por exemplo, são sites onde a sua interação é limitada. O que você faz em um site hoje em dia? Clica nos links e lê. Salvo às vezes quando você visita um site mais “animadinho” com mais ações para entreter o usuário. Mas e se você faz um site onde é preciso rotacionar uma imagem ou fazer um ZOOM? Você precisará manter as mesmas ações nos dois cenários. E como antigamente, para manter o cenário das interfaces touch você precisa da ajuda de muito script.</p>
<h3>Concluindo</h3>
<p>Responsive Web Design é um assunto muito extenso mas muito interessante. Nos faz pensar no futuro de forma diferente. Até 5 anos atrás não tínhamos preocupações com outro dispositivo a não ser um ou outro smartphone e os desktops. Hoje temos diversos aparelhos, com diversas limitações de tela, tamanhos, comportamentos&#8230; E isso não vai parar por aí.  Todos os dias aparecerão mais e mais aparelhos e dispositivos que ajudarão os usuários a terem acesso a qualquer informação. É importante que nós possibilitemos que essas informações sejam entregues da melhor maneira possível.</p>
<p>Algumas referências que você pode querer dar uma olhada:</p>
<ul>
<li><a href="http://www.alistapart.com/articles/responsive-web-design/">Responsive Web Design</a></li>
<li><a href="http://coding.smashingmagazine.com/2011/01/12/guidelines-for-responsive-web-design/">Guidelines for Responsive Web Design</a></li>
<li><a href="http://designreviver.com/articles/designing-for-a-responsive-web-with-heuristic-methods/">Designing for a Responsive Web with Heuristic Methods</a></li>
<li><a href="http://5by5.tv/bigwebshow/9">The Big Web Show sobre Responsive Web Design</a></li>
</ul>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/mobile-first-a-arte-de-pensar-com-foco/" title="Mobile First &#8211; A arte de pensar com foco">Mobile First &#8211; A arte de pensar com foco</a></li><li><a href="http://tableless.com.br/especificacao-para-touch-screens/" title="Especificação para touch screens">Especificação para touch screens</a></li><li><a href="http://tableless.com.br/sites-para-dispositivos-moveis-mediatype/" title="Sites para Dispositivos Móveis &#8211; MediaType">Sites para Dispositivos Móveis &#8211; MediaType</a></li><li><a href="http://tableless.com.br/sobre-internet-explorer-para-mobile-breve-impressao/" title="Sobre Internet Explorer para Mobile &#8211; Breve impressão">Sobre Internet Explorer para Mobile &#8211; Breve impressão</a></li><li><a href="http://tableless.com.br/experiencia-cross-device/" title="Experiência cross-device">Experiência cross-device</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/introducao-ao-responsive-web-design/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Tenha o DOM</title>
		<link>http://tableless.com.br/tenha-o-dom/</link>
		<comments>http://tableless.com.br/tenha-o-dom/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 16:35:41 +0000</pubDate>
		<dc:creator>Alysson Franklin</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Browsers]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Extensions]]></category>
		<category><![CDATA[navegadores]]></category>
		<category><![CDATA[Semântica]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=3958</guid>
		<description><![CDATA[Entenda o que é o Document Object Model e tenha o DOM.]]></description>
			<content:encoded><![CDATA[<p class="c6">Muito ja foi falado sobre DOM e posso estar sendo repetitivo aqui, mas é importante falar deste assunto que em dias de manipulação pesada de seletores, percebo que pouca atenção é dada. Temos muita literatura boa sobre o assunto mas muitas vezes o foco acaba sendo o novo plugin que saiu e faz mais-do-mesmo-no-front-end-só-que-mais-fácil (E se você tiver sorte ele é free).</p>
<p class="c6">Entender realmente como um navegador funciona é importante, e garante seu entendimento do <strong><span class="c7">real </span></strong>dos problemas que está enfrentando no código que está implementando. Tem mais! Criar um código que manipula o layout (leia-se DOM) fica mais fácil, é uma relação <em><span class="c9">win-win</span></em><span class="c7 c9">.</span></p>
<p class="c6">Criado pelo W3C,<strong> O DOM é uma multi-plataforma que representa como as marcações em HTML, XHTML e XML são organizadas e lidas pelo navegador que você usa</strong>. Uma vez indexadas, estas marcações se transformam em elementos de uma árvore que você pode manipular via API &#8211; que é o que fazemos quando usamos programas ou scripts para alterar funcionalidades de uma página: conteudo, estrutura ou folha de estilo.</p>
<h2 class="c6"><span class="c7">Um pouco de história</span></h2>
<p class="c6">Não tem graça falar sobre o assunto sem mostrar como ele surgiu. Isso só reforça ainda mais a importância de conhecermos bem o assunto pois mostra sua relevância (e porque falar de <em><span class="c9">browser wars</span></em> é bem legal, apesar de evidenciar os cabelos brancos).</p>
<p class="c6">Netscape e Microsoft guerreavam com Netscape 2 e IE3.0 lá em 1996 e enquanto a Netscape lançava o <strong>Javascript</strong> a Microsoft lançava o <strong>JScript</strong>. A diferença entre um e outro não é nada mais além do nome &#8211; acredite! Por razões comerciais devido as “<span class="c9">sangrentas” <em>browser wars</em></span> as empresas decidiram adotar nomes diferentes para a mesma coisa &#8211; que na verdade era (e continua sendo) o <strong>ECMAScript</strong>, a linguagem que comecou a ser criada em 1994 quando o W3C colocou na mesma mesa as duas empresas e várias outras para desenvolver um padrão para linguagens de script para os navegadores. <strong>Javascript, JScript e ActionScript não são nada mais que </strong><strong><em><span class="c7">dialetos</span></em> de ECMAScript.</strong></p>
<h2 class="c6"><span class="c7">O DOM em sua forma e como é reconhecido pelos navegadores</span></h2>
<div class="wp-caption alignnone" style="width: 458px"><img class="  " src="http://devfiles.myopera.com/articles/618/DOMTree.gif" alt="" width="448" height="198" /><p class="wp-caption-text">Representação de um documento HTML e sua árvore DOM</p></div>
<p class="c6">A figura acima mostra a estrutura de uma árvore DOM, a linearização  das marcações de modo que ela possa ser montada inicialmente por um navegador. <span class="c7">Esta estrutura não será o que veremos no navegador &#8211; o layout em si. O DOM é a base para uma outra árvore que é o que realmente um browser monta na tela, a <strong>Árvore de Renderização </strong></span>- <em>aka </em><em><span class="c9">Render Tree</span></em>.</p>
<p class="c6">A base para todos os nós da árvore DOM é o base class chamado <strong><span class="c7">Node.h</span></strong>. Ele possui várias categorias, e as relevantes para renderizarmos código no navegador são os nós de <strong><span class="c7">documentos, elementos </span></strong><span class="c7">e</span><strong><span class="c7"> texto</span></strong>.</p>
<ol class="c12" start="1">
<li class="c10 c6"><strong><span class="c1">Documentos </span></strong><span class="c4">é o nó mais importante do DOM, com três classes diferentes: </span><span class="c1"><strong>Document</strong>, </span><span class="c4">que é usado por todos os documentos XML e outros que não sejam SVG (que também é um XML, porém com marcação já padronizada)</span><span class="c1">, <strong>HTMLDocument </strong></span><span class="c4">que como o nome diz, cuida de documentos HTML e </span><span class="c1">SVGDocument</span><span class="c4">, responsável pelos documentos SVG e tambem por outros documentos herdados da classe </span><span class="c1">Document (</span><span class="c4">Como o </span><strong><span class="c1">Document.h </span></strong><span class="c4">e o </span><span class="c1"><strong>HTMLDocument.h</strong>).</span></li>
<li class="c10 c6"><span class="c1"><strong>Elementos</strong> </span><span class="c4">são todas as tags que estão em arquivos HTML ou XML se transformam em elementos da árvore DOM. Considerando a renderização do navegador, um elemento é um nó com uma tag que pode ser usada para fazer subclasses específicas que podem ser processadas de acordo com as necessidades da </span><em><span class="c4 c9">Render Tree </span></em><span class="c4">(</span><strong><span class="c1">Element.h</span></strong><span class="c4"><span class="c4">).</span></span></li>
<li class="c10 c6"><span class="c1"><strong>Texto</strong>: </span><span class="c4">É o texto que vai entre os elementos. Todo o conteúdo das tags (&lt;p&gt;</span><span class="c1">Isto é um text node</span><span class="c4">&lt;/p&gt;). O nó de Texto guarda basicamente texto puro, que pode ser renderizado ou trabalhado via script.</span></li>
</ol>
<h2 class="c0">A Render Tree</h2>
<div id="attachment_3942" class="wp-caption alignnone" style="width: 413px"><a href="http://tableless.com.br/wp-content/uploads/2011/07/render.png"><img class="size-full wp-image-3942  " src="http://tableless.com.br/wp-content/uploads/2011/07/render.png" alt="Como a render tree e montada" width="403" height="187" /></a><p class="wp-caption-text">Como a render tree é montada</p></div>
<p class="c6"><span class="c4">A <em>Render Tree</em> é a parte mais importante do processo de renderização. Bem parecida com a árvore DOM, cada objeto corresponde a nós de </span><strong><span class="c1">Documentos, Elementos </span><span class="c4">ou</span></strong><span class="c1"><strong> Texto</strong>. </span><span class="c4">A diferença é que q <em>Render Tree</em> possui tambem objetos que não possuem nós na árvore DOM, como <strong>scripts e folhas de estilos</strong>. </span></p>
<p class="c0">O processo de criação da<strong> Render Tree</strong> passa pelos seguintes passos:</p>
<ol class="c3" start="1">
<li class="c6 c10"><span class="c7"><strong>Attachment</strong>:</span> Após finalizar o parse do DOM e a criação de seus nós, os navegadores chamam um método chamado <strong><span class="c7">attach </span></strong>para começar a renderização. O attach adiciona primeiramente as folhas de estilo a árvore DOM e começa a estilização da página. Um bom exemplo é o uso das propriedades CSS <span class="c7">display x visibility: </span>Caso um elemento da árvore DOM tenha uma propriedade <span class="c7">display:none</span>, este elemento (e seus nós filhos) não será criado na<em> Render Tree</em>. Ao contrário do uso de <span class="c7">visibility:hidden</span>, que vai renderizar o elemento na <span class="c9">árvore</span>, porém  ele irá remover (ou adicionar quando <span class="c7">visibility:visible</span>) via<strong> Repaint </strong>as cores (ou propriedades) que formam este elemento. Vale lembrar também que este processo de attach é <em>top down</em>, criando sempre inicialmente os nós parent e depois seus descendentes (nós filhos). (<a href="http://tableless.com.br/entendendo-os-reflows-2" title="Entendendo os Reflows">Para saber mais sobre Repaint e Reflows, veja este outro artigo</a>)</li>
<li class="c10 c6"><span class="c7"><strong>RenderStyle.h</strong>:</span> Durante o processo de attach um método é criado, o <strong>RenderStyle.h</strong> que vai guardar objetos de referência com cada uma das propriedades CSS do documento. O nó criado no DOM é verificado no documento de CSS e caso existam propriedades que incidam naquele elemento, ela é aplicada. Esta propriedade fica salva dentro da <em><span class="c9">Render Tree </span></em>até que ela seja destruída ou que este valor seja alterado por algum script.</li>
<li class="c10 c6"><strong><span class="c7">CSS Box Model: </span></strong>Após o método <strong>RenderStyle</strong> ser criado, ele é acessado via <strong>RenderObject</strong>. O Box model é usado para posicionar um elemento dentro da página, oferecendo suporte para o <span class="c7">conteúdo, padding, bordas e margens </span>que envolvem este elemento</li>
</ol>
<h2 class="c6"><img class="alignnone" src="http://www.w3.org/TR/CSS21/images/boxdim.png" alt="Uma representação visual do CSS box model" width="455" height="340" /></h2>
<h2 class="c6"><span class="c5">Destruindo (ou atualizando) a Render Tree</span></h2>
<p class="c6">A <em><span class="c9">Render Tree</span></em> é destruída quando nós da árvore DOM são removidos, causando a necessidade de um novo parse no DOM, ou quando uma tab do navegador com a árvore DOM usada é fechada. Após o refresh da árvore DOM, todo o processo acima é refeito, com attach chamando o RenderStyle, que montado chama o método <strong>style()</strong> do RenderObject que acessa o CSS BOX model.</p>
<h2 class="c0">Como os navegadores interpretam todos estes elementos criados por DOM e Render Tree antes de aplicar o estilo?</h2>
<p class="c0">Todo navegador tem uma lista de elementos HTML suportados. Quando o seu markup possui tags presentes na lista, a árvore DOM é montada e o processo de <span class="c7">attachment </span>começa logo na sequência e os estilos são aplicados, dando continuidade a criação da <span class="c9"><em>Render tree</em>.</span></p>
<p class="c6">O grande problema é que cada navegador tem a sua própria lista, que trata situações similares de maneiras diferentes. Obviamente já sabemos que o navegador que mais apresenta problemas para as situações acima é o Internet Explorer, mas acredite, <strong><span class="c7">todos </span></strong>os navegadores apresentam problemas quando um elemento não está em sua lista de elementos permitidos, e precisa de um trabalho para fazer tudo acontecer na <span class="c9">Render Tree </span>como deve ser feito.</p>
<p class="c6">Elementos fora desta lista são tratados como <span class="c7">Elementos desconhecidos. </span>E eles são uma grande fonte de problemas:</p>
<ol class="c3" start="1">
<li class="c10 c6"><span class="c7"><span class="c7"><strong>Como estilizar este elemento?</strong></span></span>Por exemplo, a tag &lt;p&gt; tem por padrão espacamento no topo e bottom, &lt;blockquote&gt; possui uma indentação automática adicionando uma margem à esquerda ou &lt;h1&gt; tem uma fonte maior que o &lt;p&gt; por ser um cabeçalho. Tudo isso esta padronizado, mas como cuidar de algo que não existe?</li>
<li class="c10 c6"><span class="c7"><span class="c7"><strong>Como este elemento deve aparecer na árvore DOM?</strong></span></span>Os navegadores também possuem uma lista que mostra quais elementos podem ser filhos de outros elementos. Por exemplo, se você adiciona por engano no seu markup &lt;p&gt;&lt;p&gt; o segundo paragrafo implicitamente fechará o primeiro &lt;p&gt;, fazendo que os dois elementos sejam irmãos (no mesmo nível na árvore DOM) e nao como nós filhos como de maneira linear pode parecer. Porém se vc adiciona um &lt;p&gt;&lt;span&gt;, este paragrafo inicial não será fechado, porque o navegador permite que &lt;span&gt; seja filho de elementos de paragrafo, fazendo assim o &lt;span&gt; ser nó filho de &lt;p&gt;</li>
</ol>
<p class="c6">Para elementos desconhecidos, a ideia é <span class="c7">não estilizar.</span> Caso queira algum estilo em elementos desconhecidos, você deve colocá-lo no nó acima (se necessário um <em><span class="c9">wrapper</span></em>), para fazer com que ele <span class="c7">herde</span> o estilo.</p>
<p class="c6">Perceba a sutileza de como isso funciona. Os dois diagramas mostram uma árvore DOM, montada por um navegador suporte HTML5 nativo e o Internet Explorer 8 (navegadores que <span class="c7">não </span>suportam HTML5 tem funcionamento semelhante):</p>
<div id="attachment_3988" class="wp-caption alignnone" style="width: 570px"><a href="http://tableless.com.br/wp-content/uploads/2011/07/renderizaao_HTML5-5.png"><img class="size-full wp-image-3988 " src="http://tableless.com.br/wp-content/uploads/2011/07/renderizaao_HTML5-5.png" alt="Arvore DOM com suporte HTML5" width="560" height="472" /></a><p class="wp-caption-text">Arvore DOM com suporte HTML5</p></div>
<div id="attachment_3987" class="wp-caption alignnone" style="width: 576px"><a href="http://tableless.com.br/wp-content/uploads/2011/07/renderizacaoIE-5.png"><img class="size-full wp-image-3987  " src="http://tableless.com.br/wp-content/uploads/2011/07/renderizacaoIE-5.png" alt="Arvore DOM IE e outros navegadores sem suporte HTML5" width="566" height="458" /></a><p class="wp-caption-text">Arvore DOM IE e outros navegadores sem suporte HTML5</p></div>
<p class="c6">É por essas e outras que a gente usa o modernizr, o HTML5shiv ou um simples document.create(“SECTION”) / document.create(“ARTICLE”). E é isso que acontece quando navegadores interpretam elementos desconhecidos. Eles desconsideram o nó real aonde o elemento está, e o reconhece como filho de &lt;BODY&gt;. E por favor, sem trocadilhos com o <span class="c9">filho </span>dos outros.</p>
<p class="c6">Ver como uma árvore DOM é montada  e como a <em><span class="c9">Render tree</span> </em>é feita nos dá idéia do quão importante é ter um documento <span class="c7">semântico</span>. <strong>Realmente semântico</strong>. Uma vez entendidos os conceitos, a manipulação e a programação dos elementos fica mais fácil.</p>
<p class="c6">E você começa a entender como os navegadores funcionam.</p>
<h2>Referências</h2>
<p><a href="http://tableless.com.br/entendendo-os-reflows-2">Entendendo os Reflows</a> por Alysson Franklin</p>
<p><a href="http://www.modernizr.com/">Modernizr</a> para suporte HTML5</p>
<p><a href="http://code.google.com/p/html5shiv/">HTML5shiv</a> para suporte HTML5</p>
<p><a href="http://en.wikipedia.org/wiki/Browser_wars">Browser Wars</a> pela Wikipedia</p>
<p><a href="http://en.wikipedia.org/wiki/ECMAScript">ECMAScript</a> pela Wikipedia</p>
<p><a href="http://en.wikipedia.org/wiki/JavaScript">Javascript</a> pela Wikipedia</p>
<p><a href="http://en.wikipedia.org/wiki/JScript">JScript</a> pela Wikipedia</p>
<p><a href="http://www.w3.org/TR/CSS21/box.html#box-dimensions">CSS Box model</a> pelo W3C</p>
<p><span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px"><a href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM</a></span><span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px"> pela wikipedia </span></p>
<p><a href="http://www.webkit.org/blog/114/webcore-rendering-i-the-basics/">Renderização no webkit, o básico</a> pela webkit</p>
<p><span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px"><a href="http://www.w3.org/DOM/">W3C Overview do DOM</a></span></p>
<p><span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px"><a href="http://www.w3.org/DOM/Activity.html">Declaração de atividades do DOM pelo W3C</a></span></p>
<p><span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px"><a href="http://diveintohtml5.org/semantics.html#unknown-elements">Uma discussão sobre como Navegadores entendem elementos desconhecidos</a></span><span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px"> por Mark Pilgrim  </span></p>
<p><a href="http://dev.opera.com/articles/view/traversing-the-dom/">Traversing the DOM</a><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: x-small"><span class="Apple-style-span" style="line-height: 19px"> by Mike West</span></span></p>
<p><a href="http://www.netmagazine.com/features/%20progressive-enhancement-demystified">Progressive enhancement demystified</a><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: x-small"><span class="Apple-style-span" style="line-height: 19px"> by Aaron Gustafson</span></span></p>
<p><a href="http://paulirish.com/2011/dom-html5-css3-performance/">DOM, HTML5, CSS3 e Performance</a> – <a href="http://dl.dropbox.com/u/39519/talks/gperf/index.html">Slides</a> por Paul Irish</p>
<pre><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: x-small"><span class="Apple-style-span" style="line-height: 19px">E também o @mariocaixa, esse cara tem o DOM!</span></span></pre>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/entendendo-os-reflows-2/" title="Entendendo os Reflows">Entendendo os Reflows</a></li><li><a href="http://tableless.com.br/contedo-flash-e-html/" title="Conteúdo, Flash e HTML">Conteúdo, Flash e HTML</a></li><li><a href="http://tableless.com.br/ah-o-maravilhoso-mundo-real/" title="Ah, o maravilhoso mundo real">Ah, o maravilhoso mundo real</a></li><li><a href="http://tableless.com.br/agora-e-a-vez-dos-desenvolvedores/" title="Agora é a vez dos desenvolvedores">Agora é a vez dos desenvolvedores</a></li><li><a href="http://tableless.com.br/webintents-framework-para-webapps/" title="WebIntents &#8211; Framework para WebApps">WebIntents &#8211; Framework para WebApps</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/tenha-o-dom/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>RGB e HSL</title>
		<link>http://tableless.com.br/rgb-e-hsl/</link>
		<comments>http://tableless.com.br/rgb-e-hsl/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 13:00:32 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=3830</guid>
		<description><![CDATA[RGB e HSL são os formatos que estão se tornando populares no desenvolvimento web. Entenda como cada um funciona e saiba quais suas vantagens.]]></description>
			<content:encoded><![CDATA[<p>A manipulação de cores no HTML nunca foi muito flexível. No começo escolhíamos as cores escrevendo seus nomes por extenso. Os nomes eram padrões eram: black, blue, yellow, green, olive, maroon, fuchsia, red, white, silver, navy, teal, purple, lime, gray, aqua. Na década de 80 houve um acréscimo de 131 novas cores com nomes estranhos chamada <a href="http://en.wikipedia.org/wiki/X11_color_names">X11</a>. Estes nomes foram adotados pelos primeiros browsers tem sido suportados até hoje. Há nomes como mintcream, moccasin, navajowhite, powderblue, springgreen entre outros&#8230; O W3C ainda mantém uma <a href="http://www.w3.org/TR/SVG/types.html#ColorKeywords">lista completa com os nomes destas cores aqui</a>.</p>
<p>Além de ser muito difícil de manter uma coleção de cores com seus nomes esquisitos, é quase impossível você criar um website tentando se adequar a quantidade limitada de cores disponíveis. Já tínhamos problemas sufientes com a quantidade limitada de fonts que poderíamos utilizar. Isso não poderia acontecer com as cores também. Com esse problemas vários padrões matemáticos foram estabelecidos para que criássemos as cores que gostaríamos de utilizar. Vou falar de dois padrões aqui: RGB e HSL. Vou ligá-los ao desenvolvimento web e não de uma forma geral. Caso contrário o artigo seria mais longo e envolveríamos outros assuntos mais extensos.</p>
<p>Você já deve ter lido algo sobre utilizar para web cores no formato RGB. Esse formato está ficando mais popular com o CSS3 por que agora podemos controlar o canal alpha, tendo uma <a href="http://tableless.com.br/css3-breve-introducao-a-rgba">combinação nova chamada RGBA</a>. Há também outro formato que ganhou alguma atenção do workgroup no W3C que é o formato de cor chamado HSL. Como o RGB, o HSL também ganhou um canal de opacidade, ficando HSLA. Muitos desenvolvedores ainda tem dúvidas sobre as diferenças entre RGBA e HSLA e qual utilizar.</p>
<p>Tudo é muito simples de entender. RGB e HSL são dois formatos de composição de cores digitais. Você pode escolher qual dos dois utilizar, vai do seu gosto. Contudo como até hoje utilizamos o HEXADECIMAL como padrão de cores para web, minha sugestão é esperar para ver qual das duas específicações cairá no gosto do mercado para escolher um dos formatos para utilizá-la mais frenquentemente nos projetos. Entretanto os dois formatos tem flexibilidades diferentes e por isso pode ser muito difícil apenas uma delas se tornar mais popular que outra.</p>
<p>Abaixo vou introduzir brevemente as diferenças  entre o formato HSL e RGB para que você entenda quais suas características.</p>
<h3>O RGB</h3>
<p>O processo é simples: como na vida real onde você mistura cores para obter uma outra cor como resultado, você faz a mesma coisa com o RGB: você mistura as cores para obter uma outra cor como resultado. Para tanto você utilizará a soma de 3 valores: Red, Green e Blue: rgba(red, green, blue);</p>
<p>Veja a sintaxe abaixo para entender melhor a aplicação:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">p <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">rgb</span><span style="color: #00AA00;">&#40;</span><span style="color: #933;">100%</span><span style="color: #00AA00;">,</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">,</span> <span style="color: #933;">0%</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Os três valores são ligados às três principais respectivamente vermelha, verde e azul. No caso acima inseri 100% de cor para Vermelho e Verde. Como bom aluno de educação artística, você deve saber que misturando vermelho e verde a cor resultante será amarelo.</p>
<p>Você pode ser mais específico controlando até mesmo a fração da porcentagem, por exemplo:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">p <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">rgb</span><span style="color: #00AA00;">&#40;</span><span style="color: #933;">55.2%</span><span style="color: #00AA00;">,</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">,</span> <span style="color: #933;">0%</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Assim você consegue exatamente a cor que precisa. Esse formato de porcentagem e controle de fração também é aplicado ao HSL.</p>
<p>O RGB pode ser configurado utilizando valores hexadecimais. A conta não é simples e você precisa ser um pouco nerd para entender. A explicação é meio longa. Sugiro que <a href="http://en.wikipedia.org/wiki/RGB_color_model">você leia no Wikipedia</a> algo mais detalista.</p>
<h3>O HSL</h3>
<p>O HSL funciona um pouco diferente. A sintaxe é como abaixo:</p>
<div class="codecolorer-container css mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">p <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> hsl<span style="color: #00AA00;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">,</span> <span style="color: #933;">30%</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>A escolha de cores no HSL não é baseado na mistura mas sim em um esquema baseado em um cilindro. O primeiro número de valor na sintaxe é onde escolhemos a cor. Começamos no topo com vermelho, onde o valor é 0, e damos uma volta de 360 graus, retornando novamente no topo, na cor vermelha. Conforme aumentamos o valor vamos selecionando as cores. Por exemplo, se selecionarmos um valor por volta de 120 obtemos um verde. </p>
<p>Veja a imagem abaixo para entender melhor:</p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/06/HSL_color_solid_cylinder_alpha_lowgamma.jpg" alt="" title="HSL_color_solid_cylinder_alpha_lowgamma" ></p>
<p>Embora possamos escolher qualquer cor misturando as cores com o RGB, é muito mais instintivo escolhermos uma cor específica e modificarmos sua luminosidade. Escolhemos o azul e modificamos sua luminosidade para obtermos o tom que você deseja.</p>
<p>Para escolhermos a luminosidade e a saturação da cor modificamos os dois outros valores, o segundo valor é a luminosidade e o terceiro valor é a saturação ou a quantidade de cinza que você colocará na cor. Modificar a saturação é como se você mudasse a quantidade de cor. Quanto menos cor, mais cinza. Se você quiser uma cor mais suja, mais apagada, você diminui este valor. Caso contrário você a mantém como 100% e utiliza a quantidade integral da cor. Normalmente esse será o padrão.</p>
<h3>E o hexadecimal?</h3>
<p>O hexadecimal, queridinho dos nossos corações, sempre estará ao nosso lado. A sintaxe é muito mais curta que as outras duas específicações. Não temos todas as vantagens que as outras especificações nos dão, começando pelo canal alpha. Com a grande maioria dos programas visuais dando suporte ao formato hexadecimal ele ainda perdurará durante muito tempo ainda em nossas vidas. </p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/introducao-ao-css-3d-flip-card/" title="Introdução ao CSS 3D &#8211; Flip Card">Introdução ao CSS 3D &#8211; Flip Card</a></li><li><a href="http://tableless.com.br/experiencia-deve-ter-comeco-meio-e-fim/" title="Experiência deve ter começo, meio e fim">Experiência deve ter começo, meio e fim</a></li><li><a href="http://tableless.com.br/css3-modulo-template-layout/" title="CSS3 &#8211; Módulo Template Layout">CSS3 &#8211; Módulo Template Layout</a></li><li><a href="http://tableless.com.br/epub-aprenda-a-criar-um-livro-digital/" title="ePub: Aprenda a criar um livro digital">ePub: Aprenda a criar um livro digital</a></li><li><a href="http://tableless.com.br/oocss-ou-css-do-jeito-certo/" title="OOCSS ou CSS do jeito certo">OOCSS ou CSS do jeito certo</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/rgb-e-hsl/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

