Friday, June 28, 2019

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>

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>

Wednesday, June 26, 2019

Mostrar feeds de cualquier sitio con jQuery

FeedEkes un plugin para jQuery que nos facilita la tarea a la hora de mostrar contenido de sitios externos a través de sus feeds; tanto de nuestro sitio como de cualquier otro..

En la página de los desarrolladores podemos descargar el archivo RAR que contiene un ejemplo completo y del que sólo necesitamos el archivo FeedEk.js que alojamos en un servidor, incluimos en la plantilla o agregamos a un elemento HTML:
<script type="text/javascript" src="URL_FeedEk.js"></script>
Luego, donde quisiéramos que se mostrase el contenido, pondríamos un DIV vacío de este modo:
<div id="divRss"></div>
Lo único que nos faltaría es ejecutar la función:
<script type="text/javascript">
$(document).ready(function(){
$('#divRss').FeedEk({
FeedUrl : 'URL_FEED',
MaxCount : 3,
ShowDesc : true,
ShowPubDate: true
});
});
</script>
donde tenemos una serie de opciones a elegir:
MaxCount es la cantidad de entradas a mostrar (por defecto 5)
ShowDesc permite mostrar u ocultar el contenido (por defecto true)
ShowPubDate permite mostrar u ocultar la fecha de publicación (por defecto true)

El único dato obligatorio s la URL del feed a mostrar que colocaremos en FeedUrl y que puede ser casi cualquiera; sólo es cosa de probar y ver:

http://miblog.blogspot.com/feeds/posts/default
http://miblog.com/feeds/posts/default
http://feeds2.feedburner.com/miblog
http://miblog.com/feed.php

Obviamente, el estilo con que se mostrarán puede ser personalizado. Para comenzar, pueden usarse algunas de las reglas que se inlcuyen en el archivo FeedEk.css que son bastante sencillas:

#divRss {} es el contenedor general, el DIV donde se mostrará el feed
#divRss .ItemTitle {} es un DIV con el título de cada entrada
#divRss .ItemTitle a {} es el enlace con el título de cada entrada
#divRss .ItemDate {} es un DIV con la fecha
#divRss .ItemContent {} es un DIV con el contenido

Detalles extras que dependerán del contenido pueden ser configuradas por separado:

#divRss .ItemContent p {}
#divRss .ItemContent img {}

Monday, June 24, 2019

El gadget traductor de Blogger

Hace poco, Blogger Buzz anunciaba que ya estaba disponible un nuevo gadget que permite agregar un traductor en el blog pero, a mi entender, lo anunciaba de modo erróneo (o a propósito) haciendo hincapié en que funcionaba en las Vistas Dinámicas cuando, en realidad, la información debería decir que TAMBIÉN funciona en ese tipo de plantillas pero que está disponible para cualquier otra pero, ya se sabe que la gente de Blogger se enamora fácil de sus fracasos ya que las las Vistas Dinámicas son eso, un juguete que muy pocas personas utilizan.

De todos modos, allá vamos y respondo a un par de consultas generales advirtiendo desde ya que, como casi cualquier otro gadget, las posibilidades de configurarlo visualmente son escasas. De hecho, cuando lo agregamos, nos da muy pocas opciones; podemos colocarle un título y seleccionar un estilo (Vertical, Horizontal, Solo desplegable) aunque, al parecer, en una plantilla normal, esos estilos no existen y siempre se ve igual, elijamos lo que elijamos.


El gadget se agrega como widget cuyo ID es Translate:
<b:widget id='Translate1' locked='false' title='Translate' type='Translate'/>
Sólo podemos cambiar algunas cosas mediante CSS, agregando las reglas correspondientes antes de </b:skin>. Un ejemplo con un poco de todo:
#Translate1 { /* centramos todo */
text-align: center;
}
#Translate1 select { /* cambiamos el elemento SELECT a gusto */
background: #DDD;
border: 2px solid #EEE;
border-radius: 4px;
color: #000;
font-family: Tahoma;
margin: 10px 0;
padding: 2px 10px;
width: 200px;
}
#Translate1 option { /* cambiamos la forma en que se verán las opciones */
font-style: italic;
padding-left: 10px;
}
#Translate1 span { /* ocultamos el texto "Traductor de Google" que es demasiado ancho y se ve cortado */
display: inline-block;
overflow: hidden;
vertical-align: middle;
width: 55px;
}
#Translate1 a {
color: transparent;
}

