Creando el CSS
Empezaremos dando estilo al contenedor y al div que creamos para arreglar el bug en IE5.5. El bug de IE5.5 que tratamos de arreglar es un problema con la forma en que representa las cajas. La cosa es así: si una caja tiene 200px de alto pero el contenido dentro de la misma es más alto que esto, IE5.5 se estira hasta cubrir todo el contenido en lugar de quedarse con su altura y seguir la propiedad de overflow respectiva (que puede ser mostrar scrollbars, esconder o mostrar el contenido). Esto rompía el fondo del menu y se veía todo chueco. También arregla algunos errores con la propiedad CSS 'z-index', pues IE requiere que esta propiedad sea aplicada al contenedor y no a los elementos contenidos. Con todo esto en mente, el CSS queda así:
- /* contenedor */
- div#menwrap {
- width: 220px;
- height: 220px;
- margin: 5em auto;
- padding: 0;
- background: #fff url('background.jpg') no-repeat center 0;
- }
- div#ie_height_fix {
- width: 1px;
- height: 220px;
- margin: 0;
- padding: 0;
- }
Seguiremos con nuestra lista. Le daremos un espacio de 50px de los elemento alrededor para darle espacio y que se vea bien; un ancho y alto de 220px; le quitaremos el padding y las bullets que por default tiene y por último lo posicionaremos relativamente para poder posicionar absolutamente los elementos contenidos dentro de ella.
- ul#menu {
- margin: 50px auto;
- height: 220px;
- padding: 0;
- width: 220px;
- height: 220px;
- list-style: none;
- list-style-type: none;
- position: relative;
- }
Seguimos con el elemento <li>. Este elemento será de 45px de alto y ancho; que es el alto y ancho de las imagenes de fondo; le quitaremos margin y padding y lo mostraremos como bloque. De nuevo, quitaremos las bullets que por default trae (algunos navegadores lo aplican a <li> otros a <ul>) y cambiaremos el tamaño de la fuente. El paso más importante es posicionar absolutamente estos elementos. Al posicionarlos absolutamente, se amontonarán en la esquina superior izquierda de nuestro menu lo cual es bueno, pues tendremos más control al posicionar nuestros items al rededor de nuestro círculo. Tambien agregamos la propiedad z-index: 2;. Esta propiedad se encarga de acomodar los elementos en cascada, por así decirlo. El número 1 se mostrará primero, el número 2 detrás de el, el 3 detrás del 2 y así sucesivamente. Es poner elementos uno encima de otro. Cabe recordar que esta propiedad solo funciona con elementos que han sido posicionados, por ejemplo, con position: absolute; (como en nuestro caso).
- ul#menu li {
- width: 45px;
- height: 45px;
- margin: 0;
- padding: 0;
- display: block;
- list-style: none;
- list-style-type: none;
- position: absolute;
- z-index: 2;
- font-size: 8pt;
- font-family: verdana, arial, tahoma, serif;
- }
Con todo este embrollo de CSS, tenemos algo como esto:

Como pueden ver, todo está amontonado. Eso es bueno. tambien pueden ver el header de nuestro menu encimado. Vamos a darle algo de estilo. Primero que nada, posicionaremos absolutamente la tag <h2>; le daremos un ancho de 150px y un alto de 35px. Con esto tenemos una pequeña cajita hasta arriba a la derecha; para centrarla le daremos algo de margin hacía arriba y abajo. Como queremos tener una imagen de fondo para esta tag, un padding centrara el texto y la imagen de la sección; alinearemos el texto a la izquierda e identaremos el texto unos 45px (que es más o menos el ancho de la imagen). Por último, le daremos un z-index de 0:
- div#menwrap h2 {
- position: absolute;
- width: 150px;
- height: 35px;
- margin: 60px 0 0 45px;
- padding: 10px 0 0 0;
- text-align: left;
- font-size: 1.5em;
- z-index: 0;
- text-indent: 45px;
- }
Ahora le daremos estilo al span que está dentro de nuestro header. Este span lo mostraremos como bloque de 90px de ancho y le daremos 5px de margin hacia arriba y 25px hacia la izquierda. Esto para colocarlo en su lugar (abajo del título de la sección, centrado en el círculo). Le daremos además un padding de 10px para poder darle un borde hacía arriba de 2px de ancho y de este modo "subrayar" el título de la página. Bajaremos un poco el tamaño de la fuente, eliminaremos el identado que dimos anteriormente a la tag <h2> y cambiaremos el color de la misma. Por último, alinearemos el texto al centro:
- div#menwrap h2 span {
- display: block;
- text-indent: 0;
- font-size: .8em;
- width: 90px;
- border-top: 2px solid #abe9ab;
- margin: 5px 0 0 25px;
- padding: 5px 0 0 0;
- color: #666;
- text-align: center;
- }
Ya hemos estilizado nuestro header, pero falta una cosa: la imagen. La imagen la colocaremos identificando la clase del <h2>. En el ejemplo tenemos class="mail", pero cada sección tiene una clase que se llama del mismo modo que el id del anchor de la sección. Por lo tanto, aplicaremos la imagen a todas las clases de cada sección. La imagen será posicionada a la izquierda y a -45px de arriba para ocultar la parte de la imagen que tiene el círculo verde a su alrededor:
- /* Headers */
- div#menwrap h2.home {
- background: url('home.gif') no-repeat left -45px;
- }
- div#menwrap h2.tutos {
- background: url('tutos.gif') no-repeat left -45px;
- }
- div#menwrap h2.files {
- background: url('files.gif') no-repeat left -45px;
- }
- div#menwrap h2.search {
- background: url('search.gif') no-repeat left -45px;
- }
- div#menwrap h2.mail {
- background: url('mail.gif') no-repeat left -45px;
- }
- div#menwrap h2.id {
- background: url('id.gif') no-repeat left -45px;
- }
- div#menwrap h2.write {
- background: url('write.gif') no-repeat left -45px;
- }
- div#menwrap h2.logout {
- background: url('logout.gif') no-repeat left -45px;
- }
Ahora nuestro menu se ve así:

