Crea una barra para compartir tus entradas al estilo Mashable
Escrito el 15 Mar, 2010 por Alexis en CSS, Destacadas, jQuery
Ayer me preguntaban si conocía algún plugin o al por estilo para poder emular el comportamiento de la barra horizontal que acompaña a los post en Mashable. Esta barra se “mueve” a lo largo de la entrada acompañando al scroll y en la que se encuentran botones para socializar contenido, como ser Tweetmeme, Facebook, etc.

Sinceramente nunca le había prestado demasiada atención a esa barra, por la que me puse a investigar un poco mas sobre su comportamiento y como funciona. Después de mirar un poco pude recrear el efecto sin demasiadas complicaciones con un poco de CSS y jQuery.
Surgieron dos alternativas, la replica exacta (solo me tome el trabajo de explicar el código) de Mashable y otro un poco mas simple.

Si entramos a cualquier post en Mashable, veremos que la barra se acompaña al Scroll sin animaciones. Al usar valores negativos en el margin, esta barra no es visible en resoluciones menores (1024), por lo cual mediante jQuery se transforma en otra barra horizontal para mostrar el contenido; lo mismo sucede si redimencionamos la ventana.
La alternativa mas simple ofrece las mismas funcionalidades y un efecto en el scroll, pero si te excedes en el viewport, los visitantes que tengan una resolución de pantalla menor, no podrán apreciarla. A que me refiero con el exceso en el viewport? Simple, si tu container es de 960px de ancho y posicionamos la barra a unos -80px, nos excedimos en el viewport (960px + 80px = 1040) para resoluciones menores o iguales a 1024×768; ya que el safe area para esta resolución es de 975px de ancho.
Cualquiera de las dos alternativas es válida y funcional, queda en vos utilizar la que creas que mejor se adapte.
Replica de Mashable
Esta opción requiere un poco mas de código dada la complejidad. Al utilizar la posición fixed, esta opción no sera compatible con IE6 ya que este navegador desconoce esta propiedad.
Demo Replica de Mashable
No te olvides de redimensionar la ventana para apreciar el efecto completo
HTML
Como lo podemos apreciar en Mashable tenemos botones para sindicar contenido en Twitter, Google Buzz, Facebook y otras. Cada botón funciona por medio de un script para que les sea mas sencillo de integrar, podes usar e incluir los botones que necesitas por medio de algún plugin o simple código, eso queda en vos.
<div id="social_bar"> <div class="botones_grandes"> <div class="gbuzz s_boton"> <script type="text/javascript" src="http://button.njuice.com/buzz.js"> </script> </div> <div class="tweetmeme s_boton"> <script type="text/javascript"> //<![CDATA[ tweetmeme_source = 'baires'; // Mi usuario en Twitter // tweetmeme_url = '<?php the_permalink(); ?>'; // URL a socializar en este caso para Wordpress // //]]> </script> <script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"> </script> </div> <div class="faceboook s_boton"> <script src="http://widgets.fbshare.me/files/fbshare.js" type="text/javascript"> </script> </div> </div> <div class="botones_chicos"> <div class="s_boton_small gbuzz_small"> <script type="text/javascript"> //<![CDATA[ var njuice_buzz_size = 'small'; //]]> </script> <script type="text/javascript" src="http://button.njuice.com/buzz.js"> </script> </div> <div class="s_boton_small twwetmeme_small"> <script type="text/javascript"> //<![CDATA[ tweetmeme_style = 'compact'; //]]> </script> <script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"> </script> </div> <div class="s_boton_small facebook_small"> <script type="text/javascript"> //<![CDATA[ var fbShare = { size: 'small', } //]]> </script> <script src="http://widgets.fbshare.me/files/fbshare.js" type="text/javascript"> </script> </div> <div class="s_boton_small"> <a target="_blank" href="http://feedburner.google.com/fb/a/mailverify?uri=EliseosNet&loc=es_ES" id="s_email" class="social_sprites" name="s_email">email</a> </div> <div class="s_boton_small"> <a class="a2a_dd social_sprites" id="s_share" href="http://www.addtoany.com/share_save?linkname=Eliseos%20Net&linkurl=eliseos.net" name="s_sharethis">Share</a><script type="text/javascript"> //<![CDATA[ a2a_linkname="My Sitio";a2a_linkurl="mi-url.com"; //]]> </script><script type="text/javascript" src="http://static.addtoany.com/menu/page.js"> </script> </div> </div> <div class="s_boton"> <a target="_blank" href="http://feedburner.google.com/fb/a/mailverify?uri=EliseosNet&loc=es_ES" id="s_email" class="social_sprites" name="s_email">email</a> </div> <div class="s_boton"> <a class="a2a_dd social_sprites" id="s_share" href="http://www.addtoany.com/share_save?linkname=My%20Sitio&linkurl=mi-url.com" name="s_sharethis">Share</a><script type="text/javascript"> //<![CDATA[ a2a_linkname="My Sitio";a2a_linkurl="mi-url.com"; //]]> </script><script type="text/javascript" src="http://static.addtoany.com/menu/page.js"> </script> </div> </div>
Nuestro markup es de lo mas sencillo, como se puede hay dos clases de botones: grandes y chicos. Los botones grandes son los que se aprecian a simple vista, los chicos se encuentran escondidos para las resoluciones inferiores o en caso de redimensioanarse la pantalla. Es necesario que edites los datos de cada botón para que coincida con los tuyos, en URL, Nombre del Sitio, etc.
Recomiendo introducir la barra justo después del titulo y antes del contendido para poder desplazarnos sin problemas. Para el caso de WordPress dentro del archivo single.php
CSS
Esto es parte de la magia, otra vez es algo extremadamente simple de entender. Intente comentar lo mas posible el código para que sea de fácil entendimiento.
#social_bar { background:none repeat scroll 0 0 #FFFFFF; border:1px solid #DDDDDD; float:left; margin-left:-80px; /* // La distacia de la barra que queremos tener en relacion al post */ margin-right:10px; position:relative; } /* // Formato de los Botones grandes */ .s_boton { padding:5px; clear:left; margin:0; } /* // Formato de los Botones chicos */ .s_boton_small{ clear:none; float:left; padding:5px; } /* // Ocultamos los botones chicos de momento */ .botones_chicos{display:none;} /* //Iconos para los links de Share y Email */ #social_bar a#s_email.social_sprites { background-position:2px -32px; text-decoration: none; } #social_bar a:hover#s_email.social_sprites { background-position:2px -50px; color:#4c545b; text-decoration: none; } #social_bar a#s_share.social_sprites { background-position:0px 4px; text-decoration: none; } #social_bar a:hover#s_share.social_sprites { background-position:0px -14px; color:#4c545b; text-decoration: none; } #social_bar a.social_sprites { -moz-border-radius:3px 3px 3px 3px; background:url(../images/social_sprites.png) no-repeat scroll 0 0 #FFFFFF; border:1px solid #E8E8E8; color:#989898; display:block; font:9px/1.625 verdana,sans-serif; margin:0; padding:2px; text-align:right; width:44px; }
En caso que lo necesites esta es la imagen que utilice en los links de share & e-mail. Los iconos pertenecen al set Glyphish.
jQuery
Y aquí viene la magia que hará que el comportamiento de la barra acompañe al scroll y diferencie las distintas resoluciones de pantalla.
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 | $(function(){ if( $('#social_bar').length > 0 && !($.browser.msie && parseInt($.browser.version) < 7) ) { var descripY = parseInt($('.main').offset().top) - 20; var $postShare = $('#social_bar'); var pullX = $postShare.css('margin-left'); $(window).data('scrollBound', false); function positionShareScroll() { var scrollY = $(window).scrollTop(); var fixedShare = $postShare.css('position') == 'fixed'; if ( scrollY > descripY && !fixedShare ) { $postShare.stop().css({ position: 'fixed', left: '50%', top: 20, marginLeft: -540 // Este valor se debe ajustar ya que depende de cada diseño// }); } else if ( scrollY < descripY && fixedShare ) { $postShare.css({ position: 'relative', left: 0, top: 0, marginLeft: pullX }); } } $(window).resize(function(){ var windowW = $(window).width(); var pulledOutside = $postShare.css('margin-left') == pullX; if ( windowW >= 1137 ) { if ( !$(window).data('scrollBound') ) { if ( !pulledOutside ) { $postShare.animate({ marginLeft: pullX }); //Crear barra Vertical $('.botones_chicos').hide(); $('.s_boton').show(); $('.botones_grandes').show(); $postShare.css('border-width', '1px'); $postShare.width('auto'); $postShare.css({ marginRight: 7, marginTop: 0 }); } $(window) .data('scrollBound', true) .bind('scroll.positionShare', function(){ positionShareScroll() }) ; positionShareScroll(); } } else { if ( pulledOutside || $(window).data('scrollBound') ) { $postShare .css({ position: 'relative', left: 0, top: 0 }) .animate({marginLeft: 0}) ; //Crear barra Horizontal //$postShare.append(smallButtons); //smallButtons = ''; $('.botones_grandes').hide(); $('.s_boton').hide(); $('.botones_chicos').show(); $postShare.css({ marginTop: 5, marginBottom: 5 }); $postShare.css('border-width', 0); var content_width = $('.main').width(); if (content_width == 'undefined') content_width = 600; if ( $postShare.attr('_width') ) { $postShare.width($postShare.attr('_width')); var block_width = $postShare.attr('_width'); } else { $postShare.attr('_width', $postShare.width() ); var block_width = $postShare.width(); } $postShare.width(content_width); var add_padding = ( (content_width - block_width) / ($postShare.find('.s_boton_small').length * 2) ) + 4; //var add_padding = (642 - (88 + 120 * (buttons_count - 2) )) / (buttons_count * 2); //var add_padding = ( ( 642 - ( 88 * buttons_count ) ) / (buttons_count * 2) ) + 5; $postShare.find('.s_boton_small').css({ paddingLeft: add_padding, paddingRight: add_padding }); $(window) .data('scrollBound', false) .unbind('scroll.positionShare') ; } } }); $(window).resize(); } }); |
Solamente dos cosas debemos tener presentes, la primera es definir en la linea 4 cual sera nuestro valor de referencia para el comportamiento de la barra, es decir el ancho; generalmente corresponde al container en el que se encuentra el post. En mi caso he utilizado la clase main, que se vuelve a utilizar en la linea 76 y en la 77 con su ancho.
Luego procederemos a adaptar la distancia a la que se posicionara la barra cuando nos desplacemos, al utilizar la posición fixed, el valor difiere de los 80px originales. Este ejemplo muestra la barra posicionada a unos -540px (linea 18). Este valor tenes que ajustarlo vos ya que depende de tu diseño. Una aproximación a este numero responde a: Ancho del container (en este ejemplo: main) – 80px
Una vez presentadas todas las partes solo tenemos que integrarlas en nuestro Site, dependiendo de la plataforma con lo que estemos trabajando pude variar algún detalle, pero este código sirve tanto para WordPress como para cualquier otro CMS.
Replica de Mashable Simple
A diferencia de la opción anterior esta barra es compatible con IE6, pero no podrá ser apreciada en resoluciones menores. El scroll para este caso es una animación del padding que produce un simpático efecto final.
Demo Replica de Mashable
HTML
Es casi el mismo markup de la primera opción pero sin incluir los botones pequeños ya que no son necesarios.
<div id="social_bar_wrapper"> <div id="social_bar"> <div class="botones_contenedor"> <div class="gbuzz s_boton"> <script type="text/javascript" src="http://button.njuice.com/buzz.js"> </script> </div> <div class="tweetmeme s_boton"> <script type="text/javascript"> tweetmeme_source = 'baires'; tweetmeme_url = '<?php the_permalink(); ?>'; </script> <script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"> </script> </div> <div class="faceboook s_boton"> <script src="http://widgets.fbshare.me/files/fbshare.js" type="text/javascript"> </script> </div> </div> <div class="s_boton"> <a target="_blank" href="http://feedburner.google.com/fb/a/mailverify?uri=EliseosNet&loc=es_ES" id="s_email" class="social_sprites" name="s_email">email</a> </div> <div class="s_boton"> <a class="a2a_dd social_sprites" id="s_share" href="http://www.addtoany.com/share_save?linkname=My%20Sitio&linkurl=mi-url.com" name="s_sharethis">Share</a><script type="text/javascript"> a2a_linkname="My Sitio";a2a_linkurl="mi-url.com"; </script><script type="text/javascript" src="http://static.addtoany.com/menu/page.js"> </script> </div> </div> </div>
También se ha añadido un wrappera la barra para poder controlar el margin.
CSS
Es exactamente el mismo de la primera opción, con el adicional de wrapper y sin los botones pequeños.
#social_bar_wrapper{ position: absolute; margin-top:20px; } #social_bar { background:none repeat scroll 0 0 #FFFFFF; border:1px solid #DDDDDD; float:left; margin-left:-80px; /* // La distancia de la barra que queremos tener en relacion al post */ margin-right:10px; position:relative; } /* // Formato de los Botones grandes */ .s_boton { padding:5px; clear:left; margin:0; } /* //Iconos para los links de Share y Email */ #social_bar a#s_email.social_sprites { background-position:2px -32px; text-decoration: none; } #social_bar a:hover#s_email.social_sprites { background-position:2px -50px; color:#4c545b; text-decoration: none; } #social_bar a#s_share.social_sprites { background-position:0px 4px; text-decoration: none; } #social_bar a:hover#s_share.social_sprites { background-position:0px -14px; color:#4c545b; text-decoration: none; } #social_bar a.social_sprites { -moz-border-radius:3px 3px 3px 3px; background:url(../images/social_sprites.png) no-repeat scroll 0 0 #FFFFFF; border:1px solid #E8E8E8; color:#989898; display:block; font:9px/1.625 verdana,sans-serif; margin:0; padding:2px; text-align:right; width:44px; }
Quizás lo único que tengas que modificar es la distancia a la que se encuentra la barra con respecto del contenido, para este ejemplo es -80px (dentro de #social_bar). No te excedas en mas de -100px o no sera visible en varias resoluciones.
jQuery
Como te lo adelante anteriormente solamente animamos el padding (gracias CSS Tricks), no es necesario modificar este código a no ser que sepas lo que estas haciendo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $(function() { var $sidebar = $("#social_bar"), $window = $(window), offset = $sidebar.offset(), topPadding = 15; $window.scroll(function() { if ($window.scrollTop() > offset.top) { $sidebar.stop().animate({ marginTop: $window.scrollTop() - offset.top + topPadding }); } else { $sidebar.stop().animate({ marginTop: 0 }); } }); }); |
Bug encontrado
No la había notado la semana pasada, pero me lo remarcan en un e-mail, al contar con un contenido “muy” largo; la barra empuja ciertas secciones dentro del container en el que introducimos la barra. Una opción es cambiar a un container mas “chico” (poco practico) o para esas secciones problemáticas que se desplazan tenes que usar la regla: display: inline-block
Al añadir esta nueva regla, veras que todos los problemas se solucionan, el único inconveniente que se genera, es que display: inline-block no se comporta de manera homogénea en IE por lo que tendríamos que trabajar un poco más. Pero eso es tema para cortar otra tela, por ahora lo dejo como un pendiente.
Consideraciones finales
Por ultimo solo resta presentar todo en nuestro diseño y tendremos otra alternativa a a barra de Mashable.
Cualquier duda que tengas, hacémelo saber.
9 comentarios to “Crea una barra para compartir tus entradas al estilo Mashable”
Trackbacks/Pingbacks
Back to TopDejar un comentario
Additional comments powered by BackType













baires |15/3/2010| Site: twitter.com/baires
Crea una barra para compartir tus entradas al estilo Mashable http://goo.gl/fb/trh3 #css #destacadas #jquery #hack
This comment was originally posted on Twitter
LuisferPerales |15/3/2010| Site: twitter.com/LuisferPerales
Buena, justo lo q necesitaba RT @baires: Crea una barra para compartir tus entradas estilo Mashable http://bit.ly/bqe239 #css #jquery #hack
This comment was originally posted on Twitter
Luis Fernando |15/3/2010| Site: peruresponsable.org
Jajaja ese alguien fui yo. Gracias por tomarte el tiempo en ver este tema que me parece muy interesante y que no encontré en ningún otro lado. WP Beginner no quizo pasarme el dato y en otros sitios no respondían.
Pienso aplicar este tipo de botones a un nuevo proyecto que tengo en mente.
Gracias nuevamente, saludos.
blogueurmasque |15/3/2010| Site: twitter.com/blogueurmasque
RT @baires Crea una barra para compartir tus entradas al estilo Mashable | Eliseos.net http://bit.ly/cFVgIz
This comment was originally posted on Twitter
unique3w |16/3/2010| Site: twitter.com/unique3w
Crea una barra para compartir tus entradas al estilo Mashable. http://icio.us/g5pmct
This comment was originally posted on Twitter
LuisferPerales |21/3/2010| Site: twitter.com/LuisferPerales
Creo q @wpbeginner está ofreciendo un plugin (pagado) x algo q ya desarrolló @baires de forma gratuita como tutorial: http://ow.ly/1p45k
This comment was originally posted on Twitter
Sebastian Ludueña |21/6/2010| Site: magicoperiodista.wordpress.com
Queria consultarte si se puede hacer algo parecido en wordpress.com…
Alexis |21/6/2010| Site: eliseos.net
En realidad no tiene mucha complejidad, solo es una barra con CSS y un poco de jQuery para los menúes. Investiga con Firebug y te darás cuenta de lo que hablo.
Alyen |14/7/2010| Site: ajudawp.com
Muy bueno, yo estaba buscando eso hace tiempo ya ^^