Menú desplegable con jQuery Superfish en Blogger

Tutoriales Publicado por Claudia en octubre 30, 2011

Tiempo atrás les hablaba de un tutorial para crear menús desplegables sólo con CSS. Para algunos funcionó bien, pero para otros no. Por eso, veremos otra alternativa simple de implementar, basada en los menús desplegables de las plantillas de Premium Blogger Templates. Este menú usa el plugin jQuery Superfish, y debiese funcionar bien para todos.

Agregando un menú desplegable a tu plantilla Blogger, paso a paso

1. Carga la última versión de jQuery

Si no tienes jQuery en tu plantilla, puedes cargarlo directamente desde Google, incluyendo la siguiente línea de código en la Edición de HTML de tu plantilla (todos los cambios se harán allí mismo), justo antes de </body>:

1
<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js' type='text/javascript'/>

2. Agrega Superfish

Justo después de la línea anterior, pega el siguiente código para incluir jQuery Superfish en tu plantilla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
<script type='text/javascript'>
//<![CDATA[
 
(function($){
	/* hoverIntent by Brian Cherne */
	$.fn.hoverIntent = function(f,g) {
		// default configuration options
		var cfg = {
			sensitivity: 7,
			interval: 100,
			timeout: 0
		};
		// override configuration options with user supplied object
		cfg = $.extend(cfg, g ? { over: f, out: g } : f );
 
		// instantiate variables
		// cX, cY = current X and Y position of mouse, updated by mousemove event
		// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
		var cX, cY, pX, pY;
 
		// A private function for getting mouse position
		var track = function(ev) {
			cX = ev.pageX;
			cY = ev.pageY;
		};
 
		// A private function for comparing current and previous mouse position
		var compare = function(ev,ob) {
			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
			// compare mouse positions to see if they've crossed the threshold
			if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
				$(ob).unbind("mousemove",track);
				// set hoverIntent state to true (so mouseOut can be called)
				ob.hoverIntent_s = 1;
				return cfg.over.apply(ob,[ev]);
			} else {
				// set previous coordinates for next time
				pX = cX; pY = cY;
				// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
				ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
			}
		};
 
		// A private function for delaying the mouseOut function
		var delay = function(ev,ob) {
			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
			ob.hoverIntent_s = 0;
			return cfg.out.apply(ob,[ev]);
		};
 
		// A private function for handling mouse 'hovering'
		var handleHover = function(e) {
			// next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
			var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
			while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
			if ( p == this ) { return false; }
 
			// copy objects to be passed into t (required for event object to be passed in IE)
			var ev = jQuery.extend({},e);
			var ob = this;
 
			// cancel hoverIntent timer if it exists
			if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
 
			// else e.type == "onmouseover"
			if (e.type == "mouseover") {
				// set "previous" X and Y position based on initial entry point
				pX = ev.pageX; pY = ev.pageY;
				// update "current" X and Y position based on mousemove
				$(ob).bind("mousemove",track);
				// start polling interval (self-calling timeout) to compare mouse coordinates over time
				if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
 
			// else e.type == "onmouseout"
			} else {
				// unbind expensive mousemove event
				$(ob).unbind("mousemove",track);
				// if hoverIntent state is true, then call the mouseOut function after the specified delay
				if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
			}
		};
 
		// bind the function to the two event listeners
		return this.mouseover(handleHover).mouseout(handleHover);
	};
 
})(jQuery);
 
//]]>
</script>
<script type='text/javascript'>
//<![CDATA[
 
/*
 * Superfish v1.4.8 - jQuery menu widget
 * Copyright (c) 2008 Joel Birch
 *
 * Dual licensed under the MIT and GPL licenses:
 * 	http://www.opensource.org/licenses/mit-license.php
 * 	http://www.gnu.org/licenses/gpl.html
 *
 * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
 */
 
