Esquinas personalizadas con javascript

  • Jul
  • 18

3 comentarios! 546 palabras - 1 hits

Otra tecnica para crear esquinas personalizadas a traves del dom

Existen diferentes métodos para conseguir este efecto, este que propongo es una mezcla de técnicas que creo que destaca por su sencillez y porque ofrece la posibilidad de aplicar el efecto a mas de un elemento en la misma pagina.

Combinando el uso de javascript y css manipularemos el dom para aplicar el marcado necesario a los elementos que deseemos, el funcionamiento del script se resume de la siguiente manera, al cargarse el documento, recorre el árbol de elementos buscando aquellos marcados con la clase rounded, a los que le añade cuatro elementos “span” posicionados de manera absoluta en las esquinas. Luego, por medio de css, decoramos estos cuatro elementos con la imagen que creara el efecto.

Una de las ventajas de utilizar esta técnica es que se puede aplicar a cualquier elemento, e incluso a varios dentro del mismo documento.

Podéis ver el efecto en marcha en el siguiente ejemplo.

Pasemos a la “magia” del asunto,

Para el ejemplo he creado un script con tres funciones, de las cuales dos son auxiliares y las comentare brevemente, la que realmente aplica el efecto y comentare con mas detalle es la siguiente:

  1.  
  2.     function roundCorners() {
  3.         var rd = getElementsByClass("rounded");
  4.         for (var i = 0; i < this.rd.length; i++) {
  5.             for(var j = 1; 4 >= j;  j++) {
  6.                 var corn = document.createElement('span');
  7.                 corn.className = 'corn'+j;
  8.                 rd[i].appendChild(corn);
  9.             }
  10.         }
  11.     }
  12.  

Básicamente lo que estamos haciendo es leer el documento en busca de los elementos marcados con la clase “rounded”, para esto utilizamos la función getElementsByClass escrita por Dustin Diaz, que nos devuelve un array con todos los objetos, a partir de aquí entran en marcha dos bucles, el primero se ejecutara tantas veces como elementos contenga el array y el segundo añadirá el marcado necesario a cada elemento.

La segunda función auxiliar es la conocida addLoadEvent escrita por Simon Willison y se encarga de que todo esto se realice durante la carga del documento, evitando tener que utilizar lanzadores adicionales dentro del código html.

  1.  
  2.     Antes:
  3.     <p class="rounded">
  4.         <a href="http://example.com">ejemplo</a>
  5.     </p>
  6.     -------------------------------------------------------------
  7.     Despues:
  8.     <p class="rounded">
  9.         <a href="http://example.com">ejemplo</a>
  10.         <span class="corn1" />
  11.         <span class="corn2" />
  12.         <span class="corn3" />
  13.         <span class="corn4" />
  14.     </p>
  15.  

Esta sera la parte de la hoja de estilos,

  1.  
  2.     /* contenedor principal */
  3.     .rounded {
  4.         position:relative;
  5.     }
  6.      /* elementos a&ntilde;adidos */
  7.     .rounded span {
  8.         position:absolute;
  9.         display:block;
  10.         z-index:2;
  11.         height:8px;
  12.         width:8px;
  13.     }
  14.     .corn1 { /* esquina superior derecha */
  15.         background:transparent url(../img/tr.png) top right no-repeat;
  16.         top:0;
  17.         right:0;
  18.     }
  19.     .corn2 { /* esquina superior izquierda */
  20.         background:transparent url(../img/tl.png) top left no-repeat;
  21.         top:0;
  22.         left:0;
  23.     }
  24.     .corn3 { /* esquina inferior derecha */
  25.         background:transparent url(../img/br.png) bottom right no-repeat;
  26.         bottom:0;
  27.         right:0;
  28.     }
  29.     .corn4 { /* esquina inferior izquierda */
  30.         background:transparent url(../img/bl.png) bottom left no-repeat;
  31.         bottom:0;
  32.         left:0;
  33.     }
  34.  

la primera regla aplica una posicion relativa al contenedor principal, mientras que los demas elementos que hemos añadido se posicionaran de manera absoluta con un z-index superior para superponerlos sobre el principal.

Esto seria todo, solo quedan las imagenes, que para el ejemplo tienen unas dimensiones de 12x12 pixels y estan en formato png de 24 bits, por lo que el efecto quedara un poco deslucido si se visualiza con IE. Esto no significa que exista ninguna limitacion a la hora de utilizar otro formato de imagen, ni que no se pueda incluir algun tipo de “trampa” para que IE renderize los png con transparencias de forma correcta si es necesario, esto lo dejo para la imaginacion de cada uno.

Otros metodos similares

3 comentarios

  • Ago
  • 03

# Escrito por Diego hace 3 años, 7 meses

Muy bueno, estaba intentando hacer algo similar a eso :-).


  • Oct
  • 30

# Escrito por XpLOaD hace 3 años, 4 meses

Es interesante el funcionamiento de estos tabs


  • Dic
  • 12

# Escrito por inyaka hace 3 años, 3 meses

el ejemplo no funciona bien en el fuckExplorer otra forma para redondear esquinas es con CSS3 pero tampoco se ve en IE además se pixela miserablemente, lo mejor para redondear esquinas, y que se vean bien en todos los navegadores es con imagenes y capas (como en mi web) aca el tutorial con el que aprendi esa forma http://dionysos.webcindario.com/diseno_web_redondeada.php

saludos


Escribe tu comentario

Puedes utilizar este formulario para escribir tu opinion sobre esta entrada, no existe ningun tipo de limitacion a la hora de enviar opiniones, tan solo sigue unas reglas basicas de cortesia y todos estaremos mas contentos.

Puedes identificarte utilizando OpenID, solo tienes que introducir tu URL OpenID en el siguiente campo y pulsar el boton de validar.





Instrucciones para los comentarios

El simbolo * indica que se trata de un campo obligatorio.

Este sitio usa Markdown junto con Smartypants para educar los textos, tambien esta disponible para los comentarios.

A continuación os muestro algunas de las equivalencias:

  • [enlace de ejemplo](http://example.com/) resulta enlace de ejemplo.
  • **Texto en Negrita**
  • _Italica_
  • > blockquote
  • > > nested blockquote
  • * Esto es un elemento de una lista desordenada (ul)
  • 1. Esto es un elemento de una lista ordenada (ol)

MC Puedes seguir las respuestas a tus comentarios con MyComments.