Thursday, December 26, 2019

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>


REFERENCIAS:lab.hakim

Friday, December 20, 2019

boingPic: Sólo un experimento

Que nadie se crea que esto tiene alguna utilidad práctica inmediata, es para pasar el rato, un experimento que usa jQuery y que no tiene mayores pretensiones. Creado por kelvinluck.com/.

¿Será que todo tiene que tener alguna utilidad?
<style>
/* este es el formulario superior */
#boing-container { text-align: center; }
#boing-container input {
background: #000;
border: 2px solid #444;
border-radius: 4px;
color: #CCC;
padding: 5px;
}
#boing-container input[type=text] {
text-align: center;
width: 400px;
}
#boing-container input[type=submit]{
background-image: -moz-linear-gradient(#888, #222);
background-image: -webkit-linear-gradient(#888, #222);
background-image: -o-linear-gradient(#888, #222);
background-image: -ms-linear-gradient(#888, #222);
background-image: linear-gradient(#888, #222);
cursor: pointer;
width: 80px;
}
#boing-container input[type=submit].loading{visibility:hidden;}
.error{
color: #F00;
font-style: italic;
margin: 5px 0;
}
/* este es el contenedor con la imagen y el efecto */
#picHolder{
height: 200px;
margin: 50px auto;
position: relative;
width: 200px;
}
.block {position: absolute;}
.default { /* los cuadraditos iniciales */
border: 1px solid #FFF;
height: 18px;
width: 18px;
}
</style>

<script>
// recordar que se debe tener jQuery cargado */
// boingPic.js - a javascript experiment by Kelvin Luck - http://www.kelvinluck.com/
$(function(){
var divs;
var $picHolder = $('#picHolder');
function initGrid(w, h, backgroundImage){
$picHolder.empty();
$picHolder.css({'width' : w,'height' : h});
w /= 10; h /= 10;
divs = [];
for (var i=0; i<10; i++) {
var t = i * h; var l = 0;
for (var j=0; j<10; j++){
var css = {top:t, left:l};
if (backgroundImage){
css.background = 'url(' + backgroundImage + ') no-repeat -' + l + 'px -' + t + 'px';
css.width = w; css.height = h;
}
var d = $('<div class="' + (backgroundImage ? '' : 'default ') + 'block" />').css(css);
d.data('t', t); d.data('l', l);
divs.push(d);
$picHolder.append(d);
l+=w;
}
}
}
initGrid(200, 200);
var mouseX = 1000; var mouseY = 1000;
$(document).bind(
'mousemove',
function(e){
var po = $picHolder.offset();
mouseX = e.pageX - po.left; mouseY = e.pageY - po.top;
}
);
var force = 1500;
setInterval(
function(){
var po = $picHolder.offset();
for (var i=0; i<divs.length; i++) {
var $d = divs[i];
var o = $d.offset();
var x = o.left - po.left; var y = o.top - po.top;
var xDif = mouseX - x; var yDif = mouseY - y;
var distance = Math.sqrt(xDif*xDif+yDif*yDif);
var tempX = x - (force/distance)*(xDif/distance); var tempY = y - (force/distance)*(yDif/distance);
$d.css('left', ($d.data('l') - x)/2+tempX); $d.css('top', ($d.data('t') - y)/2+tempY);
}
},
100
);
$imageUrl = $('#imageUrl');
$imageUrl.bind(
'focus',
function(e){if ($imageUrl.val() == 'direccion url de una imagen y click en cargar ...') {$imageUrl.val('');}}
).bind(
'blur',
function(e){if ($imageUrl.val() == '') {$imageUrl.val('direccion url de una imagen y click en cargar ...');}}
);
var $submitButton = $('#loadImage');
$submitButton.bind(
'click',
function(e){
$submitButton.addClass('loading');
var i = new Image();
$(i).bind(
'load',
function(e){
$submitButton.removeClass('loading');
var w = i.width; var h = i.height;
initGrid(w, h, $imageUrl.val());
}
).bind(
'error',
function(){
$submitButton.removeClass('loading');
var $errorMessage = $('<div class="error">la URL de la imagen no es valida</div>');
$submitButton.after($errorMessage);
$errorMessage.hide().slideDown('normal').animate(
{'opacity': .9}, 2000
).slideUp(
'normal', function(){$errorMessage.remove();}
);
initGrid(20, 20);
}
);
i.src = $imageUrl.val() || 'theresnoimagebythatname!';
return false;
}
);
}
);
</script>

<div id="boing-container">
<form>
<input type="text" id="imageUrl" value="direccion url de una imagen y click en cargar ..." />
<input type="submit" id="loadImage" value="cargar" />
</form>
</div>

<div id="picHolder"></div>

Wednesday, December 18, 2019

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')

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(); });

Monday, December 16, 2019

Espejito espejito

La publicidad dice que el Cybertecture® Mirror es un espejo programable ... también dice más cosas, habla de lo digital, de lo útil que es tener uno en la casa, la oficina, la cartera de la dama o el bolsillo del caballero, que viene en varios colores y en varios idiomas ... un espejo multilingue.

Si ya los convencí para salir a comprar uno, refrenen sus ansias porque no es nada barato; algunos hablan de siete mil y otros de ocho mil dólares ... bueno, si alguien quiere aprovechar las fiestas y ponerlo en el arbolito, seguramente es un regalo mucho más atractivo que esa corbata en la que estaba pensando o ese cacharrito de cerámica que terminará adornando el fondo del placard hasta que se rompa y pase a mejor vida.


Usando un control remoto o con un opcional touch screen, interactua con los usuarios, mostrando información, chequeando el estado de salud con un sensor (no indica donde se coloca), comunicándose con la computadora, los teléfonos móviles y cualquier otro artefacto digital y además, se nos crea nuestra propia página web desde donde podemos establecer preferencias o dejar mensajes a la familia.

¿Tendrá memoria y nos mostrará eso que fuimos? ¿Será realmente un adelanto tecnológico que nos permitirá ver lo que queremos ser o sólo nos mostrará eso que somos? ¿Cuando funcione mal nos mostrará todo eso que jamás pudimos ser?

Demasiadas preguntas. Me parece que ni el espejo de la bruja de Blancanieves podría responderlas.


Thursday, December 12, 2019

Tooltips con CSS: Más simple, imposible

Hay muchas formas de crear tooltips con CSS; probablemente, esta, que muestra webdesignerdepot.com es una de las más sencillas que existen ya que sólo se requiere establecer una clase en el enlace o etiqueta a la cuál queremos aplicarlas y poner las dos reglas de estilo.

En este caso, la clase la llamamos tooltip pero, puede ser cualquier otro nombre y funcionará en cualquier navegador que admita el uso de los pseudo-elementos :after y :before.

El formato gráfico es completamente configurable así que las variaciones pueden ser casi infinitas.
<style type="text/css">
.tooltip {
display: inline;
position: relative;
}
.tooltip:hover:after {
bottom: 26px;
content: attr(title); /* este es el texto que será mostrado */
left: 20%;
position: absolute;
z-index: 98;
/* el formato gráfico */
background: rgba(255,255,255, 0.2); /* el color de fondo */
border-radius: 5px;
color: #FFF; /* el color del texto */
font-family: Georgia;
font-size: 12px;
padding: 5px 15px;
text-align: center;
text-shadow: 1px 1px 1px #000;
width: 150px;
}
.tooltip:hover:before {
bottom: 20px;
content: "";
left: 50%;
position: absolute;
z-index: 99;
/* el triángulo inferior */
border: solid;
border-color: rgba(255,255,255, 0.2) transparent;
border-width: 6px 6px 0 6px;
}
</style>
Y se usaría así:
<a href="#" title="este es un ejemplo de tooltip sencillo" class="tooltip">un ejemplo</a>

El texto que se mostrará es el que se encuentra en el atributo title de la etiqueta; si se quisiera utilizar otro atributo, bastaría cambiar la propiedad content; por ejemplo si se quiere usar rel o href sería:
content: attr(rel);
content: attr(href);
Hay que tener en cuenta que, dada su sencillez, el tooltip se verá "cortado" cuando se queire mostrar en algo que está muy a la derecha si el contenedor donde se encuentra la etiqueta tiene la propiedad overflow: hidden; algo bastante común en muchas plantillas de Blogger.

Monday, December 9, 2019

El NO misterio de posición absoluta

Cuando diseñamos una página web o simplemente agregamos etiquetas, estas se acomodan de manera natural, ya sea una al lado de la otra o bien una debajo de la otra, dependiendo del tipo que sean. El contenido fluye naturalmente, de arriba hacia abajo y de izquierda a derecha, tal como ocurre cuando escribimos o leemos.

Para modificar esa secuencia usamos distintas propiedades de CSS; les colocamos márgenes, cambiamos su tipo con display o las hacemos flotar.

De un tiempo a esta parte, se está empleando una nueva forma de posicionar "cosas" en la página, utilizando para ello la propiedad respectiva que se llama position y, que como toda propiedad de CSS, tiene un valor por defecto aunque no la definamos. Toda etiqueta tiene el valor static que no hace nada salvo decirle al navegador que esa etiqueta es "normal".

Las variantes que admite esa propiedad son tres: fixed, relative y absolute. Justamente, el uso de esta última es la que últimamente se está extendiendo porque es una forma bastante sencilla de ubicar elementos con cierta precisión pero, se suele ver que se usa de manera extraña o mejor dicho, sin tener en cuenta qué es o que hace y por lo tanto, cómo afecta al resto de las etiquetas.

Lo primero que debe tenerse en claro es que ´lo absoluto no existe y que toda posición absoluta es relativa a algo; ¿a qué? a la etiqueta que la contiene, sea la que sea ya que una página web no es otra cosa que un montón de etiquetas contenidas en otras etiquetas hasta llegar a la primera que es el body.

De este modo, si colocamos position:absolute; en una etiqueta cualquiera, el navegador la posicionará buscando "hacia atrás" la primera etiqueta que no tenga la propiedad position:static; y si no hay ninguna, tomará como referencia el body, es decir, la esquina superior izquierda de la ventana.

Este es el error más común, suponer que si algo tiene una posición absoluta, el navegador entenderá dónde queremos que se vea pero, los navegadores no piensan, sólo obedecen ordenes.

Tampoco es cierto que agregando esa propiedad, todo se resuelva porque por si sola no causa mayor efecto; en este ejemplo, el contenedor es "normal" y el contenido es absoluto y sin embargo, todo se muestra como si esta no existiera, el rectángulo se ve debajo el texto:

#contenedor {position:static;}
#contenido {position:absolute;}

Para que tenga algún efecto, debemos establecer también algunas de las propiedades que definen esa posición (left, top, right, bottom) ya que si no lo hacemos, esas propiedades son calculadas automáticamente; en el ejemplo anterior, el navegador me dice que left: es 67 y top es 414 aunque yo no lo haya escrito; si le digo que los coloque en cero, el rectángulo se moverá hasta colocarse en el ángulo superior izquierdo del primer contenedor que no tenga la propiedad position:static (que sea relative, absolute o fixed) que en el caso de esta entrada, es el DIV #main-wrapper:


Justamente, el poder usar left, top, right y bottom para ubicar algo, es lo que hace de esta propiedad una forma sencilla de diseñar algo pero, si podemos posicionar un objeto de ese modo ¿para que agregar otras propiedades como margin y float?

Esto también es bastante común y debería evitarse. Si posicionamos algo de modo absoluto, los márgenes suelen ser innecesarios y las flotaciones, inútiles; esto:
#contenido {
float: right;
margin-right: 20px;

right: 20px;
top: 40px;
}
se puede simplificar y la regla sólo debería decir:
#contenido {
right: 20px;
top: 40px;
}
Veremos lo mismo asi que ¿para qué complicarse la vida?