Sunday, June 23, 2019

Cuatro packs de íconos pequeños

Soft Media Vol 1 & 2
Contiene 96 íconos de 32x32 en formato PNG.
descargar

PixelUI
Contiene 77 íconos de 16x16 en formato PNG.
descargar

Freecns
Contiene 218 íconos de 16x16 en formato PNG.
descargar

IC Mini Social
Contiene 18 íconos de 32x32 en formato PNG.
descargar

Friday, June 21, 2019

Velocidades, resúmenes y paginación

Estas son dudas comunes:
  1. el blog es lento
  2. Blogger no respeta la cantidad de entradas que he indicado en al Configuración
  3. la cantidad de entradas es variable cuando navego hacia atrás o hacia adelante
y las respuestas son siempre las mismas, objetivas, subjetivas, de todo un poco:

  • por defecto, Blogger ES LENTO porque incluye una enorme cantidad de scripts sobre los cuales nada podemos hacer excepto soportarlos
  • la cantidad de entradas a mostrar por página debe ser un valor "bajo" ya que las páginas excesivamente largas suelen ser poco amigables
  • las imágenes deben ser optimizadas y su tamaño original debe ser adecuado; de nada sirve re-dimensionarlas con CSS; si son grandes, seguirá siendo grandes aunque las veamos pequeñas
  • todo servicio externo implica una demora en la carga, que sea un script de una línea no lo hace más liviano
  • audio, videos, Flash, cada archivo multimedia suma y suma de modo sustancial
  • muchos archivos con scripts cortos tardan en cargarse bastante más que uno solo más largo
  • todo lo que está en la plantilla se carga más rápido que si se aloja en un servidor externo
  • la longitud de la plantilla no es un detalle a tener en cuenta, puede tener pocas líneas y generar páginas pesadas
  • si se usa jSon, no hay que abusar del valor establecido en &max-results, ese número indica cuántas entradas se leerán del feed por lo tanto, pueden ser volúmenes significativos; es usual ver que se coloca 9999 porque se cree que con eso se cargaran todas pero eso es falso ya que el máximo es 500 sin importar el valor que coloquemos y cargar y procesar 500 entradas de un feed puede colapsar el navegador hasta tal punto que este nos muestre una ventana de advertencia

Si bien la lentitud o agilidad de un sitio depende de muchas cosas incluyendo nuestra conexión, que a veces veamos que el home muestra cantidades de entradas diferentes a las definidas por nosotros se debe a una limitación establecida por el mismo Blogger que, hace ya bastante tiempo, ha decido que si la página a mostrar excede determinado tamaño, se recortará SI O SI y no hay apelación posible.

Pero, aún sabiendo eso, muchas veces se argumenta que: "Tengo las entradas resumidas, ¿cómo puede ocurrir eso?"

La respuesta es otra pregunta ¿el resumen es realmente un resumen?

Para poder contestar eso hay que entender que una plantilla no es una página web, es una serie de instrucciones que ejecuta el servidor (Blogger) y que la ejecución de esas instrucciones es la parte rápida del asunto. Ese servidor crea la página, la envía al navegador y recién allí comienza el asunto.

Cuando usamos la opción MORE, el resumen es REAL e instantáneo, esa instrucción es interpretada por el servidor que no envía la entrada completa sino sólo una parte de ella por lo tanto, el navegador recibe una página más corta y obviamente, tarda menos en mostrarla.

Por el contrario, si el resumen es generado con JavaScript (que es lo que usamos muchos de nosotros), el servidor envía las entradas completas y el navegador ejecuta el script, mostrando sólo una parte de ellas. Que no las veamos completas NO significa que no se hayan cargado completas, como mucho, dependiendo del script que usemos, habremos evitado que se carguen imágenes u otros detalles pero el volumen seguirá siendo el mismo y ese es el volumen el que Blogger puede detectar como "excesivo" y mostrar entonces, una cantidad menor de entradas que las que suponíamos.

Wednesday, June 19, 2019

margin y padding: Parecen lo mismo pero no lo son

¿Acaso estos dos textos son iguales? Uno está a la derecha, otro a la izquierda pero, parecen tener el mismo tamaño y estar separados a la misma distancia en todos sus lados:

un texto
un texto

No es así, aunque ambos tienen el mismo ancho (200 pixeles) y el mismo tipo de fuente, uno tiene un margen y el otro tiene un padding.

