martes, 13 de marzo de 2012

CoolClock: Usando canvas para crear relojes

CoolClock es un script para crear relojes y utiliza la etiqueta CANVAS para dibujarlos. Debería funcionar en cualqueir navegador aunque en Internet Explorer es necesario agregar un script extra y el resultado es ... limitado. En esta entrada no estoy usándolo así que no se verá.

Lo más interesante es que es posible crear diseños personales aunque, claro, hacer eso no es nada sencillo. Algunos de esos diseños podemos verlos online en una página demo.
Para utilizarla, debemos descargar el script coolclock.js desde la página del autor y utilizar Explorer Canvas que podemos descargar desde Google Code.

Vamos a poner ambos scripts antes de </head>:
<!--[if IE]>
<script type="text/javascript" src="URL_excanvas.js"></script>
<![endif]-->
<script src="URL_coolclock.js" type="text/javascript"></script>
Eventualmente, si queremos, también podemos descargar el archivo moreskins.js que contiene todos los modelos extras y eso lo agregamos inmediatamente después de lo anterior:
<script src="URL_moreskins.js" type="text/javascript"></script>
Luego, donde quisiéramos que se viera el reloj, ponemos algo así:
<canvas id="mireloj" class="CoolClock:nombreskin:radio"></canvas>
Aparentemente, si se tiene jQuery cargado, no hace falta hacer nada más pero, como acá no está cargado, lo que debe hacerse es activarlo de este modo:
<script>CoolClock.findAndCreateClocks();</script>
En la clase CSS siempre colocamos CoolClock y luego, separando los datos con dos puntos, podemos agregar valores opcionales:
  • nombreskin indica el tipo de diseño gráfico (por defecto es swissRail pero, en el script original hay más: chunkySwiss, fancy, machine, classic, modern y simple. Si agregamos el script moreskins.js tendremos muchísimas más opciones.
  • radio es el tamaño y por defecto es 85; es un valor expresado en pixeles
  • noSeconds elimina la aguja del segundero
Si se quieren omitir parámetros, se deben agregar los dos puntos igual así que para usar el modelo por defecto pero sin segundero, pondríamos:
class="CoolClock:CoolClock:::noSeconds"
Como en la etiqueta CANVAS podemos agregar un ID cualquier, luego, con CSS, es posible agregarle fondos, alinearlo, etc.

sábado, 10 de marzo de 2012

Social Media Icons (1)

Lifetime Networks
Contiene 295 íconos de diferentes tamaños en formato PNG.
descargar

Burnt wood
Contiene 12 íconos de 420x420 en formato PNG.
descargar

Sosical
Contiene 30 íconos de 128x128, 256x256 y 512x512 en formato PNG.
descargar

martes, 6 de marzo de 2012

Jugando con el gadget de páginas estáticas

Las páginas estáticas son algo que tiene un uso que se va extendiendo a lo largo del tiempo, sobre todo, porque las nuevas plantillas incluyen el gadget por defecto y justamente, ese gadget es el que genera confusiones y preguntas respecto a su personalización ya que suele ser confundido con un "menú normal" que puede ser personalizado libremente pero no lo es.

Como todo gadget, posee un código rígido y una serie de reglas de estilo predefinidas por Blogger; si queremos modificar algo, deberíamos entender su estructura y sus limitaciones.

El primer problema a resolver es agregar enlaces que no sean páginas estáticas; eso es bastante simple y, aunque ya está explicado en alguna otra entrada, vuelvo a repetir la idea: hay que desplegar los artilugios de la plantilla y buscar el includable que lo contiene:
<b:widget id='PageList1' locked='false' title='Páginas' type='PageList'>
allí, hay un loop con etiquetas UL y LI; si queremos incorporar algún enlace extra, debemos agregar las etiquetas justo después de </b:loop> y antes de </ul>
<ul>
<b:loop values='data:links' var='link'>
.......
</b:loop>
<li><a href='URL_1'>,vaga</a></li>
<li><a href='URL_2'>twitter</a></li>

</ul>
Pero se puede cambiar más. Vamos a agregarle una imagen de fondo distinta a cada uno de esos enlaces; para eso, bastaría que los identificaremos mediante una clase o un ID pero, como son escritos de modo automático, debemos usar alguna variable para que cada uno sea distinto del otro.

Si los títulos de nuestras páginas, que es eso que vemos en el "menú", sólo tienen una palabra; podemos usar ese dato; si no es así, debemos recurrir a un script y como este sería el método más universal, vamos a verlo.

Lo que haré es modificar el loop completo de tal forma que quede así:
<ul id='listapaginas'>
<b:loop values='data:links' var='link'>
<b:if cond='data:link.isCurrentPage'>
<li><a class='selected' expr:href='data:link.href' id=''><data:link.title/></a></li>
<b:else/>
<li><a expr:href='data:link.href' id=''><data:link.title/></a></li>
</b:if>
</b:loop>
<li><a href='URL_sitio1' id=''> otro </a></li>
<li><a href='URL_sitio2' id=''> otro más </a></li>
</ul>
<script type='text/javascript'>agregarIDs();</script>
y la función con el script la colocaré antes de </head>
<script type='text/javascript'>
//<![CDATA[
function agregarIDs() {
var laclase;
var obj = document.getElementById("listapaginas");
var enlaces = obj.getElementsByTagName("a");
for (var i=0; i<enlaces.length; i++) {
enlaces[i].id="pagina" + String(i);
}
}
//]]>
</script>
Lo que hará esa función es sencillo, sólo le colocará un atributo ID a cada enlace del gadget de tal modo que sean identificables individualmente; el primero se llamará pagina0, el segundo pagina1, el tercero pagina2 y así sucesivamente.

Como dije antes, si los títulos de las páginas sólo contienen una palabra, el script es innecesario y podemos usar ese texto como ID de los enlaces:
<li><a class='selected' expr:href='data:link.href' expr:id='data:link.title'><data:link.title/></a></li>

<li><a expr:href='data:link.href' expr:id='data:link.title'><data:link.title/></a></li>
Sea cual sea el esquema elegido, el resto es CSS que también ponemos antes de </head>
<style>

/* una imagen de fondo distinta par cada enlace */
#pagina0 {background: transparent url(IMAGEN_0) no-repeat 0 0;}
#pagina1 {background: transparent url(IMAGEN_1) no-repeat 0 0;}
#pagina2 {background: transparent url(IMAGEN_2) no-repeat 0 0;}
#pagina3 {background: transparent url(IMAGEN_3) no-repeat 0 0;}
#pagina4 {background: transparent url(IMAGEN_4) no-repeat 0 0;}

/* la etiqueta LI contenedora */
.PageList li {
/* sobrescribir las reglas de Blogger */
margin: 40px 0 20px !important;
padding: 0 !important;
/* las animamos un poco */
-moz-transition: all 1s;
-webkit-transition: all 1s;
-o-transition: all 1s;
-ms-transition: all 1s;
transition: all 1s;
}

/* los enlaces tienen una imagen de fondo y un texto */
.PageList li a {
color: #666;
display: inline-block;
font-family: Shadows Into Light Two,cursive;
font-size: 28px;
/* establecemos la dimensión */
height: 60px;
padding-bottom: 0;
padding-top: 110px;
width: 120px;
/* los animamos un poco */
-moz-transition: all 0.3s;
-webkit-transition: all 0.3s;
-o-transition: all 0.3s;
-ms-transition: all 0.3s;
transition: all 0.3s;
}

/* el efecto hover anima las cosas */
.PageList li a:hover {
color: #000;
font-size: 34px;
text-decoration: none;
/* invertimos la posición para que la imagen "baje" */
background-position: 0 bottom !important;
/* invertimos los padding para que el texto "suba" */
padding-top: 0;
padding-bottom: 110px;
}

/* la página atula se muestra "torcida" */
.PageList a.selected {
-moz-transform: rotate(-15deg);
-webkit-transform: rotate(-15deg);
-o-transform: rotate(-15deg);
-ms-transform: rotate(-15deg);
transform: rotate(-15deg);
}
/* y se endereza al poner el cursor encima */
.PageList a.selected:hover {
-moz-transform: rotate(0);
-webkit-transform: rotate(0);
-o-transform: rotate(0);
-ms-transform: rotate(0);
transform: rotate(0);
}
</style>
Y el resultado final es el que puede verse en este blog de pruebas.

sábado, 3 de marzo de 2012

Skip


jueves, 1 de marzo de 2012

Páginas dinámicas o blogs sin blogs

A veces me pregunto si la gente de Blogger tiene alguna idea de lo que es un blog.

Hace rato que estoy seguro que sus conceptos de blog difieren radicalmente de los míos pero ya ni siquiera parece que habláramos el mismo idioma.

Obviamente, todos habrán visto o leído el tema de estas llamadas paginas dinámicas; aparecieron primero en modo Google, es decir "beta permanente" para luego ser parte integral del servicio.


Las promovieron a lo grande, con banda, desfile y decenas de artículos ... y siguen insistiendo:


Hoy estamos pre-visualizando cinco nuevas plantillas dinámicas de Blogger que pronto serán personalizables y podrán ser usadas en su blog. Estos nuevas plantillas utilizan lo último en tecnología web, incluyendo AJAX, HTML 5 y CSS3, para ofrecer una serie de beneficios tanto a usted como a sus lectores:

  • Desplazamiento infinito: leer más entradas sin tener que recargar o abrir una segunda página
  • Nuevos diseños: vistas diferentes adaptadas a los diferentes tipos de blogs
  • Velocidad: las imágenes se cargan a medida que son vistas
  • Interactividad: nuevas formas para experimentar y enriquecer el contenido del blog

Las trompetas y el auto-bombo suenan atractivos ¿pero, será verdad? Por supuesto, nadie puede responder a esa pregunta así que uno simplemente puede deducir y pensar: Si el Diseñador de Plantillas es un ejemplo de lo que Blogger propone para el futuro, "algo huele mal en Dinamarca".

A lo largo de estos meses, han ido cambiando el sistema, agregándole cosas (update#1, update#2) y la última es la posibilidad de incluir gadgets o de mantener los que existen en el blog cuando se cambia a este tipo de plantilla.


Curiosamente, esta última parece que ha ido cambiando desde el anuncio hasta el momento en que escribo estas líneas ya que al principio esa barra oscura a la derecha donde se expanden, se mostraba encima de la barra de scroll y ya no.

Y acá comienza lo subjetivo (o continua) pero no puedo evitarlo así que empiezo por el final: la parte más interesante de todo esto es la posibilidad de deshabilitarlo; gracias; por lo menos esta vez, me han dado la opción de decir NO.

NO por muchas razones, por todas las razones por las que uno ha creado un blog y que estas cosas desvirtúan, transformando eso que era un espacio personal, en una página ascética que podrá ser llamativa para algunos pero que nada aportan a los sitios más allá de la parafernalia de las cositas que suben bajan o se mueven y que podemos hacer nosotros mismos aún sin los recursos del gigante. Ni que decir que también las podríamos hacer mucho más fácilmente si en lugar de intentar estandarizar, se dedicaran a agregar las herramientas y facilitarnos su uso.
  • ¿Podríamos usar Ajax? Sí, si ellos quisieran pero no quieren.
  • ¿Podríamos tener desplazamiento infinito? Sí, si ellos permitieran un acceso más fluido a nuestros propios datos; pero por ahora, ni siquiera nos ofrecen un sistema de paginación elemental.
  • ¿Podríamos tener mejor velocidad? Sí, si ellos centralizaran librerías, dejaran de agregar cosas que no utilizamos y no llenaran las páginas de scripts que siempre tienen algún error.
  • ¿Podríamos tener mejor interactividad? Sí, si ellos nos permitieran gerenciar los comentarios, compartir las entradas con razonabilidad, generar resúmenes, etc, etc, etc.
NO porque un blog deja de ser blog para transformarse en un tablón de anuncios.

Es evidente que la idea es esa o ¿les sobraron "cositas" del fracasado Google Wave y no sabían qué hacer con todo eso y que no se notara el desperdicio de recursos?

¿Será que la ambición de querer entrar a toda costa en el mercado de redes sociales que es uno de los pocos bastiones donde Google no puede hacer pie los ha llevado a pensar que enchufarnos Google+ hasta en la sopa es insuficiente y que Blogger podría ser la punta de lanza de ese desembarco?

Me lo pregunto porque eso que veo no difiere demasiado del concepto de las redes sociales; posee esa uniformidad inevitable, las opciones pre-digeridas y les salió barato porque el contenido lo aportamos nosotros ¿Será paranoia? Quién sabe; "piensa mal y acertarás" es un consejo bastante derrotista así que mejor imaginar qué sólo se trata de una gafe, una más y ya van varias de esta gente que utiliza sus incontables recursos para ... ¿para qué?

Lo repito. Para mi, lo mejor de estos COSOS es que se puede deshabilitar y que, por ahora, no son obligtorios.

Ya los miré; ya los probé. Algunas andan y otras no andan para nada; vi como hace desastres en ciertas entradas de este sitio; vi blogs sin blogs, vi blogs sin gente detrás de ellos, no vi diferencias, no vi calidad humana, vi una máquina mostrando cuadraditos, páginas claritas, enlaces celestitos siempre subrayados y sentí que me querían meter en la picadora de carne para venderme como hamburguesa de McDonald.

Y claro, alguien podrá decir "a mi me gusta", y estará perfecto; yo hablo de eso, de esas diferencias. De mantenerlas, de permitirlas ¿se mantendrán o en algún momento no me dejarán decir NO?

Y claro, alguien podrá protestar y decir "si no te gusta, no lo veas", y tendrá razón, off course, pero, además de no verlo, también puedo decirlo porque, pese a Blogger, esto, sigue siendo un blog.

jueves, 23 de febrero de 2012

Textualizer: Efectos en textos con jQuery

Textualizer es un plugin para jQuery con el que se pueden generar transiciones entre distintos textos de manera bastante extraña, cambiando las letras de lugar con efectos diversos.

Su uso es muy sencillo, basta agregar el script que puede descargarse desde la página del autor ya sea en su versión minimizada como completa y agregarlo antes de </head>

Luego, para usarlo debemos agregar un contenedor al que identificamos mediante su ID, allí donde quisiéramos que se mostrara; por ejemplo:
<div id="demo"></div>
y llamamos a la función con las opciones que se nos ocurran:
<script>
var list = [un txto', 'otro texto, 'último texto']; // la lista de textos a mostrar
var txt = $('#demo'); // el ID del contenedor
var options = {
duration: 1000, // el tiempo que el texto permanecerá visible
rearrangeDuration: 1000, // ella duración del efecto
effect: 'random', // el efecto que puede ser fadeIn, slideLeft, slideTop o random
centered: true // si queremos que se centre
}
txt.textualizer(list, options); // enviamos los datos
txt.textualizer('start'); // y lo ejecutamos
</script>
Como cualquier otra etiqueta, podemos definir su estilo; por ejemplo:
<style>
#demo {
color: #FFF;
font-family: Georgia;
font-size: 20px;
height:140px;
width: 500px;
}
</style>

Eventualmente, tres funciones más nos permitirían controlarlo:
.textualizer('pause') pausaria la animación
.textualizer('stop') la detendría por completo
.textualizer('destroy') la elimininaría

domingo, 19 de febrero de 2012

CSS Shapes


#circle { 
background: red;
border-radius: 70px;
height: 100px;
width: 100px;
}
#oval1 {
background: yellow;
border-radius: 100px / 50px;
height: 100px;
width: 200px;
}
#oval2 {
background: SandyBrown;
border-radius: 50px / 100px;
height: 160px;
width: 80px;
}