Lo mismo puede decirse se display; salvo muy raras excepciones, es innecesario agregar esa propiedad en la regla.

Por supuesto, como la posición es absoluta, margin: 0 auto; no centra absolutamente nada; mucho menos lo hará text-align o el viejo atributo align. Si queremos centrar algo que tenga este tipo de propiedad, debemos conocer su ancho. Por ejemplo, en este caso, el rectángulo celeste tiene 200 pixeles de ancho y lo centramos usando left y un margen izquierdo negativo:
#contenido {
left: 50%;
margin-left: -100px;
margin-top: -60px;
position: absolute;
top: 50%;
}
Y con top lo podemos centrar verticalmente así que si el contenido es de 200x120, esto, lo centraría en ambos sentidos:
#contenido {
left: 50%;
margin-left: -100px;
margin-top: -60px;
position: absolute;
top: 50%;
}


Wednesday, December 4, 2019

Blogger: Resúmenes tipo mosaico

Cuando se quieren mostrar las entradas resumidas en un formato tipo mosaico y que las imágenes que generalmente se utilizan como adorno, mantengan su proporción, estamos hablando de una estructura distinta a la clásica que muestra una serie de rectángulos donde la altura es siempre fija:


Es el caso del famoso Pinterest o sitios similares que van colocando rectángulos de altura variable, acomodándolos una debajo del otro, llenando los espacios vacíos.


