Mostrando entradas con la etiqueta JavaScript. Mostrar todas las entradas
Mostrando entradas con la etiqueta JavaScript. Mostrar todas las entradas

lunes, 12 de agosto de 2013

Plugin configurable para obtener las entradas desde Json para Blogger

Este liviano script, se encarga de mostrar sus entradas (O bien las entradas de otros blogs) en alguna parte de su sitio, es algo muy similar a lo que funciona en la plantilla GeekLines en el slider de entradas.

Blogger, Json


El uso de este script va a depender de lo que ustedes quieran hacer con él, ya que se puede configurar fácilmente para cosas como:

  • Configurar para sliders dinámicos mediante una estructura personalizada.
  • Insertar dentro de una página estática un sitemap.
  • Mostrar entradas relacionadas al pie de una entrada.
  • Crear un gadget de últimas entradas personalizado.
  • Crear un índice de blog personalizado.
  • Traer las entradas del blog al azar.
  • Otros posibles usos que puedas darle.

Cómo añadir el plugin en Blogger:

Para poder incluir el script en tu blog, símplemente deberás pegar el siguiente código donde desees que se ubiquen los artículos:
<script type="text/javascript" src="https://dl.dropboxusercontent.com/u/69931585/Ayuda%20Bloggers%202013/Desarrollo/ayudabloggers-obtener-feed.js"></script>
<script type"text/javascript">
var cantidad_posts = 10; // Cantidad de posts que se mostrarán
var caracteres_resumen = 100; // Cantidad de carácteres del resúmen
var tamano_imagen = 100; // Tamaño imagen en píxeles
var url_imagen_no_disponible = "URL IMAGEN NO DISPONIBLE"; // URL de la URL si no existe una imagen
var id_contenedor = "ID_CSS"; // Identificador CSS del contenedor de todos los elementos
var html_personalizado = false; // Usar estructura personalizada, útil si necesitas configurar un slider en particular o algún sistema de terceros

<script src="http://www.ayuda-bloggers.info/feeds/posts/default?orderby=published&amp;alt=json-in-script&amp;callback=obtener_feeds&amp;max-results=999999"></script>

En donde deberás reemplazar http://www.ayuda-bloggers.info por la URL de tu blog.

Si necesitas crear una estructura personalizada, omite el código anterior y añade el siguiente código antes de </head>:
<script>
// Obtener posts a partir de las feeds de Blogger
// Por Víctor Calderón Oyarce
// Para Ayuda Bloggers
// http://www.ayuda-bloggers.info

// CONFIGURACIONES INICIALES
var cantidad_posts = 10; // Cantidad de posts que se mostrarán
var caracteres_resumen = 100; // Cantidad de carácteres del resúmen
var tamano_imagen = 100; // Tamaño imagen en píxeles
var url_imagen_no_disponible = "URL IMAGEN NO DISPONIBLE"; // URL de la URL si no existe una imagen
var id_contenedor = "ID_CSS"; // Identificador CSS del contenedor de todos los elementos
var html_personalizado = false; // Usar estructura personalizada, útil si necesitas configurar un slider en particular o algún sistema de terceros

