Cómo usar una imagen de fondo que se adapte a la pantalla

Actualizado 23-Sep: Arreglado fallo en IE8

Hace unos meses, estuve trabajando en la web de Amapola Films, y surgió un reto interesante: cómo usar una imagen de fondo que permaneciese fija y tuviera una escala correcta.

Para este ejemplo, he elegido la siguiente imagen de fondo:

La imagen de fondo que usaremos de ejemplo

Prueba #1: usando CSS

Normalmente, para poner una imagen de fondo usaría CSS, pero en este caso queremos que ocupe toda la pantalla independientemente del tamaño del navegador.

He reducido la página al mínimo para poder centrarnos en el fondo, así que el contenido del body sería:

<div id="content">
<h1>Prueba 1: usando CSS</h1>
</div>

Y el CSS correspondiente:

body {
  background: url(images/background.jpg) no-repeat center top;
}

Como se puede ver en la siguiente captura, la imagen es mucho más grande que la ventana del navegador y no se muestra correctamente

Primer intento: FAIL

La propiedad background de CSS es bastante limitada para este caso y  no nos permite escalar la imagen. Si queremos ajustar la anchura o altura, tendremos que usar el elemento img

Prueba #2: imagen en HTML

Esta vez, en lugar de ponerle un fondo al body, vamos a insertar una imagen en el documento e intentar enviarla al fondo.

<img id="bg" src="images/background.jpg" alt="Fondo" />
<div id="content">
<h1>Prueba 2: imagen de fondo</h1>
</div>

Para esto, aplicaremos un posicionado fijo a la imagen, y le pondremos el z-index a -1, para enviarla al fondo. También especificamos que la imagen se ajuste al ancho de la pantalla

#bg {
  position: fixed;
  z-index: -1;
  top: 0;
  left: 0;
  width: 100%;
}

Segundo intento, parece que funciona

Con un navegador apaisado se ve decente

El problema viene a la hora de redimensionar. Si por cualquier motivo, la ventana es mas ancha que larga se produce el siguiente efecto.

Segundo intento: FAIL

Tras ver esto, se me ocurrió brevemente poner también la altura al 100%, pero eso deformaría la imagen. Sólo nos queda Javascript

Prueba 3: Javascript al rescate

La idea principal es averiguar mediante javascript las proporciones de la pantalla y, dependiendo de estas, ajustar la anchura o la altura, dejando que el navegador elija la otra medida automáticamente.

El código HTML y CSS es similar al anterior, sólo que esta vez añadiremos el siguiente Javascript (depende de jQuery aunque se podría adaptar fácilmente):

function updateBackground() {
screenWidth = $(window).width();
screenHeight = $(window).height();
var bg = jQuery("#bg");

// Proporcion horizontal/vertical. En este caso la imagen es cuadrada
ratio = 1;

if (screenWidth/screenHeight > ratio) {
$(bg).height("auto");
$(bg).width("100%");
} else {
$(bg).width("auto");
$(bg).height("100%");
}

// Si a la imagen le sobra anchura, la centramos a mano
if ($(bg).width() > 0) {
$(bg).css('left', (screenWidth - $(bg).width()) / 2);
}
}
$(document).ready(function() {
// Actualizamos el fondo al cargar la pagina
updateBackground();
$(window).bind("resize", function() {
// Y tambien cada vez que se redimensione el navegador
updateBackground();
});
});

Podemos ver que en este caso, el fondo se muestra correctamente sea cual sea el tamaño de la ventana.

Cuadrado: OK

Horizontal: OK

Vertical: OK

Demo

Podéis ver los ficheros utilizados en:

Ojo con las tarjetas de memoria SD falsas en eBay

No me hace mucha ilusión estrenar blog quejándome, pero lo que me ha pasado hoy me ha dejado con ganas de contarlo.

La semana pasada compré en eBay una tarjeta Sandisk Extreme III de 8GB. El precio: unos 20€, envío gratuito. Parecía demasiado bueno para ser verdad, y así ha sido.

Cuando recibo el paquete y lo abro, me encuentro la tarjeta en una funda de plástico bastante más grande de las que usa Sandisk últimamente, incluso más grande que las que se usaban antes. Saco la tarjeta, y algo no estaba bien. Podéis ver en las fotos que la tarjeta parece genuina, pero tenia un tacto extraño, como si el plástico estuviera mal cortado.

En fin, vamos a probarla. Según la descripción, es una tarjeta de clase 6, lo que nos garantiza una transferencia mínima de 6MB/s. Con un pequeño programa que he preparado, me dedico a copiar ficheros de 10M y medir tiempos: 4MB/s de media. Algo no esta bien definitivamente. Intento descartar el factor humano, probando con otras tarjetas: una Ultra II da 8MB/s, y un modelo anterior de Extreme III unos 14MB/s. Confirmado: esta tarjeta no es lo que dice ser.

Entro en la web de Sandisk y pruebo a registrar el producto con el número de serie, ningún problema. Miro por la sección de soporte: tienen live chat. Probemos.

Después de una breve espera y tras unos minutos de conversación (describiendo la tarjeta y enviándoles fotos) llegan a la conclusión:

Upon checking, the details that you have provided didn’t match that of a genuine SanDisk memory card.

O lo que es lo mismo: más falsa que un billete de 300.

No pasa nada, la devuelvo y listo. Por un segundo, me debato entre simplemente contactar con el vendedor o abrir una disputa en Paypal… Esto es fraude, mejor disputa, por si acaso. 10 minutos después me dice Paypal que mi disputa se ha cerrado. Segundos antes de volverme loco, me doy cuenta de que el vendedor me había reintegrado el importe, y ha tenido el detalle de decir que no hacía falta que le enviase la tarjeta.

Durante la conversación con Sandisk, me he dado cuenta de otros detalles sutiles:

  • El interruptor para bloquear la escritura es blanco, mientras que en el resto de tarjetas Sandisk que he visto es gris.
  • La velocidad aparece por delante en un 6 dentro de una C (debajo del III de Extreme). En la parte trasera aparece un 8 (o una ¿B?) dentro de la C
  • El logo de Sandisk en la parte trasera esta un poco mal impreso

Este es el segundo artículo que tengo que devolver en eBay en pocos meses (y no compro tanto), cada vez me da menos confianza. Es una lástima.