Para que sea simple de hacer, ese tipo de estructura requiere CSS3 y utilizar las distintas variantes de la propiedad column lo que implica que sólo será visible en navegadores de última generación. Para colmo, a mi entender, ese sistema no es muy razonable en un blog ya que las columnas se escriben de arriba hacia abajo con lo que, si colocáramos 15 entradas en tres columnas, la columna izquierda tendría las primera 5, la del centro las segundas 5 y la tercera el resto; algo que puede ser molesto ya que un lee e interpreta de izquierda a derecha.

Otra forma de hacer lo mismo es usar scripts o plugins específicos aunque algunos de ellos no solucionan esos problemas ya que la única manera de hacer algo así y que se vea en cualquier navegador es mediante alguna clase de script que calcule alturas y vaya "dibujando cada rectangulito estableciendo propiedades absolutas.

Ahora bien, si uno no quiere complicarse la vida, en Blogger, habría una solución simple que no requiere nada sofisticado y que debería funcionar en cualquier navegador ya que no se necesitan propiedades especiales y el script es similar a cualquier otro que lea los feeds del sitio utilizando json.

La idea es crear tres DIVs que serán las columnas, uno flota a la izquierda, otro a la derecha y el tercero está centrado. Luego, vamos agregando las entradas a cada una de ellos en el orden en que las leemos de tal manera que si mostramos 15 entradas, los post 1,4,7,10 y 13 estarán en DIV izquierdo, los posts 2,5,8,11,14 en el centro y los posts 3,6,9,12,15 en el DIV derecho.

Voy hacer lo con un ejemplo concreto; busqué el includable principal del blog:
<b:includable id='main' var='top'>
.......
</b:includable>
Y como es algo que sólo quiero mostrar en el home sin hacer una plantilla nueva, me limitaré a condicionar su contenido y agregar las nuevas columnas de este modo:

<b:includable id='main' var='top'>
<b:if cond='data:blog.url == data:blog.homepageUrl'>
<div id='left-col'/>
<div id='right-col'/>
<div style='clear:both;'/>
<script src='/feeds/posts/default?start-index=1&amp;max-results=12&amp;orderby=published&amp;alt=json-in-script&amp;callback=mosaicocols' type='text/javascript'/>
<b:else/>
<!-- AQUÍ DEJO TODO LO QUE TENGA, SEA LO QUE SEA -->
</b:if>
</b:includable>
Y ahora, el script que es el que interpreta los feeds; lo coloco antes de </head> y usa jQuery para simplificar las cosas pero, podría hacerse con cualquier otra librería o con ninguna:
<b:if cond='data:blog.url == data:blog.homepageUrl'>
<script type='text/javascript'>
//<![CDATA[
function mosaicocols(json) {
var entry, posttitle,posturl,postimg;
var salida = "";
var contar = 0;
for (var i = 0; i < 24; i++) { // voy a mostrar 24 entradas
if (i == json.feed.entry.length) { break; }
entry = json.feed.entry[i]; // el feed
posttitle = entry.title.$t;; // el título de cada post
for (var k = 0; k < entry.link.length; k++) {
if (entry.link[k].rel == 'alternate') {
posturl = entry.link[k].href; // la dirección url de cada post
break;
}
}
// buscamos una imagen para decorar
var t = "";
if ("media$thumbnail" in entry) {
postimg = entry.media$thumbnail.url; // es la que Blogger detecta
postimg = postimg .replace('s72-c','s275'); // pero la cambio para que sea más grande y no una miniatura
} else {
// si no se detecta una, buscamos en el mismo post
var s, a, b, c, d;
s = entry.content.$t;
a = s.indexOf("<img");b = s.indexOf("src=\"",a);c = s.indexOf("\"",b+5);d = s.substr(b+5,c-b-5);
if((a!=-1)&&(b!=-1)&&(c!=-1)&&(d!="")) {
postimg = d; // es la primera imagen del post
} else {
// y si no hay ninguna, usamos una imagen genérica
postimg = 'url_imagenxdefecto';
}
}
// ahora, armo la salida de cada rectángulo utiilizando cualquier estructurura HTML que se me ocurra
salida = "<div class='m-post' id='"+i+"'>";
salida += "<a class='miniatura' href='" + posturl + "' target='_blank'><img src='" + postimg + "' /></a>";
salida += "<h2><a href='" + posturl + "' target='_blank'>" + posttitle + "</a></h2>";
salida += "</div>";
contar = contar+1; // para simplificar las cosas, voy contando los posts
if (contar==1) { // posts 0 3 6 9 12 15 etc
$('#left-col').append(salida); // los agrego a la columna izquierda
} else if (contar == 2) { // posts 1 4 7 10 13 16 etc
$('#right-col').append(salida); // los agrego a la columna derecha
} else { // posts 2 5 8 11 14 17 etc
$('#center-col').append(salida); // los agrego a la columna central
contar = 0; cada tres, pongo el contador a cero
}
}
}
//]]>
</script>
</b:if>
Estas son las tres líneas que deberían cambiarse si se usa otra librería o si no se usa ninguna:
$('#left-col').append(salida);
$('#right-col').append(salida);
$('#center-col').append(salida);
Por último, el CSS que también va antes de </head>:
<b:if cond='data:blog.url == data:blog.homepageUrl'>
<style>
// si es necesario, agrego cualquier cosa que se necesaria para cambiar anchos u ocultar elementos
#outer-wrapper, #content-wrapper, #header-wrapper, #main-wrapper {width:930px;}
#sidebar-wrapper {display:none;}
// estas serían las reglas de las tres columnas
#left-col {float:left;}
#right-col {float:right;}
#center-col {margin:0 auto;width: 297px;}
// cada uno de los rectángulos
.m-post {
border: 1px solid #EEE;
margin-bottom: 20px;
padding: 10px;
text-align: center;
width: 275px;
background-color: #FFF;
box-shadow: 0 5px 5px #AAA;
position: relative;
}
.m-post a {text-decoration:none;}
// la imagen de los posts
.m-post .miniatura {
display: inline-block;
}
.m-post .miniatura img {
vertical-align: top;
width: 275px;
}
// el título de los posts
.m-post h2 a {
color:#666;
font-size: 17px;
font-family: Tahoma;
font-weight: normal;
letter-spacing: 0;
padding: 0;
text-transform: none;
}
</style>
</b:if>
Y eso es todo. Obviamente, de ahí en adelante, cualquier cosa es posible y cada uno deberá investigar y jugar un poco.

