Elmord's Magic Valley

Computers, languages, and computer languages. Às vezes em Português, sometimes in English.

Fun with CSS (not)

2013-01-06 21:20 -0200. Tags: comp, web, em-portugues

HTML segue sendo minha maneira preferida de editar texto formatado desde 1927. (Houve um tempo, antes de entrar para a CIC, em que eu fazia trabalhos de aula em HTML e depois copiava e colava do browser no Word para imprimir.) Entretanto, esse tal de CSS e seu box model às vezes me decepcionam.

No penúltimo post, eu resolvi colocar uma imagem à esquerda do texto, de modo que o texto seguisse normalmente no espaço vazio à direita da imagem. Trabalho para um elemento floated. Coisa simples, não? Acontece que por três pequenos acasos essa tarefa foi menos trivial do que parecia ser.

Primeira tentativa

O primeiro passo foi adicionar a figurinha com a propriedade float: left e olhar no browser o resultado. Como eu ainda não tinha escrito o resto do texto do post, o que aconteceu é que o link de comentários e o post seguinte ficaram arranjados ao lado da imagem. Embora o problema fosse desaparecer assim que eu continuasse a adicionar texto, por uma questão de princípios eu resolvi garantir que o conteúdo de um post ficaria isolado do post seguinte independentemente de quanto texto houvesse no post. A primeira coisa que eu tentei foi colocar um <DIV> em volta do post inteiro. Isso não resolve o problema: o elemento floated não conta no tamanho da DIV por padrão, e a DIV termina antes da figura. A solução que eu encontrei nas Internets (e que não vou me dar ao trabalho de vasculhar no histórico para descobrir onde achei) foi dar a propriedade overflow: hidden para a DIV que engloba o post. Não, a definição oficial da propriedade overflow: hidden não é essa. Anyway. Primeiro problema resolvido.

Segunda tentativa

Por um acaso infernal, a primeira coisa ao lado da imagem, depois de um subtítulo, era um BLOCKQUOTE. O comportamento normal do BLOCKQUOTE é deixar uma margem à esquerda, indentando o texto citado. Porém, o CSS resolveu calcular a margem a partir da esquerda da DIV do post, ignorando a existência da imagem floated. Como a margem era menor que a largura da imagem, ela era simplesmente desprezada. O mesmo problema acontece com listas (com o bônus de que as bullets de uma lista são posicionadas no espaço da margem por padrão, e conseqüentemente aparecem por cima da imagem).

Não achei uma solução decente para isso. A solução indecente foi:

Agora está tudo certo, certo?

Terceira tentativa

Bem, não. Por outro acaso infernal, a imagem era um link. Lembra do nosso BLOCKQUOTE com margem maluca? Pois a margem maluca invisível agora fica sobreposta à imagem, e com isso o trecho de imagem que fica ao lado do BLOCKQUOTE não é clicável. Tentei tacar z-index na imagem e no BLOCKQUOTE para mudar a ordem de sobreposição. Nada.

Acontece que:

Ou seja, quando eu taquei um position: relative; left: 24px no BLOCKQUOTE, ele passou a ser empilhado sobre a imagem floated, com margem e tudo. A solução, portanto, é tacar um position: relative; z-index: 10 na imagem, para valores arbitrários de 10 (e um z-index: 0 no BLOCKQUOTE por via das dúvidas).

Agora tudo funciona. Certo?

Comentários / Comments (4)

Valdeni, 2013-01-06 21:43:42 -0200 #

Veja bem que... com o HTML 6, é possível utilizarmos-nos de novas implementações para... melhorar o sistema de boxes do CSS. Porque o HTML 7 dispensa o uso das boxes. O HTML 5 é superior. Não é?
Note que existe outro modelo para a navegação... que é a navegação temporal. Essa navegação é feita de maneira simples em HTML 7.5. Utilizamos uma marcação... HTML. O nome é... meta-refresh. Meta-refresh. Que é o HTML temporal. Vejam... é muito simples... não é?
É sim... Pasmem!


Marcus Aurelius, 2013-01-07 22:25:57 -0200 #

Fiquei com vontade de responder que na segunda tentativa eu já teria usado uma tabela, hehe. Mas aí eu vi que ia ser um inferno também...

Tá certo que meus conhecimentos em CSS se assemelham aos meus conhecimentos em culinária (*), mas o primeiro problema não poderia ser resolvido com um float: clear?

(*) Bom... eu sei que para cozinhar é necessário esquentar a comida. Já é algum conhecimento, né?


Vítor De Araújo, 2013-01-08 23:45:31 -0200 #

Pelo que eu entendi, o "clear" controla se vão aparecer outros elementos floats do lado de um float. Experimentei aqui meio a facão e não funcionou...

(Tabela? Nunca faria tal coisa. Favor não olhar o fonte desta página. :P)


Vítor De Araújo, 2013-01-09 11:57:17 -0200 #

Aaah, o 'clear' vai no próximo elemento, não no float. Funcionaria, mas aí eu teria que colocar o 'clear' no parágrafo com o link de comentários (o que exigiria mudar o fonte deste belo blog system), ou criar uma DIV dummy no final do post...


Deixe um comentário / Leave a comment

Main menu

Recent posts

Recent comments

Tags

em-portugues (213) comp (148) prog (71) in-english (62) life (49) unix (38) pldesign (37) lang (32) random (28) about (28) mind (26) lisp (25) fenius (22) mundane (22) web (20) ramble (18) img (13) rant (12) hel (12) scheme (10) privacy (10) freedom (8) esperanto (7) music (7) lash (7) bash (7) academia (7) copyright (7) home (6) mestrado (6) shell (6) android (5) conlang (5) misc (5) emacs (5) latex (4) editor (4) etymology (4) php (4) worldly (4) book (4) politics (4) network (3) c (3) tour-de-scheme (3) security (3) kbd (3) film (3) wrong (3) cook (2) treta (2) poem (2) physics (2) x11 (2) audio (2) comic (2) lows (2) llvm (2) wm (2) philosophy (2) perl (1) wayland (1) ai (1) german (1) en-esperanto (1) golang (1) translation (1) kindle (1) pointless (1) old-chinese (1)

Elsewhere

Quod vide


Copyright © 2010-2024 Vítor De Araújo
O conteúdo deste blog, a menos que de outra forma especificado, pode ser utilizado segundo os termos da licença Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International.

Powered by Blognir.