Ya va tomando forma.
Ahora solo nos queda acomodar los iconos al rededor del círculo. Para esto, tenemos que acomodar cada icono por separado, con precisión de pixel y posicionando absolutamente cada elemento. Primero que nada, vamos a esconder la información; es decir, todo el texto dentro de nuestros anchors:
- /* Esconder información */
- ul#menu li a.menitem span, ul#menu li a.menitem strong, ul#menu li a.menactive span, ul#menu li a.menactive strong {
- display: none;
- }
Y ahora vamos a mostrar la información cuando pasemos el mouse sobre el anchor: Para esto posicionaremos el tag <strong> y el tag <span> absolutamente; los mostraremos como bloques y los pondremos a la izquierda del menu. El tag <hspan>, que es la descripción, será una caja amarilla con un borde un poco más oscuro, tendrá 120px de ancho, el atributo de z-index: 1; y le daremos 20px de padding hacia arriba para poder colocar ahí el tag <strong>, que es el título de la sección. Este tag (<strong>) tendrá un ancho de 100px y un borde al fondo de 1px color amarillo. También le daremos la propiedad de z-index: 2; para colocarlo sobre el tag <span>. A ambas tags les daremos el atributo left: 50px; para alejarlo 5px a la derecha de nuestro icono (¿recuerdas que la imagen es de 45px de ancho? Le vamos a dar 5px de espacio entre el icono y el tooltip; por lo que 45px+5px = 50px) y top:0; para que esté a la misma altura que nuestro icono. También he agregado el atributo opacity para los navegadores que lo soportan:
- /* Mostrar información en :hover */
- ul#menu li a.menitem:hover strong {
- display: block;
- text-align: left;
- position: absolute;
- width: 100px;
- border-bottom: 1px solid #ffdb5e;
- padding: 2px 0 2px 0;
- margin: 0 0 0 5px;
- color: #333;
- left: 50px;
- top: 0;
- z-index: 2;
- }
- ul#menu li a.menitem:hover span {
- display: block;
- position: absolute;
- width: 120px;
- text-align: left;
- border: 1px solid #ffe897;
- background-color: #ffefb7;
- padding: 20px 2px 2px 2px;
- color: #333;
- left: 50px;
- top: 0;
- z-index: 1;
- opacity: .9;
- }
Con todo esto ya practicamente hemos terminado. Solo nos falta dar algo de estilo a los iconos. Empezaremos con darles estilo cuando están activos y cuando no. Cuando un icono no está activo, queremos mostrar el fondo con el icono sin el círculo verde, por lo que posicionamos la imagen de fondo hasta abajo. Cuando el mouse pasa encima de un icono que no está activo, mostraremos la imagen con el círculo verde, por lo que posicionamos el fondo hasta arriba. Finalmente, cuando el icono está activo mostraremos la imagen con el círculo verde para diferenciarlo de los que no lo están. De nuevo, he agregado el atributo opacity para los navegadores que lo soportan:
- /* Fondo en :active y :hover */
- /* Items del menu no activos */
- ul#menu a.menitem:link, ul#menu a.menitem:visited {
- background-position: left bottom;
- opacity: .7;
- }
- ul#menu a.menitem:hover, ul#menu a.menitem:active, {
- background-position: left top;
- background-color: transparent;
- opacity: .9;
- }
- /* Items del menu activos */
- ul#menu li a.menactive {
- background-position: left top;
- background-color: transparent;
- opacity: 1;
- }
- ul#menu li a.menactive:hover {
- opacity: 1;
- }
Con todo esto lo único que nos queda es dar estilo a los anchos. Empezaremos con mostrarlos como un bloque de 45px por 45px posicionado absolutamente y quitando el borde (si es necesario):
- /* Dando estilo a los anchors */
- ul#menu a {
- border: 0;
- position: absolute;
- width: 45px;
- height: 45px;
- }
Ya solo nos queda especificar la imagen de cada icono y posicionarla en su lugar. Para posicionarlas usaremos los atributos top y left. ¿Recuerdas que todos nuestros <li> están hasta arriba a la izquierda? Esto nos facilitará el posicionamiento de los iconos. Relativo a esta posición (hasta arriba a la derecha) daremos los valores de top y left e iremos acomodando los iconos alrededor del círculo. También especificaremos la iamgen de fondo de cada anchor:
- #home {
- top: -20px;
- left: 95px;
- background-image: url('home.gif');
- }
- #tutos {
- top: 20px;
- left: 170px;
- background-image: url('tutos.gif');
- }
- #files {
- top: 90px;
- left: 200px;
- background-image: url('files.gif');
- }
- #search {
- top: 155px;
- left: 170px;
- background-image: url('search.gif');
- }
- #mail {
- top: 195px;
- left: 95px;
- background-image: url('mail.gif');
- }
- #id {
- top: 155px;
- left: 10px;
- background-image: url('id.gif');
- }
- #write {
- top: 90px;
- left: -20px;
- background-image: url('write.gif');
- }
- #logout {
- top: 20px;
- left: 10px;
- background-image: url('logout.gif');
- }
Y con todo esto ya hemos terminado. Pueden ver el producto terminado aquí. Es un rollo, yo sé; pero traten de analizarlo y no es tan difícil. Ahora bien, la aplicación de este menu sigue siendo un misterio para mi... pero tal vez alguien en algún lugar logre encontrarle un uso.
Proximamente pondré un pequeño tutorial de cómo lograr que el menú sepa dónde está y que imprima una respuesta (una clase, por ejemplo) para mantener la navegación "actual"; es decir, que el menactive se marque solo y nos dé el estilo si estamos en dicha pagina.
Firefox 1.5.0.11 en XP también funciona
OMG, me encanta. ;_;
En Safari 2.0.4 y Firefox 2.0.0.2 sobre mac funciona perfecto.
Un saludo!
Firefox 2.0.0.3 en winXP SP2, funciona sin problemas
IE 7.0 en winXP SP2, funciona sin problemas
Realmente muy bueno!
Tengo las mismas herramientas que aerovoyager, así que me ahorro el decir que funciona...
Mis felicitaciones por un muy buen diseño, que (como decís arriba) además de ser atractivo es útil y funcional...
Saludos!
esto funciona en linux
Impresionante. Muy buen trabajo. Funciona muy bien en los navegadores que lo probé (Safari, IE6 winXP, Firefox).
Limpio y semántico tu código. Excelente demo =)
Muy bueno el menu.
Muy bueno este menu circular!! Lo veo en Opera 9.02 en Win XP perfecto, lo unico que cambiaria si se pudiera seria lo extenso que es, uf. Felicitaciones
Impresionante. Es increible ver las cosas que se pueden hacer con algo tan "simple" como CSS
Buenas Hermano,
Muy bueno este menu. Gracias!!!
MENU CIRCULAR EM CSS...
Para provar todo o poder das CSS, dêem uma olhada nesse menu circular, totalmente desenvolvido com HTML e CSS, e nada de JavaScript.
......
Funciona perfectamente en FF 2.0.0.1 bajo Kubuntu Linux y en Konqueror 3.5.2 ( que viene defecto en Kubuntu ).
Una aplicacion que se me ocurre, click en un objeto y que nos aparezca este menu para seleccionar la accion deseada con el mismo (Comprar, Ver mas Datos, Recomendar a un Amigo, etc). Claro que para esto se complementaria posicionandolo exactamente donde este el mouse en ese momento.
Excelente trabajo.
Bien en Opera 9 sobre WinXP SP2
excelente, andaba buscando algo parecido
¡Magnífico! Algo 'sencillo' con una aspecto espectacular. Enhorabuena.
Sensacional menu... sin duda algo espectacular.
Excelênte!!! está funcionando bem.
Meus parabêns.
"O Poder dos CSS"
[...] Menu Circular (CSS) Cada dia o CSS vai me assustando, não tem muito oque falar, apenas clique e mate a curiosidade. [...]
Muy bueno, funciono haciéndolo tal cual lo comentas.
Intente cambiar el tamaño a 440px, y cambie los iconos por otros para mí más útiles, pero me sucedió una cosa extraña, desaparece a la vista la imagen circular de fondo y las imágenes de los iconos, mueves el ratón, por la pantalla y cuando encuentra donde supuestamente esta el icono aparece el tag del contenido, me podías indicar donde puede estar el fallo, gracias
José Manuel El error podría estar en el nombre de los archivos, en algún cambio en las propiedades de los elementos (principalmente en el position), en el tamaño de las imagenes o en las posiciones absolutas de los elementos. Es un código algo delicado y la menor alteración lo afecta todo. Te recomiendo vuelvas a hacerlo, paso por paso, y revisando el resultado final después de cada edición. Así podrás detectar facilmente el cambio que provoca el error.
[...] Circular Menu with CSS [...]
[...] O site metalize.liveonstyle.com publicou um interessante tutorial sobre como criar um menu em forma de circulo utilizando CSS. Veja um exemplo do menu funcionando aqui. [...]
[...] Yukarda gördüğünüz tarz menüleri belki birçok sitede görmüşsünüzdür ancak genelde Flash teknolojisi kullanılarak yapılmışlardır.Ancak bu gördüğünüz menü CSS tekniğiyle oluşturulmuş bir menü.Menünün yapımı bu adresde uzun uzun anlatılmış.Ancak sanırım İspanyolca bir anlatım olduğu için sadece kod yapısını inceleyebilirsiniz.(Belki ispanyolca biliyorsunuzdur.)Yada çeviri sitelerine başvurabilirsiniz… [...]
Can I get the English version help and Demo Page URL please...
Sai: I'm very sorry, but there is no translated version of this tutorial. Yet, I believe the HTML and CSS speaks for themselves. You might as well be able to do something with just the example page. Best of lucks!
Muy lindo menu y muy buena utilización del css, felicitaciones
¡excelente! De verdad muy bueno.
[...] bugune kadar gormus oldugum en yaratici css menulerden birisini. nasil yapildigini ogrenmek icin : [ 1 ] [ 2 ] [ 3 ]. nasil calistigini gormek icinde buraya goz atabilirsiniz.not : belirtmeliyimki yapilan aciklamalarin hepsi ispanyolca. [...]
[...] metal.ize » Blog Archive » Menu circular en CSS (tags: css menu webdesign tutorial web javascript tool howto inspiration) [...]
Maybe you should mention, that the icons are part of the tango project oO?
Holy mother of god... thanks for remembering that. I was pretty sure that the example page included a link... damn. Well, I've already added a link on the first page of this tutorial...
I shall apologize to the Tango Icon Project development team. I seriously thought the link was there. Thanks for an awesome set of icons, by the way.
[...] Circular Menu with CSS This article shows how a beautiful circular navigation menu is created. In Spanish with Source code and an example. [...]
Muito bom mesmo essa dica! Parabéns.
Grato.
muy interesante para hacer un menu circular
Muy bueno para salir de lo comun.....Felicitaciones
Interestante, el artículo. Saludos
i'am really impressed!!
Excelente trabajo, me funciona re bien. Estoy en proceso de agregar íconos y cambiar las imágenes para adapatarlo a mi trabajo... FELICIDADES NUEVAMENTE.
Ola.. Apliquei este menu circular en mi site. http://www.luciane.pro.br/
Gracias por tu ejemplo e Saludos...
Hola acabo de implementarlo en mi página para los distintos boliches xD
http://www.confizona.com.ar/menu/fotos.php
La verdad que hace mucho que queria hacerlo pero recien ahora le dedique a full.
La verdad siempre leo tus articulos
saludos!
Puedo hacer un menu animado solo con ccs
para evitar usar javascript ya que varos usuarios no lo tienen activado ?
Esto era lo que estava buscando para mi web
hola esta padre el menu pero sabes tengo un problema con firefox 2.0.0.7 no me aparese la imagen de que esta selecionado no se si me puedas ayudar gracias
quero fazer um menu estilo icone do desktop clicavel e arrastavel como o da area de trabalho do widowns, é possível?
Alguem pode me ajudar???
[...] Menu en CSS: Menu circular en CSS, muy interesante. [...]
Fantastico
Podrias enviar el codigo en un archivo zip?
Gracias
good work! i am impressed!
OK.. ELEGANTE!
Muy bueno! Gracias!
hi
i found this bug on ur site
my browser is Firefox V:Mozilla/5.0 (Windows; U; Windows NT 5.1; ar; rv:1.8.1.14) Gecko/2008040413 Firefox/2.0.0.14
and i have the "web developer" add ons
when i disable the minimum font size from disable menu ...ur site