Monday, December 2, 2019

Nube de etiquetas con jQuery

Esta es una forma de crear una nube de etiquetas animadas utilizando jQuery publicada por devirtuoso.com y que, tal vez, con algunos cambios, podría aplicarse incluso a las etiquetas de Blogger, cosa que quedará para quien quiera investigar el asunto.

El HTML no es otra cosa que una lista común:
<div id="listaE">
<ul>
<li><a href="url_etiqueta_1">etiqueta 1</a></li>
<li><a href="url_etiqueta_2">etiqueta 2</a></li>
<li><a href="url_etiqueta_3">etiqueta 3</a></li>
<!-- continuamos agregando los distintos enlaces -->
</ul>
</div>
Y el CSS básico:
<style>
#listaE {
display:none;
overflow:hidden;
position:relative;
/* dimensionamos el contenedor y lo centramos */
margin:0 auto;
padding:20px 40px;
height:500px;
width:500px;
}
#listaE ul, #listaE li {
/* eliminamos cualquier propiedad por defecto de la lista */
list-style:none;
margin:0;
padding:0;
}
#listaE a {
position:absolute;
text-decoration: none;
/* establecemos color y tipo de fuente del texto */
color: #FFF;
}
#listaE a:hover {
/* y del efecto hover sobre los enlaces */
color:#FFF !important;
opacity: 1 !important;
}
</style>
Por último, el script en si mismo que ejecutamos cuando se termine de cargar la página:
<script>
$(document).ready(function(){
var element = $('#listaE a');
var offset = 0;
var stepping = 0.03;
var list = $('#listaE');
var $list = $(list);
$list.mousemove(function(e){
var topOfList = $list.eq(0).offset().top;
var listHeight = $list.height();
stepping = (e.clientY ) / listHeight * 0.2 - 0.1;
});
for (var i = element.length - 1; i >= 0; i--){
element[i].elemAngle = i * Math.PI * 2 / element.length;
}
setInterval(render, 20);
list.show();
function render(){
for (var i = element.length - 1; i >= 0; i--){
var angle = element[i].elemAngle + offset;
x = 120 + Math.sin(angle) * 30;
y = 45 + Math.cos(angle) * 30;
size = Math.round(20 - Math.sin(angle) * 20);
var elementCenter = $(element[i]).width() / 2;
var leftValue = (($list.width()/2) * x / 100 - elementCenter) + "px";
$(element[i]).css("fontSize", size + "pt");
$(element[i]).css("opacity",size/100);
$(element[i]).css("zIndex" ,size);
$(element[i]).css("left" ,leftValue);
$(element[i]).css("top", y + "%");
}
offset += stepping;
}
});
</script>

Saturday, November 30, 2019

Social Media Icons

3D black and white
Contiene 41 íconos de 32x32 y 48x48, en formato PNG.
descargar

Yammy Social Media
Contiene 30 íconos de 64x64 y 128x128, en formato PNG.
descargar

Wednesday, November 27, 2019

Sobre resúmenes e imágenes desproporcionadas

Son muchos los que utilizan alguna clase de plantilla o tiene un sitio donde las entradas del home se muestran resumidas, adornadas con una imagen. También son muchos los que preguntan ¿cómo puedo hacer para que esas imágenes no se deformen?

La respuesta a eso es sencilla y no le gusta a nadie: no se puede.

No se puede porque si usamos etiquetas IMG y las re-dimensionamos, cosa que podemos hacer con width y height tanto en el CSS como con atributos en la misma etiqueta, la imagen se mostrará con esa dimensión; como una es más alta que ancha, el pobre patito "engordará".