function obtener_feeds(json) {
var posts_obtenidos = json.feed.openSearch$totalResults.$t;
var crear_arreglo = new Array();

document.write('<div id="'+ id_contenedor+'">
');

for(var i= 0; i < cantidad_posts; ++i) {

// ELEMENTOS DE CADA POST
var titulo_post = json.feed.entry[i].title.$t; // Título entrada
var miniatura = json.feed.entry[i].media$thumbnail.url; // Thumbnail entrada
var url_post = json.feed.entry[i].link[1].href; // URL entrada
var url_post = url_post.replace('#comment-form', '');


var miniatura = miniatura.replace('s72-c', 's'+ tamano_imagen +'-c' ); // Miniatura
if (miniatura.length == 0) { // Si la entrada no contiene imagen...
miniatura = url_imagen_no_disponible;
}


if ("content" in json.feed.entry[i]) { // Si "content" se encuentra dentro del artículo (Para full feeds)
var resumen = json.feed.entry[i].content.$t
}
else if ("summary" in json.feed.entry[i]) { // Si "summary" se encuentra dentro del artículo (Para feeds resumidas)
var resumen = json.feed.entry[i].summary.$t
}

var strip = /<\S[^>]*>/g;
resumen = resumen.replace(strip, ""); // Eliminamos las etiquetas HTML de nuestros resúmenes

if(resumen.length > caracteres_resumen) { // Si el artículo es superior a la cantidad de carácteres límite, resumimos.
resumen = resumen.substring(0,caracteres_resumen)+ '...';
}
crear_arreglo[i] = i; // Almacenamos el índice del arreglo actual


if(html_personalizado == false) { // Si no hemos habilitado html_personalizado...
document.write('

<div class="ab-json-post">
');
document.write('

<div class="ab-post-title">
<a href="http://www.blogger.com/%27+%20url_post%20+%27">' + titulo_post + '</a></div>
');
document.write('<img alt="titulo_post" class="ab-thumbnail" src="' + miniatura + '" />');
document.write('

<div class="ab-post-summary">
'+resumen+'</div>
');
document.write('</div>
');
} else { // Escribe aquí tu propio código utilizando las variables y el ejemplo de arriba

document.write('Empieza a escribir tu código HTML, este es el post índice '+i +'');

}

}
document.write('

<div class="clearfix clear">
</div>
</div>
');
}
</script>

Y en donde desees incluir las entradas, deberás añadir lo siguiente:
<script src="http://www.ayuda-bloggers.info/feeds/posts/default?orderby=published&amp;alt=json-in-script&amp;callback=obtener_feeds&amp;max-results=999999"></script>
En donde deberás reemplazar http://www.ayuda-bloggers.info por la URL de tu blog.

Guarda los cambios y empieza a configurar mediante los siguientes pasos:

Configurar el plugin:

Dentro del script se pueden configurar los siguientes parámetros:
// CONFIGURACIONES INICIALES
var cantidad_posts = 10; // Cantidad de posts que se mostrarán
var caracteres_resumen = 100; // Cantidad de carácteres del resúmen
var tamano_imagen = 100; // Tamaño imagen en píxeles
var url_imagen_no_disponible = "URL IMAGEN NO DISPONIBLE"; // URL de la URL si no existe una imagen
var id_contenedor = "ID_CSS"; // Identificador CSS del contenedor de todos los elementos
var html_personalizado = false; // Usar estructura personalizada, útil si necesitas configurar un slider en particular o algún sistema de terceros
Estas variables permiten alterar un poco el comportamiento del script, si deseas hacer cambios a la estructura que éste devuelva, entonces deberás buscar el siguiente código:

document.write('Empieza a escribir tu código HTML, este es el post índice '+i +'');


Y empezar a escribir el nuevo código guiándote con el código que se encuentra arriba de éste. Esto es muy útil si necesitas adaptar un slider para que muestre las últimas entradas de tu blog, por ejemplo.

Importante: Recuerda cambiar por true la variable html_personalizado o de lo contrario no funcionará.

Configurar mediante CSS:

El identificador que asignes en la variable id_contenedor, deberás utilizarlo para enlazar atributos. El resultado del script es el siguiente:
<div id="ID_CSS">
<div class="ab-json-post">
<div class="ab-post-title"><a href="URL-POST-1">Título entrada 1</a></div>
<img class="ab-thumbnail" src="URL-IMAGEN-MINIATURA" alt="Título entrada 1" />
<div class="ab-post-summary">Resúmen de la entrada</div>
</div>


<div class="ab-json-post">
<div class="ab-post-title"><a href="URL-POST-2">Título entrada 2</a></div>
<img class="ab-thumbnail" src="URL-IMAGEN-MINIATURA" alt="Título entrada 2" />
<div class="ab-post-summary">Resúmen de la entrada</div>
</div>


...


<div class="ab-json-post">
<div class="ab-post-title"><a href="URL-POST-N">Título entrada N</a></div>
<img class="ab-thumbnail" src="URL-IMAGEN-MINIATURA" alt="Título entrada N" />
<div class="ab-post-summary">Resúmen de la entrada</div>
</div>
<div class="clearfix clear"></div>
</div>


Estas son las reglas CSS que deberás modificar:
#ID_CSS { /* Reemplazar por el ID que hayas seleccionado */

}

.ab-json-post {
}

.ab-post-title {
}

.ab-post-thumbnail {

}

.ab-post-summary {

}

.clearfix {
clear:both;
}

Un ejemplo, utilizando el sistema para mostrar las entradas relacionadas en Blogger:
#posts-relacionados { /*Identificador asignado por mí*/
background:#EFEFEF;
border:1px solid #DDD;
padding:15px 15px 0;
color:#666;
}

#posts-relacionados:before {
content:"Otros artículos interesantes:";
font-size:large;
display:block;
margin-bottom:15px;

}

.ab-json-post {
width:31%;
float:left;
margin:0 0 15px 0;
height:235px;
}

.ab-json-post:nth-child(3n+2) {
margin:0 3.5% 15px;
}

.ab-post-title {
white-space:nowrap;
text-overflow:ellipsis;
overflow:hidden;
}

.ab-post-thumbnail {
max-width:100%;
}


Conjuntamente, para que se encuentren los artículos relacionados según coincidencias de etiquetas, utilizar el siguiente código:
<b:loop values='data:post.labels' var='label'>
<b:if cond='data:label.isLast != "true"'>

<script src="https://dl.dropboxusercontent.com/u/69931585/Ayuda%20Bloggers%202013/Desarrollo/ayudabloggers-obtener-feed.js" type="text/javascript"></script>
<script>
var cantidad_posts = 6; // Cantidad de posts que se mostrarán
var caracteres_resumen = 50; // Cantidad de carácteres del resúmen
var tamano_imagen = 200; // Tamaño imagen en píxeles
var url_imagen_no_disponible = "URL IMAGEN NO DISPONIBLE"; // URL de la URL si no existe una imagen
var id_contenedor = "posts-relacionados";
var html_personalizado = false;
</script>

<script expr:src='"http://www.ayuda-bloggers.info/feeds/posts/default/-/" + data:label.name + "?alt=json-in-script&callback=obtener_feeds&max-results=99999"' type='text/javascript'/>

</b:if>
</b:loop>

El resultado de esto:



Configuraciones opcionales:

Si deseas que el script se encargue de devolverte la entrada completa (Incluyendo las etiquetas de formateo HTML), deberás eliminar estas líneas:
var strip = /<\S[^>]*>/g;
resumen = resumen.replace(strip, ""); // Eliminamos las etiquetas HTML de nuestros resúmenes

if(resumen.length > caracteres_resumen) { // Si el artículo es superior a la cantidad de carácteres límite, resumimos.
resumen = resumen.substring(0,caracteres_resumen)+ '...';
}

Recuerda, que si deseas hacer cualquier cambio al script o si bien lo deseas utilizar como base para un script mejor, puedes tomarlo y modificarlo a tu antojo.

Ver el código fuente del script en GitHub Gist.

lunes, 7 de enero de 2013

Caracteres "raros" en scripts y CSS

A veces, cuando se usan scripts, debemos escribir caracteres especiales como acentos y estos no se ven bien o aparece un signo de interrogación u otros símbolos raros. Por lo general, esto se resuelve si la codificación de caracteres es correcta pero lo lógico no siempre funciona.

En Blogger, los caracteres especiales suelen verse bien por lo que ese problema es difícil que se nos presente pero, cuando se trata de otros servicios, de archivos externos, las cosas pueden complicarse, sobre todo si queremos emplear caracteres especiales [1 2]

Por ejemplo, esto, suele verse bien y al hacer click en este enlace, se verán las letras de modo correcto:
alert(" á é í ó ú  ☺ ❤ ✛ ");
Si no es así y quiero usar caracteres de ese tipo, lo que debo hacer es escribirlos en un formato especial, las llamadas cadenas de escape que no son otra cosa que una barra invertida seguida de una letra y un número en formato hexadecimal. En el caso de los acentos o caracteres comunes, sería \x más el código Unicode de dos dígitos:

\xe1 es la letra á
\xe9 es la letra é
\xed es la letra í
\xf3 es la letra ó
\xfa es la letra ú

Algunas combinaciones generan caracteres especiales:

\n es un salto de linea
\t es una tabulación
\' es la forma de escribir comillas simples
\" es la forma de escribir comillas dobles
\\ es una barra invertida

De manera más genérica, podemos usar \u más el código Unicode en formato hexadecimal (cuatro dígitos):

\u00e1 es la letra á
\u00e9 es la letra é
\u00ed es la letra í
\u00f3 es la letra ó
\u00fa es la letra ú

lo que nos permitirá ver correctamente eso que antes no se podía:
alert(" \u263a \u2764 \u271b ");
En esta página, hay una lista muy completa de todos los caracteres, tanto símbolos como distintos alfabetos.

Aunque en el CSS no suelen usarse caracteres raros, hay un caso en que también son necesarios, cuando se utiliza la propiedad content junto con :after y :before

Allí, se usa el mismo criterio aunque sólo es necesario agregar la barra invertida seguida de los cuatro dígitos del código hexadecimal. Por ejemplo:
content: ":\24d1\24d4\24d5\24de\24e1\24d4";

content: ":after \263a \2724 \2602";
:after ☺ ✤ ☂
:ⓑⓔⓕⓞⓡⓔ

miércoles, 26 de diciembre de 2012

Fokus: Un script para resaltar lo resaltado

Fokus es un script interesante aunque el resultado final dependerá mucho de la página donde se quiera utilizar, tanto de su color de fondo como de la forma en que está estructurada. Lo que hace es resaltar cualquier cosa que uno haya seleccionado, cubriendo el resto de la página con una cierta opacidad.

Justamente, es esa opacidad lo que hace que el resultado sea variable porque está pensada para fondos claros y no posee opciones de configuración aunque, si se quiere, se podría modificar el script, buscando esta línea y colocando allí el color a utilizar en formato rgba():

v.fillStyle="rgba( 0, 0, 0, "+t+" )";
Por ejemplo, si quisierámos que fuera una opacidad en blanco, sería:
v.fillStyle="rgba( 255, 255, 255, "+t+" )";

El script no utiliza librería así que puede agregarse en cualquier sitio aunque, como usa la etiqueta canvas, no se verá en versiones inferiores de Internet Explorer. Lo podemos descargar desde github y basta agregarlo antes de </head>


Cras nec magna ante. Nam rutrum tristique porttitor. Ut quam felis, fringilla a ultrices sed, ornare ut purus. Morbi vitae felis magna, nec mollis augue. Aenean sagittis ornare nunc, a facilisis neque luctus at. Phasellus porta sapien non ligula gravida ac pharetra erat fringilla. Suspendisse elementum vehicula libero, vel hendrerit diam porta quis. Proin bibendum erat in orci commodo sit amet egestas eros elementum! Nullam pharetra lacus lorem. In nec hendrerit elit. Sed consectetur tincidunt dui; in aliquam sapien ullamcorper et.

Integer tristique dignissim mollis. Nam justo magna, egestas ac sodales quis, posuere commodo tellus.


REFERENCIAS:lab.hakim

martes, 18 de diciembre de 2012

Cambiar el favicon de modo dinámico

No sé hasta que punto esto tendrá utilidad alguna pero, se me ocurrió buscar en la web a ver si existía alguna forma sencilla de cambiar el favicon de una página; es decir, tener uno pro defecto y cambiarlo por otro ya sea por la acción de un usuario (un click en alguna parte) o de manera aleatoria.

Había muchas respuestas y dudas que, naturalmente, incluían diferencias entre los navegadores (Internet Explorer y Chrome son problemáticos), funciones complicadas, etc etc pero, en un foro, alguien propone una solución que funciona bastante bien en Firefox, Chrome y Opera y que se basa en este artículo.

La función sería esta:
<script>
var IE = navigator.userAgent.indexOf("MSIE")!=-1;
var favicon = {
change: function(iconURL){
if (arguments.length == 2){document.title = optionalDocTitle;}
this.addLink(iconURL, "icon");
this.addLink(iconURL, "shortcut icon");
if (!IE) {
if (!window.__IFrame){
__IFrame = document.createElement('iframe');
var s = __IFrame.style;
s.height = s.width = s.left = s.top = s.border = 0;
s.position = 'absolute';
s.visibility = 'hidden';
document.body.appendChild(__IFrame);
}
__IFrame.src = 'about:blank';
}
},
addLink: function(iconURL, relValue) {
var link = document.createElement("link");
link.type = "image/x-icon";
link.rel = relValue;
link.href = iconURL;
this.removeLinkIfExists(relValue);
this.docHead.appendChild(link);
},
removeLinkIfExists: function(relValue) {
var links = this.docHead.getElementsByTagName("link");
for (var i=0; i<links.length; i++) {
var link = links[i];
if (link.type == "image/x-icon" && link.rel == relValue) {
this.docHead.removeChild(link);
return;
}
}
},
docHead: document.getElementsByTagName("head")[0]
}
</script>
Una vez agregada, bastaría ejecutarla con algo así:
favicon.change('url_imagen')
Por ejemplo, esta es una lista de imágenes cualquiera, haciendo click en cada una de ellas, el favicon de esta página, cambiará:



Es simple; estoy usando imágenes en formato gif pero pueden usarse otras, incluyendo formatos ico:
<img onclick="favicon.change('http://www.google.com/favicon.ico');" src="http://www.google.com/favicon.ico" />

Para que sea aleatorio, colocamos las imágenes en un array y seleccionamos una cualquiera:
function favalea() {
// lista de imágenes a utilizar
misFavicons=new Array('url_imagen_1','url_imagen_2','url_imagen_3','url_imagen_4');
// elegimos una al azar y llamamos a la función
favicon.change(misFavicons[Math.floor(Math.random()*misFavicons.length)]);
}
Y una etiqueta cualquiera que la ejecute:
<span style="cursor:pointer;" onclick="favalea()">favicon al azar</span>
o ejecutamos la función cuando la página esté cargada:
window.onload = (function(){ favalea(); });
favicon al azar

domingo, 16 de diciembre de 2012

Construir spoilers con el botón de Google+ y Javascript

En CodeCanyon encontré un artículo muy interesante que consta en construir spoilers con CSS3 y jQuery mediante el Callback del botón de Google+. Este artículo es un tutorial de pago, así que decidí hacer una alternativa algo similar, pero sin jQuery y con Javascript nativo.

Nota: Para comprobar en el demo si la cookie existe, primero debes actualizar la página, la cookie se almacenará en la entrada y no en todo el blog para prevenir que se desbloqueen todos los posts al mismo tiempo.
El tutorial:

Paso 1: Crear la función para el Callback y definir todas las variables:

Lo primero que debemos hacer es una función, que ésta lleve como parámetro el mismo que el del callback, además debemos empezar con todas las variables que se emplearán y también con las instrucciones que se ejecutarán al hacer +1.


<script type="text/javascript">
// Empezamos con las variables
var url = document.URL; // Establecemos la URL actual
var ruta = "http://tu-blog.blogspot.com".length; // Obtenemos la longitud de nuestro dominio
var mensaje_spoiler = document.getElementById("contenido-oculto"); // Creamos una variable a partir del spoiler
var boton_spoiler = document.getElementById("boton-plusone"); // Creamos una variable a partir del botón de Google+
var cookieplus = document.cookie.substring(document.cookie.indexOf("plusoneguardado" + '=') + "plusoneguardado".length + 1,document.cookie.length); // Esta variable nos permite crear un índice por si existen otras cookies almacenadas en la página, con esta la seleccionamos de manera individual
if(cookieplus.indexOf(';') != -1)cookieplus = cookieplus.substring(0,cookieplus.indexOf(';'))


function spoiler(plusone) { // Empezamos la función con el Callback
if(plusone.state == "on") { // Si el estado del callback es on...
mensaje_spoiler.className = "g-activo"; // Asignamos una clase .g-activo al contenido oculto
boton_spoiler.className ="g-oculto"; // Asignamos una clase .g-oculto al botón +1
document.cookie ='plusoneguardado=confirmado; path=' + url.substring(ruta,999); // Escribimos la cookie denominada plusoneguardado=confirmado y se le asigna un path, se calcula mediante substring y la longitud de la variable ruta
}

};
</script>

Paso 2: Detectar la cookie cuando la página se cargue:

Dentro de la misma etiqueta <script> iniciaremos otra nueva función, ésta se denominará leercookie y designará una serie de instrucciones si la condición se cumple:
<script type="text/javascript">
// Empezamos con las variables
var url = document.URL; // Establecemos la URL actual
var ruta = "http://tu-blog.blogspot.com".length; // Obtenemos la longitud de nuestro dominio
var mensaje_spoiler = document.getElementById("contenido-oculto"); // Creamos una variable a partir del spoiler
var boton_spoiler = document.getElementById("boton-plusone"); // Creamos una variable a partir del botón de Google+
var cookieplus = document.cookie.substring(document.cookie.indexOf("plusoneguardado" + '=') + "plusoneguardado".length + 1,document.cookie.length); // Esta variable nos permite crear un índice por si existen otras cookies almacenadas en la página, con esta la seleccionamos de manera individual
if(cookieplus.indexOf(';') != -1)cookieplus = cookieplus.substring(0,cookieplus.indexOf(';'))


function spoiler(plusone) { // Empezamos la función con el Callback
if(plusone.state == "on") { // Si el estado del callback es on...
mensaje_spoiler.className = "g-activo"; // Asignamos una clase .g-activo al contenido oculto
boton_spoiler.className ="g-oculto"; // Asignamos una clase .g-oculto al botón +1
document.cookie ='plusoneguardado=confirmado; path=' + url.substring(ruta,999); // Escribimos la cookie denominada plusoneguardado=confirmado y se le asigna un path, se calcula mediante substring y la longitud de la variable ruta
}

};
</script>


// Función creada para comprobar si la cookie existe
window.onload = function leercookie() { // Cargamos la función al cargar la página
if (cookieplus == "confirmado") { // Si la cookie contiene el valor "confirmado"...
mensaje_spoiler.className = "g-activo"; // Asignamos una clase .g-activo al contenido oculto
boton_spoiler.className ="g-oculto"; // Asignamos una clase .g-oculto al botón +1
}

};

No olvides reemplazar "http://tu-blog.blogspot.com" por la URL de tu blog (Sin / al final).

Nota: Este código debe ir antes de:

</body>

Paso 3: Añadir CSS a los elementos:

Para que todos estos elementos interactúen correctamente, lo que debemos hacer es crear las reglas CSS con las que condicionaremos los comportamientos. Lograremos entonces que la clase .g-activo sea del tipo visible, y .g-oculto una clase invisible, y junto con ello aplicaremos estilos a todos los elementos:

#plus-one { /*Atributos del contenedor del spoiler*/
font-family: 'Open Sans', sans-serif; /**/
background:#F9F9F9; /*Color de fondo en formato hexadecimal*/
border:5px solid white; /*Tamaño, tipo y color del borde*/
box-shadow:0 0 5px rgba(0,0,0,0.1), inset 0 0 5px rgba(0,0,0,0.3); /*Sombras con CSS3*/
color:#888; /*Color de la fuente*/
padding:12px 20px; /*Espaciado del contenedor*/
border-radius:10px; /*Bordes redondeados*/
width:85%; /*Ancho del spoiler*/
font-weight:300; /*Ancho de la tipografía, necesita que ésta la soporte*/
margin:10px auto; /*10px de márgen superior e inferior, y automático para centrar*/
}

#plus-one a { /*Atributos de los enlaces dentro del contenedor*/
text-decoration:none; /*Sin subrayado o algún otro tipo de decoración*/
color:#444;/*Color del enlace*/
}

#boton-plusone { /*Atributos del botón y del mensaje*/
font-style:italic; /*Cursiva*/
}