;(function($){
	$.fn.superfish = function(op){
 
		var sf = $.fn.superfish,
			c = sf.c,
			$arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
			over = function(){
				var $$ = $(this), menu = getMenu($$);
				clearTimeout(menu.sfTimer);
				$$.showSuperfishUl().siblings().hideSuperfishUl();
			},
			out = function(){
				var $$ = $(this), menu = getMenu($$), o = sf.op;
				clearTimeout(menu.sfTimer);
				menu.sfTimer=setTimeout(function(){
					o.retainPath=($.inArray($$[0],o.$path)>-1);
					$$.hideSuperfishUl();
					if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
				},o.delay);	
			},
			getMenu = function($menu){
				var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
				sf.op = sf.o[menu.serial];
				return menu;
			},
			addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
 
		return this.each(function() {
			var s = this.serial = sf.o.length;
			var o = $.extend({},sf.defaults,op);
			o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
				$(this).addClass([o.hoverClass,c.bcClass].join(' '))
					.filter('li:has(ul)').removeClass(o.pathClass);
			});
			sf.o[s] = sf.op = o;
 
			$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
				if (o.autoArrows) addArrow( $('>a:first-child',this) );
			})
			.not('.'+c.bcClass)
				.hideSuperfishUl();
 
			var $a = $('a',this);
			$a.each(function(i){
				var $li = $a.eq(i).parents('li');
				$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
			});
			o.onInit.call(this);
 
		}).each(function() {
			var menuClasses = [c.menuClass];
			if (sf.op.dropShadows  && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
			$(this).addClass(menuClasses.join(' '));
		});
	};
 
	var sf = $.fn.superfish;
	sf.o = [];
	sf.op = {};
	sf.IE7fix = function(){
		var o = sf.op;
		if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
			this.toggleClass(sf.c.shadowClass+'-off');
		};
	sf.c = {
		bcClass     : 'sf-breadcrumb',
		menuClass   : 'sf-js-enabled',
		anchorClass : 'sf-with-ul',
		arrowClass  : 'sf-sub-indicator',
		shadowClass : 'sf-shadow'
	};
	sf.defaults = {
		hoverClass	: 'sfHover',
		pathClass	: 'overideThisToUse',
		pathLevels	: 1,
		delay		: 800,
		animation	: {opacity:'show'},
		speed		: 'normal',
		autoArrows	: true,
		dropShadows : true,
		disableHI	: false,		// true disables hoverIntent detection
		onInit		: function(){}, // callback functions
		onBeforeShow: function(){},
		onShow		: function(){},
		onHide		: function(){}
	};
	$.fn.extend({
		hideSuperfishUl : function(){
			var o = sf.op,
				not = (o.retainPath===true) ? o.$path : '';
			o.retainPath = false;
			var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
					.find('>ul').hide().css('visibility','hidden');
			o.onHide.call($ul);
			return this;
		},
		showSuperfishUl : function(){
			var o = sf.op,
				sh = sf.c.shadowClass+'-off',
				$ul = this.addClass(o.hoverClass)
					.find('>ul:hidden').css('visibility','visible');
			sf.IE7fix.call($ul);
			o.onBeforeShow.call($ul);
			$ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
			return this;
		}
	});
 
})(jQuery);
 
//]]>
</script>
 
 
 
 
<script> 
 
    $(document).ready(function(){ 
        $(&quot;ul.menu-secondary&quot;).superfish({ 
            pathClass:  &#39;current&#39; 
        }); 
    }); 
 
</script>

3. El CSS

Pega, justo antes de ]]></b:skin>, los estilos del menú. Podrás notar que no hay ninguna imagen, así que sólo será cosa de cambiar los colores hexadecimales a tu gusto (y quizás una que otra propiedad) una vez que hayas incluido el menú.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* SUPERFISH MENU */
 