¿Qué pasa en los resúmenes? Imaginemos algo así:
<div class="demoresumen">
<div>
<img src="una_imagen"/>
<p> ... un texto ... </p>
</div>
<!-- etc etc etc -->
<div>
<img src="una_imagen"/>
<p> ... un texto ... </p>
</div>
</div>
Con este estilo:
<style>
.demoresumen {margin: 0 auto; overflow: hidden; width: 480px;}
.demoresumen div {border: 1px solid #444; float: left; height: 240px; margin: 5px; width: 225px;}
.demoresumen p {font-size: 11px; margin: 0; padding: 10px;}
.demoresumen img {display: block; height: 160px; margin: 10px auto 0; width: 200px;}
</style>
Veríamos algo así:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...


Para que una imagen se re-dimensione sin perder sus proporciones debemos establecer una y solo una de las dimensiones, dejando que la otra sea calculada por el navegador; en este caso, basta con eliminar height o colocar height: auto; pero, obviamente, con este método, toda la estructura se desquicia ya que habrá rectángulos mas altos que otros y si estamos dimensionando la altura del contenedor y usando overflow:hidden, se cortará.

height: auto | overflow:hidden | restaurar

¿Podemos hacer que la imagen del pato se muestre sin deformarse? Si pero no. Una forma de hacerlo es colocarla dentro de un contenedor, dimesionarlo y usar overflow; es decir, "cortar" lo que sobre; en lugar de:
<img src="una_imagen"/>
pondríamos algo así:
<span><img src="una_imagen"/></span>
y cambiaríamos las reglas de estilo:
.demoresumen span {display: block;height: 160px;margin: 10px auto 0;overflow: hidden;width: 200px;}
.demoresumen img {width: 200px;}

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...


Tampoco resuelve demasiado.

Si estamos buscando opciones sencillas, lo ideal es que las imágenes que vamos a utilizar mantengan siempre una proporción adecuada y listo; ese tipo de plantilla ha sido pensada para eso; caso contrario, deberíamos olvidarnos de lo que tenemos y pasar a alguna estructura de mosaico usando CSS3 lo que impedirá que se muestre correctamente en ciertos navegadores o agregando algún script que maneje ese tipo de solución.

Una alternativa intermedia es usar un poco de CSS que no resolverá el problema pero mitigará los efectos. Para esto, debemos olvidarnos de la etiqueta IMG y colocar la imagen como fondo. Otra vez, en lugar de:
<img src="una_imagen"/>
pondríamos algo así:
<span style="background-image:url(una_imagen)"></span>
Y es esa etiqueta con la imagen de fondo la que podemos manipular un poco mediante las propiedades background; por ejemplo:
.demoresumen span {
display: block;
height: 160px;
margin: 10px auto 0;
width: 200px;
background-repeat: no-repeat;
background-position: 50% 50%;
background-size: cover;
}

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy ...


La imagen se cortará pero, podemos establecer donde; en el ejemplo, eso se hace con background-position y los valores 50% 50% indican que se coloque en el medio pero puede ser cualquier otro valor.

La otra propiedad que podemos usar es background-size aunque esta, sólo se aplicará en navegadores modernos y, básicamente, tiene tres valores:

background-size: contain | background-size: cover | background-size: auto

En resumen, no hay soluciones perfectas y por eso comencé diciendo que la respuesta a la pregunta es no, no se puede porque es imposible mantener las proporciones de una imagen si lo que estamos haciendo es cambiando esas proporciones. El problema, termina siendo una contradicción en si misma.

Saturday, November 23, 2019

Thursday, November 21, 2019

Múltiples fondos y efectos hover

Esta es una forma muy particular de utilizar fondos múltiples para crear efectos hover; algo que se le ocurrió a designshack.net donde la técnica está explicada en detalle.

Lo básico es saber que con las nuevas características del CSS3, una etiqueta cualquiera puede tener varios fondos (varias propiedades background) y cada una de ellas puede ser controlada de modo individual. La sintaxis d esto es exactamente igual que la tradicional y los distintos valores, se separan con comas así que una regla como esta, agregaría dos imágenes distintas al mismo contenedor:
#ejemplo {
background-image: url(imagen_1), url(imagen_2);
background-position: left 50%, right 50%;
background-repeat: no-repeat;
background-color: red;
}
la primera estará a la izquierda, la segunda a la derecha; ambas centradas verticalmente; ninguna de ellas se repetirá y el fondo "sobrante" será de color rojo.


Entendiendo cómo funciona esto de los fondos múltiples y que su posición puede controlarse con background-position, supongamos que tenemos un contenedor que mide 200x200 al que le coloco tres imágenes de fondo; las dos primeras son las que veré por defecto (imagen_fondo) y la tercera es la que permanecerá oculta hasta poner el cursor encima (imagen_oculta).
#ejemplo {
display: inline-block;
height: 200px;
width: 200px;
transition: all 1s; /* con prefijos para los distintos navegadores */
background-image: url(imagen_fondo), url(imagen_fondo), url(imagen_oculta);
background-repeat: no-repeat;
/* background-position: ???????; */
}
Para que esto funcione, un poco de aritmética. Si queremos que se "abra" horizontalmente:
background-position: -100px 0px, 100px 0px, 0 0;
y si queremos que se "abra" verticalmente:
background-position: 0 -100px, 0 100px, 0 0;
Y la regla del hover sería:
#ejemplo:hover {background-position: -200px 0px, 200px 0px, 0 0;}
o bien:
#ejemplo:hover {background-position: 0 -200px, 0 200px, 0 0;}


Del mismo modo, agregando más fondos, se obtienen distintos efectos:


<style>
.hoverDot {
display: inline-block;
height: 200px;
margin: 10px;
width: 200px;
-moz-transition: all 1s ease 0s;
-webkit-transition: all 1s ease 0s;
-o-transition: all 1s ease 0s;
-ms-transition: all 1s ease 0s;
transition: all 1s ease 0s;
}

#slidingDoors {
background-image: url(fondo.png), url(fondo.png), url(imagen.jpg);
background-position: -100px 0px, 100px 0px, 0 0;
background-repeat: no-repeat;
}
#slidingDoors:hover {
background-position: -200px 0px, 200px 0px, 0 0;
}

#slidingDoorsVert {
background-image: url(fondo.png), url(fondo.png), url(imagen.jpg);
background-position: 0 -100px, 0 100px, 0 0;
background-repeat: no-repeat;
}
#slidingDoorsVert:hover {
background-position: 0 -200px, 0 200px, 0 0;
}

#breakApart {
background-image: url(fondo.png), url(fondo.png), url(fondo.png), url(fondo.png), url(imagen.jpg);
background-position: -100px -100px, 100px 100px, -100px 100px, 100px -100px, 0 0;
background-repeat: no-repeat;
}
#breakApart:hover {
background-position: -200px -200px, 200px 200px, -200px 200px, 200px -200px, 0 0;
}

#twistAndShout {
background-image: url(fondo.png), url(fondo.png), url(fondo.png), url(fondo.png), url(imagen.jpg);
background-position: -100px -100px, 100px 100px, -100px 100px, 100px -100px, 0 0;
background-repeat: no-repeat;
transform: rotate(-90deg);
}
#twistAndShout:hover {
background-position: -200px -200px, 200px 200px, -200px 200px, 200px -200px, 0 0;
transform: rotate(0deg);
}
</style>