#trapezium1 {
border-right: 40px solid transparent;
border-bottom: 80px solid Aquamarine;
border-left: 40px solid transparent;
height: 0;
width: 80px;
}
#trapezium2 {
border-top: 80px solid Coral;
border-right: 40px solid transparent;
border-left: 40px solid transparent;
height: 0;
width: 80px;
}
#parallelogram {
background: pink;
height: 75px;
width: 130px;
-moz-transform: skew(20deg);
-webkit-transform: skew(20deg);
-o-transform: skew(20deg);
transform: skew(20deg);
}



#up-triangle {
border-right: 60px solid transparent;
border-bottom: 80px solid green;
border-left: 60px solid transparent;
height: 0;
width: 0;
}
#down-triangle {
border-top: 80px solid pink;
border-right: 60px solid transparent;
border-left: 60px solid transparent;
height: 0;
width: 0;
}
#left-triangle {
border-top: 50px solid transparent;
border-right: 100px solid orange;
border-bottom: 50px solid transparent;
height: 0;
width: 0;
}
#right-triangle {
border-top: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 100px solid red;
height: 0;
width: 0;
}




#octagon {
background: DarkTurquoise;
height: 100px;
width: 100px;
}
#octagon:before {
border-bottom: 30px solid DarkTurquoise;
border-right: 30px solid #101921; /* el color del fondo */
border-left: 30px solid #101921; /* el color del fondo */
content:"";
height: 0;
position: absolute;
width: 40px;
}
#octagon:after {
border-top: 30px solid DarkTurquoise;
border-right: 30px solid #101921; /* el color del fondo */
border-left: 30px solid #101921; /* el color del fondo */
content:"";
height: 0;
margin: 70px 0 0 0;
position: absolute;
width: 40px;
}

