<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Desenvolvimento &#193;gil - Blog da Improve It: Tag best practices</title>
    <link>http://blog.improveit.com.br/articles/tag/bestpractices</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Margens na tag HR: um caso resolvido</title>
      <description>&lt;blockquote class="excerpt"&gt;
  &lt;p&gt;Basicamente, o tapa na cabe&#231;a que faz o IE se comportar direitinho &#233; o &lt;code&gt;display: block&lt;/code&gt;. Depois dessa, voc&#234; p&#245;e a margem que quiser no &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sou dos que usa a tag &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; para dividir se&#231;&#245;es. &#201; semanticamente mais coerente do que separar usando as pr&#243;prias bordas dos divs, fica melhor quando se v&#234; o HTML sem CSS, essas coisas que j&#225; se discute &#224; be&#231;a por a&#237;. Aprendi a apreciar sua utilidade.&lt;/p&gt;

&lt;p&gt;Mas o fato &#233; que &#233; enjoado dar estilo a esta tag. Para cada browser devem-se editar &lt;a href="http://www.sovavsiti.cz/css/hr.html"&gt;atributos diferentes para se alcan&#231;ar um mesmo efeito&lt;/a&gt;. Enfim, com algum jeitinho, deixa-se o &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; com a mesma cara em todos os browsers.&lt;/p&gt;

&lt;p&gt;O que mata mesmo, o que deixa f&#243;runs de cabelo em p&#233; &#233; a tal &lt;strong&gt;margem&lt;/strong&gt; que fica em volta do &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; no IE. A margem no IE &#233; teimosa, indestrut&#237;vel, incontrol&#225;vel, inestiliz&#225;vel. Por todo lugar que eu procurasse, as pessoas decidiam seguir com as margens mesmo, e os mais persistentes chegavam ao ponto de &lt;a href="http://www.robertnyman.com/2007/03/09/a-hard-challenge-styling-an-hr-element"&gt;inserir o &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; num &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;&lt;/a&gt; para conseguir dar o estilo que quiserem. Ou seja, uns desistiam muito f&#225;cil, outros recorriam a medidas desesperadas para fazer a coisa de qualquer jeito.&lt;/p&gt;

&lt;p&gt;Um dia encontrei dois posts que se aproximavam da solu&#231;&#227;o. Sozinho, nenhum dos dois resolvia o caso. Mas juntando os dois funcionava! Fiz os testes e, de fato, misturando os dois racioc&#237;nios eu conseguia a medida que eu quisesse em qualquer browser que fosse &amp;mdash; at&#233; zero. Mas, numa jogada um tanto infeliz, n&#227;o salvei os posts nos favoritos, nem salvei o arquivo de testes. Uma resposta bastante procurada, e eu a perdi de bobeira...&lt;/p&gt;

&lt;p&gt;Este artigo &#233; sobre o meu caso: eu queria usar o &lt;em&gt;&lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; livre de divs sem sentido, e com margem &lt;strong&gt;zero&lt;/strong&gt;; at&#233; no IE&lt;/em&gt;. E, sobretudo, o artigo &#233; para deixar a resposta num lugar seguro e ao alcance de todos. Agora que eu lembrei a solu&#231;&#227;o, n&#227;o perco mais.&lt;/p&gt;

&lt;h3&gt;&amp;ldquo;Pescotapa&amp;rdquo;&lt;/h3&gt;

&lt;p&gt;Depois que perdi de vista os posts e as semanas se passaram, tudo o que eu lembrava &#233; que o Internet Explorer precisava de um tapa na cabe&#231;a: era um atributo nada intuitivo e totalmente inesperado, que surpreendentemente o fazia acordar para a realidade. Basicamente, o tapa na cabe&#231;a que faz o IE se comportar direitinho &#233; o &lt;code&gt;display: block&lt;/code&gt;. Depois dessa, voc&#234; p&#245;e a margem que quiser no &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vai entender. O &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; j&#225; &#233; um elemento em bloco. Tem toda a cara de elemento em bloco. Pula linha em cima, pula linha embaixo, n&#227;o tem nada de inline. E &#233; por isso que os f&#243;runs tanto rodam atr&#225;s de uma solu&#231;&#227;o: poucos suspeitariam que &#233; necess&#225;rio lembrar a ele que de fato &#233; um bloco. Dizer &lt;code&gt;display: block&lt;/code&gt; seria redundante e desnecess&#225;rio. Mas o danado do IEca faz quest&#227;o disso para se dar conta de que &amp;ldquo;ah, &#233;, &#233; verdade...&amp;rdquo;.&lt;/p&gt;