<div class="hoverDot" id="slidingDoors"></div>
<div class="hoverDot" id="slidingDoorsVert"></div>
<div class="hoverDot" id="breakApart"></div>
<div class="hoverDot" id="twistAndShout"></div>

Monday, November 18, 2019

Botones simples con CSS

Estos botones son sencillos de armar y el CSS se puede descargar desde la página del autor, usarlos total o parcialmente o modificarse a gusto.

En principio, funcionarían en cualquier navegador incluyendo versiones viejas de Internet Explorer aunque faltaría agregarles las propiedades para Opera y sería mejor eliminar aquellas que ya no son necesarias tales como -webkit-border-radius, -moz-border-radius, -webkit-box-shadow o -moz-box-shadow

Además, sería conveniente modificar la sintaxis de las gradientes utilizadas en Chrome para que sean iguales al resto de los navegadores; por ejemplo:
-webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#f0f0f0));
se transformaría en esto:
-webkit-linear-gradient(top,  #f9f9f9, #f0f0f0);
El HTML es genérico, se scribe siempre igual:
<a class="button white" href="#">ejemplo</a>

Este es el CSS de uno de los botones:
.button { /* clase general */
border: 1px solid #dedede;
border-radius: 3px;
color: #555;
display: inline-block;
font: bold 12px/12px HelveticaNeue, Arial;
padding: 8px 11px;
text-decoration: none;
}

.button.white{
background: #f5f5f5;
border-color: #dedede #d8d8d8 #d3d3d3;
box-shadow: 0 1px 1px #eaeaea, inset 0 1px 0 #fbfbfb;
color: #555;
text-shadow: 0 1px 0 #fff;
background: -moz-linear-gradient(top, #f9f9f9, #f0f0f0);
background: -webkit-linear-gradient(top, #f9f9f9, #f0f0f0);
background: o-linear-gradient(top, #f9f9f9, #f0f0f0);
background: ms-linear-gradient(top, #f9f9f9, #f0f0f0);
background: linear-gradient(top, #f9f9f9, #f0f0f0);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#f0f0f0');
}

.button.white:hover{
background: #f4f4f4;
border-color: #c7c7c7 #c3c3c3 #bebebe;
box-shadow: 0 1px 1px #ebebeb, inset 0 1px 0 #f3f3f3;
text-shadow: 0 1px 0 #fdfdfd;
background: -moz-linear-gradient(top, #efefef, #f8f8f8);
background: -webkit-linear-gradient(top, #efefef, #f8f8f8);
background: -o-linear-gradient(top, #efefef, #f8f8f8);
background: -ms-linear-gradient(top, #efefef, #f8f8f8);
background: linear-gradient(top, #efefef, #f8f8f8);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#efefef', endColorstr='#f8f8f8');
}
Sí, ya sé, tener que escribir varias propiedades para los distintos navgadores es realmente molesto pero, es lo que hay.

Saturday, November 16, 2019

Snaggy: Ctrl+V para guardar imágenes en al web

Snaggy es un servicio web que puede ser usado para guardar y editar imágenes de modo simple copiando tanto desde una página como desde nuestra PC. Para eso, basta usar el atajo del teclado normal Ctrl+V dentro del área que nos muestra el sitio.


Aunque a veces funciona de modo errático, es bastante cómodo. Podemos usar cualquier imagen copiada en el portapapeles, sea esta un PrintScreen clásico, una selección realizada en nuestro editor de imágenes o una imagen completa.

Una vez procesada, nos mostrará el resultado y la dirección URL que podemos compartir en redes sociales y si queremos, también podemos editarla ahí mismo con algunas herramientas sencillas para recortarla, agregarle textos y otros detalles gráficos.


No tiene misterios, basta ir y probar porque no requiere registro de ninguna clase

REFERENCIAS:wwwhatsnew.com

Thursday, November 14, 2019

Firefox 16: Sin prefijos en el CSS

A partir de la versión 16 de Firefox, ya resulta innecesario agregar prefijos en la mayoría de las propiedades de CSS3 que se utilicen en este navegador con lo cual, poco a poco, nos vamos acercando a la estandarización mínima que requiere el diseño web: hablar el mismo idioma.

Así el -moz- puede desaparecer de las propiedades animation, transition, transform y de las gradientes:
  • animation, animation-name, animation-duration, animation-delay, animation-timing-function, animation-iteration-count, animation-direction, animation-play-state, animation-fill-mode, @keyframes
  • transition, transition-property, transition-delay, transition-duration, transition-timing-function
  • CSS3 Transforms transform, transform-origin, transform-style, backface-visibility, perspective, perspective-origin
  • CSS3 Image Values linear-gradient(), radial-gradient(), repeating-linear-gradient(), repeating-linear-gradient()
Es de esperar que la gente de Chrome haga lo mismo rápidamente y aliviarnos la tarea de estar tecleando y tecleando.

REFERENCIAS:hacks.mozilla.org

Tuesday, November 12, 2019

Blogger y los comentarios abusivos

Esta es una traducción aproximada de un artículo publicado en The Real Blogger Status que me llamó la atención:

Blogger no censurará comentarios o aceptará reportes sobre comentarios abusivos

En los Foros de Ayuda de Blogger, muchas veces se pregunta ¿Por qué Blogger no me da la opción de bloquear a un comentarista abusivo?

Esta es una petición que simplemente no se pueden cumplir ya que:

  • es técnicamente imposible
  • es contrario a la política de Blogger

Porque cualquier persona puede crear varias cuentas de Google sin esfuerzo y Blogger no van a perder tiempo en desarrollar funciones de bloqueo que sólo darían una falsa sensación de seguridad ya que no tendría efectos a largo plazo.

Si usted realmente siente que un comentarista representa una amenaza legal o física, debe reportar la amenaza a las autoridades locales. Si se trata de otro tipo de "molestia", Blogger considera que es "libertad de expresión" y por lo tanto, la publicación de ese tipo de comentarios es de quien los hace y quien los permite ya que el administrador de un blog, usted puede elegir qué comentarios publicar y qué comentarios rechazar para lo cual existe la opción de moderarlos.

Si cualquier comentario lo ofende, modérelos o elimínelos lo antes posible. Concéntrese en la publicación de su blog y pase por alto estos abusos. Con el tiempo, la persona abusiva se aburrirá y seguirá adelante.



A simple vista, la explicación parece razonable pero mezcla verdades, mentiras y excusas.

En primer lugar, es cierto que la responsabilidad de lo publicado es nuestra; tanto si somos administradores de un blog como si somos comentaristas pero, es completamente falso que Blogger no pueda implementar técnicamente este tipo de función, que sea una opción inútil o que sea algo contrario a sus políticas. Por favor, no traten de enarbolar banderas para justificar lo injustificable.

De hecho, Blogger TIENE varias opciones de denuncia. En la navbar (Informar sobre mal uso), en los comentarios (marcar como spam); cada tanto, aparecen direcciones para reclamar por violaciones al copyright.

Muchos otros servicios de Google tienen opciones de bloqueo o filtros diversos, GMail, YouTube ... casi cualquier sistema de redes sociales posee lo mismo (y un blog es una red social). Es algo casi elemental.

Todas esas herramientas nada tienen que ver con la censura ni limitan la libertad de expresión de nadie porque libertad de expresión es defender dos derechos: el de cualquiera a decir lo que se le de la gana y el mio a decidir si quiero o no quiero escucharlo; si no se defienden ambos derechos no hablamos de libertad de expresión.


A veces, parecería que cuando se trata de la web, el concepto de la libertad está un poco tergiversado. Una cosa es que yo acepte, admita o defienda la libertad de cualquiera, de hacer de su propio espacio el sitio que quiera y otra cosa es que yo permita que aquello que no me gusta, se traslade al mio. Ese concepto es tan elemental como eso de que cada hogar es un mundo ... pero el mio es mio.

Poner límites no significa coartar la libertad de nadie porque no creo que nadie pueda ser feliz haciendo infelices a otros a menos que sea alguna especie de psicótico. Respetar y ser respetado, las reglas son muy sencillas.

Cuando me dejo de sentir cómodo en cierto lugar porque no me gustan sus reglas, lo que debo hacer es irme silbando bajito y a otra cosa. Lo mismo pasa si lo que veo no es de mi agrado o si no cubre mis expectativas ¿Qué voy a hacer? ¿Decirle al otro que eso no me gusta? ¿A quién le puede importar? ¿Qué aporto? ¿Qué cambiará? ¿Acaso debo ser el juez de todo? ¿Acaso los otros deben darme explicaciones? Sería mejor utilizar el viejo criterio y callarse a menos que se tenga algo bueno que decir. Ser sincero no es decir siempre lo que uno piensa, sobre todo, cuando nadie nos ha preguntado nuestra opinión.

La máscara que nos provee la web es un arma de doble filo. Por un lado, nos permite re-inventarnos a nosotros mismos y despojarnos de timideces, traumas y miedos. Por el otro, parece habilitar a que algunos saquen lo peor de si.

La máscara provoca embriaguez, aguza los sentidos, destraba la lengua (o los dedos) pero nos enfrenta al riesgo de sentirnos omnipotentes, de hacernos creer que nuestra voz debe ser escuchada a como de lugar.

Friday, November 8, 2019

Algunos plugins para jQuery

Estos son algunos plugins que requieren jQuery para funcionar y que me han parecido interesantes para ir probando aunque se trata de cosas demasiado específicas como para intentar mostrar ejemplos concretos para cada uno de ellos así que ... a arremangarse e intentarlo.

Tinycon

No sé que utilidad puede tener aplicado a Blogger pero este plugin cambia el favicon agregándole una burbuja con algún tipo de dato variable.

jQuery Corner

Es un plugin que permite generar decenas de bordes distintos, simples o complejos ya predefinidos y, obviamente no funcionará en los navegadores que no admitan CSS3.

jPages

Un plugin muy completo que sirve para generar contenido paginado, algo que normalmente está reservado para lenguajes que se ejecutan del lado del servidor.

MediaElement.js

Complejo sistema que permite crear reproductores de audio y video utilizando sólo HTML y CSS e incluye soporte para Flash y Silverlight por lo que funciona incluso en navegadores que no soportan HTML5.

jCarousel

Un plugin para controlar el orden de cualquier lista que pueden ser estáticas o bien ser cargadas usando AJAX.


fitvidsjs

Un plugin muy liviano que permite transformar los videos incrustados en objetos fluidos que se adapten a cualquier contenedor.

infinity

Genera código que ayuda a controlar la forma en que se ven listas muy largas, usando animaciones suaves.


rotate3Di

Plugin para crear efectos 3D con rotaciones y animaciones



imagesLoaded

Una forma sencilla de determinar si una o varias imágenes se han cargado y actuar en consecuencia.


tooltipster

Un sistema completo para generar tooltips en cualquier tipo de etiqueta que incluso, funciona en viejas versiones de Internet Explorer.

Thursday, November 7, 2019

Blogger, navegadores y compatibilidad

Hay quien aún se preocupa porque su sitio se vea en ciertos navegadores como Internet Explorer 6 por ejemplo, cosa que, a esta altura del siglo 21, carece de todo sentido práctico. Incluso, hay quienes se preocupan por IE7 que parecería más moderno pero en realidad, sólo fue una prueba fallida que trajo más problemas que soluciones.

Claro que, cada cuál puede hacer lo que quiera pero, si se usa Blogger, hay que saber que ninguno de esos navegadores es soportado por el sistema mismo y, si bien por ahora podemos acceder al servicio sin restricciones usando cualquier tipo de navegador, Blogger nos advierte que no se responsabiliza por los resultados y, cualquier cosa es posible.

En su página de ayuda Blogger and browser compatibility no da la lista de los navegadores soportados:


Y en el caso de IE8 y 9, nos advierte que debemos deshabilitar la opción de compatibilidad

Todo muy lindo, todo muy razonable pero si todo es así ¿por qué demonios Blogger sigue agregando automáticamente esta etiqueta en las platillas?
<meta content='IE=EmulateIE7' http-equiv='X-UA-Compatible'/>
Ya que, lo que hace eso es justamente lo contrario, indicarle a IE que debe usar el modo compatibilidad, es decir, si estamos usando IE8 o IE9 el blog se mostrará como si usáramos IE7. Moraleja, a la ridiculez de Microsoft se le suma la de Google así que, ya sabemos en manos de quien estamos XD

Lo primero que debe hacerse en una plantilla de Blogger es sobrescribir esa etiqueta y abandonar de una buena vez esta locura de pretender compatibilidad absoluta con todo navegador y todo dispositivo a costa de nosotros, los usuarios, que debemos hacer malabares para resolver los problemas que ellos generan así que hay que agregar lo siguiente inmediatamente después de <head>
<meta content='IE=EmulateIE8' http-equiv='X-UA-Compatible'/>
Nosotros, sólo debemos entender que un blog con cierto diseño, no se verá igual en un móvil con una pantallita de 320 pixeles de ancho que en un monitor widescreen salvo que pensemos ese diseño con anterioridad y adaptemos las cosas para que ello ocurra. Los límites existen siempre, basta saber cuáles son para usarlos a nuestro favor o ... hacer cualquier cosa menos ignorarlos.

Monday, November 4, 2019

Verificar un blog de Blogger en Pinterest

Según me contaba Roudy Capella, Pinterest ahora permite verificar el sitio web que hayamos agregado en nuestro perfil. Esa opción se realiza mediante un archivo que uno debe alojar en su sitio pero, claro, quienes usan Blogger, aparentemente no pueden hacerlo ya que no hay manera de subir un archivo a un servidor que no existe.

Ellos dicen que por el momento, servicios de blogs quedan excluidos excepto Tumblr y prometen ir agregando otras opciones

Sin embargo, en la misma ayuda, se encuentran enlaces a métodos alternativos para WordPress e incluso para Blogger mismo así que es cosa de probar y ver.

El procedimiento parece algo raro pero funciona así que trataré de mostrarlo paso a paso tal como lo hice por si alguien no entiende inglés que es el idioma original de la ayuda.

Lo primero que debemos hacer es entrar en nuestra cuenta de Pinterest y allí, ir a Configuracióndonde veremos la dirección de nuestro sitio (si lo hemos agregado) y un botón Verificar sitio web:


Hacemos click en el botón y aparecerá una ventana de advertencia donde nos dice que no podremos verificar un dominio de blogspot pero, lo ignoramos y ... click here:


Descargamos el archivo que nos den que tendra como nombre pinterest-xxxxx.html y que será personal por lo que incluirá números y letras diversas:


Y dejamos esa página abierta.

Ahora, nos vamos a Blogger y creamos una página estática nueva a la que le damos cualquier nombre. Abrimos el archivo previamente descargado con cualquier editor como el block de notas, copiamos su contenido y lo pegamos en nuestra nueva página, verificando que estemos en el modo HTML. Luego, publicamos la página y tomamos nota de su dirección url que será algo así:
http://nombre.blogspot.com/p/titulo-de-la-pagina.html
Vamos a la Configuración de Blogger y en el apartado Preferencias de búsqueda, elegimos Redireccionamiento personalizado, Editar.

En el item De: colocaremos la dirección url tal como la esperaría Pinterest que es el nombre del archivo descargado:
/pinterest-xxxxx.html
y en el item Para: colocaremos la dirección url de la página que hayamos creado:
/p/titulo-de-la-pagina.html
y marcamos Permanente, sin olvidar que las direcciones son relativas y comienzan con una barra:


Ya terminamos, podemos volver a la página de Pinterest y decirle que todo esta listo Haz click aquí para completar el proceso; si hicimos las cosas bien, nos dirá que el sitio fue verificado:


Y podremos ver ese dato en nuestro Perfil:

Thursday, October 31, 2019

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;}}

Tuesday, October 22, 2019

Seguimiento de descargas

Algunas personas que tienen sitios desde donde se descargan archivos de distinto tipo, han preguntado si hay una forma de mantener un registro de esas descargas, algo que muchos servicios donde se alojan esos archivos permiten o incluyen pero otro nos y, desde Blogger, no hay muchas alternativas.

Una de ellas es usar Google Analytics que es un servicio que se integra desde la misma Configuración del blog o manualmente, copiando y pegando el script que ellos proveen.

Teniéndolo incluido, podemos, ellos nos dan la posibilidad de hacer un seguimiento de cualquier enlace en particular aunque las explicaciones que ahora nos muestran son poco claras; más fácil es entender el método leyendo la ayuda "vieja" aunque esté en inglés ya que la metodología no ha cambiado.

¿Qué nos dicen? Que si tenemos un enlace de cualquier tipo:
<a href="URL_archivo">descargar</a>
bastaría agregarle un evento onclick que llame a la función de Google Analytics y, de ese modo, las descarga del archivo será registrada por el servicio:
<a href="URL_archivo" onclick="_gaq.push(['_trackPageview','URL_archivo']);">descargar</a>
o bien:
<a href="URL_archivo" onclick="_gaq.push(['_trackEvent','URL_archivo']);">descargar</a>
Usar uno u otro sistema dependerá de la forma en que quisiéramos que se registraran los datos y las diferencias entre _trackPageview y _trackEvent quedan para ser estudiadas por cada uno ya que, además poseen parámetros opcionales.

Si quisiéramos automatizar esto y agregarlo a los enlaces sin tener que escribirlos manualmente, deberías usar alguna clase de script. Por ejemplo, usando jQuery podríamos usar una clase para identificar los archivos:
<a class="descarga" href="URL_archivo">descargar</a>
y poner una función así:
$('.descarga').click(function () {
_gaq.push(['_trackPageview', $(this).attr('href').replace('http://','')]);
});
o así:
$('.descarga').click(function () {
_gaq.push(['_trackEvent', 'MISdescargas']);
});
Y para quien no quiera complicarse la vida, llegado el caso, pueden usar entourage.js que es un script que agregamos antes de </head> o antes del código de Google Analytics y hará todo eso de modo automático.