#diamond {
background: SkyBlue;
height: 80px;
width: 80px;
-moz-transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
-moz-transform-origin: 0 100%;
-webkit-transform-origin: 0 100%;
-ms-transform-origin: 0 100%;
-o-transform-origin: 0 100%;
transform-origin: 0 100%;
}




#twelve-point-star {
background: orange;
height: 100px;
position: absolute;
width: 100px;
}
#twelve-point-star:before {
background: orange;
content:"";
height: 100px;
position: absolute;
width: 100px;
-moz-transform: rotate(30deg);
-webkit-transform: rotate(30deg);
-ms-transform: rotate(30deg);
-o-transform: rotate(30deg);
transform: rotate(30deg);
}
#twelve-point-star:after {
background: orange;
content:"";
height: 100px;
position: absolute;
width: 100px;
-moz-transform: rotate(-30deg);
-webkit-transform: rotate(-30deg);
-ms-transform: rotate(-30deg);
-o-transform: rotate(-30deg);
transform: rotate(-30deg);
}


#six-point-star {
border-bottom: 80px solid red;
border-right: 50px solid transparent;
border-left: 50px solid transparent;
position: absolute;
height: 0;
width: 0;
}
#six-point-star:after {
border-top: 80px solid red;
border-right: 50px solid transparent;
border-left: 50px solid transparent;
content:"";
height: 0;
margin: 30px 0 0 -50px;
position: absolute;
width: 0;
}