Y otra vez volvemos a eso que es fundamental entender y que provoca muchas preguntas y genera dudas cuando queremos acomodar las cosas en una página web.

Si bien, aparentemente, usar margin y usar padding es lo mismo: NO ES LO MISMO y es fácil de ver apenas le agregamos un borde:

un texto
un texto

o un color de fondo:

un texto
un texto

Cada etiqueta es un rectángulo y esos rectángulos se pueden separar unos de otros utilizando la propiedad margin. El margen a la izquierda o a la dercha es universal, se aplica a todas las etiquetas; el margen superior o inferior sólo es efectivo cuando se trata de etiquetas de tipo bloque (DIV, P, etc) o aquellas que tienen propiedades que las transforman en bloques (display, position, etc).

El padding no separa un rectángulo del otro sino que separa el contenido de ese rectángulo:
  • el margen es externo; el padding es interno.
  • el margen no cambia el tamaño del elemento, el padding si.
No hay una regla exclusiva para todos los casos posibles pero, en general, si un elemento no tiene bordes ni fondo, basta definir una cualquiera de esas propiedades y no es necesario agregar ambas. Esto, es algo bastante común y confunde mucho ya que se generan espacios vacíos que se van sumando. Aunque no es una regla de oro, siempre he pensado que lo mejor es eliminar cuanto margen y padding exista y luego, agregarlos uno por uno, tratando de controlar esas separaciones y de ese modo, evitar que eso que creemos que tiene cierto tamaño, se vea cortado, apretujado o demasiado separado sin que uno sepa bien por qué.

Incluso, una etiqueta vacía (sin contenido) puede generar espacios, separaciones que no sabemos de dónde salen o por qué se producen ¿por qué hay un espacio acá abajo?


Simplemente porque esas etiquetas vacías, sin contenido, tienen un margen o padding. Otra vez, basta ponerles un borde o un fondo para "verlas":


¿Hay una forma sencilla de "ver" el tamaño real de algo? Si no queremos agregarle un color de fondo se peude utilizar la propiedad outline que agregará un borde que no ocupará espacio y por lo tanto, el elemento tendrá el tamaño real y podremos ver el lugar que realmente ocupa dentro de la página.

Monday, June 17, 2019

Efectos originales usando CSS

Las posibilidades del CSS3 sólo están comenzando a ser aplicadas y de alguna manera, son infinitas. Las opciones son muchísimas y en general, bastante simples de aplicar. En este caso, Gem@ nos enseña cómo realizar una serie de efectos originales creados por codrops. Acá, sólo voy a intentar reproducir uno de ellos pero el resto, se pueden ver en el demo online o descargar directamente a la PC.

