Cantos arredondados. Eles já eram uma "grande coisa" alguns anos atrás e, embora existam várias soluções hoje, eles continuam sendo um obstáculo que não pode ser superado com muita elegância. Quando o CSS3 foi apresentado, uma das primeiras características mostradas foi a propriedade border-radius, nos inibindo de aplicar cantos arredondados com o CSS. Lembra como todos estavam felizes? Pare de pensar assim e leia este artigo para ver como é que a idéia já está falhando antes mesmo de encontrar a maneira para cada navegador moderno.
Há um tempo atrás, técnicas de design eram necessárias para obter bordas arredondadas em um conteiner transparente. Desde que nós decidimos não usar o JavaScript, começamos a procurar outras opções, finalmente estabelecendo a resolução de algumas boas e velhas críticas. A ultima versão do Firefox e WebKit (Safari e Chrome) tem suas próprias propriedades para renderizar bordas arredondadas usando CSS. Seu uso é extremamente simples e seus resultados claramente bonitos.
div {border-radius:10px;}O código acima demonstra o fácil uso que é definido pelos membros da W3C (World Wide Web Consortium). Esta declaração cria bordas arredondadas, criadas em um círculo com raio de 10px. Além desse, é possível configurar valores separados ambos para os raios horizontais e verticais e cada borda separadamente. Considerando o espaço deste artigo embora, a declaração acima nós realmente precisamos.
Há uma semana ou mais, eu estava tentando projetar no HTML e desde que eu precisei de bordas arredondadas eu notei que eu poderia usar a propriedade de Firefox (antes de tudo, isso era somente um exercício de design). O que eu precisei foi de uma barra de navegação com 4 bordas arredondadas. Um caso pouco simples, então eu adicionei bordas arredondadas no ul, oscilando os elementos li e acrescentando alguns retoques finais para os estados active e hover. Foi onde começou a falhar.
Firefox e WebKit tem seus próprios border-radius implementados agora, então nós iremos usar aqueles para construir e demonstrar nosso teste. A pagina teste contém uma configuração simples de navegação horizontal (sem algum projeto ideal), então dê uma rápida olhada para obter um entendimento melhor da situação (e problema).
Página de teste >> barra de navegação com bordas arredondadas.
(trabalha somente em versões que suportam a funcionalidade, como Safari, Firefox e Chrome)
O problema são as expectativas. Em nossa cabeça, bordas arredondadas (e bordas) são muito mais do que um elemento de desenho. Se você colocar bordas em um conteiner e você arredonda eles, o conteiner se torna tudo que está dentro da área entre as bordas. A parte fora do arredondamento não é uma parte do conteiner. Os especialistas do W3C parecem levar em conta como cor do background e imagens no conteiner são tampadas igualmente.
O que está faltando são regras que indicam o comportamento dos elementos dentro do conteiner. No exemplo acima, significa a lista e os elementos dos links. Embora o ul (conteiner) receba bordas arredondadas, a ligação de elementos parece desconhecer isso, então quando eles têm um background eles sobrepõem as bordas arredondadas. Eu não acho que alguém ia considerar isto lógico, ou mesmo preferiu este comportamento. Se você voltar na Página de teste e você coloca o mouse sobre o primeiro elemento que você verá como é que este não é exatamente o que você esperaria que fosse.
Existem, evidentemente, várias soluções, mas nenhuma delas é boa. Você poderia colocar as bordas nos links dos elementos, mas então você tem que se preocupar com as bordas duplas e recebendo os arredondamentos do lado direito da barra. Outra opção é permitir que a borda principal na ul e puxar o primeiro elemento acima da borda usando margens negativas, depois aplicar o mesmo arredondamento para o elemento li.
Existem provavelmente outras soluções, mas tem uma razão por eu não estar explicando-as totalmente ou mesmo me incomodar a obtê-las através de qualquer forma clara. Uma implementação como essa é simplesmente impossível. E eu não posso imaginar que vamos ter de lidar com coisas simples como essa. Se essa é a forma como a execução será em 5 anos, propriamente, já é um fracasso para mim.
*
Publicado originalmente em http://www.onderhond.com/blog/work/trouble-with-rounded-corners
Qual o problema em utilizar um simples a:first-child { border-top-left-radius: 5px; border-bottom-left-radius: 5px; }?
Paulo Rocha dos Santos
Olha sou programador (e um péssimo designer), mas outra solução não seria utilizar uma imagem e com o evento de mouse sobe, substituir a imagem?
Ou quem sabe colocar esse arredondamento somente nas laterais e dar um padding?
Bem eu sei que aqui é discutido como fazer isso com CSS3, mas enquanto não dá, essas não seriam opções válida?
tive um problema semelhante ao teu e consegui resolver, veja neste site: http://www.estudiosite.com.br/criacao_site/index.php/criacao-sites-segmentados
... Mas Paulo Rocha, um dos objetivos deste tutorial é justamente mostrar uma alternativa ao uso de imagens. O que ele quis demonstrar com essa matéria é que a solução para bordas arredondadas com uso de CSS apenas ainda não é a melhor opção, justamente devido às limitações demonstradas.
Quanto ao uso do a:first-child, sim, realmente é uma saída, mas convenhamos que se tivermos que criar sempre as formatações do primeiro e do último elemento de um menu, estaremos apenas mudando as técnicas para cobrir um problema existente? Hoje esse problema pode ser "solucionado" com uso de imagens ou JavaScript. Aí pensaram em "por que não incluir este recurso na CSS?", mas esqueceram deste detalhe envolvendo o conteúdo... E se não consertarem "a tempo", as soluções que hoje são imagens e JS amanhã será o uso OBRIGATÓRIO de :first-child e :last-child, sendo que isso poderia ser corrigido diretamente na "fonte"...
Enfim, nosso amigo Vinicius apenas demonstrou que uma das propriedades mais aguardadas das CSS3 não é perfeita o quanto se imagina... A não ser que corrijam antes de lançarem oficialmente...
Vinicius, belo post.
Realmente as implementações do CSS3 ainda estão muito cruas (como o próprio CSS3), mas o avanço já é visível. Por exemplo no Chrome esse problema já não ocorre. Estou usando a versão 2.0.172.31.
Claro que mesmo assim ainda não está perfeito, a renderização da borda é falha e o background não acompanha exatamente o arredondamento. No quesito renderização meu ponto vai para a raposa.
Abraço
O css tá para simplificar. Poderia ter feito com imagens para foi deito com css. O que é mais legal.
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.