#speech-bubble {
background: Thistle;
border-radius: 10px;
height: 80px;
position: absolute;
width: 120px;
}
#speech-bubble:before {
border-top: 13px solid transparent;
border-right: 26px solid Thistle;
border-bottom: 13px solid transparent;
content:"";
height: 0;
margin: 13px 0 0 -25px;
position: absolute;
width: 0;
}



#pacman {
border-top: 60px solid yellow;
border-right: 60px solid transparent;
border-bottom: 60px solid yellow;
border-left: 60px solid yellow;
border-radius: 60px;
height: 0px;
width: 0px;
}



#heart { 
position: relative;
}
#heart:before, #heart:after {
background: red;
border-radius: 50px 50px 0 0;
content: "";
height: 115px;
left: 70px;
position: absolute;
top: 0;
width: 70px;
-moz-transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
-moz-transform-origin: 0 100%;
-webkit-transform-origin: 0 100%;
-ms-transform-origin: 0 100%;
-o-transform-origin: 0 100%;
transform-origin: 0 100%;
}
#heart:after {
left: 0;
-moz-transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
-moz-transform-origin: 100% 100%;
-webkit-transform-origin: 100% 100%;
-ms-transform-origin: 100% 100%;
-o-transform-origin: 100% 100%;
transform-origin :100% 100%;
}


REFERENCIAS:CSS3 Shapes