Todos ellos tienen una estructura similar; dentro de un DIV con cierta clase CSS (view), agregamos una imagen cuyo tamaño define el resto de las propiedades y luego, otro DIV que permanecerá oculto (mask) y cuyo contenido puede ser variable.
<div class="view">
<img src="URL_IMAGEN" />
<div class="mask">
<h4> el título </h4>
<p> el trexto </p>
<a href="#" class="info"> LEER MAS </a>
</div>
</div>
Obviamente, el CSS es lo que importa y es ... largo porque, lamentablemente, hay que repetir muchas propiedades ya que los navegadores, aún n ose han decidido a unificarlas.
<style>
.view { /* el DIV principal al le damos la misma dimensión que a la imagen a usar, en este caso, 300x188 */
border: 10px solid #FFF;
cursor: pointer;
height: 188px;
margin: 0 auto;
overflow: hidden;
position: relative;
text-align: center;
width: 300px;
}
.view img { /* la imagen */
display: block;
position: relative;
-moz-transition: all 0.5s ease-out;
-webkit-transition: all 0.5s ease-out;
-o-transition: all 0.5s ease-out;
transition: all 0.5s ease-out;
opacity: 1;
filter: alpha(opacity=100);
}
.view:hover img { /* se "anima cuando ponesmos el cursor encima */
-moz-transform: rotate(720deg) scale(0);
-webkit-transform: rotate(720deg) scale(0);
-o-transform: rotate(720deg) scale(0);
-ms-transform: rotate(720deg) scale(0);
transform: rotate(720deg) scale(0);
opacity: 0;
filter: alpha(opacity=0);
}
.view .mask { /* el DIV oculto con los textos */
background-color: #ABC;
height: 188px;
left: 0;
position: absolute;
overflow: hidden;
top: 0;
width: 300px;
-moz-transform: rotate(0deg) scale(1);
-webkit-transform: rotate(0deg) scale(1);
-o-transform: rotate(0deg) scale(1);
-ms-transform: rotate(0deg) scale(1);
transform: rotate(0deg) scale(1);
-moz-transition: all 0.3s ease-out;
-webkit-transition: all 0.3s ease-out;
-o-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
opacity: 0;
filter: alpha(opacity=0);
}
.view:hover .mask { /* se muestra el DIV */
-moz-transform: translateY(0px) rotate(0deg);
-webkit-transform: translateY(0px) rotate(0deg);
-o-transform: translateY(0px) rotate(0deg);
-ms-transform: translateY(0px) rotate(0deg);
transform: translateY(0px) rotate(0deg);
-moz-transition-delay: 0.4s;
-webkit-transition-delay: 0.4s;
-o-transition-delay: 0.4s;
transition-delay: 0.4s;
opacity: 1;
filter: alpha(opacity=100);
}
.view h4 { /* el título que permanece oculto */
background-color: rgba(255, 255, 255, 0.5);
color: #FFF;
text-align: center;
position: relative;
font-family: Georgia;
font-size: 20px;
margin: 20px 0 0 0;
padding: 5px 0;
text-shadow: 0 3px 1px #000;
-moz-transform: translateY(-200px);
-webkit-transform: translateY(-200px);
-o-transform: translateY(-200px);
-ms-transform: translateY(-200px);
transform: translateY(-200px);
-moz-transition: all 0.2s ease-in-out;
-webkit-transition: all 0.2s ease-in-out;
-o-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
.view:hover h4 { /* se muestra el título */
-moz-transform: translateY(0px);
-webkit-transform: translateY(0px);
-o-transform: translateY(0px);
-ms-transform: translateY(0px);
transform: translateY(0px);
-moz-transition-delay: 0.7s;
-webkit-transition-delay: 0.7s;
-o-transition-delay: 0.7s;
transition-delay: 0.7s;
}
.view p { /* el texto que permanece oculto */
color: #000;
font-family: Tahoma;
font-size: 13px;
margin: 0;
padding: 15px;
position: relative;
text-align: center;
text-shadow: 1px 1px 1px #FFF;
-moz-transform: translateY(-200px);
-webkit-transform: translateY(-200px);
-o-transform: translateY(-200px);
-ms-transform: translateY(-200px);
transform: translateY(-200px);
-moz-transition: all 0.2s ease-in-out;
-webkit-transition: all 0.2s ease-in-out;
-o-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
.view:hover p { /* se muestra el texto */
-moz-transform: translateY(0px);
-webkit-transform: translateY(0px);
-o-transform: translateY(0px);
-ms-transform: translateY(0px);
transform: translateY(0px);
-moz-transition-delay: 0.6s;
-webkit-transition-delay: 0.6s;
-o-transition-delay: 0.6s;
transition-delay: 0.6s;
}
.view a.info { /* el enlace que permanece oculto */
background-color: #456;
border-radius: 5px;
box-shadow: 0 0 2px #FFF, 0 0 5px #FFF inset;
color: #FFF;
display: inline-block;
padding: 7px 14px;
text-decoration: none;
-moz-transform: translateY(-200px);
-webkit-transform: translateY(-200px);
-o-transform: translateY(-200px);
-ms-transform: translateY(-200px);
transform: translateY(-200px);
-moz-transition: all 0.2s ease-in-out;
-webkit-transition: all 0.2s ease-in-out;
-o-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
.view a.info:hover {
box-shadow: 0 0 5px #FFF;
}
.view:hover a.info { /* se muestra el enlace */
-moz-transform: translateY(0px);
-webkit-transform: translateY(0px);
-o-transform: translateY(0px);
-ms-transform: translateY(0px);
transform: translateY(0px);
-moz-transition-delay: 0.5s;
-webkit-transition-delay: 0.5s;
-o-transition-delay: 0.5s;
transition-delay: 0.5s;
}
</style>

estilos con estilo

Vivamus ultrices enim ac ante commodo et interdum odio pulvinar! Duis vel nisl at sapien luctus tincidunt. Mauris in erat risus, id euismod felis.

LEER MAS