&lt;h3&gt;Como aconteceu comigo:&lt;/h3&gt;

&lt;p&gt;Vamos ao meu caso. Eu pretendia inserir umas tags &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; no &lt;a href="http://www.patriciafigueira.com.br"&gt;site da fot&#243;grafa Patricia Figueira&lt;/a&gt;, como experimento para implementa&#231;&#227;o futura no pr&#243;prio site e em nosso produto em desenvolvimento, o &lt;a href="http://beonthe.net/"&gt;beonthe.net&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O primeiro passo foi inserir tags &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; nos espa&#231;os entre cabe&#231;alho, conte&#250;do principal e rodap&#233;. Vamos ao HTML:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div id="header"&amp;gt;
  (conte&#250;do do cabe&#231;alho)
&amp;lt;/div&amp;gt;
&amp;lt;hr /&amp;gt;
&amp;lt;div id="main_content"&amp;gt;
  (conte&#250;do principal)
&amp;lt;/div&amp;gt;
&amp;lt;hr /&amp;gt;
&amp;lt;div id="footer"&amp;gt;
  (conte&#250;do do rodap&#233;)
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E logo surgiu a linha cinza entre os divs. Ficou assim:&lt;/p&gt;

&lt;p&gt;Safari: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_1_inserindo_hr_safari.gif" alt="O hr foi inserido corretamente." title="No Safari, o hr foi inserido corretamente."/&gt;&lt;/p&gt;

&lt;p&gt;Opera: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_1_inserindo_hr_opera.gif" alt="O hr tamb&#233;m foi inserido corretamente." title="No Opera, o hr tamb&#233;m foi inserido corretamente."/&gt;&lt;/p&gt;

&lt;p&gt;Firefox: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_1_inserindo_hr_firefox.gif" alt="O hr foi inserido corretamente como os outros." title="No Firefox, o hr foi inserido corretamente como os outros."/&gt;&lt;/p&gt;

&lt;p&gt;Internet Explorer 7: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_1_inserindo_hr_ie_7.gif" alt="O hr foi inserido corretamente, mas deixou margens que afastaram os conte&#250;dos dos divs." title="No IE7, o hr foi inserido corretamente, mas deixou margens que afastaram os conte&#250;dos dos divs."/&gt;&lt;/p&gt;

&lt;p&gt;Internet Explorer 6: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_1_inserindo_hr_ie_6.gif" alt="O hr foi inserido corretamente, mas tamb&#233;m deixou as mesmas margens que afastaram os conte&#250;dos dos divs." title="No IE6, o hr foi inserido corretamente, mas tal como no IE7, deixou margens que afastaram os conte&#250;dos dos divs."/&gt;&lt;/p&gt;

&lt;p&gt;(Ah, o IE...)&lt;/p&gt;

&lt;p&gt;Linhas inseridas, eu queria que cada divis&#243;ria tivesse as seguintes caracter&#237;sticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quebrasse poss&#237;veis floats;&lt;/li&gt;
&lt;li&gt;N&#227;o ocupasse qualquer espa&#231;o vertical;&lt;/li&gt;
&lt;li&gt;Fosse invis&#237;vel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A primeira tarefa &#233; simples. Na folha de estilos &lt;code&gt;application.css&lt;/code&gt;, usamos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  clear:      both;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Nota: Depois vi que, para limpar de fato os floats do &lt;code&gt;div#main_content&lt;/code&gt;, foi necess&#225;rio p&#244;r os hr&amp;rsquo;s &lt;strong&gt;dentro&lt;/strong&gt; do &lt;code&gt;#main_content&lt;/code&gt;, em suas extremidades, e n&#227;o adjacentes a ele. Mas isto &#233; papo para toda uma outra discuss&#227;o e, para efeito de ilustra&#231;&#227;o, vou continuar exibindo os hr&amp;rsquo;s como se estivessem &lt;strong&gt;entre&lt;/strong&gt; o &lt;code&gt;#main_content&lt;/code&gt; e o &lt;code&gt;#header&lt;/code&gt;.&lt;/h4&gt;

&lt;p&gt;Agora vem a segunda tarefa: limpar os espa&#231;os que a linha gera no IE. Mas, como dito antes e tantas vezes blogs afora, a margem do hr no IE &#233; turrona, implac&#225;vel, indel&#233;vel, inoxid&#225;vel. Tem gente tentando de tudo: &lt;code&gt;margin: 0&lt;/code&gt;, &lt;code&gt;padding: 0&lt;/code&gt;, &lt;code&gt;line-height: 0&lt;/code&gt;, &lt;code&gt;font-size: 0&lt;/code&gt;, at&#233; &lt;code&gt;overflow: hidden&lt;/code&gt;. Zerar as margens at&#233; ajuda com os browsers que seguem os padr&#245;es, mas nada acaba com o espa&#231;amento no IE.&lt;/p&gt;

&lt;p&gt;Ent&#227;o, em nosso &lt;code&gt;application.css&lt;/code&gt;, cuidemos dos browsers inteligentes para garantir que n&#227;o haja margens:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  clear:      both;
  margin:     0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A explica&#231;&#227;o para as margens insistentes do IE &#233; a seguinte: o IE renderiza o &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; com uma margem vertical de 7px a mais do que os outros browsers. Ou seja, se voc&#234; escreve...&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  clear:      both;
  margin:     7px 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;... Voc&#234; tem num browser decente o esperado: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_2_hr_margin_7_0_safari.gif" alt="Exatamente 7px de espa&#231;o para cima e 7px para baixo." title="Num browser decente, temos o esperado: 7px de espa&#231;o para cima e 7px para baixo."/&gt;&lt;/p&gt;

&lt;p&gt;E no IE, uma soma do que voc&#234; inseriu mais a margem nativa: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_2_hr_margin_7_0_ie_6.gif" alt="14px para cima e 14px para baixo (7 + 7)." title="No IE, temos a margem que inserimos somada &#224; margem nativa de seus hr&amp;rsquo;s."/&gt;&lt;/p&gt;

&lt;p&gt;&amp;ldquo;Ora&amp;rdquo;, posso pensar, &amp;ldquo;Ent&#227;o &#233; s&#243; escrever &lt;strong&gt;margens negativas&lt;/strong&gt; para o IE&amp;rdquo;. Seria o intuitivo, mas o IE n&#227;o trata de coisas como &amp;ldquo;o intuitivo&amp;rdquo;. N&#227;o funciona: o IE tira a margem superior, mas jamais elimina a margem inferior! Veja: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_3_hr_margem_negativa_ie_6.gif" alt="O hr fica zerado em cima, mas o espa&#231;o de baixo dobra: ele assumiu os 7px de cima!" title="Usando margens negativas no IE, fazemos o espa&#231;o de cima sumir, mas o de baixo dobra: ele assumiu os 7px de cima! Mas que raios!"/&gt;&lt;/p&gt;

&lt;h3&gt;O pulo do gato&lt;/h3&gt;

&lt;p&gt;Entra na nossa folha de estilos &lt;code&gt;application.css&lt;/code&gt; o atributo &lt;em&gt;&lt;code&gt;display: block&lt;/code&gt;&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  clear:      both;
  margin:     0;
  display:    block;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este &#233; o &#250;ltimo atributo em que eu pensaria para eliminar margens. N&#227;o sei explicar por que d&#225; certo. &#201; contra-intuitivo. &#201; redundante. &#201; idiota. E mesmo assim (ou talvez por isso mesmo) faz o IE acordar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agora sim&lt;/strong&gt;, podemos repensar a quest&#227;o das margens negativas. Ent&#227;o corrigimos o &lt;code&gt;application.css&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  clear:      both;
  margin:     -7px 0;
  display:    block;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E voil&#224;! Finalmente, um &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; sem margens! &lt;img src="http://blog.improveit.com.br/files/2008-09-02_4_hr_sem_margens_ie_6.gif" alt="N&#227;o &#233; ilus&#227;o! &#201; poss&#237;vel eliminar totalmente as margens de um hr no IE!" title="N&#227;o &#233; ilus&#227;o! &#201; poss&#237;vel eliminar totalmente as margens de um hr no IE!"/&gt;&lt;/p&gt;

&lt;h3&gt;Coment&#225;rio condicional:&lt;/h3&gt;

&lt;p&gt;O problema de usar margens negativas &#233; que os browsers inteligentes as interpretam como elas s&#227;o &amp;mdash; negativas:
&lt;img src="http://blog.improveit.com.br/files/2008-09-02_5_hr_margens_negativas_safari.gif" alt="Margens negativas no Safari." title="Margens negativas no Safari."/&gt;&lt;/p&gt;

&lt;p&gt;Temos que definir um comportamento para cada tipo de browser.&lt;/p&gt;

&lt;p&gt;O que eu costumo usar s&#227;o &lt;a href="http://www.quirksmode.org/css/condcom.html"&gt;coment&#225;rios condicionais&lt;/a&gt;. H&#225; quem diga que &lt;a href="http://meiert.com/en/blog/20070201/why-conditional-comments-are-bad-repeat-bad/"&gt;eles s&#227;o maus&lt;/a&gt;, mas at&#233; agora s&#243; t&#234;m me ajudado.&lt;/p&gt;

&lt;p&gt;Vamos ao &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; no HTML. L&#225; inserimos uma condi&#231;&#227;o para o IE:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;!--[if IE]&amp;gt;
  &amp;lt;link href="/stylesheets/application_ie.css" media="all" rel="stylesheet" type="text/css" /&amp;gt;
&amp;lt;![endif]--&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ela serve para chamar uma folha de estilo com regras espec&#237;ficas para o Internet Explorer: &lt;strong&gt;&lt;code&gt;application_ie.css&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nesta nova folha &lt;code&gt;application_ie.css&lt;/code&gt;, aplicamos as margens negativas que t&#237;nhamos at&#233; ent&#227;o:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  margin:     -7px 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E pronto. Esta &#233; a &#250;nica regra que diferencia o &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; nos browsers inteligentes e no Internet Explorer. Agora podemos zerar as margens no nosso &lt;code&gt;application.css&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  clear:      both;
  margin:     0;
  display:    block;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E o resultado &#233;: &lt;strong&gt;consenso&lt;/strong&gt;! Nos browsers inteligentes:
&lt;img src="http://blog.improveit.com.br/files/2008-09-02_1_inserindo_hr_safari.gif" alt="(Apar&#234;ncia do hr no Safari. &#201; a mesma do IE!)" title="Apar&#234;ncia do hr no Safari. &#201; a mesma do IE!"/&gt;&lt;/p&gt;

&lt;p&gt;... e no IE:
&lt;img src="http://blog.improveit.com.br/files/2008-09-02_4_hr_sem_margens_ie_6.gif" alt="(Apar&#234;ncia do hr no IE6. Agora o hr de todos os browsers tem a mesma apar&#234;ncia.)" title="Apar&#234;ncia do hr no IE6. Agora o hr de todos os browsers tem a mesma apar&#234;ncia."/&gt;&lt;/p&gt;

&lt;h3&gt;Acabamento&lt;/h3&gt;

&lt;p&gt;Resta a terceira tarefa, que &#233; deixar invis&#237;veis as linhas divis&#243;rias. Isso &#233; f&#225;cil com &lt;code&gt;visibility: hidden&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  clear:      both;
  margin:     0;
  display:    block;
  visibility: hidden;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O que vai fazer com que o &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; fique invis&#237;vel, mas ainda ocupando o espa&#231;o que ocupava antes, de modo que fica uma lacuna de 2 pixels entre o cabe&#231;alho e o conte&#250;do principal: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_6_hr_invisivel_lacuna.gif" alt="O hr agora sumiu, mas ainda ocupa o espa&#231;o que ocupava antes. Temos que nos livrar da lacuna." title="O hr agora sumiu, mas ainda ocupa o espa&#231;o que ocupava antes. Temos que nos livrar da lacuna."/&gt;&lt;/p&gt;

&lt;h4&gt;Nota: Usar &lt;code&gt;display: none&lt;/code&gt; n&#227;o &#233; &#250;til neste caso porque cancela o atributo &lt;code&gt;clear: both&lt;/code&gt;. E n&#243;s queremos que ele quebre os &lt;em&gt;floats&lt;/em&gt;. Neste caso, &#233; melhor ficar com &lt;code&gt;visibility: hidden&lt;/code&gt;.&lt;/h4&gt;

&lt;p&gt;Nos browsers decentes, esta lacuna &#233; devida &#224; espessura da borda. Bordas de 1px em volta de um elemento com altura zero resultam em 2px de altura total. Um aributo de borda deve resolver:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  clear:      both;
  margin:     0;
  display:    block;
  visibility: hidden;
  border:     none;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A lacuna some no Safari e no Opera. Mas Firefox e IE precisam de mais uma forcinha. Lembre-os que a altura do elemento deve ser nula:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  clear:      both;
  margin:     0;
  display:    block;
  visibility: hidden;
  border:     none;
  height:     0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No Firefox resolve. Mas no IE a lacuna, em vez de sumir, fica reduzida a 1px (Ah, o IE...). Isso porque nele as bordas n&#227;o s&#227;o definidas pelo atributo &lt;code&gt;border&lt;/code&gt;, mas pelo atributo &lt;code&gt;color&lt;/code&gt; (j&#225; mencionei que o IE n&#227;o trata de coisas como &amp;ldquo;o intuitivo&amp;rdquo;?). Como n&#227;o d&#225; para &amp;ldquo;zerar&amp;rdquo; a cor para sumir com a lacuna, o jeito &#233; retocar as margens que deixamos no &lt;code&gt;application_ie.css&lt;/code&gt;, contribuindo para as margens negativas com 1px em cima ou em baixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hr {
  margin:     -8px 0 -7px 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E eis o resultado final: &lt;img src="http://blog.improveit.com.br/files/2008-09-02_7_hr_final.gif" alt="Em todos os browsers, uma linha divis&#243;ria sem margens e invis&#237;vel. Miss&#227;o cumprida." title="Em todos os browsers, uma linha divis&#243;ria sem margens e invis&#237;vel. Miss&#227;o cumprida."/&gt;&lt;/p&gt;

&lt;h3&gt;Conclus&#227;o&lt;/h3&gt;

&lt;p&gt;Este foi o meu caso bem espec&#237;fico com a tag &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt;. Se voc&#234; for uma das pessoas que se descabelavam por causa das margens teimosas no IE, saiba que h&#225; solu&#231;&#227;o. N&#227;o &#233; preciso desistir e adaptar seu precioso layout para se conformar com as margens, nem &#233; preciso inserir a tag num &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; s&#243; para ela. Boas pr&#225;ticas j&#225;!&lt;/p&gt;

&lt;p&gt;Espero ter  contribu&#237;do para diminuir sua dor de cabe&#231;a. A resposta est&#225; agora aqui, para todo o mundo. E breve voc&#234; a ver&#225; implementada no &lt;a href="http://www.patriciafigueira.com.br"&gt;site da Patricia Figueira&lt;/a&gt; e no &lt;a href="http://beonthe.net/"&gt;beonthe.net&lt;/a&gt;. Mas se este post n&#227;o resolver o seu caso espec&#237;fico, escreva. Vamos juntos pensar em solu&#231;&#245;es para dominar o &lt;code&gt;&amp;lt;hr /&amp;gt;&lt;/code&gt; &amp;mdash; e, quem sabe, s&#243; quem sabe, o Internet Explorer.&lt;/p&gt;</description>
      <pubDate>Tue, 02 Sep 2008 12:33:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:71ec4e3a-2c7f-49e1-8468-b8153b66cec5</guid>
      <author>Leandro Mello</author>
      <link>http://blog.improveit.com.br/articles/2008/09/02/margens-na-tag-hr-um-caso-resolvido</link>
      <category>best practices</category>
      <category>CSS</category>
      <category>design</category>
      <category>layout</category>
      <category>IE</category>
    </item>
    <item>
      <title>O denominador comum</title>
      <description>&lt;blockquote class="excerpt"&gt;
    &lt;p&gt;Na internet, mesmo que voc&#234; n&#227;o consiga mostrar uma imagem, ainda consegue dizer as mil palavras.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hoje descobri um detalhe no meu m&#233;todo de escrever CSS que pretendo adotar como "best practice" pra mim em todo projeto futuro: a &#250;nica folha de estilo que, num projeto que abranja tela/impress&#227;o/mobile, deve levar atributo &lt;code&gt;media="all"&lt;/code&gt;. Eu a chamo de &lt;strong&gt;"typography.css"&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;Inspira&#231;&#227;o de fora da web&lt;/h3&gt;

&lt;p&gt;Cheguei a esta pr&#225;tica aplicando no webdesign um tanto do &lt;em&gt;modus operandi&lt;/em&gt; adotado por publicit&#225;rios e designers fora da web.&lt;/p&gt;

&lt;p&gt;Em design e publicidade, costuma-se lidar separadamente com &lt;strong&gt;layout&lt;/strong&gt; e &lt;strong&gt;tipografia&lt;/strong&gt;. Isso porque o design aplicado ao texto carrega por si s&#243; uma personalidade t&#227;o forte, que merece aten&#231;&#227;o &#224; parte. H&#225; aos montes empresas dedicadas exclusivamente &#224; tipografia, que passam dias, semanas, para criar uma &#250;nica fonte, completa e bela. O visual do texto tem um poder s&#243; seu.&lt;/p&gt;

&lt;p&gt;Na web, sofremos s&#233;rias restri&#231;&#245;es &#224; tipografia. N&#227;o &#233; poss&#237;vel usar fontes realmente &#250;nicas em um site porque elas podem n&#227;o existir no computador do usu&#225;rio. O uso de imagens com texto bonit&#227;o apresenta alguns riscos &#224; acessibilidade, e a pr&#225;tica de incluir as pr&#243;prias fontes no c&#243;digo tem &lt;a href="http://typographica.org/001112.php"&gt;suas pr&#243;prias complica&#231;&#245;es&lt;/a&gt;. Em resumo, paci&#234;ncia: o jeito &#233; usar o rozfej&#227;o mesmo e saber brincar com ele. O que &#233; bom, j&#225; que este texto n&#227;o trata mesmo de tipografia, mas do que podemos aprender com o h&#225;bito de separ&#225;-la do layout.&lt;/p&gt;

&lt;h3&gt;Consist&#234;ncia e identidade visual&lt;/h3&gt;

&lt;p&gt;O bom do CSS &#233; que ele garante a consist&#234;ncia das p&#225;ginas do seu site. Uma mudan&#231;a num seletorzinho qualquer e pronto, milhares de p&#225;ginas s&#227;o atualizadas de uma vez s&#243;, que beleza! Isso tem tudo a ver com o que chamamos &lt;em&gt;identidade visual&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Uma empresa que respeita a pr&#243;pria identidade visual faz quest&#227;o de que, no m&#237;nimo, sua tipografia seja consistente em todos os meios de comunica&#231;&#227;o, tanto em impressos como em eletr&#244;nicos, tanto quanto for poss&#237;vel. O layout &#233; muito mais sujeito a pequenos ajustes aqui e ali por causa da variedade de suportes a que pode ser aplicado, mas o modo como o texto &#233; apresentado tem que respeitar uma consist&#234;ncia ainda mais globalizada &amp;mdash; o designer um dia pode se ver tendo que fazer uma pe&#231;a que confie unicamente na tipografia, e as pessoas t&#234;m que reconhecer que tal pe&#231;a pertence a tal empresa. E na web esta situa&#231;&#227;o &#233; bastante recorrente.&lt;/p&gt;

&lt;h3&gt;O denominador comum&lt;/h3&gt;

&lt;p&gt;Imagine que seu site &#233; poderos&#227;o, pode ser impresso, visto em mobiles, transformado numa transpar&#234;ncia etc. Agora tire todos os luxos. Imagens, firulas de layout e tudo mais. O que sobra? &lt;strong&gt;Texto&lt;/strong&gt;. Na internet, mesmo que voc&#234; n&#227;o consiga mostrar uma imagem, ainda consegue dizer as mil palavras. E de quebra transmiti-las para as outras m&#237;dias. Ent&#227;o por que n&#227;o criar uma folha de estilo que lide s&#243; com o que tem a ver com texto?&lt;/p&gt;

&lt;h3&gt;Como aconteceu comigo&lt;/h3&gt;

&lt;p&gt;&#192; medida que os projetos em que eu trabalho cresciam, ficava complicado navegar pelo mar de seletores. Como eu escrevo CSS de modo incrivelmente regular, com todas propriedades aparecendo sempre na mesma ordem (ok, podem me chamar de man&#237;aco) percebi que as propriedades que regiam o texto vinham sempre antes do grupo que controlava o layout. Para diminuir o tamanho de arquivo, resolvi pegar as propriedades de texto e jogar todas num arquivo separado, a que chamei &lt;strong&gt;typography.css&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;Ent&#227;o, por exemplo:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;.rss_links a, 
.podcast_files h4 a {
    font-size:              80%;
    text-transform:         uppercase;
    text-decoration:        none;
    padding:                .3em 1em;
    background:             #F7F7F7 url(/images/background/gradient_light_to_dark.png) repeat-x bottom left;
    border:                 1px outset #F7F7F7;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;... dividiu-se em um trecho que foi para o &lt;em&gt;typography.css&lt;/em&gt;:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;.rss_links a, 
.podcast_files h4 a {
    font-size:              80%;
    text-transform:         uppercase;
    text-decoration:        none;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;... e outro que permaneceu no original &lt;em&gt;application.css&lt;/em&gt;:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;.rss_links a, 
.podcast_files h4 a {
    padding:                .3em 1em;
    background:             #F7F7F7 url(/images/background/gradient_light_to_dark.png) repeat-x bottom left;
    border:                 1px outset #F7F7F7;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E assim por diante, com todos seletores. A cis&#227;o foi bem f&#225;cil. A decis&#227;o de fazer a divis&#227;o e o nome que arranjei para a nova folha de estilos foi mais guiada pelo meu velho h&#225;bito de designer gr&#225;fico &amp;mdash; e por uma leve esperan&#231;a de que isso tornasse menores os arquivos &amp;mdash; do que por alguma no&#231;&#227;o de onde isso ia dar. Mal sabia que ia ter resultados bem interessantes.&lt;/p&gt;

&lt;p&gt;Ora, em um ponto chega a hora de fazer um CSS de impress&#227;o e um para mobile. Em minha primeira experi&#234;ncia desde que resolvi usar o m&#233;todo typography, resolvi expandir a dobradinha para o &lt;em&gt;print&lt;/em&gt; e o &lt;em&gt;handheld&lt;/em&gt;, criando assim as folhas de estilo &lt;strong&gt;application_print&lt;/strong&gt; e &lt;strong&gt;typography_print&lt;/strong&gt;, e &lt;strong&gt;application_handhled&lt;/strong&gt; e &lt;strong&gt;typography_handheld&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Minha pasta "stylesheets" ent&#227;o ficou assim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;application.css;&lt;/li&gt;
&lt;li&gt;application_handhled.css;&lt;/li&gt;
&lt;li&gt;application_print.css;&lt;/li&gt;
&lt;li&gt;typography.css.&lt;/li&gt;
&lt;li&gt;typography_handheld.css;&lt;/li&gt;
&lt;li&gt;typography_print.css;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Que beleza! Mas p&#244;... &lt;em&gt;seis&lt;/em&gt; folhas de estilo s&#243; por um capricho de designer de separar o layout da tipografia? "Tem que ter um jeito de fazer melhor", pensei. E tinha. Com a saca&#231;&#227;o sutil, j&#225; dita l&#225; em cima, de que a tipografia tem que ser &lt;em&gt;global&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;Refatora&#231;&#227;o, resultados e vantagens&lt;/h3&gt;

&lt;p&gt;Percebi que os seletores dos tr&#234;s arquivos de tipografia eram muito similares. Assim, misturei tudo o que eu tinha no &lt;code&gt;typography&lt;/code&gt;, &lt;code&gt;typography_handheld&lt;/code&gt; e &lt;code&gt;typography_print&lt;/code&gt; em um &#250;nico arquivo &lt;code&gt;typography.css&lt;/code&gt;. Fim da duplica&#231;&#227;o: ele passou a cuidar de tudo &amp;mdash; tamanho da fonte, cor da letra, it&#225;licas, negritos, mai&#250;sculas e tudo mais. No CSS de impress&#227;o, como geralmente as pessoas preferem imprimir textos em preto, foi s&#243; escrever &lt;code&gt;html * { color: #000; }&lt;/code&gt; que tudo foi resetado para preto (sobra meia d&#250;zia de seletores teimosos, &#233; s&#243; fazer o mesmo).&lt;/p&gt;

&lt;p&gt;Por &#250;ltimo, no &lt;code&gt;head&lt;/code&gt; do HTML, atribu&#237; ao typography.css &lt;code&gt;media="all"&lt;/code&gt;. E s&#243; a ele. As outras folhas de estilo que se preocupassem com suas m&#237;dias espec&#237;ficas. Todas estas outras folhas herdariam as mesmas propriedades de texto e, assim, estaria garantida a consist&#234;ncia n&#227;o s&#243; entre as p&#225;ginas de um mesmo site, mas entre as v&#225;rias m&#237;dias que uma empresa e seu site disponibilizam. Identidade visual, caro leitor!&lt;/p&gt;

&lt;p&gt;Outras vantagens que este m&#233;todo me trouxe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Com todas as minhas preocupa&#231;&#245;es com texto voltadas para uma &#250;nica folha de estilos, pude concentrar esfor&#231;os de design no layout espec&#237;fico de cada m&#237;dia, o que me salvou de um trabalh&#227;o extra, e mostrou ser para mim um jeito bem mais gostoso de trabalhar layout;&lt;/li&gt;
&lt;li&gt;A prolifera&#231;&#227;o das folhas de estilo ficou bem mais controlada. Agora, se eu tenho CSS para &lt;em&gt;n&lt;/em&gt; m&#237;dias diferentes, em vez de ter 2n folhas de estilo como antes, passo a ter sempre n+1, sendo este "1" o nosso amigo typography;&lt;/li&gt;
&lt;li&gt;O peso total da soma dos arquivos, em conseq&#252;&#234;ncia, diminuiu. Leveza &#233; o que h&#225;!&lt;/li&gt;
&lt;li&gt;E o mais importante de tudo: as folhas de estilo n&#227;o mais viram um oceano gigantesco de seletores, ficam leg&#237;veis para todos na equipe, eu encontro o que quero f&#225;cil, altero o que preciso bem f&#225;cil, e &lt;em&gt;volto para casa no fim do expediente sem fazer hora extra!&lt;/em&gt;   ;D&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enfim, a nova pr&#225;tica tem-me rendido bons resultados. H&#225; ressalvas, claro: num projeto pequeno, que n&#227;o se pretende imprimir ou ver em mobile, n&#227;o vale a pena separar typography de application. Por sua vez, um projeto gigantesco, ainda que bom candidato a ganhar um &lt;code&gt;typography.css&lt;/code&gt;, tem muito mais chances de ter folhas de estilo auxiliares que provavelmente jogariam por terra minha contagem "n+1" de folhas. Mas no todo, meu trabalho com CSS tem sido bem mais bacana tendo que me preocupar com uma coisa de cada vez. &#201; algo que com certeza vou adotar como best practice nos meus trabalhos... at&#233; aparecer uma pr&#225;tica melhor!  :)&lt;/p&gt;

&lt;p&gt;Este foi meu primeiro post no blog da Improve It. Espero que as informa&#231;&#245;es sejam &#250;teis de alguma forma, e inspirem boas pr&#225;ticas em designers e programadores por a&#237;. At&#233; onde experimentei, foi dos m&#233;todos que mais facilitou o trabalho por aqui. Claro que, ou eu n&#227;o li o suficiente sobre CSS, ou esse assunto de separar tipografia j&#225; cansou de ser discutido l&#225; fora, ou as duas coisas. Por isso, convido meus caros compadres designers a participarem da discuss&#227;o. Quem sabe at&#233; onde esta metodologia pode ser aprimorada?&lt;/p&gt;</description>
      <pubDate>Thu, 26 Jun 2008 22:57:44 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:a97f2393-8de8-480e-8c1f-c9df8901ad79</guid>
      <author>Leandro Mello</author>
      <link>http://blog.improveit.com.br/articles/2008/06/26/css-design-o-denominador-comum</link>
      <category>design</category>
      <category>CSS</category>
      <category>tipografia</category>
      <category>layout</category>
      <category>best practices</category>
    </item>
  </channel>
</rss>
