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;
}

RuntimeError: dictionary changed size during iteration

Em Python, o erro do título desse post acontece quando você percorre um dicionário e ele é mudado durante o laço.

Isso pode acontecer quando fazemos:

1
2
3
4
5
6
7
8
9
>>> dicionario = {'nome': 'Julio', 'sobrenome': 'Nobrega'}
>>> for k, v in dicionario.iteritems():
...     print v
...     del dicionario[k]
...
Nobrega
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
RuntimeError: dictionary changed size during iteration

Se você quer mudar o dicionário durante um laço, use keys():

1
2
3
4
5
6
7
>>> dicionario = {'nome': 'Julio', 'sobrenome': 'Nobrega'}
>>> for k in dicionario.keys():
...     print dicionario[k]
...     del dicionario[k]
...
Nobrega
Julio

Isso só é possível porquê keys() retorna uma lista independente do dicionário.

IFrame em CSS

Barra de rolagem em uma caixa, com CSS. Parece IFrame mas não é :)

Basta usar o estilo:

1
2
3
4
#id{
height:50px;
width: 200px;
overflow:auto;

Por exemplo:

1
2
3
4
5
6
7
8
9
<div style="height:50px;width: 200px;overflow:auto;">
Ipsem Lorem, com texto aleatório.
Ipsem Lorem, com texto aleatório. 
Ipsem Lorem, com texto aleatório. 
Ipsem Lorem, com texto aleatório. 
Ipsem Lorem, com texto aleatório. 
Ipsem Lorem, com texto aleatório. 
Ipsem Lorem, com texto aleatório.
</div>

Resultado final:

Ipsem Lorem, com texto aleatório.
Ipsem Lorem, com texto aleatório.
Ipsem Lorem, com texto aleatório.
Ipsem Lorem, com texto aleatório.
Ipsem Lorem, com texto aleatório.
Ipsem Lorem, com texto aleatório.
Ipsem Lorem, com texto aleatório.

E você pode trocar a unidade pixel no width pela porcentagem.