.g-oculto {
display:none; /* g-oculto es una clase invisible*/
}

.g-activo {
display:block; /*g-activo es una clase visible*/
}

Nota: Este código debe ir antes de:

]]></b:skin>

Y para la fuente, pega el siguiente código antes de </head>
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,300italic,300,400italic,600,600italic' rel='stylesheet' type='text/css' />


Paso 4: Insertar el spoiler en alguna entrada:

Una vez que ya tengas todo instalado y configurado correctamente en tu plantilla, deberás pegar el siguiente código en la edición HTML de la entrada en la cual insertarás el spoiler:
<div id="plus-one">
<div id="boton-plusone">Contenido Bloqueado. Para desbloquear el contenido oculto presiona en el siguiente botón.
<br />
<g:plusone callback="spoiler"></g:plusone>
</div>

<div id="contenido-oculto" class="g-oculto">
Inserta acá el código que se mostrará cuando el botón haya sido presionado.
</div>
</div>

Importante: Para que el spoiler almacene la ruta correctamente, el spoiler debe ir oculto mediante el salto de línea en la página principal, o de lo contrario almacenará la cookie en dicha URL.

martes, 13 de noviembre de 2012

Personaliza la fecha de tus entradas con Javascript y CSS

En este artículo veremos 2 métodos para personalizar las fechas con CSS3 y Javascript, ya que hace algún tiempo atrás vimos una forma para hacerlo y algunos usuarios han tenido problemas para incrustar el script correctamente en sus plantillas ya que quedaba un contenedor vacío, no se ejecutaba correctamente la función o había un problema con la etiqueta que se utilizaba.

