Pré-carregar imagem

O pré-carregamento de imagens em Javascript ajuda com troca de imagens, por exemplo nos eventos de clique ou passagem do mouse (onmousedown e onmouseover), pois o visitante não precisará esperar ser carregada a imagem apenas quando o navegador disparar o evento.

O pré-carregamento é feito com o seguinte código (lembre-se de colocar isso dentro de <script> e/ou <head>:

1
2
var imagem = new Image();
imagem.src = "caminho/arquivo.gif";

O código inicia um novo objeto do tipo Image e especifica o atributo scr com o caminho da imagem. Para os mais espertinhos da platéia, sim, isso é o mesmo que:

1
<img src="caminho/arquivo.gif" />

Para cada imagem a ser pré-carregada, você deve iniciar um objeto e especificar o src, duas, três, quatro vezes e assim por diante.

Para facilitar, vale a pena colocar numa matriz todas as imagens que você deseja carregar e apenas dar um laço nela.

1
2
3
4
5
6
7
// Lista do caminho e nome dos arquivos de imagem. Pode ter quantas você quiser :)
imagem_lista = Array('arquivo.gif', 'arquivo2.gif', 'arquivo3.gif');
imagem_qtd = imagem_lista.length;
for (i = 0; i < imagem_qtd; i++) {
    var preload = new Image();
    preload.src = imagem_lista[i];
}

E pronto :) Todas as imagens da matriz imagem_lista serão carregadas pelo navegador quando o script acima rodar.

Esticar uma caixa verticalmente com CSS

Quando você quer esticar uma caixa via CSS para ocupar todo um espaço vertical, a solução mais óbvia é fazer:

[css].classe {
width:100%;
}[/css]

E funciona na maioria das vezes. Entretanto, quando o doctype está em modo strict, a caixa não esticará para preencher todo o espaço.

Isso acontece porque no modo strict, uma caixa tem o tamanho do conteúdo dela. Para deixá-la ocupar todo o espaço disponível, a “caixa-pai”, ou a que contém a caixa que precisamos esticar, também deve ter height:100%.

Quando nossa caixa está dentro de um <td>, ou <div>, é fácil, basta colocar na caixa-pai o estilo. Mas quando ela está dentro do <body>, é essa tag que deve receber o height:100%, pois o <body> é também uma “caixa”.

[css]body {
height:100%;
}[/css]

E pronto! Esteja dentro do <body> ou dos tipos mais comuns de caixas, você pode esticá-la para ocupar todo o espaço disponível na tela.

Posições vertical e horizontal de um elemento

Depois de penar por uma hora para descobrir uma maneira multi-plataforma de recuperar as posições vertical e horizontal de um objeto na tela, achei uma solução.

Multi-plataforma no sentido que testei no Firefox 1.0.7, IE 6 e Opera 8.5 :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function pegarPosicaoX(objeto)
{
    var atual_left = 0;
    if (objeto.offsetParent) {
        while (objeto.offsetParent) {
            atual_left += objeto.offsetLeft
            objeto = objeto.offsetParent;
        }
    }
    return atual_left;
}
 
function pegarPosicaoY(objeto)
{
    var atual_top = 0;
    if (objeto.offsetParent) {
        while (objeto.offsetParent) {
            atual_top += objeto.offsetTop
            objeto = objeto.offsetParent;
        }
    }
    return atual_top;
}

Para usar, supondo que temos um objeto com um id=”exemplo” na página, descobrimos a posição dele fazendo:

1
2
3
elemento = document.getElementById('exemplo');
x = pegarPosicaoX(elemento);
y = pegarPosicaoY(elemento);

Em um próximo post mostrarei porque cargas-da-água precisei descobrir a posição de um elemento (no meu caso, foi uma imagem).

Como usar saquinho de gasolina

Pois hoje acabou a gasolina, e quando fui dar a partida no carro, apenas um leve ronco do motor e nada dele sair do lugar.

Com o Rafael, I(g)nácio, Thiago e o Fi, fui até o posto. Oito reais por três litros de gasolina, mais um real pelo saquinho, voltamos ao carro. Virei o saquinho e comecei a despejar o combustível. Estava indo tão devagar… Foi aí que o Rafael teve a idéia de usar uma revista como funil.

E oh! Funcionou… uma Veja São Paulo dobrada e a gasolina pode fluir rapidamente ao tanque. O que demoraria 20 minutos foi feito em 3! Fica aí a dica :)

Budismo no ocidente

Ao mesmo tempo que minha velhice traz serenidade para encarar os problemas, ela cria outros. Não consegui ler o artigo Por que o Budismo encanta o Ocidente? sem achar os erros da argumentação do escritor.

Primeiro, a justificação que o Budismo só faz “sucesso” no Ocidente devido à condições temporais. Se vamos usar um método de divisão tão arcaico como lado esquerdo e direito do mundo, tanto deveria importar em qual época estamos. Quer dizer que o budismo ou qualquer outra “religião” tem méritos por causa das tendências da pós-modernidade neoliberal. Bem, isso é novidade para mim… O Budismo tem lá feito seu sucesso em outros lugares do mundo, e não precisava de uma maneira de visão do mundo para encontrar seu lugar.

Quer dizer, nos lugares em que ele tem raiz, esses “problemas” não existem, certo? E da última vez que eu vi, não existe necessariamente muita diferença entre eu aqui no Brasil e um monge na Mongólia. Não pode ser razão de sucesso, aliás, deixa eu parar por aqui….

Continue reading

Monstros em obras de arte

Concurso de Photoshop misturando monstros e obras de arte.

Não sou fã de “Halloween”, ou Dia das Bruxas, quando essa brincadeira chegou eu já era velho demais para pedir doces ou travessuras, e tinha descoberto que o melhor da vida são as travessuras. Um chocolate pode ser bom para te deixar feliz por cinco minutos, mas uma boa tirada ou brincadeira é motivo para risadas a vida inteira.

Menos jogar ovo. Nada mais estúpido que jogar ovo na casa dos outros.

Alien

Diferenças entre objetos

Essa função retorna quais atributos são diferentes entre dois objetos, e opcionalmente você pode especificar apenas para verificar alguns desses atributos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function diff($objeto_antes, $objeto_depois, $atributos_especificos = array())
{
    $diff = array();
    foreach ($objeto_antes as $atributo => $valor) {
        if (isset($objeto_depois->$atributo)) {
            // foram especificados atributos para comparar? ...
            if (sizeof($atributos_especificos) > 0) {
                // ... o atributo atual está na lista?
                if (in_array($atributo, $atributos_especificos)) {
                    if ($objeto_depois->$atributo != $valor) {
                        $diff[] = $atributo;
                    }
                }
            } else {
                if ($objeto_depois->$atributo != $valor) {
                    $diff[] = $atributo;
                }
            }
        }
    }
 
    return $diff;
}