<?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>Meio Código &#187; CSS</title>
	<atom:link href="http://www.meiocodigo.com/category/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.meiocodigo.com</link>
	<description>A peça que faltava para seu código.</description>
	<lastBuildDate>Mon, 19 Jul 2010 19:11:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Melhorando o tempo de carregamento de um site</title>
		<link>http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/</link>
		<comments>http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/#comments</comments>
		<pubDate>Fri, 21 Dec 2007 04:00:47 +0000</pubDate>
		<dc:creator>fabiomcosta</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[compactar]]></category>
		<category><![CDATA[Gzip]]></category>
		<category><![CDATA[otimizacao]]></category>
		<category><![CDATA[otimizar]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/</guid>
		<description><![CDATA[Não sei se o leitor conhece um add-on (ou plugin) do Firefox chamado Firebug. Essa ferramenta é de fundamental importância para o desenvolvimento de sites usando CSS e Javascript, não vou entrar em detalhes. Onde quero chegar é que o Firebug possui um add-on ( isso mesmo um add-on de um add-on ) chamado YSlow, [...]]]></description>
			<content:encoded><![CDATA[<p>Não sei se o leitor conhece um add-on (ou plugin) do <a title="Firefox" href="http://www.getfirefox.com" target="_blank">Firefox</a> chamado <a title="Firebug" href="http://www.getfirebug.com/" target="_blank">Firebug</a>. Essa ferramenta é de fundamental importância para o desenvolvimento de sites usando CSS e Javascript, não vou entrar em detalhes. Onde quero chegar é que o Firebug possui um add-on ( isso mesmo um add-on de um add-on ) chamado <a title="YSlow" href="http://developer.yahoo.com/yslow/" target="_blank">YSlow</a>, ele ajuda bastante o desenvolvedor a achar onde o site está lento. Ele se baseia em 14 regras, por ordem de importância, para dar notas ao site. Dependendo de como ele estiver em cada uma das regras ele receberá a respectiva nota para a regra. Falarei sobre algumas das regras que esse programa apresenta e como obter uma melhor nota em cada uma delas.</p>

<h4>Regra número 1:  Fazer o minimo de requisições HTTP possível</h4>

<p>Como eu falei acima as regras estão em ordem de importância, ou seja essa é a principal delas. Para diminuir as requisições HTTP do seu site o que pode ser feito é diminuir o número de arquivos externos, como por exemplo, arquivos Javascript, CSS, imagens, etc. No caso o ideal seria que o site tivesse no máximo um arquivo CSS e um Javascript. Já no caso das imagens o que pode ser feito é salvar várias imagens em apenas uma e usando a propriedade background-position do CSS você acessaria cada uma dessas imagens.</p>

<p><a title="Uma imagen para vários icones" href="http://www.meiocodigo.com/exemplos/bg-position" target="_blank">exemplo</a></p>

<h4>Regra número 2: Usar mais de um sub-domínio</h4>

<p>Você pode criar subdomínios e colocar os arquivos externos de seu site neles. Por exemplo se você tem o domínio meiocodigo.com você pode colocar seus arquivos CSS e javascript num subdomínio a.meiocodigo.com e botar arquivos flash, flv e vídeos por exemplo num subdomínio b.meiocodigo.com. Isso melhora a velocidade do site por que ao fazer isso você acessa mais de um servidor de uma vez, e dessa forma eles têm como enviar seus pedidos mais rapidamente. Para entrar em mais detalhes sobre os benefícios visite <a title="Connections" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html" target="_blank">este site</a>.</p>

<h4>Regra número 3: Adicionar data de expiração no cabeçalho</h4>

<p>A data de expiração que pode vir no cabeçalho de arquivos HTTP serve para informar ao browser a data em que ele deve ser desprezado, ou seja se colocarmos uma data futura no cabeçalho o browser será capaz de armazenar em cache o arquivo até a data que você determinar. Existem várias formas de fazer isso. Uma delas é adicionando a meta tag abaixo dentro da tag head de uma página de seu site:
<pre class="brush: html">&lt;meta http-equiv=&quot;expires&quot; content=&quot;Tue, 18 Dec 2010 02:18:46 GMT&quot; /&gt;</pre>
Uma outra que eu particularmente prefiro e acho mais robusta, apesar de que somente serve para servidores Apache ( mas deve ter formas semelhantes para outros servidores ) é acrescentar a seguinte regra ao seu httpd.conf ou .htaccess:
<pre class="brush: html">&lt;FilesMatch &quot;.(jpg|jpeg|png|gif)$&quot;&gt;
Header set Expires &quot;Tue, 18 Dec 2010 02:18:46 GMT&quot;
&lt;/FilesMatch&gt;</pre>
Dessa forma eu estou dizendo que apenas os arquivos de imagem do meu site terão data de expiração futura. Você pode usar essa forma para adicionar datas de expiração diferentes para diferentes grupos de arquivos. Por exemplo não é muito interessante colocar uma data muito futura no caso de arquivos .html ou .php, que são arquivos que estão em constante atualização.</p>

<p><a title="Cache" href="http://yuiblog.com/blog/2007/01/04/performance-research-part-2/" target="_blank"> mais sobre cache </a></p>

<h4>Regra número 4: Compactar arquivos externos com GZip</h4>

<p>Essa é uma das principais regras para quem costuma usar bibliotecas javascript (<a title="JQuery" href="http://www.jquery.com" target="_blank">JQuery</a>, <a title="Mootools" href="http://mootools.net/" target="_blank">Mootools</a>, etc) com frequência, mas também pode ser usado com qualquer arquivo. A motivo de informação sobre os benefícios da compactação GZip darei um exemplo de uma usando a biblioteca JQuery que tem em torno de 77kb em sua forma normal. Se for usado o <a title="YUI Compressor" href="http://developer.yahoo.com/yui/compressor/" target="_blank">compactador de javascript do Yahoo!</a> ele passa a ter em torno de 46kb, e se for usada a compactação GZip em cima desse arquivo a biblioteca fica com incríveis 15kb! É um ganho de 513,33%!</p>

<p>Para compactar seus arquivos usando GZip deve-se ter o mod_deflate instalado no Apache ( a maioria dos hosts possui ) e pode-se usar a seguinte regra em seu httpd.conf ou .htaccess:
<pre class="brush: html">&lt;IfModule mod_deflate.c&gt;
AddOutputFilterByType DEFLATE application/x-javascript text/css text/javascript
&lt;/IfModule&gt;</pre>
Neste caso estou compactando apenas os arquivos Javascript e CSS, mas claro que pode-se adicionar outros tipos de arquivos. Para mais tipos de arquivos você pode olhar o arquivo mime.type que se encontra na pasta raiz do Apache.</p>

<p>Para testar se o seu servidor está realmente compactando seus arquivos com gzip você pode usar um serviço web como o indicado pelo leitor Ricardo Torres, o <a title="GZip Test" href="http://nontroppo.org/tools/gziptest/" target="_blank">GZip Test</a>.</p>

<h4>Regra número 5: Colocar arquivos CSS no cabeçalho do arquivo</h4>

<p>Foi constatado que as páginas de um site carregam com maior velocidade se os estilos forem colocados na tag head dos arquivos. Isso acontece por que a renderização da página é feita progressivamente, ao contrário do que acontece quando você coloca CSS no final de um arquivo. Um outro fator é o visual, quando um usuário abre uma página e ela vai &#8220;visualmente abrindo&#8221; ele sabe que a página está chegando em seu browser e ele vai esperar calmamente (até um certo limite, é claro), mas se você colocar o CSS na parte de baixo do site ele será a última coisa a ser lida pelo browser e o usuário terá a sensação que o site não está carregando até que seja finalmente lido o CSS e ele veja o site completo. Além de que existem bugs de renderização no IE, quando se coloca CSS na parte de baixo do site ( em cima ou em baixo, sempre existirão bugs de renderização no IE :S ).</p>

<h4>Regra número 6: Colocar scripts no final do arquivo</h4>

<p>Os browsers lêem o código fonte dos sites de cima para baixo, e quando lê uma inclusão de um arquivo Javascript, por exemplo, ele tem que baixar todo o arquivo, ler seu conteúdo e interpretar o código, para somente depois continuar com a leitura do resto do site. Por isso quando existem arquivos muito pesados na parte de cima de um site o usuário pode ficar um tempo considerável sem ter nenhuma resposta visual do site, por que o browser está lendo e interpretando linhas de script. Por isso, deve-se evitar ao máximo colocar scripts na parte de cima dos sites. Uma das soluções é incluir um arquivo, usando qualquer linguagem server-side, somente com scripts no final da página, antes do fim da tag body.</p>

<h4>Regra número 7: Evitar expressões no CSS</h4>

<p>As expressões de CSS são suportadas apenas pelo Internet Explorer e devem ser evitadas por que são executadas toda vez que um evento acontece no site ( toda vez que o mouse mexe, ou damos um click por exemplo) , podendo acarretar em lentidão no computador do usuário.  A regra é só usar expressões em casos em que já se tentou de tudo e não se obteve sucesso.  Para quem não sabe o que são expressões de CSS ai vai um exemplo de linha de código para uma expressão desse tipo, pesadíssima por sinal:
<pre class="brush: css">background-color: expression( (new Date()).getHours()%2 ? &quot;#B8D4FF&quot; : &quot;#F08A00&quot; );</pre></p>

<h4>Regra número 8: Colocar Javascript e CSS em arquivos externos</h4>

<p>Quanto maior os arquivos de Javascript e CSS e quanto maior a quantidade de páginas usando o mesmo conteúdo dos arquivos mais importante é essa regra. O que acontece  é que esses arquivos externos são guardados em cache quando possuem data de expiração futura ( regra 3 ) e quando um usuário visita mais de uma página de seu site acaba tendo acesso muito mais rápidos às páginas por possuir os arquivos em cache.</p>

<h4>Regra número 9: Reduzir o número pesquisas em DNS</h4>

<p>Essa regra vai um pouco contra a regra número dois mas a idéia é não ter um número muito grande de nomes de domínios numa mesma página de um site. Como a requisição a um servidor DNS para saber qual o IP associado a aquele nome demanda um certo tempo isso pode comprometer o desempenho do site. O ideal então é ter entre 2 e 4 nomes de domínios diferentes no mesmo site. Se for menos vai contra a regra número 2 e se for mais vai contra esta regra.</p>

<h4>Regra número 10: Comprimir os arquivos Javascript</h4>

<p>Existem algoritmos opensource na internet que comprimem scripts Javascript. Eles são especialmente úteis para trechos de código fixos, onde se sabe que não ocorrerão alterações ( o código após a compressão fica difícil de compreender ) como por exemplo no caso de se usar uma biblioteca Javascript. Algumas já fornecem seus códigos comprimidos usando esse tipo de algoritmo. Os mais famosos e eficientes são o <a title="YUI-Compressor" href="http://developer.yahoo.com/yui/compressor/" target="_blank">YUI-Compressor</a> criado pela Yahoo! e o <a title="Packer" href="http://dean.edwards.name/packer/" target="_blank">packer</a> criado por Edwards Packer. Cada um tem sua vantagem, o da Yahoo! tem uma taxa de compressão muito boa e não usa nenhum tipo de script mirabolante para comprimir o arquivo, já o packer tem uma taxa de compressão excelente porém usa um script que faz uso da função eval do javascript (muito conhecida por ser pesada) para a compressão do arquivo e por isso pode comprometer o desempenho do site quando o arquivo comprimido está sendo interpretado pelo browser. Meu preferido, e acredito que de muita gente, é o YUI-Compressor, que além de não comprometer o desempenho do site ainda tem uma taxa de compressão muito boa e pode chegar até a ser melhor do que a do packer se em cima desse arquivo for usada a compressão GZIP, que foi apresentada na regra número 4. Mais informações sobre o benefício do YUI-Compressor com GZIP <a title="YUI-Compressor com GZIP" href="http://www.julienlecomte.net/blog/2007/08/13/" target="_blank">neste link</a>.</p>

<h4>Regra número 11: Evite redirecionamentos</h4>

<p>Bom achei essa regra um pouco boba, afinal só se faz redirecionamento em sites quando é realmente necessário. Simplesmente evite-os.</p>

<h4>Regra número 12:  Remover scripts duplicados</h4>

<p>Sem comentários.</p>

<h4>Regra número 13: Configurar ETags</h4>

<p>As ETags são etiquetas compostas por inode-tamanho-timestamp  no caso do Apache 1.3 e 2.x e servem para identificar unicamente um arquivo e isso pode causar um pequeno delay se seus arquivos estiverem hospedados em diversos hosts diferentes. Para remover as ETags de seus arquivos você pode colocar as seguintes linhas em seu arquivo httpd.conf ou .htaccess:
<pre class="brush: html">Header unset ETag
FileETag None</pre>
Para mais informações sobre ETags visite <a title="ETags" href="http://www.htaccesselite.com/htaccess/etags-vt68.html" target="_blank">este site</a>.</p>

<h4>Regra número 14: Fazer cache de Ajax</h4>

<p>Quando uma aplicação tiver um arquivo Ajax com conteúdo estático o ideal seria usar a regra 3 nesses arquivos. Dependendo da quantidade de arquivos deste tipo seu site pode ficar bastante rápido e intuitivo.</p>

<p>Espero que tenham gostado pessoal, postem por favor!  Próximo post estou pensando em adicionar mais uma funcionalidade a biblioteca ajax que já apresentei anteriormente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Compactar com GZip e armazenar em Cache arquivos .js e .css (solução)</title>
		<link>http://www.meiocodigo.com/2007/10/25/compactar-com-gzip-e-armazenar-em-cache-arquivos-js-e-css-solucao/</link>
		<comments>http://www.meiocodigo.com/2007/10/25/compactar-com-gzip-e-armazenar-em-cache-arquivos-js-e-css-solucao/#comments</comments>
		<pubDate>Fri, 26 Oct 2007 00:04:40 +0000</pubDate>
		<dc:creator>meiocodigo</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[compactar]]></category>
		<category><![CDATA[Gzip]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[otimizacao]]></category>
		<category><![CDATA[otimizar]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/2007/10/25/compactar-com-gzip-e-armazenar-em-cache-arquivos-js-e-css-solucao/</guid>
		<description><![CDATA[ Editado:

Pessoal, para a melhor solução para este tipo de problema vejam a regra número 4 deste post.
Se quizer entender mais sobre GZip continue lendo.

Fim da edição. 

GZip é uma compactação feita pelo servidor web antes de enviar os arquivos para o browser, mas para que isso ocorra com sucesso deve-se mudar o cabeçalho dos [...]]]></description>
			<content:encoded><![CDATA[<p><em> Editado:</em></p>

<p>Pessoal, para a melhor solução para este tipo de problema vejam a regra número 4 <a title="GZIP" href="http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/">deste post</a>.
Se quizer entender mais sobre GZip continue lendo.</p>

<p><em>Fim da edição. </em></p>

<p>GZip é uma compactação feita pelo servidor web antes de enviar os arquivos para o browser, mas para que isso ocorra com sucesso deve-se mudar o cabeçalho dos arquivos para indicar que o arquivo aceita esse tipo de compactação, para que o servidor compacte este arquivo e quando esse arquivo chegar no browser, este descompacte-o, tornando-o um arquivo normal como todos os outros novamente.</p>

<p>A motivo de informação sobre os benefícios da compactação GZip darei um exemplo de uma biblioteca muito famosa, a <a title="jQuery" href="http://jquery.com/" target="_blank">JQuery</a>, que tem em torno de 77kb em sua forma normal. Se for usado o <a title="YUI Compressor" href="http://developer.yahoo.com/yui/compressor/" target="_blank">compactador de javascript do Yahoo!</a> ele passa a ter em torno de 46kb, e se for usada a compactação GZip em cima desse arquivo a biblioteca fica com incríveis 15kb!</p>

<p>Vinha a um tempo pensando em uma forma inteligente de compactar arquivos &#8220;.js&#8221; e &#8220;.css&#8221; usando GZip. Li vários artigos no Yahoo! e em fórums diversos e não encontrei nada falando a respeito, e quando falavam não era de forma clara, tanto é que só fui ver uma forma inteligente de se fazer isso a uns minutos atrás, quando achei algo a respeito no site do <a title="Extensão do Joomla" href="http://extensions.joomla.org/component/option,com_mtree/task,viewlink/link_id,3249/Itemid,35/" target="_blank">Joomla</a>. É uma extensão que modifica o cabeçalho dos arquivos que são incluídos nas páginas desse sistema. Vendo a extensão eu pude ver o quão simples é modificar o cabeçalho de arquivos .css e .js de forma inteligente. Antes havia pensado em modificar a extensão dos arquivos para &#8220;.php&#8221; e fazer essas modificações (trabalho de corno), vi que funcionou mas não era viável em um projeto grande.</p>

<p>Bom, falei demais já. Vamos para o código da solução:
<pre class="brush: php">/**
* @author Fábio Miranda Costa&lt;br /&gt;
* Usado para compactar arquivos JS e CSS, acrescenta-os ao cache do browser
* e faz algumas melhorias adicionais. &lt;script src=&quot;incs/file_inc.php?file=funcs.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:0--&gt;&lt;/script&gt;
*/
$file = $_GET[&quot;file&quot;];
$ext = substr($file,strrpos($file, &quot;.&quot;)+1,strlen($file));
ob_start (&quot;ob_gzhandler&quot;);
if($ext==&quot;js&quot;) $ext=&quot;javascript&quot;;
header( &quot;Content-type: text/&quot;.$ext.&quot;; charset: &lt;span class=&quot;attribute-value&quot;&gt;iso-8859-1&lt;/span&gt;&quot;);//não se esqueça de mudar para o charset que você usa
header( &quot;Content-Encoding: gzip,deflate&quot;);
header( &quot;Expires: &quot;.gmdate(&quot;D, d M Y H:i:s&quot;, time() + (24 * 60 * 60)) . &quot; GMT&quot;);//adiciona 1 dia ao tempo de expiração
header( &quot;ETag: &quot;);//a idéia é apagar o conteúdo da Etag, ver post http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/
header( &quot;Cache-Control: must-revalidate, proxy-revalidate&quot; );
include($file);
ob_flush();</pre>
Fiz esse código o mais compacto possível, já que será usado em todos os includes de css e js do site.
Não vou explicar muito como funciona, apenas como usá-lo, que é o que importa.
Para usar é muito fácil, apenas crie um arquivos incluindo o código acima, no meu exemplo o arquivo é &#8220;file_inc.php&#8221;, e coloque no cabeçalho do seu site os includes de arquivos css e javascript seguindo os exemplos abaixo:</p>

<p>para javascript:
<pre class="brush: php">&lt;script src=&quot;incs/file_inc.php?file=funcs.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
No atributo &#8220;src&#8221; coloque o caminho para o arquivo &#8220;file_inc.php&#8221; depois passe a variável &#8220;file&#8221; usando GET, ou seja adicione o texto &#8220;?file=&#8221; logo após o nome do arquivo, como pode-se ver no exemplo e depois coloque o endereço do arquivo &#8220;.js&#8221; que você quer incluir em seu site. Lembrando que esse endereço será sempre relativo ao arquivos file_inc.php, ou seja, se o &#8220;file_inc.php&#8221; estiver na pasta &#8220;inc/includer/&#8221; e o arquivo que você quer incluir está na pasta &#8220;inc/js/&#8221; o &#8220;src&#8221; do include ficará &#8220;inc/includer/file_inc.php?file=../js/funcs.js&#8221;.</p>

<p>para css:
<pre class="brush: php">&lt;link href=&quot;incs/file_inc.php?file=styles.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;</pre>
Com o css é a mesma coisa, o que muda é apenas o óbvio, ou seja, a tag será &#8220;link&#8221; e o atributo usado passará a ser &#8220;href&#8221;.
<a title="GZIP" href="http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2007/10/25/compactar-com-gzip-e-armazenar-em-cache-arquivos-js-e-css-solucao/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Flash cobrindo conteúdo (solução)</title>
		<link>http://www.meiocodigo.com/2007/06/20/flash-cobrindo-conteudo-solucao/</link>
		<comments>http://www.meiocodigo.com/2007/06/20/flash-cobrindo-conteudo-solucao/#comments</comments>
		<pubDate>Wed, 20 Jun 2007 13:46:05 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/2007/06/20/flash-cobrindo-conteudo-solucao/</guid>
		<description><![CDATA[Um problema muito comum para quem usa flash combinado com html e css, apenas para destacar alguns detalhes, é o fato de o flash cobrir o conteúdo da página por padrão. Eu particularmente enfrentei este problema várias vezes ao tentar colocar um menu drop-down que ao ser visualizado deveria cobrir o flash. Mas o menu [...]]]></description>
			<content:encoded><![CDATA[<p>Um problema muito comum para quem usa flash combinado com html e css, apenas para destacar alguns detalhes, é o fato de o flash cobrir o conteúdo da página por padrão. Eu particularmente enfrentei este problema várias vezes ao tentar colocar um menu drop-down que ao ser visualizado deveria cobrir o flash. Mas o menu ficava sempre escondido atrás do flash.</p>

<p>Para solucionar o caso eu utilizei os seguintes conceitos:</p>

<ul>
    <li>A propriedade z-index do CSS;</li>
    <li>posicionamento do CSS;</li>
    <li>As tags object e embed;</li>
    <li>e o atributo wmode do vídeo.</li>
</ul>

<p>O z-index pelo que eu tenho percerbido e lido em diversos lugares só funciona em elementos html que estejam &#8220;posicionados&#8221;, ou seja, tenham o atributo position com o valor absolute, relative ou fixed.</p>

<p>Portanto, colocaremos o video flash dentro de uma div e aplicaremos o seguinte css a ela:
<pre class="brush: css">div#flash_div{
position: relative;
z-index: 0;
}</pre>
E devemos fazer o mesmo para os objetos que queremos que sobreponham o flash.</p>

<p>Como existem muitas divergências na renderização entre os browsers, é necessário fazer duas chamadas ao vídeo: uma por meio da tag object(a qual é aceita pelo Internet Explorer) e por meio da tag embed(aceita pelo firefox). Ambas as tags terão os mesmos atributos. E dentre eles deve-se setar o wmode do object e do embed para transparent:
<pre class="brush: html">
&lt;object classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0&quot; width=&quot;214&quot; height=&quot;229&quot; id=&quot;monitor&quot; align=&quot;&quot;&gt;
&lt;param name=&quot;movie&quot; value=&quot;images/monitor.swf&quot;&gt;
&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt;
&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;
&lt;embed wmode=&quot;transparent&quot; src=&quot;images/monitor.swf&quot; quality=&quot;high&quot; bgcolor=&quot;#FFFFFF&quot; width=&quot;214&quot; height=&quot;229&quot; name=&quot;monitor&quot; type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot;&gt;&lt;/embed&gt;
&lt;/object&gt;</pre>
Eu resolvi meu problema assim. Com apenas uma ressalva: essa solução não funciona para usuário do Linux, e não tenho conhecimento de nenhuma outra solução. Espero ter ajudado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2007/06/20/flash-cobrindo-conteudo-solucao/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Biblioteca AJAX</title>
		<link>http://www.meiocodigo.com/2007/05/23/biblioteca-ajax/</link>
		<comments>http://www.meiocodigo.com/2007/05/23/biblioteca-ajax/#comments</comments>
		<pubDate>Wed, 23 May 2007 02:33:57 +0000</pubDate>
		<dc:creator>meiocodigo</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/?p=10</guid>
		<description><![CDATA[Bem&#8230; Começarei os posts sobre AJAX com esse &#8220;esqueleto&#8221; de uma biblioteca, orientada a objeto, para aplicações em AJAX.
O código abaixo deve ser colocado em um arquivo &#8220;max_ajax.js&#8221; ou outro nome de sua escolha. Mas no final desse post eu anexei os 3 arquivos citados aqui neste post.
/**
 * @author Fábio Miranda Costa - www.meiocodigo.com
 [...]]]></description>
			<content:encoded><![CDATA[<p>Bem&#8230; Começarei os posts sobre AJAX com esse &#8220;esqueleto&#8221; de uma biblioteca, orientada a objeto, para aplicações em AJAX.
O código abaixo deve ser colocado em um arquivo &#8220;max_ajax.js&#8221; ou outro nome de sua escolha. Mas no final desse post eu anexei os 3 arquivos citados aqui neste post.
<pre class="brush: javascript">/**
 * @author Fábio Miranda Costa - www.meiocodigo.com
 * @version 0.26
 * Pequena biblioteca para uso geral em Ajax.
 * bugs conhecidos: Não conversa muito bem com tabelas.
 * Testado com IE 6 e firefox 2.
 * Qualquer dúvida mande e-mail para meiocodigo@gmail.com ou simplesmente comente.
 */&lt;/p&gt;

&lt;p&gt;if(typeof window.max === &quot;undefined&quot;) var max = new Object();</pre>
Esse inicio apenas verifica a existência do objeto max antes de criá-lo para ser possível acrescentar mais de uma das bibliotecas max.
Aos poucos eu irei postando outras bibliotecas que eu fiz para não ficar com muito conteúdo em um só post.</p>

<h3>Métodos</h3>

<h4>Construtor</h4>

<p><pre class="brush: javascript">/**
 * Construtor da classe max.Ajax
 *
 * @param {String} url - a url do arquivo que receberá a chamada ajax
 * @param {Object} options - um objeto que conterá as possíveis opções, entre elas estão:
 * update (opcional) - um id de um nó DOM que receberá a resposta do servidor.
 * onComplete (opcional) - função que será executada logo após o servidor ter respondido ao pedido.
 *
 */
max.Ajax = function(url,options){</pre>
Este é o método construtor da classe max.Ajax. Como ele podemos inicializar as variáveis usadas internamente em um objeto desta classe.
Se você quizer aprender alguma coisa sobre Javascript e orientação a objeto vá para o site <a href="http://www.w3schools.com">www.w3schools.com</a> que é um site excelente para iniciantes, aprendi muita coisa lá no inicio.</p>

<p>Bem voltando ao código inicialmente temos a declaração do construtor como sendo uma função que faz as seguintes coisas:
<pre class="brush: javascript">this.xmlHttp = this.createXMLHttp();//criação do objeto que tratará da nossa requisição ao servidor</pre>
Cria um XMLHttpObject para fazer as requisições assincronamente ao servidor.
<pre class="brush: javascript">this.url = url;</pre>
Inicializa a variável url pertencente a classe com o primeiro valor passado por parâmetro na inicialização do objeto. Este valor deve ser a url para o arquivo que deve ser enviada a requisição Ajax.
<pre class="brush: javascript">this.update = options.update || null;//se não for definida um id para fazer o update, this.update = null, caso contrário this.update = options.update</pre>
Inicializa a variável update pertencente a classe com o valor de options.update se esta for declarada ou inicializa ela com null se não tiver sido declarada. Este valor deve ser o id de algum nó DOM no seu HTML, este nó receberá o conteúdo que foi retornado pelo arquivo que recebeu a requisição Ajax. (complicado? :S)
<pre class="brush: javascript">this.onComplete = options.onComplete || function(){};//se tiver sido definida uma função para ser executado ao final da requisição então this.onComplete = options.onComplete senão this.onComplete = null;
};</pre>
Inicializa a variável onComplete pertencente a classe com o valor de option.onComplete, que deve ser sempre uma função. A função que for passada por parâmetro nesse caso será executada logo após a requisição Ajax ser finalizada.</p>

<h4>Requisição Ajax por GET</h4>

<p><pre class="brush: javascript">max.Ajax.prototype = Object({
    /**
     * Método para enviar pedido get.
     */
    get:
        function(){</pre>
Este é o método de envio de uma requisição Ajax usando GET.
<pre class="brush: javascript">var thisObj = this;//fazendo referência a este objeto</pre>
Inicializamos a variável thisObj com o valor &#8220;this&#8221;.
Você deve estar pensando: &#8220;que babaca&#8230; pra que isso?&#8221;. Calma eu vou explicar depois por que inicializei essa variável dessa forma.
<pre class="brush: javascript">this.xmlHttp.onreadystatechange = function(){thisObj.updateFunc();};//esta linha define qual será a função que será executada quando nosso objeto xmlHttp tiver seu estado modificado, no caso updateFunc()</pre>
Aqui nós definimos um método ( &#8220;updateFunc()&#8221; ) que será executado toda vez que o estado do nosso XMLHttpObject mudar. Existem no máximo 5 possíveis valores para o estado, dependendo do browser.</p>

<ul>
    <li>Estado 0 &#8211; A requisição assíncrona com o servidor não foi iniciada</li>
    <li>Estado 1 &#8211; A requisição foi inicializada</li>
    <li>Estado 2 &#8211; A requisição foi enviada</li>
    <li>Estado 3 &#8211; A requisição está sendo processsada</li>
    <li>Estado 4 &#8211; A requisição foi completada, com sucesso ou não.</li>
</ul>

<p>Agora vem a explicação do por que inicializar a variável thisObj com &#8220;this&#8221;. Se eu tivesse feito essa mesma linha dessa forma:</p>

<p><pre class="brush: javascript">this.xmlHttp.onreadystatechange = function(){this.updateFunc();};</pre></p>

<p>vocês acham que funcionaria?
A resposta é não, por que o &#8220;this&#8221; neste caso está se referindo ao &#8220;this.xmlHttp&#8221; por estar dentro de seu escopo, por isso eu fiz uma atribuição ao max.Ajax (var thisObj = this;) e usei ele dentro do escopo do &#8220;this.xmlHttp&#8221;.
<pre class="brush: javascript">this.url += (this.url.indexOf(&quot;?&quot;) === -1)?&quot;?&quot;:&quot;&amp;amp;&quot;;
this.url += &quot;ridwes=&quot;+Math.random();//adicionando uma variável randomica ao nosso get para que resolva um problema de cache que acredito que só aconteça no IE, chamei de ridwes por que acredito que ninguem teria uma variavel com esse nome, mas se for o caso...modifique hehe</pre>
Essas duas linhas acrescentam uma variável &#8220;ridwes&#8221; à nossa requisição. Esse nome eu escolhi arbitrariamente achando que ninguem escolheria tal nome para uma variável mas se você tiver escolhido então modifique o nome de sua variável ou modifique o código.
O objetivo de adicionar essa variável com valor randômico é de evitar problemas de cache que acontecem freqüentemente no IE.
<pre class="brush: javascript">this.xmlHttp.open(&quot;get&quot;,this.url,true);//define que o método usado para a nossa requisição será o &#039;get&#039;, a url do arquivo que receberá a requisição e o true indica que a chamada será assincrona.</pre>
Aqui temos, como o nome diz, a abertura de uma conexão com o servidor. O primeiro parâmetro da função open é o método utilizado para a comunicação (&#8220;get&#8221; ou &#8220;post&#8221;), o segundo é a url para o arquivo que receberá a chamada do browser, podem ser incluidas variáveis juntamente com ela, e o terceiro é um valor booleano que indica se a chamada será assíncrona (true) ou síncrona (false).
<pre class="brush: javascript">this.xmlHttp.send(null);//finalmente envia nosso pedido
},</pre>
E finalmente enviamos a chamada ao servidor, passando null como parametro. Veremos futuramente que se tivessemos usando o método &#8220;post&#8221; as variáveis seriam passadas por parâmetro ao invez do null.</p>

<h4>Update nó DOM</h4>

<p><pre class="brush: javascript">/**
     * Método executado toda vez que o xmlHttp mudar de estado.
     */
    updateFunc:
        function(){</pre>
Esta função, como já foi visto neste mesmo post, é executada no evento &#8220;readystatechange&#8221; do nosso objeto xmlHttp.
<pre class="brush: javascript">if (this.xmlHttp.readyState==4 || this.xmlHttp.readyState==&quot;complete&quot;){//verifica se o estado do xmlHttp é de completo, ou seja se a resposta do servidor já está &quot;em mãos&quot;
    if (this.xmlHttp.status == 200){//verifica se o estatus do objeto é de sucesso, caso contrario o ideal seria mostrar um erro, mostrarei isso no futuro
        if (this.update){
            document.getElementById(this.update).innerHTML = this.xmlHttp.responseText;//joga o texto de resposta do servidor dentro do nó DOM especificado na opção update, se ela existir
        }
        this.onComplete(this.xmlHttp.responseText,this.xmlHttp.responseXML);//executa a função ao final da chamada ajax, também chamada de callback
    }
}
},</pre>
Resolvi comentar todas essas linhas juntas porque são muitos &#8220;ifs&#8221;, um dentro do outro, pode acabar confundindo alguem.
A primeira linha é uma condição que verifica se a propriedade &#8220;readyState&#8221; do objeto xmlHttp está em seu estado final, ou seja, que a requisição ao servidor já retornou.
A segunda linha verifica se a propriedade estatus, do mesmo objeto xmlHttp, indica sucesso (o número 200 quer dizer que o servidor não retornou nenhuma mensagem de erro, no futuro veremos outros números e o que cada um deles representa).
A terceira linha verifica se foi passado por parâmetro algum id ao se criar um objeto max.Ajax, se tiver passado, na quarta linha o nó DOM com esse id receberá o responseText, ou seja, o texto de resposta do arquivo que chamamos em nossa requisição Ajax.
E finalmente na sexta linha temos a execução do método que foi passado por parâmetro no onComplete.
Se você não estiver entendendo muito bem veja o exemplo logo no final desse post que irá esclarecer melhor como essa biblioteca funciona.</p>

<h4>Criação de objeto XMLHttp</h4>

<p><pre class="brush: javascript">/**
     * Copiado na cara de pau, peguei de um artigo no Wrox.
     * Método usado para a criação do objeto XMLHttp, peça chave para o ajax.
     * Não explicarei em detalhes.
     */
    createXMLHttp:
        function(){
            if(typeof XMLHttpRequest != &quot;undefined&quot;)//entra em todos os navegadores menos o IE
                return new XMLHttpRequest();
            else if (window.ActiveXObject) {//no caso do IE
              var aVersions = [ &quot;MSXML2.XMLHttp.5.0&quot;,&quot;MSXML2.XMLHttp.4.0&quot;,&quot;MSXML2.XMLHttp.3.0&quot;,&quot;MSXML2.XMLHttp&quot;,&quot;Microsoft.XMLHttp&quot;];
              //por cima, o que ela faz é verificar qual a versão mais recente do xmlHttp Object suportada pelo navegador e retorna o objeto
              for (var i = 0; i &amp;lt; aVersions.length; i++) {
                try{
                    var oXmlHttp = new ActiveXObject(aVersions[i]);
                    return oXmlHttp;
                }catch (oError){}
              }
            }
            throw new Error(&quot;Objeto XMLHttp não pode ser criado.&quot;);
        }
});</pre>
Não falarei dessa função em detalhes, apenas coloquei alguns comentários aí no código. Mas basicamente essa função cria o objeto xmlHttp.</p>

<p>O código já está com comentários nas linhas mais importantes.
Criei um arquivo para testar a biblioteca com todas as opções possíveis.
Você pode copiar este texto em um arquivo HTML qualquer ou simplesmente baixar os arquivos anexados ao post.
<pre class="brush: html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot; &quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Untitled Document&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;max_ajax_ref_blog.js&quot; &gt;&lt;/script&gt;&lt;/p&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
function testeAjax(thisObj){

var url = &quot;teste.php&quot;;//criando uma string cujo valor corresponde à url do arquivo que receberá a requisição Ajax
url += &quot;?valor_teste=&quot;+thisObj.innerHTML;//adicionando a variável &quot;valor_teste&quot; à url

var maxAjaxObj = new max.Ajax(url,{update:&quot;teste&quot;,onComplete:
function(texto,xml){
alert(&quot;O innerHTML é:&quot;+texto);
}
});//aqui estamos criando um objeto max.Ajax passando ao construtor como parâmetros uma url e um objeto com uma propriedade &quot;update&quot;
//cujo valor é o id &quot;teste&quot; indicando que o nó com id=&quot;teste&quot; receberá o texto de resposta do servidor, depois temos o onComplete
//que é uma função e será executada logo após a resposta com sucesso do servidor
maxAjaxObj.get();//execução do método get para a nossa chamada Ajax.
}
window.onload = function(){//as função que estão dentro desse escopo só são executadas após todo o carregamento do site
document.getElementById(&quot;link_teste&quot;).onclick = function(){
        testeAjax(this);
        return false;
    };//aqui nós estamos dizendo que o nó com id=&quot;link_teste&quot; escutará esta função no evento &quot;onclick&quot;
}

&lt;/script&gt;

&lt;p&gt;&lt;/head&gt;&lt;/p&gt;

&lt;p&gt;&lt;body&gt;
&lt;a id=&quot;link_teste&quot; href=&quot;#&quot;&gt;Texto para testar <img src='http://www.meiocodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> &lt;/a&gt;&lt;/p&gt;

&lt;div id=&quot;teste&quot;&gt;&lt;/div&gt;

&lt;p&gt;&lt;/body&gt;
&lt;/html&gt;</pre>
O que esse código faz é enviar um pedido para o arquivo &quot;teste.php&quot; passando por get as variáveis ridwes com valor randomico (explicado no código) e a variável valor_teste que terá como valor a string &quot;Texto para testar <img src='http://www.meiocodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> &quot;.</p>

<p>meu arquivo teste.php ficou:
<pre class="brush: php">&lt;?php
echo $_GET[&quot;valor_teste&quot;];
?&gt;</pre>
ou seja a resposta do servidor será exatamente o valor da variável &#8220;valor_teste&#8221; que é &#8220;Texto para testar <img src='http://www.meiocodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> &#8221;.</p>

<p>Traduzindo tudo, quando clicamos no link a requisição ao servidor é enviada quando o browser recebe a resposta da requisição um alerta é mostrado com o texto: &#8220;O innerHTML é: Texto para testar <img src='http://www.meiocodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> &#8221; e a div de id &#8220;teste&#8221; receberá também o mesmo texto de reposta do servidor (&#8220;Texto para testar <img src='http://www.meiocodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> &#8221;) por que eu coloquei como uma de minhas opções update:&#8221;teste&#8221;.</p>

<p>Espero ter sido claro =/</p>

<p>Qualquer dúvida comente por favor!! <img src='http://www.meiocodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>

<h5>Arquivos:</h5>

<ul class="arquivos">
    <li><a title="Biblioteca Ajax" href="http://www.meiocodigo.com/wp-content/uploads/2007/07/max_ajax.zip">max_ajax.zip </a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2007/05/23/biblioteca-ajax/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