Para evitar este problema, he creado 2 scripts, si el primero fallara en sus plantillas, pueden recurrir al segundo.

Blogger date css, custom blogger date, fecha blogger


Primer método: Mediante data:post.dateHeader:

La etiqueta <data:post.dateHeader /> es la que se encarga de mostrar la fecha en las entradas de tu blog, genéricamente debería funcionar en cualquier plantilla pero como toda regla tiene una excepción, hay algunas que se niegan a funcionar con esta etiqueta.


Para hacer funcionar este método, primero busca la siguiente línea en tu plantilla (Con los artilugios expandidos):

<data.post.body/>

Arriba de ésta pega el siguiente código:

<script type="text/javascript">
// Script creado por Víctor Calderón Para Ayuda Bloggers - Opción para data:post.dateHeader
function dividir_fecha()
{
var fecha_completa="<data:post.dateHeader/>"; // Formato original de la fecha
var nueva_fecha=fecha_completa.split(" "); // Dividir la var con .split
dia = nueva_fecha[0];
mes = nueva_fecha[1];
año = nueva_fecha[2];
document.write("<span class=\"dia\">" + dia + "</span>" // Devuelve esto, con mes hasta 3 carácteres únicamente
+ "<span class=\"mes\">" + mes.slice(0,3) + "</span>" + "<span class=\"año\">" + año + "</span>"
);

}
</script>

<div class="fecha-ayudabloggers">
<script>dividir_fecha()</script>
</div>

Posteriormente vas a "Configuración | Idioma y Formato", y en "Formato de cabecera de fecha" estableces el siguiente:

13 Noviembre 2012

Si este método no funciona, suprime el código anterior y prueba con el método siguiente.

Segundo método: Mediante data:post.timestamp:

La etiqueta <data:post.timestamp/> es aquella que muestra la hora en alguna determinada sección de la entrada. Con saber la hora no podemos hacer nada, pero podemos aprovechar una de las opciones que se encuentran en el apartado Formato de hora:



Deberás elegir la que tiene este formato:

martes, noviembre 13, 2012

Una vez que ya seleccionamos esta opción, pegaremos el siguiente script en la misma sección que el anterior:


<script type="text/javascript">
// Script creado por Víctor Calderón Para Ayuda Bloggers - Opción para data:post.timestamp
function dividir_fecha()
{
var fecha_completa="<data:post.timestamp/>"; // Formato original de la fecha
var nueva_fecha=fecha_completa.split(","); // Dividir la var con .split
var mes = nueva_fecha[1];
var año = nueva_fecha[2];
var dia_nuevo = mes.split(" "); // El día y mes se encuentran juntos, para poder obtener sólamente el día se requiere este fix
var dia = dia_nuevo[2];

document.write("<span class=\"dia\">" + dia + "</span>" // Devuelve esto
+ "<span class=\"mes\">" + mes.slice(1,4) + "</span>" + "<span class=\"año\">" + año.slice(1,5) + "</span>" // Los .slice son para eliminar el espacio y en el caso del mes para limitarlo a 3 carácteres
);
}


</script>

<div class="fecha-ayudabloggers">
<script>dividir_fecha()</script>
</div>

Previsualizamos si la fecha nos aparece correctamente en cada post, y si es correcto podemos guardar la plantilla.

Nota:

Si aparece un error de síntaxis al intentar previsualizar o guardar la plantilla deberás parsear el código que se encuentra al final del script (Toda la sección de document.write).

Personalizando las fechas:

El resultado de ambos scripts es el siguiente:

<div class="fecha-ayudabloggers"> 
<span class="dia">13</span>
<span class="mes">Nov</span>
<span class="año">2012</span>
</div>

Si nosotros lo previsualizamos, veremos el siguiente resultado:

13Nov2012

Para poder aplicar atributos usaremos los selectores ya establecidos en las clases, tanto del <div>, como de los subelementos:

.fecha-ayudabloggers {
/*Atributos del contenedor de la fecha*/
}

.dia {
/*Atributos del día*/
}

.mes {
/*Atributos del mes*/
}

.año {
/*Atributos del año*/
}

Puedes jugar con los márgenes, tamaños distintos de fuentes, flotación y todos los atributos que estimes necesarios. Para que puedas tener una idea de lo que puedes hacer, adjunto 2 ejemplos con sus atributos respectivos:


Ejemplo 1 (Basado en: WpLover - Easier Date Display Technique with CSS3):


13Nov2012
Curabitur id nibh auctor tellus adipiscing pharetra. Fusce vel justo non orci semper feugiat. Cras eu leo at purus ultrices tristique. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.



Código CSS:

.fecha-ayudabloggers {
position: relative;
width: 81px;
font-family: Georgia, serif;
color: #777;
float:left;
height: 60px;
}

.dia, .mes, .año {
position: absolute;
}

.dia {
font-size: 39px;
bottom: -8px;
}

.mes {
top: 0;
left: 0;
font-size: 26px;
}

.año{
top: 16px;
right: 0;
font-size: 25px;
rotation: -90deg !important;
-webkit-transform: rotate(-90deg);
-moz-transform: rotate(-90deg);
}


Ejemplo 2 (Basado en: Line25 - How To Create a Cool Blog Post Date Icon with CSS):

13Nov2012
Curabitur id nibh auctor tellus adipiscing pharetra. Fusce vel justo non orci semper feugiat. Cras eu leo at purus ultrices tristique. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.



Código CSS:

.fecha-ayudabloggers {
float:left;
position:relative;
width: 65px; height: 80px;
background: #fcfcfc;
background: linear-gradient(top, #fcfcfc 0%,#dad8d8 100%);
background: -moz-linear-gradient(top, #fcfcfc 0%, #dad8d8 100%);
background: -webkit-linear-gradient(top, #fcfcfc 0%,#dad8d8 100%);
border: 1px solid #d2d2d2;
border-radius: 10px;
box-shadow: 0px 0px 15px rgba(0,0,0,0.1);
text-align:center;
margin: 0 10px 0 0;
}

.dia, .mes, .año {
display:block;
padding:0;
margin:0;
}

.dia {
font-size:40px;
padding:10px 0 0 0;
}

.mes {
background: #d10000;
background: linear-gradient(top, #d10000 0%, #7a0909 100%);
background: -moz-linear-gradient(top, #d10000 0%, #7a0909 100%);
background: -webkit-linear-gradient(top, #d10000 0%, #7a0909 100%);
font-size: 25px;
font-weight: bold;
color: #fff;
text-transform: uppercase;
display: block;
border-top: 3px solid #a13838;
border-radius: 0 0 10px 10px;
padding: 2px 0;
}

.año{
background: #d10000;
background: linear-gradient(top, #d10000 0%, #7a0909 100%);
background: -moz-linear-gradient(top, #d10000 0%, #7a0909 100%);
background: -webkit-linear-gradient(top, #d10000 0%, #7a0909 100%);
color:#fff;
border-bottom: 1px solid #a13838;
font-size:11px;
text-align:right;
position:absolute;
top:0;
width:94%;
max-width:94%;
border-radius: 10px 10px 0 0;
padding:0 5px 0 0;
}


Notas Importantes:
  • El script no puede ir en el </head>, ya que las etiquetas <data> requieren una cierta ubicación para poder funcionar.
  • Los atributos deben ir antes de  ]]></b:skin>
  • Si en las páginas estáticas se ve el contenedor, puedes usar condicionales y encerrar todo el código con el siguiente:
<b:if cond='data:blog.pageType != "static_page"'> 
<!-- Inserta acá el código del script -->
</b:if>

miércoles, 31 de octubre de 2012

prefix-free y basta de prefijos en el CSS

prefix-free es un script que habría que tener muy en cuenta ya que nos ayuda a resolver uno de los problemas más molestos a la hora de escribir reglas de estilo "modernas" ya que lo que hace es agregar de modo automático, los prefijos correspondientes para cada navegador de tal modo que no sería necesarios escribir algo así:
.una-regla {
background-image: -moz-linear-gradient(#000,#FFF);
background-image: -webkit-linear-gradient(#000,#FFF);
background-image: -o-linear-gradient(#000,#FFF);
background-image: -ms-linear-gradient(#000,#FFF);
background-image: linear-gradient(#000,#FFF);
}
y todo ese exceso de líneas (que, inevitablemente uno termina equivocando u olvidando) se transformaría en es esto:
.una-regla {
background-image: linear-gradient(#000,#FFF);
}
es decir, sólo deebría usarse la propiedad especificada por la w3.org y del resto, se encargará el script.

¿En que navegadores funcionará? En todos aquellos que usen ese tipo de prefijos, Firefox, Chrome, Safari, Opera, IE9 en adelante y las versiones móviles más comunes. Obviamente, como IE8 no soporta la mayoría de las propiedades CSS3, nada ocurrirá allí pero tampoco tendrá influencia alguna, todo seguirá como antes.

¿Funciona en Blogger? Si, no debería haber problemas ya que el script se ejecuta tanto sobre etiquetas <style> </style>, estilos externos agregados con la etiqueta LINK o incluso, en estilos agregados inline con el atributo style en la misma etiqueta.

¿Cómo lo usamos? Descargamos el script desde la página del desarrollador (es muy pequeño) y lo alojamos en un servidor:
<script src='URL/prefixfree.min.js' type='text/javascript'/>
o simplemente lo copiamos y pegamos en la plantilla entre etiquetas
<script type='text/javascript'>
//<![CDATA[
....... acá pegamos el contenido del archvo js .......
//]]>
</script>
y, en ambos casos, conviene hacerles caso a los desarrolladores y agregarlo justo antes de </head>

Tres ejemplo rápidos:
/* un fondo con gradiente */
#pf1{background-image:linear-gradient(#000,#FFF);}

/* una transición */
#pf2{font-size: 0;line-height: 100px;border-radius:0;background-color: #000;transition:all 1s;}
#pf2:hover{background-color:#F0F8FF;border-radius:50px;background-color: #F00;font-size: 80px;}

/* una animación*/
#pf3{background-color:#000;animation: recrojo 1s infinite alternate;}
@keyframes recrojo {from {background-color:#000;} to {background-color:#F00;}}

lunes, 15 de octubre de 2012

TinyScroller: Simple y personalizable

TinyScroller es un script muy sencillo que no requiere librerías extras y nos permite mostrar mucho contenido en un espacio pequeño tal como normalmente hacemos cuando usamos un contenedor con cierta altura dimensionada y le aplicamos la propiedad overflow para que se pueda ver utilizando una barra de desplazamiento.

El script es realmente pequeño, uno poco más de 50 líneas sin comprimir aunque el ZIP que lo contiene también incluye una versión minimizada.

Lo agregamos como cualquier otro, alojándolo en un servidor o directamente, antes de <head>:

<script type='text/javascript'>
//<![CDATA[
var TINY={};
function T$(id){return document.getElementById(id)}
function T$$$(){return document.all?1:0}
TINY.scroller=function(){
return{
init:function(a,c,b,s,d){
a=T$(a); a.c=c; a.s=s; c=T$(c); b=T$(b); s=T$(s); a.n=d||0;
b.style.display='block'; a.style.overflow='hidden';
var h=a.offsetHeight, t=c.offsetHeight;
if(t<h){
b.style.display='none'
}else{
a.m=h-t; a.d=t/h; s.style.height=(h*(h/t))+'px'; s.style.top=b.style.top=0;
s.onmousedown=function(event){TINY.scroller.st(event,a.id); return false};
s.onselectstart=function(){return false}
}
a.l=b.offsetHeight-s.offsetHeight
},
st:function(e,f){
var a=T$(f), s=T$(a.s); a.bcs=TINY.cursor.top(e); a.bct=parseInt(s.style.top);
if(a.mv){this.sp(f)}
a.mv=function(event){TINY.scroller.mv(event,f)};
a.sp=function(){TINY.scroller.sp(f)};
if(T$$$()){
document.attachEvent('onmousemove',a.mv); document.attachEvent('onmouseup',a.sp)
}else{
document.addEventListener('mousemove',a.mv,1); document.addEventListener('mouseup',a.sp,1)
}
if(a.d){s.className+=' '+a.n}
},
mv:function(e,f){
var a=T$(f), m=TINY.cursor.top(e)-a.bcs+a.bct, s=T$(a.s), c=T$(a.c);
if(m>=0&&m<a.l){
s.style.top=m+'px'; c.style.top=(m*-1*a.d)+'px'
}else if(m<0){
s.style.top=0; c.style.top=0
}else if(m>a.l){
s.style.top=a.l+'px'; c.style.top=a.m+'px'
}
},
sp:function(f){
var a=T$(f), s=T$(a.s); if(a.d){s.className=s.className.replace(' '+a.n,'')}
if(T$$$()){
document.detachEvent('onmousemove',a.mv); document.detachEvent('onmouseup',a.sp)
}else{
document.removeEventListener('mousemove',a.mv,1); document.removeEventListener('mouseup',a.sp,1)
}
a.mv=0;
}
}
}();
TINY.cursor=function(){
return{
top:function(e){
return T$$$()?window.event.clientY+document.documentElement.scrollTop+document.body.scrollTop:e.clientY+window.scrollY
}
}
}();
//]]>
</script>

Y lo usarmemos de este modo:
<div id="ejemplo-scroll" class="scroll">
<div id="ejemplo-scrollcontent" class="scrollcontent">
....... acá pondremos nuestro contenido .......
</div>
<div id="ejemplo-scrollbar" class="scrollbar">
<div id="ejemplo-scroller" class="scroller"></div>
</div>
</div>
e inmediantamente debajo, llamamos a la función que en este caso, sería así:
<script type="text/javascript">TINY.scroller.init('ejemplo-scroll','ejemplo-scrollcontent','ejemplo-scrollbar','ejemplo-scroller','buttonclick');</script>
Eso, lo haremos siempre del mismo modo, con la misma sintaxis, colocando en la función los cinco parámetros que son los IDs que hemos elegido:

el ID del contenedor que en este caso llamé ejemplo-scroll
el ID del contenido que llamé ejemplo-scrollcontent
los IDs de lso DIVs auxiliares que mostrarán la barra de desplazamiento y el botón: (ejemplo-scrollbar y ejemplo-scroller)
y la clase de ese botón (buttonclick)

Por último, necesitamos el CSS que es lo que podemos personalizar y que en este caso, rearmé agregando clases par que, de esa forma, pudieran mostrarse con distintos tamaños y detalles gráficos:
<style>

/* las reglas genéricas */
.scroll { /* el contenedor */
overflow: auto;
position: relative;
}
.scrollcontent { /* el contenido */
position: absolute;
z-index: 200;
}
.scrollbar { /* la barra de desplazamiento es una imagen */
background:url(URL_scroll-bg.gif);
display: none;
float: right;
position: relative;
width: 15px;
z-index: 100;
}
.scroller { /* el botón de desplazamiento también es una imagen */
background-color: #CCC;
background-image: url(URL_scroll-arrows.gif);
background-position: 50% 50%;
background-repeat: no-repeat;
cursor: pointer;
position: absolute;
top: 0;
width: 15px;
}
.buttonclick { background-color:#BBB; }

/* y defino los anchos, altos y otros detalles de cada uno de elllos */
#ejemplo-scroll { /*
background-color: #000;
margin: 0 auto;
height: 200px; /* el ancho */
width: 300px; /* el alto */
}
#ejemplo-scrollcontent {
width:275px; /* el ancho del contenedor menos el ancho de la barra de desplazamiento */
}
#ejemplo-scrollbar {
height: 200px; /* el mismo alto que el contenedor */
}

</style>

ejemplo 1

Duis erat justo; aliquam sit amet scelerisque vitae, gravida at magna. Morbi ac justo a est porta sollicitudin id vitae velit. Vivamus dui turpis, placerat id aliquam in, mattis vel nunc. Cras lacus tellus, congue placerat ullamcorper sed, imperdiet molestie mi. Maecenas non tristique leo. Quisque in hendrerit velit. Curabitur vel metus ut dui tincidunt lacinia. Aliquam sed est in tellus lobortis auctor a at tortor. Sed in elit a mauris tempus consequat feugiat eget felis. Donec risus erat, pellentesque vitae lacinia ac, placerat ac enim. Curabitur adipiscing feugiat hendrerit. Integer porttitor malesuada magna, vel laoreet lectus rutrum quis. Etiam tortor lorem, semper vitae auctor sed, lobortis vel libero! Morbi sollicitudin, lacus laoreet malesuada commodo, sapien magna nullam sodales.

Mauris euismod nulla non ligula rutrum non consequat tellus suscipit. Praesent mattis lorem nec nisi lacinia vehicula. Integer dolor justo, pellentesque ut lacinia non, mollis non leo. Sed ornare consectetur dui, at tempus dui suscipit tincidunt. Suspendisse blandit; eros ac vulputate ullamcorper, mi lectus rutrum erat, sit amet ornare tellus nisl a felis. Duis luctus placerat nunc, quis tempus tortor aliquet eget! Nullam ut nisl vitae nibh dignissim dignissim nec sit amet risus. Nulla et turpis dui? Nunc convallis porta consequat.

Morbi molestie lectus et sem luctus tempus. Mauris elementum urna ut mi tristique pharetra. Nullam a eros sem, vel ultricies metus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In hac habitasse platea turpis duis.



Bastaría establecer otros valores para crear otro modelo y usarlo en la misma página:
#otro-scroll{
background-color: #222;
border: 2px solid #000;
height: 270px;
margin: 0 auto;
outline: 1px solid #666;
width: 600px;
}
#otro-scroll{width: 575px;}
#otro-scroll{height: 270px; }

ejemplo 2


Duis erat justo; aliquam sit amet scelerisque vitae, gravida at magna. Morbi ac justo a est porta sollicitudin id vitae velit. Vivamus dui turpis, placerat id aliquam in, mattis vel nunc. Cras lacus tellus, congue placerat ullamcorper sed, imperdiet molestie mi. Maecenas non tristique leo. Quisque in hendrerit velit. Curabitur vel metus ut dui tincidunt lacinia. Aliquam sed est in tellus lobortis auctor a at tortor. Sed in elit a mauris tempus consequat feugiat eget felis. Donec risus erat, pellentesque vitae lacinia ac, placerat ac enim. Curabitur adipiscing feugiat hendrerit. Integer porttitor malesuada magna, vel laoreet lectus rutrum quis. Etiam tortor lorem, semper vitae auctor sed, lobortis vel libero! Morbi sollicitudin, lacus laoreet malesuada commodo, sapien magna nullam sodales.

Mauris euismod nulla non ligula rutrum non consequat tellus suscipit. Praesent mattis lorem nec nisi lacinia vehicula. Integer dolor justo, pellentesque ut lacinia non, mollis non leo. Sed ornare consectetur dui, at tempus dui suscipit tincidunt. Suspendisse blandit; eros ac vulputate ullamcorper, mi lectus rutrum erat, sit amet ornare tellus nisl a felis. Duis luctus placerat nunc, quis tempus tortor aliquet eget! Nullam ut nisl vitae nibh dignissim dignissim nec sit amet risus. Nulla et turpis dui? Nunc convallis porta consequat.

Morbi molestie lectus et sem luctus tempus. Mauris elementum urna ut mi tristique pharetra. Nullam a eros sem, vel ultricies metus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In hac habitasse platea turpis duis.

lunes, 8 de octubre de 2012

Agregar fullscreen a distintos elementos

BigScreen es un pequeño script que nos permite mostrar contenido en pantalla completa, algo que los navegadores pueden hacer pero que tiene restricciones cuando se pretende hacerlo con JavaScript y que, por ahora, sólo funciona en Firefox, Chrome y Safari.

El script no hace otra cosa que permitirnos usar un sintaxis única para esto ya que, por ahora, los navegadores usan distintos métodos pero, en todos los casos, siempre estaremos restringidos por las opciones de seguridad de estos y en todos, se mostrará una ventana de advertencia:


Una vez que tenemos agregado el script, usarlo es bastante simple y si bien tiene varios métodos que están explicados en la página del autor, hay dos que son los básicos; el primero, permite mostrar toda la página en modo fullscreen y el segundo, mostrar sólo algún tipo de elemento.

Por ejemplo, si tuvieramos un enlace o botón con cierto ID:
<a id="fspagina" href="#">fullscreen de esta página</a>
Podríamos asociar el evento click de este modo:
document.getElementById('fspagina').addEventListener('click', function() {
if (BigScreen.enabled) {
BigScreen.toggle();
} else {
alert("este navegador no soporta el método fullscreen");
}
}, false);
y si usáramos jQuery, algo así:
$(document).on('click', '#fspagina', function(e){
e.preventDefault();
if (BigScreen.enabled) {
BigScreen.toggle();
} else {
alert("este navegador no soporta el método fullscreen");
}
});

Si lo que queremos es mostrar en pantalla completa un elemento, debemos identidifcarlo y usar BigScreen.request():
document.getElementById('fselemento').addEventListener('click', function() {
var el = document.getElementById('fselemento');
if (BigScreen.enabled) {
BigScreen.request(el);
} else {
alert("este navegador no soporta el método fullscreen");
}
}, false);
Con jQuery podría ser más simple si asociamos el evento click a una clase y, de ese modo, podemos mostrar en pantalla completa distintos elementos, por ejemplo, imágenes:
<img class="fullimage" src="URL_imagen1" style="width:200px;"/>
<img class="fullimage" src="URL_imagen2" style="width:200px;"/>

$(document).on('click', ''.fullimage', function(e){
e.preventDefault();
if (BigScreen.enabled) {
BigScreen.request($(this)[0]);
} else {
alert("este navegador no soporta el método fullscreen");
}
});


No sólo pueden mostrarse imágenes sino también videos si se utiliza la nueva etiqueta <video> pero, en todos los casos, debe recordarse que los navegadores no tienen integrado este sistema de manera completa y los errores varían.


REFERENCIAS:HTML5 y fullscreen

domingo, 30 de septiembre de 2012

Dile adiós a los prefijos en CSS3 con Prefix Free


prefix free

¿Qué son los prefijos?


Los insoportables prefijos son usados con el fin de disponer ciertas funcionalidades en CSS3 para distintos navegadores, anteponiéndolos de esta manera en nuestros atributos CSS3:

#elemento {
width: 500px;
height: 500px;

border-radius: 50%;
-webkit-border-radius: 50%;
-o-border-radius: 50%;
-moz-border-radius: 50%;
-ms-border-radius: 50%;

box-shadow: 0 0 10px #000000;
-webkit-box-shadow: 0 0 10px #000000;
-o-box-shadow: 0 0 10px #000000;
-moz-box-shadow: 0 0 10px #000000;
-ms-box-shadow: 0 0 10px #000000;
}

Los prefijos utilizados representan a distintos navegadores.
  • -webkit- representa a navegadores basados en webkit como Chrome y Safari.
  • -o- representa al navegador Opera.
  • -moz- representa a navegadores basados en Gecko, como Firefox.
  • -ms- representa al navegador poco usado "Internet Explorer".

Con solo agregar un prefijo a tal condición se aplicara al navegador deseado. Aunque se puede ocupar de una forma ingeniosa para lograr algo selectivo en aplicar el CSS3 en distintos navegadores. También evitaras malgastar tiempo, y ocuparlo en otra cosa más importante.

Pero por suerte tenemos una muy buena herramienta llamada Prefix Free para agregar todo los prefijos automáticamente, convirtiendo nuestro código CSS en algo mas cálido, e incluso mas fácil de entender, así evitando errores y también la pérdida de tiempo en nuestros proyectos, quedando nuestro código CSS de esta manera:

#elemento {
width: 500px;
height: 500px;

border-radius: 50%;

box-shadow: 0 0 10px #000000;

}


¿Cómo usar Prefix Free?

Utilizar Prefix Free es  bastante sencillo simplemente debemos descargar desde su pagina el script oficial agregándolo antes de </head> de esta manera:




Usamos vista previa y si todo esta bien, presionamos guardar. Ya de esta manera el script hará su trabajo y podrán ocupar todo sus atributos CSS3 sin prefijos, el script también lo pueden subir a sus propios repositorios si lo desean.

¡Compatibilidad!

Prefix Free es compatible con navegadores de escritorio como IE9+, Opera 10, Firefox 3.5+, Safari 4+ y Chrome. Para navegadores mobiles: Mobile Safari, Android Browser, Chrome y Opera Mobile.

¡Algunos inconvenientes!
  • No funciona con estilos importados (@import).
  • No funciona con archivos locales en Chrome y Opera.
  • No funciona con estilos inline.
  • No funciona con hojas de estilos de otros dominios.

Espero que les sea de gran utilidad queridos lectores. Un gran abrazo :)

jueves, 13 de septiembre de 2012

Raphaël: Una librería muy especial

Raphaël es una librería de JavaScript pensada para crear y mostrar gráficos vectoriales(SVG y VML) y que estos sean visibles en cualquier navegador, incluyendo viejas versiones de Internet Explorer.

El script es realmente pequeño y hay bastante documentación que explican una por una todas las funciones además de una serie de demos que pueden verse online pero, de todas maneras, su uso no es sencillo en absoluto aunque los resultados pueden ser asombrosos.


jueves, 6 de septiembre de 2012

oridomi: Contenidos plegables

oridomi es un script para animar cualquier tipo de contenido, plegándolo con diferentes efectos, como si fueran hojas de papel pero, claro está, esto sólo ocurrirá en navegadores que soporten las nuevas propiedades de CSS3.

Aunque la documentación del script es abundante ya que se explica cada función de modo detallado, lamentablemente, es poco lo que se indica del modo en que debe usarse y las distintas opciones pero veamos lo que dicen.

Para empezar, oriDomi funciona con o sin librerías anexas así que, luego de agregar el script (el minimizado o el normal) que podemos descargar de Github, debemos indicar cual o cuales serán los contenidos a los que se aplicará y esto, lo hacemos estableciendo una clase o un id. Por ejemplo si lo usara en este tipo de contenido:
<div id="ejemplo" class="ejemplo"><img src="una_imagen" /></ldiv>
debajo, pondría lo siguiente:
<script>var domi = new OriDomi(document.getElementById('ejemplo'));</script>
o bien esto si se usan clases en lugar de ids:
var domi = new OriDomi(document.getElementsByClassName('ejemplo')[0]);
aunque es más sencillo usando jQuery
var $domi = $('#ejemplo').oriDomi();
Y si quiera aplciarlo a varios contenidos distintos, sólo debería usar variables diferentes para cada uno:
var $domiUNO = $('#ejemplo').oriDomi();
var $domiOTRO = $('#otro-ejemplo').oriDomi();
Inicializado de ese modo, las opciones serán las que tiene por defecto pero, pueden ser modificadas; por ejemplo:
var $domi = $('#ejemplo').oriDomi({ vPanels: 3, hPanels: 10, perspective: 200, speed: 500, shading: false });
donde:

hPanels es la cantidad de secciones horizontales
vPanels es la cantidad de secciones verticales
speed es la velocidad
perspective es el valor de la perspectiva
shading indica si se agregarán sombras o no

Todo muy lindo pero ¿cómo lo usaría? Ahí, ya depende de lo que uno quiera hacer. Si sólo deseo mostrar ese contenido (imagen, texto, casi cualquier otra cosa simple o más o menos compleja) bastaría llamar a la función correspondiente, por ejemplo, algo así:
$domi.oriDomi('stairs',50,'left');
donde $domi es el nombre de la variable que le asignamos ($domiUNO, $domiOTRO); .oriDomi es la función genérica y lo que se encuentra entre paréntesis es efecto a usar, sus parámetros y opciones.

Los parámetros son números (positivos o negativos) que indican el ángulo y las opciones básicas indican el sentido de la rotación (left, right, top, bottom) siendo left la opción por defecto.

Los efectos posibles son varios y estos son los que se muestran en el demo inferior:
$domi.oriDomi('accordion', -40, 'right');
$domi.oriDomi('curl', 70, 'left');
$domi.oriDomi('ramp',50, 'top');
$domi.oriDomi('collapse','left');
$domi.oriDomi('stairs',50,'left');
$domi.oriDomi('fracture',30,'right');
$domi.oriDomi('twist',40,'left');
$domi.oriDomi('reveal', -50, 'right');
Hay otros como collapseAlt, foldUp, unfold y uno en particular nos permite restaurar el contendido, o se, volverlo a su estado original:
$domi.oriDomi('reset');

jueves, 26 de julio de 2012

Algunas librerías para manejar la etiqueta Canvas

Estas son algunas librerías que podrían ayudar a manejar la etiqueta canvas de modo más simple, entendiendo que simple no significa fácil.

EaselJS es una de las más completas y modernas, enfocada básicamente a la parte gráfica. En la página de los autores se pueden ver muchos demos online como este.

Artisan JS es más sencilla y las funciones son limitadas pero bastante intuitivas. Puede verse un ejemplo de su funcionamiento en este generador de wallpapers.

jCanvaScript provee muchos métodos y funciones que permite generr contenido en cualquier plataforma incluyendo móviles aunque, como en todos estos casos, para Internet Explorer se requieren librerías extras como ExCanvas. Incluye animaciones drag and drop y manejo de eventos tanto del mouse como del teclado.

viernes, 13 de julio de 2012

¿Google no funciona? Cargar una librería alterna

Cargar las librerías desde los repositorios de Google usando las Google AJAX Library API es algo que se ha generalizado a tal punto que incluso los sitios "más grandes" utilizan ese método, transfiriéndoles a ellos la responsabilidad de mantener el sistema funcionando.

Pero ¿qué pasaría si un dia dejan de funcionar?

Seguramente, sería el pre-anuncio de un apocalipsis o algo por el estilo pero, de todos modos, en net.tutsplus.com nos muestran una alternativa que permitiría cargar un archivo alterno alojado en otro servidor y que deberíamos tener como respaldo ante eventuales catástrofes. En el caso de jQuery, sería algo así:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>!window.jQuery && document.write('<script src="URL_ARCHIVO"><\/script>')</script>
Dudo mucho que tal cosa sea necesaria pero ... por las dudas ...

martes, 10 de julio de 2012

Jugando con el botón de Pinterest

Una de las modas de estos nuevos tiempos es el uso de redes sociales, pseudo-sociales y todos esos sitios donde se comparten cosas. Algunos son exitosos porque "los usuarios los usan" y otros pasan al olvido rápidamente; hacia donde vamos o cuál será el modelo de internet que tendremos en unos años vaya uno a saber, por ahora seguimos caminando, probando y viendo de que se trata todo esto.

Uno de esos servicios que se está imponiendo es Pinterest y el botoncito para compartir ya se ve en muchos sitios.

Colocarlo es sencillo, se hace del mismo modo que con cualquiera de ellos, copiando y pegando el código que ofrecen y listo, funcionará sin problemas aunque , para mi gusto, es muy lento.

La forma de aplicarlo a Blogger la pueden ver en dos artículos escritos por Oloman donde se explica detalladamente su uso y las variantes que pueden elegirse: Pinterest, botón que se ve y funciona y Otras opciones para instalar el botón de Pinterest.

Ahora bien, para jugar un poco, me puse a ver si era posible hacer lo mismo pero de modo más específico, es decir, ver si podía agregarse ese botón a determinadas cosas y no a los posts en general; por ejemplo, adosar ese botón sólo en ciertas imágenes que uno quisiera que fueran compartidas y para ello, recurro a jQuery porque no se me ocurre nada más fácil.

El resultado, será algo como esto:


¿Cómo se identifica qué imagen quiero compartir y cuál no? Simplemente, le agrego una clase a la etqiueta IMG que, en este caso, será class="pin":
<img class="pin" src="URL_IMAGEN" />
Obviamente, lo primero que debo hacer es colocar el script del servicio que va al final de la plantilla, antes de </body>:
<script src='//assets.pinterest.com/js/pinit.js' type='text/javascript'/>
Y para que esto funcione, el botón también lo voy a crear con JavaScript cuyo código colocaré antes de </head> o antes del script anterior.

Los datos que debemos enviar son tres:

url es la drección desde donde se envía es decir, nuestra página
media es la dirección de la imagen
description es un texto alternativo

Quiero enviarle esos tres datos y además, que al hacer click en el botón, no se abra la página de Pinterest en otra pestaña sino en una ventana tipo pop-up así que armo algo como esto:
<script type='text/javascript'>
//<![CDATA[

// esto evitará que el enlace se abra en otra pestaña
$(document).on('click', '.pin-it-button', function(e){
e.preventDefault();
})

// esto hará que el enlace se abra en una ventanita de tipo pop-up
$(document).on('click', '.pinimg', function(e){
var url = $(this).attr('rel');
window.open(url,"pinshare","toolbar=0,status=0,width=620,height=320");
})

// y cuando se cargue la página
$(document).ready(function(){

// buscaremos todas las imágenes de los posts que tengan la clase "pin"
$('.post-body img.pin').each(function() {

// con estos datos vamos a armar la dirección url que debe enviarse a Pinterest
var post = location.href; // la dirección de nuestra página
var src = $(this).attr('src'); // la imagen a compartir
var texto = document.title; // la descripción será el título de la página
if($(this).attr('alt')) {
// y si colocamos el atributo alt en la imagen, allí podríamos mostrar un texto especial; si existe, lo usamos
texto = $(this).attr('alt') + " : via MIBLOG";
}

// verifico si la imagen flota
var cssflotar = $(this).css('float');

// y creamos el botón con esos datos
var boton ="<a count-layout='none' class='pin-it-button' href='#'><img title='Pin It' src='//assets.pinterest.com/images/PinExt.png' class='pinimg' rel='http://pinterest.com/pin/create/button/?url="+post+"&amp;media="+src+"&amp;description="+texto+"' /></a>";
// la etiqueta A tiene un href vacio justamente para evitar que se abra
// el dato a enviar está en el atributo rel de la etiqueta IMG

// rodeamos nuestra imagen con una etiqueta SPAN
$(this).wrap('<span class="pinwrap"></span>');
// que tiene la misma propiedad flaot que la imagen
$(this).parent().css('float',cssflotar);
// y le adosamos el botón
$(this).after(boton);
// y si tiene, le sacamos la flotación a la imagen
$(this).css('float','none');
})

})

//]]>
</script>
Un poco de CSS para que el botón se superponga a la imagen y pueda aplicarse a cualquier imagen, centrada o flotante:
<style>
.pinwrap {
display: inline-block;
position: relative;
}
.pin-it-button{
bottom: 10px;left: 10px;
position: absolute;
}
</style>
Y terminamos.

Acá abajo, la imagen de la derecha puede compartirse y la de la izquierda no:

una imagen para compartir

jueves, 28 de junio de 2012

spin.js: Script para generar Imágenes de carga

spin.js es un pequeño script que permite crear esas imágenes que uno ve a menudo cuando de indica que algo se está cargando y debemos esperar.

esta es una imagen


No parecería nada del otro mundo pero hay una diferencia sustancial; no genera imagenes sino animaciones con CSS o usando el lenguaje VML en el caso que estemos usando Internet Explorer incluyendo la versión 6 si es que aún hay dinosaurios caminando por la web.

Se integra fácilmente, basta agregar el script normal o minimizado que descargamos desde la página del autor y agregarlo antes de </head> ya sea, alojándolo en un servidor propio:
<script type='text/javascript' src='URL_spin.min.js'></script>
o copiando y pegando su contenido:
<script type='text/javascript'>
//<![CDATA[
....... acá copiamos y pegamos el contenido del archivo .......
//]]>
</script>
Ahora, podemos usarlo de dos modos, o agregamos definiciones globales para controlar su aspecto:
<script>
var opts = {
lines: 15, // la cantidad de líneas
length: 36, // el tamaño de cada línea
width: 8, // el grosor de las líneas
radius: 36, // el radio del círculo
color: '#FFF', // el color en formato RGB
speed: 1, // la velocidad
trail: 60, // el efecto luminosidad
shadow: false // habilitar o deshabilitar las sombras
};
</script>
Y generamos la imagen en un DIV:
<div id="spin1"></div>
<script>new Spinner(opts).spin(document.getElementById('spin1'));</script>

esto no es una imagen





O bien podemos generar imágenes individuales, estableciendo opciones diferentes:
<div id="spin2"></div>
<script>new Spinner({color:'#FF0', lines: 12}).spin(document.getElementById('spin2'));</script>



<div id="spin3"></div>
<script>
new Spinner({color:'#77DF', lines: 15, length: 20, width: 6, radius: 20, speed: 2}).spin(document.getElementById('spin3'));
</script>

jueves, 14 de junio de 2012

Resaltar el item del menú según la página actual

Si tenemos un menú personalizado donde se muestran enlaces a alguna entradas en particular o a alguna página estática pero no estamos usando el gadget de Páginas de Blogger ¿es posible resaltar el elemento actual de menú? ¿mostrar ese enlace con alguna característica gráfica especial?
Eso es lo que se ve en muchos menús donde se establece una clase CSS para diferenciar ese item en particular, el sistema detecta la página donde estamos y automáticamente, agrega esa clase; es simple pero, no funciona en Blogger porque el sistema no nos ofrece esa posibilidad salvo, como dije antes, en el gadget de Páginas.

Supongamos que tenemos un menú de este tipo, con enlaces a entradas y páginas estáticas entremezcladas:
<ul div id="mimenu">
<li><a href="http://miblog.com">inicio</a></li>
<li><a href="http://miblog.com/2010/01/ejemplo.html" class="ejemplo">ejemplo</a></li>
<li><a href="http://miblog.com/p/otra-pagina.html">otra pagina</a></li>
<li><a href="http://miblog.com/2012/06/final.html">final</a></li>
</ul>

Si tenemos ese tipo de menú común y corriente, con enlaces personales, para conseguir el mismo efecto deberíamos recurrir a JavaScript y el método más cómodo, seria utilizar jQuery ya que nos permite usar selectores sencillos.
var url = document.URL;
nos diría en que página estamos y algo como esto:
$('#mimenu a[href="'+url+'"]').addClass('actual');
nos permitiría agregar la clase llamada actual para diferenciar el enlace correspondiente.



Esta sería una simulación pero, la idea sería la misma, haciendo click acá, se resaltaría el item del menú de este mismo ejemplo.

Bastaría entonces, agregar el script debajo del menú en si mismo:
<script>
//<![CDATA[
var url = document.URL;
$('#mimenu li a[href="'+url+'"]').addClass('actual');
//]]>
</script>

martes, 22 de mayo de 2012

Animando listas con Stroll

stroll es un script experimental creado por Hakimel que no pretende tener ningún uso práctico, simplemente, se trata de un efecto visual que funcionará sólo en los navegadores más modernos ya que hace un uso intensivo de las nuevas propiedades de estilo tales como transiciones, transformaciones y perspectivas.

Lo que permite es aplicar una serie de efectos a las listas que utilizan la propiedad overflow para mostrar sólo una parte del contenido y que el resto sea accesible mediante el uso de una barra de scroll vertical.

No tiene muchas explicaciones y en realidad, no son necesarias, podemos descargar el demo desde github y allí tendremos todo lo necesario para aplicarlo en nuestros propios proyectos. Para eso, basta tener dos cosas: los estilos y el script.

Los estilos se encuentran en el archivo stroll.min.css o stroll.css (son iguales) y no es necesario agregarlos todos, basta seleccionar el efecto deseado y descartar el resto. Lo más simple es copiar las reglas y agregarlas a nuestra plantilla.

El script también tiene dos versiones stroll.min.js y stroll.js; podemos usar cualquiera de ellas y la agregamos como siempre, antes de </head>

¿Y cómo lo usamos? Basta colocar la lista dentro de algún DIV contenedor al que identificamos mediante un ID y luego, llamar a la función:
<div class="demo">
<ul class="zipper">
<li>uno</li>
<li>dos</li>
<li>tres</li>
</ul>
</div>
<script>stroll.bind('#demo ul');</script>
Todos los efectos funcionan de la misma manera y se distinguen estableciendo el atributo class en al etiqueta UL; en esta entrada, hay tres ejemplos distintos: curl, helix y zipper.

  • uno
  • dos
  • tres
  • cuatro
  • cinco
  • seis
  • siete
  • ocho
  • nueve
  • diez
  • once
  • doce
  • trece
  • uno
  • dos
  • tres
  • cuatro
  • cinco
  • seis
  • siete
  • ocho
  • nueve
  • diez
  • once
  • doce
  • trece
  • uno
  • dos
  • tres
  • cuatro
  • cinco
  • seis
  • siete
  • ocho
  • nueve
  • diez
  • once
  • doce
  • trece

Un último detalle extra a tener en cuenta: establecer las propiedades mínimas de las etiquetas UL y LI de la lista a la que vamos a aplicar el efecto; un ejemplo:
#demo ul {
height: 280px;
list-style-type: none;
margin: 0;
overflow-x: hidden;
overflow-y: scroll;
padding: 0;
position: relative;
width: 190px;
}
#demo ul li {
background-color: #B0B9C1;
color: #000;
font-size: 20px;
padding: 10px;
position: relative;
z-index: 2;
}
#demo ul li:nth-child(odd) {
background-color:#EEE;
}