<?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>RamonPage.com . Web na ponta do lápis &#187; DOM</title>
	<atom:link href="http://ramonpage.com/category/dom/feed/" rel="self" type="application/rss+xml" />
	<link>http://ramonpage.com</link>
	<description>arte, desenvolvimento, design, programação, webstandards, acessibilidade, usabilidade, tipografia, UX, UI, IA</description>
	<lastBuildDate>Tue, 15 May 2012 17:44:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>HTML5 e o outro lado da moeda</title>
		<link>http://ramonpage.com/2008/09/23/html5-e-o-outro-lado-da-moeda/</link>
		<comments>http://ramonpage.com/2008/09/23/html5-e-o-outro-lado-da-moeda/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 04:46:12 +0000</pubDate>
		<dc:creator>RamonPage</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://ramonpage.com/?p=82</guid>
		<description><![CDATA[Para você que leu meu último post sobre HTML5 e encarou com estranheza a idéia de que só em 2022 ele estará definitivamente &#8220;pronto para uso&#8221;, alguns pontos importantes precisam ser esclarecidos. Saiba quais são eles. 1. Compatibilidade dos browsers A expectativa é de que em 2009 (data programada para um novo rascunho) o HTML5 [...]]]></description>
			<content:encoded><![CDATA[<p>Para você que leu meu <a href="http://ramonpage.com/2008/09/14/html5-e-o-futuro-da-internet/" rel="external">último post sobre <abbr title="HyperText Markup Language 5">HTML5</abbr></a> e encarou com estranheza a idéia de que só em 2022 ele estará definitivamente &#8220;pronto para uso&#8221;, alguns pontos importantes precisam ser esclarecidos. Saiba quais são eles.</p>
<p><span id="more-82"></span></p>
<h3>1. Compatibilidade dos <em>browsers</em></h3>
<p>A expectativa é de que em 2009 (data programada para um novo rascunho) o HTML5 já esteja suportado na maioria dos browsers modernos, mas não por completo.</p>
<p>Assim como a guerra dos browsers propõe, cada browser deve se basear primeiramente naquilo que lhe convém. Dentro deste tema, será interessante ver a abordagem das tags <code>&lt;audio&gt;</code> e <code>&lt;video&gt;</code> que certamente implicarão em interesses pessoais de Microsoft (Media Player) e Apple (QuickTime).</p>
<h3>2. Implementação incompleta</h3>
<p><a href="http://wiki.whatwg.org/wiki/Implementations_in_Web_browsers" rel="external" class="external-link">Veja uma pequena lista</a> de implementações catalogada pelo pessoal do <a href="http://www.whatwg.org/" rel="external" class="external-link"><abbr title="Web Hypertext Application Technology Working Group">whatwg</abbr></a>, cujo trabalho é voltado exatamente no HTML5.</p>
<p>Veja outra lista no <a href="http://en.wikipedia.org/wiki/Comparison_of_layout_engines_(HTML_5)" rel="external" class="external-link">wikipedia</a>. O <a href="http://www.opera.com/" rel="external" class="external-link">Opera Browser</a> (Presto Engine), como já é de se esperar, tem o melhor suporte até então.</p>
<h3>3. Cultura</h3>
<p>Passamos um bom tempo até chegarmos numa web satisfatória (mesmo que numa percentagem pequena ainda). Poucos anos atrás, não existia a preocupação nos desenvolvedores em manter a  marcação de seus sites organizada, que dirá pensar em <em>standards</em>: era perda de tempo demais!  </p>
<p>Agora, nos deparamos com uma nova realidade, já que <span class="pullquote">até quem trabalha com XHTML 1.x poderá se converter para o HTML5</span>. Mas, será que os desenvolvedores querem mesmo isso? Esse ponto é importantíssimo para aqueles que correlacionam padrões web apenas com XHTML. Ledo engano.</p>
<p>John Resig, aquele do <a href="http://jquery.com/" rel="external" class="external-link">Jquery</a>, escreveu no início do ano sobre <a href="http://ejohn.org/blog/html5-doctype/" rel="external" class="external-link">uma forma prática</a> de implementar sempre o mais recente DOCTYPE nas marcações. Essa técnica será válida para o HTML5. Assim, os desenvolvedores poderiam continuar com seu HTML4 e ir adicionando funcionalidades ao longo do tempo &#8212; de acordo com a compatibilidade dos browsers &#8212; dentro da marcação HTML5. Como o DOCTYPE não define a versão da marcação, ele sempre procurará corresponder à mais recente encontrada.</p>
<p>O código é simples:</p>
<p><code>&lt;!DOCTYPE html&gt;</code></p>
<p>Essa seria uma forma interessante de comerçarmos a nos acostumar com o HTML5.</p>
<h3>Conclusão</h3>
<p>Apesar de existir um longo caminho até o HTML5 substituir completamente o HTML4, estamos próximos de conseguirmos utilizá-lo aos poucos, já com certa compatibilidade de recursos nos browsers. De qualquer forma, penso que a &#8220;cultura&#8221; que trato neste artigo está diretamente ligada à previsão de 2022 tratada no artigo anterior, visto que certamente haverá um bom tempo até que alguma parte dos desenvolvedores/webdesigners se conscientizem da nova realidade. Vale lembrar que tínhamos bom suporte à HTML <em>standard</em> há muitos anos (mais de uma década) e só agora, desde poucos anos atrás, nos tocamos disso. <strong>:P</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://ramonpage.com/2008/09/23/html5-e-o-outro-lado-da-moeda/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A maturidade do javascript e acessibilidade</title>
		<link>http://ramonpage.com/2007/08/05/a-maturidade-do-javascript-e-acessibilidade/</link>
		<comments>http://ramonpage.com/2007/08/05/a-maturidade-do-javascript-e-acessibilidade/#comments</comments>
		<pubDate>Sun, 05 Aug 2007 18:05:45 +0000</pubDate>
		<dc:creator>RamonPage</dc:creator>
				<category><![CDATA[Acessibilidade]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[DOM]]></category>

		<guid isPermaLink="false">http://ramonpage.com/2007/08/05/a-maturidade-do-javascript-e-acessibilidade/</guid>
		<description><![CDATA[Corrija-me se eu estiver errado: javascript se não for &#8220;o&#8221; é um dos grandes adventos da Internet de todos os tempos! Porém ainda existem muitos mitos em torno da sua utilização. Assim como disse para o ajax, repito para os scripts em geral: javascript é bom, mas na medida certa. E para justificar isso, apresento [...]]]></description>
			<content:encoded><![CDATA[<p>Corrija-me se eu estiver errado: javascript se não for &#8220;o&#8221; é um dos grandes adventos da Internet de todos os tempos! Porém ainda existem muitos mitos em torno da sua utilização. Assim como disse para o <a href="http://ramonpage.com/2006/11/26/algumas-formas-de-se-usar-ajax-corretamente-em-projetos-web/" rel="external">ajax</a>, repito para os scripts em geral: javascript é bom, mas na medida certa. E para justificar isso, apresento algumas formas acessíveis de se usar javascript, além de divagar sobre sua maturidade, que vem se revigorando à cada dia.</p>
<p><span id="more-50"></span></p>
<h2>Javascript como deve ser</h2>
<p>Algumas razões para se usar javascript:</p>
<ul>
<li>Interatividade;</li>
<li>Validação de dados;</li>
<li>Processamento de informação;</li>
<li>Efeitos visuais.</li>
</ul>
<p>Como o javascript oferece um sem fim de possibilidades, a má utilização de um dos itens acima pode ser perigosa e determinante para o resultado insatisfatório de um projeto.</p>
<p>E este perigo está diretamente ligado à acessibilidade do javascript. É importante lembrar que <span class="pullquote">páginas não devem depender de scripts. Scripts devem, apenas, incrementar seus resultados</span>.</p>
<h2>Javascript acessível?</h2>
<p>Sim, é possível! Pensemos como se todas as páginas não usassem javascripts. Qual seria a alternativa para algo que invariavelmente um javascript faria? Complicado não? Porém não impossível.</p>
<h3>Algumas regras</h3>
<ul>
<li>Não restringir apenas o uso do mouse para algum script;</li>
<li>Usar eventos independentes&sup1; de dispositivo (<code>onFocus</code>, <code>onBlur</code>, <code>onSelect</code> e <code>onChange</code>, por exemplo)</li>
<li>Não comprometer a navegação pelo teclado em qualquer seção de uma página;</li>
<li>Oferecer alternativas para situaçõs em que o javascript não esteja habilitado;</li>
<li>Usar <abbr title="Document Object Model">DOM</abbr> ao invés de <abbr title="Dynamic Hypertext Markup Language">DHTML</abbr>; e</li>
<li>Usar <a href="http://onlinetools.org/articles/unobtrusivejavascript/" class="external-link" rel="external">javascript unobtrusivo</a>.</li>
</ul>
<p class="info-label">&sup1; &#8211; Eventos independentes são eventos que podem ser acionados tanto por mouse, quanto por teclado, sem que o resultado seja comprometido.</p>
<h2>Javascript maduro é o que há!</h2>
<p>Do DHTML ao DOM, do javascript <em>acoplado</em> ao javascript unobtrusivo, dos scripts convencionais às <abbr title="Application Programming Interface">API</abbr>s e <em>libraries</em>. O javascript notoriamente está sendo levado à sério.</p>
<h3>Incrementado a acessibilidade com javascript maduro</h3>
<p>Atualmente, existem diversas formas de se incrementar um javascript tradicional. Algumas são simples, como a adição de <a href="http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html" class="external-link" rel="external">addEvents</a> para observar eventos de elementos, outras mais complexas, como a escolha da library adequada para um projeto. E essa escolha tende a ser difícil, pois a gama de alternativas é grande: <a href="http://jquery.com/" class="external-link" rel="external">JQuery</a>, <a href="http://www.prototypejs.org/" class="external-link" rel="external">Prototype</a>, <a href="http://mochikit.com/" class="external-link" rel="external">Mochikit</a>, <a href="http://dojotoolkit.org/" class="external-link" rel="external">Dojo Toolkit</a>, <a href="http://developer.yahoo.com/yui/" class="external-link" rel="external">YUI</a>, <a href="http://extjs.com/" class="external-link" rel="external">Ext JS</a>&#8230; Ufa! Ainda esqueci outros, com certeza.</p>
<h2>Conclusão</h2>
<p>Está comprovado que é possível usar javascript de forma inteligente e acessível. E, como digo para qualquer outro recurso: o uso ou não de uma determinada alternativa depende, antes de tudo, da característica fim do projeto. Não fará sentido usar uma <em>library</em> apenas para validar um formulário. Em contrapartida, é quase que imprescindível o seu uso em uma aplicação baseada em Web. <strong>;)</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://ramonpage.com/2007/08/05/a-maturidade-do-javascript-e-acessibilidade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gerador de ano de copyright via DOM</title>
		<link>http://ramonpage.com/2007/02/24/gerador-de-ano-de-copyright-via-dom/</link>
		<comments>http://ramonpage.com/2007/02/24/gerador-de-ano-de-copyright-via-dom/#comments</comments>
		<pubDate>Sun, 25 Feb 2007 01:18:54 +0000</pubDate>
		<dc:creator>RamonPage</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[DOM]]></category>

		<guid isPermaLink="false">http://ramonpage.com/2007/02/24/gerador-de-ano-de-copyright-via-dom/</guid>
		<description><![CDATA[Deseja atualizar os anos de copyright de sua página, automaticamente, sem comprometer a sua marcação? Deseja, ainda, integrar essa atualização à estrutura de microformats que você já possui? Então, eis uma técnica simples de como atualizar automaticamente os anos de copyright de uma página web, via DOM. Conceito A lógica é simples: dado um ano, [...]]]></description>
			<content:encoded><![CDATA[<p>Deseja atualizar os anos de <em>copyright</em> de sua página, automaticamente, sem comprometer a sua marcação? Deseja, ainda, integrar essa atualização à estrutura de <a href="http://microformats.org/wiki/hcard" class="external-link" rel="external">microformats</a> que você já possui? Então, eis uma técnica simples de como atualizar automaticamente os anos de copyright de uma página web, via DOM.</p>
<p><span id="more-36"></span></p>
<h2>Conceito</h2>
<p>A lógica é simples: dado um ano, caso ele seja maior que o ano de criação do site, este é adicionado ao ano de copyright da página.</p>
<ol class="code">
<li><code>var firstYear = els[i].innerHTML; // Ano retirado do site</code></li>
<li><code>var currentYear = new Date(); // Data corrente</code></li>
<li><code>&nbsp;</code></li>
<li><code>currentYear = currentYear.getFullYear();</code> // Ano corrente, ajustado para 4 dígitos (formato para todos os browsers).</li>
<li><code>&nbsp;</code></li>
<li><code>if (currentYear > firstYear) { // Se o ano corrente for maior que o ano do site.</code></li>
<li class="tab1"><code>els[i].innerHTML = els[i].innerHTML + " - " + currentYear; // Ano do site recebe o ano de criação, mais o ano corrente.</code></li>
<li><code>}</code></li>
</ol>
<p>Na notação acima, <code>els[i].innerHTML</code> representa todas as classes encontradas no site para a representação do ano de criação.</p>
<h2>Como fazer funcionar?</h2>
<p>Basta inserir o ano de criação do site dentro de um <code>&lt;span&gt;</code>. O resto deixe por conta do script!</p>
<p><em>Exemplo:</em></p>
<ol class="code">
<li><code>&lt;span class="copyright year"&gt;2007&lt;/span&gt;</code></li>
</ol>
<p><em>Resulta em<sup>1</sup>:</em></p>
<p class="info-label"><sup>1</sup> &#8211; Adiante a data de seu Sistema Operacional em 1 (um) ano para poder ver este exemplo em ação.</p>
<p><span class="copyright year">2007</span></p>
<h3>Mas&#8230; Por que &#8220;copyright year&#8221;?</h3>
<p>Lembra dos <a href="http://microformats.org/wiki/hcard" class="external-link" rel="external">microformats</a>? Pois então. Esta minha escolha de classes foi idealizada exatamente para não comprometer o seu uso.</p>
<h2>Colocando para funcionar</h2>
<p>Para fazer o <em>Copyright Generator</em> funcionar em seu site, basta baixar o arquivo <a href="http://ramonpage.com/wp-content/themes/pagev3/js/copygen.js">copygen.js</a>,  inserí-lo na lista de scripts do <code>&lt;head&gt;</code> de sua página e utilizar o <code>&lt;span class="copyright year"&gt;&lt;/span&gt;</code> para receber o ano de criação do seu site. <em>Enjoy!</em> <strong>;)</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://ramonpage.com/2007/02/24/gerador-de-ano-de-copyright-via-dom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mostrar-esconder conteúdo via DOM V.2</title>
		<link>http://ramonpage.com/2006/11/06/mostrar-esconder-conteudo-via-dom-v2/</link>
		<comments>http://ramonpage.com/2006/11/06/mostrar-esconder-conteudo-via-dom-v2/#comments</comments>
		<pubDate>Mon, 06 Nov 2006 11:39:07 +0000</pubDate>
		<dc:creator>RamonPage</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://ramonpage.com/2006/11/06/mostrar-esconder-conteudo-via-dom-v2/</guid>
		<description><![CDATA[Show-hide content with DOM V.2 Ontem, ao redigir o artigo sombra em imagem com DOM e CSS, percebi que o script de mostrar-esconder conteúdo poderia receber uma melhoria. Ao invés de procurar cada classe CSS que se referisse à outra língua (no meu caso o inglês), por que não utilizar o atributo lang inserido dentro [...]]]></description>
			<content:encoded><![CDATA[<h3 class="lang-en" lang="en">Show-hide content with DOM V.2</h3>
<p>Ontem, ao redigir o artigo <a href="http://ramonpage.com/2006/11/05/sombra-em-imagem-com-dom-e-css/">sombra em imagem com <abbr title="Document Object Model">DOM</abbr> e <abbr title="Cascading Style Sheets">CSS</abbr></a>, percebi que o script de mostrar-esconder conteúdo poderia receber uma melhoria. Ao invés de procurar cada classe CSS que se referisse à outra língua (no meu caso o inglês), por que não utilizar o atributo <code>lang</code> inserido dentro das referidas tags?? Pois é, essa foi a sacada!</p>
<p><span id="more-25"></span></p>
<h3>Novo código</h3>
<ol class="code">
<li><code>var arrEls = new Array("h1","h2","h3","h4","h5","h6", "p","span","ul","ol","blockquote")</code></li>
<li><code>&nbsp;</code></li>
<li><code>function getTextNodeByLangName(tag,eventNode) {</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var els = document.getElementsByTagName(tag);</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var idLink = 'showHideTextNode';</code></li>
<li class="tab1"><code>var messageShow = '[+] Show english content';</code></li>
<li class="tab1"><code>var messageHide = '[-] Hide english content';</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var linkTextNode = document.getElementById(idLink);</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>for (i = 0; i < els.length; i++) { </code></li>
<li class="tab2"><code>var lang = els[i].getAttribute("lang"); </code></li>
<li class="tab2"><code>if (lang == 'en') {</code></li>
<li class="tab3"><code>if (eventNode == 'hide') {</code></li>
<li class="tab4"><code>linkTextNode.innerHTML = messageShow;</code></li>
<li class="tab4"><code>linkTextNode.className = "link-show";</code></li>
<li class="tab4"><code>linkTextNode.onclick = function() {</code></li>
<li class="tab5"><code>for (j = 0; j < arrEls.length; j++) {</code></li>
<li class="tab6"><code>getTextNodeByLangName(arrEls[j],'show');</code></li>
<li class="tab5"><code>}</code></li>
<li class="tab4"><code>};</code></li>
<li class="tab4"><code>els[i].style.display = 'none';</code></li>
<li class="tab3"><code>} else if (eventNode == 'show') {</code></li>
<li class="tab4"><code>linkTextNode.innerHTML = messageHide;</code></li>
<li class="tab4"><code>linkTextNode.className = "link-hide";</code></li>
<li class="tab4"><code>linkTextNode.onclick = function() {</code></li>
<li class="tab5"><code>for (j = 0; j < arrEls.length; j++) {</code></li>
<li class="tab6"><code>getTextNodeByLangName(arrEls[j],'hide');</code></li>
<li class="tab5"><code>}</code></li>
<li class="tab4"><code>};</code></li>
<li class="tab4"><code>els[i].style.display = 'block';</code></li>
<li class="tab3"><code>}</code></li>
<li class="tab2"><code>}</code></li>
<li class="tab1"><code>}</code></li>
<li><code>}</code></li>
<li><code>&nbsp;</code></li>
<li><code>function init_textNode() {</code></li>
<li class="tab1"><code>if (!document.getElementsByTagName) return</code></li>
<li class="tab2"><code>for (j = 0; j < arrEls.length; j++) {</code></li>
<li class="tab3"><code>getTextNodeByLangName(arrEls[j],'hide');</code></li>
<li class="tab2"><code>}</code></li>
<li><code>}</code></li>
<li><code>&nbsp;</code></li>
<li><code>addLoadEvent(init_textNode);</code></li>
</ol>
<p>A grande mudança está na localização do atributo <code>lang</code>, como a seguir:</p>
<ol class="code">
<li class="tab2"><code>var lang = els[i].getAttribute("lang"); </code></li>
<li class="tab2"><code>if (lang == 'en') {</code></li>
</ol>
<p>Agora, a classe que antes era responsável por esconder os conteúdos, agora ficou apenas com o trabalho de estilizar estas áreas. <strong>;)</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://ramonpage.com/2006/11/06/mostrar-esconder-conteudo-via-dom-v2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sombra em imagem com DOM e CSS</title>
		<link>http://ramonpage.com/2006/11/05/sombra-em-imagem-com-dom-e-css/</link>
		<comments>http://ramonpage.com/2006/11/05/sombra-em-imagem-com-dom-e-css/#comments</comments>
		<pubDate>Sun, 05 Nov 2006 22:01:56 +0000</pubDate>
		<dc:creator>RamonPage</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://ramonpage.com/2006/11/05/sombra-em-imagem-com-dom-e-css/</guid>
		<description><![CDATA[Image drop shadow with DOM and CSS Inspirado pelos artigos do A List Apart, há um tempo venho pensando numa solução para criar sombras em imagens sem atrapalhar minha semântica, ou seja, com o mínimo de manipulação da marcação em torno da imagem. Depois de alguns estudos e testes, cheguei num resultado onde é necessário [...]]]></description>
			<content:encoded><![CDATA[<h3 class="lang-en" lang="en">Image drop shadow with DOM and CSS</h3>
<p>Inspirado <a href="http://alistapart.com/articles/cssdropshadows/" class="external-link">pelos</a> <a href="http://alistapart.com/articles/cssdrop2/" class="external-link">artigos</a> do <a href="http://alistapart.com/" class="external-link">A List Apart</a>, há um tempo venho pensando numa solução para criar sombras em imagens sem atrapalhar minha semântica, ou seja, com o mínimo de manipulação da marcação em torno da imagem. Depois de alguns estudos e testes, cheguei num resultado onde é necessário utilizar <em>apenas</em> uma classe para criar as sombras.</p>
<p class="lang-en" lang="en">Inspired by two articles of <strong>A List Apart</strong>, I come thinking about a solution to create drop shadows on images without confuse my semantic, that is, with the minimum of manipulation in markup around the image. After some studies and tests, I arrived in a result where it&#8217;s necessary to use only one class to create the drop shadows.</p>
<p><span id="more-24"></span></p>
<h3>Como funciona</h3>
<h3 class="lang-en" lang="en">How it works</h3>
<p>O conceito da criação das sombras é o seguinte:</p>
<ol>
<li>Adicionar um <code>div</code>, via <abbr title="Document Object Model">DOM</abbr>, em volta da imagem;</li>
<li>Setar este <code>div</code> com a mesma largura da imagem, para que a sombra fique proporcional à largura da mesma;</li>
<li>Inserir um background que simule uma sombra neste <code>div</code> via <abbr title="Cascading Style Sheets">CSS</abbr>;</li>
<li>Deslocar, levemente, a imagem para obter o tamanho de sombra desejado, também via <abbr title="Cascading Style Sheets">CSS</abbr>.</li>
<li>Pronto!</li>
</ol>
<ol class="lang-en" lang="en">
<li>Insert a <code>div</code>, with <abbr title="Document Object Model">DOM</abbr>, around the image;</li>
<li>Set this <code>div</code> with the same width of the image;</li>
<li>Insert a shadow background on <code>div</code> with <abbr title="Cascading Style Sheets">CSS</abbr>;</li>
<li>Dislocate, lightly, the image to get the desired size of drop shadow, also with <abbr title="Cascading Style Sheets">CSS</abbr>.</li>
<li>That&#8217;s all!</li>
</ol>
<p>Veja um exemplo:</p>
<p class="lang-en" lang="en">Take a look:</p>
<ol class="code">
<li><code>&lt;img src="../avatar-80x80.gif" class="shadow" /&gt;</code></li>
</ol>
<p>Resulta em:</p>
<p class="lang-en" lang="en">Results in:</p>
<p><img src="http://ramonpage.com/wp-content/themes/pagev2/pics/avatar-80x80.gif" class="shadow" /></p>
<h3>Os códigos</h3>
<h3 class="lang-en" lang="en">The codes</h3>
<p>Criando o container, via DOM, para receber a sombra da imagem.</p>
<ol class="code">
<li><code>setImageDropShadow = function (searchClass,tag) {</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var browser=navigator.appName;</code></li>
<li class="tab1"><code>var agent = navigator.userAgent;</code></li>
<li class="tab1"><code>var b_version=navigator.appVersion;</code></li>
<li class="tab1"><code>var version=parseFloat(b_version);</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var opera = false</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>if(agent.indexOf("Opera")!=-1){</code></li>
<li class="tab2"><code>var versionindex=agent.indexOf("Opera")+6;</code></li>
<li class="tab3"><code>if (parseInt(agent.charAt(versionindex))>=8)</code></li>
<li class="tab4"><code>opera = true;</code></li>
<li class="tab1"><code>}</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var els = document.getElementsByTagName(tag); </code></li>
<li class="tab1"><code>var pattern = new RegExp("\\b"+searchClass+"\\b");</code></li>
<li class="tab1"><code>for (i = 0; i < els.length; i++) {</code></li>
<li class="tab2"><code>if ( pattern.test(els[i].className) ) {</code></li>
<li class="tab3"><code>var NewDiv = document.createElement('div');</code></li>
<li class="tab3"><code>NewDiv.className = "shadow-container";</code></li>
<li><code>&nbsp;</code></li>
<li class="tab3"><code>if (((browser=="Microsoft Internet Explorer") &#038;&#038; (version>=4) &#038;&#038; (!agent.indexOf("MSIE 7") != -1)) || (opera)) { // Fix IE 6 and Opera width problem</code></li>
<li class="tab4"><code>NewDiv.style.width = (els[i].width - 4).toString() + "px";</code></li>
<li class="tab3"><code>} else {</code></li>
<li class="tab4"><code>NewDiv.style.width = (6 + els[i].width).toString() + "px";</code></li>
<li class="tab3"><code>}</code></li>
<li><code>&nbsp;</code></li>
<li class="tab3"><code>var parentDiv = els[i].parentNode;</code></li>
<li class="tab3"><code>parentDiv.insertBefore(NewDiv, els[i]);</code></li>
<li class="tab3"><code>NewDiv.appendChild(els[i]);</code></li>
<li class="tab2"><code>}</code></li>
<li class="tab1"><code>}</code></li>
<li><code>}</code></li>
<li><code>&nbsp;</code></li>
<li><code>window.onload = function() {</code></li>
<li class="tab1"><code>setImageDropShadow('shadow','img');</code></li>
<li><code>};</code></li>
</ol>
<p>Estilizando a sombra. </p>
<ol class="code">
<li><code>.shadow-container {</code></li>
<li class="tab1"><code>position: relative;</code></li>
<li class="tab1"><code>background: url(bg-small-shadow.png);</code></li>
<li><code>}</code></li>
<li><code>&nbsp;</code></li>
<li><code>.shadow-container img {</code></li>
<li class="tab1"><code>position: relative;</code></li>
<li class="tab1"><code>display: block;</code></li>
<li class="tab1"><code>top: -3px;</code></li>
<li class="tab1"><code>left: -3px;</code></li>
<li class="tab1"><code>margin: 0;</code></li>
<li class="tab1"><code>padding: 2px;</code></li>
<li class="tab1"><code>background: #fff;</code></li>
<li class="tab1"><code>border: 1px solid #e1e1e1;</code></li>
<li><code>}</code></li>
</ol>
<p>Para criar a sombra, utilizei uma imagem de 20x20px, em tom de cinza claro (#d8d8d8) e 50% de transparência. <a href="http://ramonpage.com/wp-content/themes/pagev2/pics/bg-small-shadow.png">A imagem pode ser vista aqui!</a></p>
<p class="lang-en" lang="en"><a href="http://ramonpage.com/wp-content/themes/pagev2/pics/bg-small-shadow.png">Get the drop shadow background here!</a></p>
<p>Detalhe importante! A parte em negrito, a seguir, é a que determina a distância da sombra em relação à imagem. Quanto menores os valores inseridos para <code>top</code> e <code>left</code>, maior será a distância da sombra em relação à imagem.</p>
<p class="lang-en" lang="en">Important detail! The lines in boldface, below, are that determine the distance between the image and the drop shadow. Change the values for better use.</p>
<ol class="code">
<li><code>.shadow-container img {</code></li>
<li class="tab1"><code>position: relative;</code></li>
<li class="tab1"><code>display: block;</code></li>
<li class="tab1"><code><strong>top: -3px;</strong></code></li>
<li class="tab1"><code><strong>left: -3px;</strong></code></li>
<li class="tab1"><code>margin: 0;</code></li>
<li class="tab1"><code>padding: 2px;</code></li>
<li class="tab1"><code>background: #fff;</code></li>
<li class="tab1"><code>border: 1px solid #e1e1e1;</code></li>
<li><code>}</code></li>
</ol>
<h3>Tudo o que você precisa para usar sombras em suas imagens</h3>
<h3 class="lang-en" lang="en">All you need to work with it</h3>
<ul>
<li><a href="http://ramonpage.com/wp-content/themes/pagev2/js/image-drop-shadow.js">image-drop-shadow.js</a></li>
<li><a href="http://ramonpage.com/wp-content/uploads/image-drop-shadow.css">image-drop-shadow.css</a></li>
<li><a href="http://ramonpage.com/wp-content/themes/pagev2/pics/bg-small-shadow.png">bg-small-shadow.png</a></li>
</ul>
<p>Esta solução foi testada no <strong>Opera 9.x</strong>, <strong>Firefox 1.5.0.7</strong>, <strong>IE 6.0</strong>, <strong>IE 7.0 RC1</strong> e <strong>Safari 2.0.4</strong>. </p>
<p>Reportes de erros, bugs, e, pricipalmente, sugestões são muito bem-vindos. <strong>;)</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://ramonpage.com/2006/11/05/sombra-em-imagem-com-dom-e-css/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mostrar-esconder conteúdo via DOM</title>
		<link>http://ramonpage.com/2006/09/04/mostrar-esconder-conteudo-via-dom/</link>
		<comments>http://ramonpage.com/2006/09/04/mostrar-esconder-conteudo-via-dom/#comments</comments>
		<pubDate>Mon, 04 Sep 2006 04:10:50 +0000</pubDate>
		<dc:creator>RamonPage</dc:creator>
				<category><![CDATA[DOM]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://ramonpage.com/2006/09/04/mostrar-esconder-conteudo-via-dom/</guid>
		<description><![CDATA[Show-hide content with DOM Um dos requisitos que declarei para o meu site foi a possibilidade de inserir conteúdo em outras línguas para as minhas postagens, em especial em inglês. Depois de alguns estudos cheguei à estrutura que desejava e desenvolvi um script em DOM para implementá-la. Como este não era um requisito de prioridade [...]]]></description>
			<content:encoded><![CDATA[<h3 class="lang-en" lang="en">Show-hide content with DOM</h3>
<p>Um dos requisitos que declarei para o meu site foi a possibilidade de inserir conteúdo em outras línguas para as minhas postagens, em especial em inglês. Depois de alguns estudos cheguei à estrutura que desejava e desenvolvi um script em <abbr title="Document Object Model">DOM</abbr> para implementá-la. Como este não era um requisito de prioridade alta, deixei sua implementação para uma data futura. Eis que esta data chegou!</p>
<p><span id="more-22"></span></p>
<p>O conceito do script é simples: defini uma classe para todos os elementos (<em>tags</em>) que eu gostaria de inserir em inglês e fiz uma função em javascript para localizar todas as instâncias desta e escondê-la. Clicando em um link específico, as áreas são apresentadas. Clicando novamente no mesmo link, as áreas são escondidas.</p>
<p>Exemplo escondido:</p>
<p class="lang-en" lang="en">This is an example of show-hide english content on <code>&lt;p&gt;</code> element</p>
<ul class="lang-en" lang="en">
<li>This is a list with english content</li>
<li>Line example</li>
<li>Line example</li>
</ul>
<blockquote class="lang-en" lang="en"><p>This is an <code>&lt;blockquote&gt;</code> element with english content.</p>
</blockquote>
<h3>Definindo os recursos da solução</h3>
<p>O primeiro passo foi definir um link para esconder e mostrar as áreas. Inseri um ID para este link para poder trabalhá-lo via script.</p>
<ol class="code">
<li><code>&lt;a href="#" id="showHideTextNode"&gt;&lt;/a&gt;<br />
</code></li>
</ol>
<p>Não inseri nenhum conteúdo no link para poder manipulá-lo via script, trocando o texto, via <code>innerHTML</code>, de acordo com o clique efetuado (<em>[+] Show english content</em> para mostrar o conteúdo e <em>[-] Hide english content</em> para esconder o conteúdo).</p>
<p>Após, apenas defini uma classe para cada elemento que tivesse conteúdo em inglês. A classe foi chamada de <code>lang-eng</code>.</p>
<h3>Manipulando a classe lang-eng via javascript</h3>
<p>O primeiro passo foi definir um <code>Array</code> para todos os elementos que poderiam receber a classe <code>lang-eng</code>.</p>
<ol class="code">
<li>var arrEls = new Array(&#8220;h1&#8243;,&#8221;h2&#8243;,&#8221;h3&#8243;,&#8221;h4&#8243;,&#8221;h5&#8243;,&#8221;h6&#8243;,&#8221;p&#8221;,&#8221;span&#8221;,&#8221;ul&#8221;,&#8221;blockquote&#8221;)</li>
</ol>
<p>Após, foi preciso apenas uma função para localizar a classe <code>lang-eng</code> e efetuar as alterações nas páginas  em que ela foi instanciada. Utilizei como base o script <a href="http://www.dustindiaz.com/getelementsbyclass" class="external-link">getElementByClass</a> do <a href="http://www.dustindiaz.com/" class="external-link">Dustin Diaz</a>. A partir daí, otimizei o script para chegar ao resultado que gostaria.</p>
<ol class="code">
<li><code>function getTextNodeByClassName(searchClass,tag,eventNode) {</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var els = document.getElementsByTagName(tag);</code></li>
<li class="tab1"><code>var pattern = new RegExp("\\b"+searchClass+"\\b");</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var idLink = 'showHideTextNode';</code></li>
<li class="tab1"><code>var messageShow = '[+] Show english content';</code></li>
<li class="tab1"><code>var messageHide = '[-] Hide english content';</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var linkTextNode = document.getElementById(idLink);</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>for (i = 0; i < els.length; i++) {</code></li>
<li class="tab2"><code>if ( pattern.test(els[i].className) ) {</code></li>
<li class="tab3"><code>if (eventNode == 'hide') {</code></li>
<li class="tab4"><code>linkTextNode.innerHTML = messageShow;</code></li>
<li class="tab4"><code>linkTextNode.className = "link-show";</code></li>
<li class="tab4"><code>linkTextNode.onclick = function() {</code></li>
<li class="tab5"><code>for (j = 0; j < arrEls.length; j++) {</code></li>
<li class="tab6"><code>getTextNodeByClassName('lang-eng',arrEls[j],'show');</code></li>
<li class="tab5"><code>}</code></li>
<li class="tab4"><code>};</code></li>
<li class="tab4"><code>els[i].style.display = 'none';</code></li>
<li class="tab3"><code>} else if (eventNode == 'show') {</code></li>
<li class="tab4"><code>linkTextNode.innerHTML = messageHide;</code></li>
<li class="tab4"><code>linkTextNode.className = "link-hide";</code></li>
<li class="tab4"><code>linkTextNode.onclick = function() {</code></li>
<li class="tab5"><code>for (j = 0; j < arrEls.length; j++) {</code></li>
<li class="tab6"><code>getTextNodeByClassName('lang-eng',arrEls[j],'hide');</code></li>
<li class="tab5"><code>}</code></li>
<li class="tab4"><code>};</code></li>
<li class="tab4"><code>els[i].style.display = 'block';</code></li>
<li class="tab3"><code>}</code></li>
<li class="tab2"><code>}</code></li>
<li class="tab1"><code>}</code></li>
<li><code>}</code></li>
</ol>
<p>Por fim, inseri uma função para esconder todos os elementos declarados com a classe <code>lang-eng</code>. Esta função é inicializada por um <a href="http://simon.incutio.com/archive/2004/05/26/addLoadEvent" class="external-link">addLoadEvent</a>.</p>
<ol class="code">
<li>function init_langEngNode() {</li>
<li class="tab1"><code>if (!document.getElementsByTagName) return</code></li>
<li class="tab2"><code>for (j = 0; j < arrEls.length; j++) {</code></li>
<li class="tab3"><code>getTextNodeByClassName('lang-eng',arrEls[j],'hide');</code></li>
<li class="tab2"><code>}</code></li>
<li>}</li>
<li><code>&nbsp;</code></li>
<li>add_event(init_langEngNode);</li>
</ol>
<h3>Como tudo funciona</h3>
<p>Pegando todas as tags inseridas como parâmetro e selecionando apenas a classe desejada para estas tags. Numa tag com <code>class="lang-eng alignleft"</code>, por exemplo, apenas a <em>lang-left</em> seria selecionada.</p>
<ol class="code">
<li><code>function getTextNodeByClassName(searchClass,tag,eventNode) {</code></li>
<li><code>&nbsp;</code></li>
<li class="tab1"><code>var els = document.getElementsByTagName(tag);</code></li>
<li class="tab1"><code>var pattern = new RegExp("\\b"+searchClass+"\\b");</code></li>
</ol>
<p>Eu poderia setar "*" como <em>tag</em> para pegar todas as tags na página (vide linha "<code>var els = document.getElementsByTagName(tag);</code>"), inutilizando a necessidade de criação do Array de elementos, porém esta estrutura tiraria o controle que eu teria sobre os elementos que eu efetivamente gostaria de esconder. </p>
<p>O bom da história é que praticamente toda a aplicabilidade da solução está no script, portanto qualquer alteração futura fica totalmente mais prática. Minhas intenções estavam totalmente voltadas na manipulação do mínimo possível de marcação e trabalhar diretamente no javascript.</p>
<p>Continuando...</p>
<p>Definindo o ID para o link de manipulação e suas mensagens.</p>
<ol class="code">
<li class="tab1"><code>var idLink = 'showHideTextNode';</code></li>
<li class="tab1"><code>var messageShow = '[+] Show english content';</code></li>
<li class="tab1"><code>var messageHide = '[-] Hide english content';</code></li>
</ol>
<p>Pegando o ID inserido no link da página.</p>
<ol class="code">
<li class="tab1"><code>var linkTextNode = document.getElementById(idLink);</code></li>
</ol>
<p>Para os elementos encontrados, testar se cada um deles tem a classe escolhida como parâmetro.</p>
<ol class="code">
<li class="tab1"><code>for (i = 0; i < els.length; i++) {</code></li>
<li class="tab2"><code>if ( pattern.test(els[i].className) ) {</code></li>
</ol>
<p>Foram definidos dois parâmetros para manipular as tags: <code>show</code> para mostrar os conteúdos e <code>hide</code> para escondê-los. Uma estrutura de <code>if</code> foi criada para testar em qual status a página está. Caso o evento seja <code>hide</code> o link de manipulação recebe a mensagem <em>[+] Show english content</em>. Caso seja <code>show</code>, recebe a mensagem <em>[-] Hide english content</em>. </p>
<p>Para o evento <code>onclick</code> do link é inserida uma função para voltar à mesma função e mostrar ou esconder o conteúdo. A forma de esconder é simples: o elemento encontrado recebe como atributo <code>display</code> o valor "<code>none</code>" (<code>els[i].style.display = 'none';</code>). Para mostrar, o atributo <code>display</code> recebe o valor "<code>block</code>" (<code>els[i].style.display = 'block';</code>).</p>
<ol class="code">
<li class="tab3"><code>if (eventNode == 'hide') {</code></li>
<li class="tab4"><code>linkTextNode.innerHTML = messageShow;</code></li>
<li class="tab4"><code>linkTextNode.className = "link-show";</code></li>
<li class="tab4"><code>linkTextNode.onclick = function() {</code></li>
<li class="tab5"><code>for (j = 0; j < arrEls.length; j++) {</code></li>
<li class="tab6"><code>getTextNodeByClassName('lang-eng',arrEls[j],'show');</code></li>
<li class="tab5"><code>}</code></li>
<li class="tab4"><code>};</code></li>
<li class="tab4"><code>els[i].style.display = 'none';</code></li>
<li class="tab3"><code>} else if (eventNode == 'show') {</code></li>
<li class="tab4"><code>linkTextNode.innerHTML = messageHide;</code></li>
<li class="tab4"><code>linkTextNode.className = "link-hide";</code></li>
<li class="tab4"><code>linkTextNode.onclick = function() {</code></li>
<li class="tab5"><code>for (j = 0; j < arrEls.length; j++) {</code></li>
<li class="tab6"><code>getTextNodeByClassName('lang-eng',arrEls[j],'hide');</code></li>
<li class="tab5"><code>}</code></li>
<li class="tab4"><code>};</code></li>
<li class="tab4"><code>els[i].style.display = 'block';</code></li>
<li class="tab3"><code>}</code></li>
<li class="tab2"><code>}</code></li>
<li class="tab1"><code>}</code></li>
<li><code>}</code></li>
</ol>
<p>O último passo foi estilizar a classe <code>lang-eng</code> para separar as áreas apresentadas (português/ inglês), senão ficaria tudo uma coisa só, visualmente.</p>
<p>Esta solução pode ser utilizada em vários outros contextos. Basta ter criatividade. ;)</p>
<p class="update"><strong>Atualização 2006-11-06:</strong> Versão 2.0 concluída, ver: <a href="http://ramonpage.com/2006/11/06/mostrar-esconder-conteudo-via-dom-v2/">Mostrar-esconder conteúdo via DOM V.2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ramonpage.com/2006/09/04/mostrar-esconder-conteudo-via-dom/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