.menus,.menus *{margin:0;padding:0;list-style:none;list-style-type:none;}
.menus ul{position:absolute;top:-999em;100%;}
.menus ul li{width:100%}
.menus li:hover{visibility:inherit}
.menus li{float:left;position:relative}
.menus a{display:block;position:relative}
.menus li:hover ul,.menus li.sfHover ul{left:0;top:100%;z-index:99}
.menus li:hover li ul,.menus li.sfHover li ul{top:-999em}
.menus li li:hover ul,.menus li li.sfHover ul{left:100%;top:0}
.menus li li:hover li ul,.menus li li.sfHover li ul{top:-999em}
.menus li li li:hover ul,.menus li li li.sfHover ul{left:100%;top:0}
.sf-shadow ul{padding:0 8px 9px 0;-moz-border-radius-bottomleft:17px;-moz-border-radius-topright:17px;-webkit-border-top-right-radius:17px;-webkit-border-bottom-left-radius:17px}
.menus .sf-shadow ul.sf-shadow-off{background:transparent}
.menu-secondary-wrap{padding:0;margin:0;position:relative;height:40px;z-index:300;background: #F1F1F1; width: 100%;}
.menu-secondary{height:40px}
.menu-secondary ul{min-width:160px}
.menu-secondary li a{color:#1B1A1A;padding:13px 15px 12px 15px;text-decoration:none;text-transform:uppercase;font:bold 12px Arial,Helvetica,Sans-serif; border-right: 1px solid #FFF;}
.menu-secondary li a:hover,.menu-secondary li a:active,.menu-secondary li a:focus,.menu-secondary li:hover > a,.menu-secondary li.current-cat > a,.menu-secondary li.current_page_item > a,.menu-secondary li.current-menu-item > a{color:#FFF;background: #C3C3C3;outline:0;}
.menu-secondary li li a{color:#fff;background:#969696;padding:10px 15px;text-transform:none;font-weight:normal; border-right: 0;}
.menu-secondary li li a:hover,.menu-secondary li li a:active,.menu-secondary li li a:focus,.menu-secondary li li:hover > a,.menu-secondary li li.current-cat > a,.menu-secondary li li.current_page_item > a,.menu-secondary li li.current-menu-item > a{color:#fff;background:#B4B4B4;outline:0}
.menu-secondary a.sf-with-ul{padding-right:26px;min-width:1px}
.menu-secondary .sf-sub-indicator{position:absolute;display:block;overflow:hidden;right:0;top:0;padding:10px 13px 0 0}
.menu-secondary li li .sf-sub-indicator{padding:6px 13px 0 0}

4. El HTML

Copia el siguiente código bajo la cabecera de tu blog, o antes de ésta. Para copiar bajo la cabecera, debes buscar </header> en las plantillas nuevas y poner el códijo justo debajo. En las plantillas más antiguas, deberás poner el código justo antes de    <div id=’content-wrapper’>.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<div class='menu-secondary-wrap'>
<ul class='menus menu-secondary'>
<li><a href='/'>Home</a></li>
<li><a href='#'>Business</a>
<ul class='children'>
<li><a href='#'>Internet</a></li>
<li><a href='#'>Market</a></li>
<li><a href='#'>Stock</a></li>
</ul>
</li>
<li><a href='#'>Downloads</a>
<ul class='children'>
<li><a href='#'>Dvd</a></li>
<li><a href='#'>Games</a></li>
<li><a href='#'>Software</a>
<ul class='children'>
<li><a href='#'>Office</a>
</li>
</ul>
</li>
</ul>
</li>
<li><a href='#'>Parent Category</a>
<ul class='children'>
<li><a href='#'>Child Category 1</a>
<ul class='children'>
<li><a href='#'>Sub Child Category 1</a></li>
<li><a href='#'>Sub Child Category 2</a></li>
<li><a href='#'>Sub Child Category 3</a></li>
</ul>
</li>
<li><a href='#'>Child Category 2</a></li>
<li><a href='#'>Child Category 3</a></li>
<li><a href='#'>Child Category 4</a></li>
</ul>
</li>
<li><a href='#'>Featured</a></li>
<li><a href='#'>Health</a>
<ul class='children'>
<li><a href='#'>Childcare</a></li>
<li><a href='#'>Doctors</a></li>
</ul>
</li>
<li><a href='#'>music</a></li>
<li><a href='#'>politics</a></li>
</ul>
</div>

Ahora sólo queda modificar los enlaces manualmente, reemplazando los textos ancla y los signos gato (#) por tus links con http://.

Finalmente…

Puedes hacer las modificaciones que quieras en el CSS y el HTML de tu menú. No es muy complicado, y sólo depende de tu creatividad.
Lo bueno de un menú desplegable con jerarquías, es que logra una mayor organización en tu blog. Lo único malo que tiene, es que para que funcione en Blogger todos los cambios los tienes que hacer de forma manual.

Posts relacionados

Tags: ,
Compártelo!

23 Comentarios

octubre 30, 2011

Información Bitacoras.com…

Valora en Bitacoras.com: Tiempo atrás les hablaba de un tutorial para crear menús desplegables sólo con CSS. Para algunos funcionó bien, pero para otros no. Por eso, veremos otra alternativa simple de implementar, basada en los menús desplegable……

elang ajib ajib-elang.blogspot.com
noviembre 1, 2011

cool,,thanks for sharing

Monika Sanchez guapaalinstante.blogspot.com
noviembre 2, 2011

Muchas gracias por la informacion de tu blog, sobre todo para blogger me vendra perfecto para conseguir lo que queria

un abrazo!!!

noviembre 19, 2011

Muchísimas gracias, me ha venido muy bien, y me ha salido a la primera…

noviembre 24, 2011

hola :D Dios, no puedo decir de todas las que me has salvado en el tiempo que trato de personalizar mi blog. bueno, tengo una duda ya que me he atrevido y he tomado este menu que para mi es muuucho mas complejo porque mis conocimientos son casi nulos. Bien, mi duda es la siguiente: ¿puedo seguir agregando pestañas y solo debo hacerlo en el codigo html?

noviembre 26, 2011

Si cuando se abre una foto en el blogger con este menú instalado, y se produce el problema de que se superpone el menu sobre la imagen se soluciona en la línea 9 del código CSS. Donde dice z-index: 99, añadir varios nueves más e ir probando hasta que no se superponga el menu sobre la imagen abierta.

diciembre 4, 2011

Hola! He instalado este menu en mi blog. Ha sido relativamente facil siguiendo los pasos que has marcado, a pesar de que es la primera vez que intento algo asi, pero tengo un problema: Las pestañas de los submenus no salen, y no se porque, ni como arreglarlo. ¿Me echaras una mano con esto? Gracias

Dejo el enlace de mi blog, para quele pegueis un vistacillo
http://blogsecretec.blogspot.com

diciembre 4, 2011

Hola que tal.
Tengo una duda, pues cuando pongo todo el menu me aparece de lado izquierdo no habria una forma de centar los menus?
Muchas Gracias me sirvio ^^

diciembre 4, 2011

Hola de nuevo. a se porque no se ven los submenus, es que lo he pegado en un gadget html, y creo que eso e slo que hace que no salgan, bueno, sigo necesitado lo mismo. Si pego el menu en el html del blog ajo la cabecerase descentra, pero is salen los submenus.
Alguna sugerencia….

diciembre 29, 2011

Centrar no sé, pero estirar se hace jugando con el código CSS línea 19, donde dice padding:13px 15px…juega con el valor del 15. Suerte.

enero 3, 2012

Themes códigos y mas para usuarios de Blogger…

Comencé en este mundo de la Web usando Blogger y por mucho tiempo me fue muy útil, y creo que sigue siéndolo. Teniendo en cuenta que no solo te ofrece un subdominio si no puedes comprar en Google tu dominio y alojarlo en Blogger. En nuestra red pasamos…

enero 3, 2012

Hola^^ Muy buen tutorial pero tengo un problema, yo tengo mi blog pero aparte tengo uno de pruebas ambos son la misma plantilla y no se que pasa que en la de pruebas si que me funciona y la verdadera no, me sale el menu escrito normal sin el diseño

enero 3, 2012

Puede ser que uno de los blogs tenga algún otro script javascript (librería como mootols), o widget que impida que el menú funcione. Saludos.

enero 20, 2012

Hola, realicé los cambios aunque no sé nada del tema y quedó bien. Pero no pude cambiar correctamente los textos ancla y símbolo por el enlace http, para dirigirlo a la página. Puedes darme un ejemplo por favor? También estoy trabajndo con blogger, y supongo que las páginas que ya tenía anteriormente no las puedo eliminar, entonces las dejo “invisible”, pero esot significa que con el nuevo menú tampoco se podrán ver? Sludos.

enero 23, 2012

Anuncios

asi podria quedar tu menu, suerte :D

Complicado pergarte codigo aca porque lo interpreta :S

Gonzalo gonzaloymariel.com
febrero 6, 2012

Hola gracias por el post, pero tengo justamente problemas con que la foto me queda superpuesta con el menu, agregue muchooooosss 9999 y nada no lo puedo solucionar.
gracias por la ayuda
gonzaqlo

Beyka cocinaconbeyka.blogspot.com
abril 17, 2012

Hola ChicaBlogger, me encanta tu blog y me has ayudado muchas veces antes ^_^
Tenía una duda que pensé que quizás podrías ayudarme a resolver. Me gustaría poder poner este menú (o uno muy similar al menos) que se mantenga siempre arriba de la página incluso cuando bajemos, es decir, siempre visible. ¿Podrías ayudarme con ello a partir de este código?

Muchisísimas gracias!!!

junio 19, 2012

Hola, la barra de menu es toda la pagina, por lo que quiero acortarla y que coja solo la largura del logo. Me podriais ayudar??

Un Saludo y gracias por todo.

junio 19, 2012

Rafa: Tienes que poner un valor de ancho fijo (width: 940px, por ejemplo) en el contenedor donde vas a poner el menú.

Esteban Pedreros comicverso.org
junio 24, 2012

Estoy probando el menú en un Blog de prueba… el problema que tengo es que aparece el ícono de los listados “li” dentro del menú desplegable.

http://cvadsense2.blogspot.com/

Yinyit yinyit.blogspot.com
septiembre 6, 2012

Hola!!! Excelente tutorial, lo utilice y excelente!!!!! Muchas gracias!!!

luis elblogdespearhead.blogspot.com.es
noviembre 19, 2012

hola hice lo k pusistes y me salio ala perfeccion pero esta en ingles como lo hago para ponerlo en español para k lo entienda y asi poder poner cada una en su categoria saludos me refiero a peliculas>BrRip>BrScreener etc etc Juegos>Shooter>rol etc etc

febrero 8, 2013

Hola, ando buscando lo mismo para WordPress para listar subcategorias dentro de categorías.
Podrías pasarme alguno?

Deja tu comentario

Nombre (requerido)
Email (requerido)
Sitio web (opcional)