CSS 3 object-fit: cover y contain

Sin duda CSS3 nos va a permitir hacer cosas que hasta ahora eran bastante complejas de hacer, al menos si se querían hacer bien. Aunque todavía casi ningún navegador le da soporte (yo lo he probado con Opera 12a), me gusta mucho las funciones de object-fit que permiten, de forma sencilla, integrar imágenes o incluso vídeos dentro de un espacio determinado, o adaptarlo a unos tamaños a los que hasta ahora estábamos forzados.

He hecho la prueba en Internet Explorer 9.0, Google Chrome 16.0, Mozilla Firefox 9.0 y Opera 12a y sólo en este último he conseguido que esto funcione…

El objetivo es hacer lo siguiente (imagen basada en Opera 12a):

Object Fit: Contain

Básicamente es meter la imagen dentro de un espacio definido. En mi caso era meter la imagen en un cuadrado de 150px x 150px. Para ello tan sólo hay que ejecutar el siguiente código de CSS.

width: 150px;
height: 150px;
border: 1px solid black;
-ms-object-fit: contain;
-moz-object-fit: contain;
-o-object-fit: contain;
-webkit-object-fit: contain;
object-fit: contain;

Con esto conseguimos meter la imagen dentro del recuadro, como se ve en la imagen.

Object Fit: Cover

En este caso tenemos algo similar, pero lo que hace es adaptar la imagen del alto o ancho (la menos de ellas) al ancho o alto propuesto por el código… esto significa que siempre habrá un sitio por el que sea más grande si la imagen no es cuadrada.

width: 150px;
height: 150px;
border: 1px solid black;
-ms-object-fit: cover;
-moz-object-fit: cover;
-o-object-fit: cover;
-webkit-object-fit: cover;
object-fit: cover;

Podéis ver un ejemplo en real en la página de ejemplo de CSS3 object-fit que he hecho para probar o visitar la página del W3C donde se explican más detalles sobre object-fit.

Data URI mejor que CSS Sprites

Una de las cosas que más a bombo y platillo se nos ha intentado meter en la cabeza en los últimos tiempos es que era mejor usar los CSS Sprites que no un montón de imágenes. Y es cierto, es mejor lo primero que lo segundo… ¿pero es lo óptimo? No.

En alguna ocasión he hablado ligeramente sobre las peticiones HTTP y lo que afectan en cuanto a la velocidad de carga de un sitio; una de esas cosas que comenté en su momento fue la de usar los Data URI. Y es que el uso de los CSS Sprites está muy bien si hablamos de navegadores como Internet Explorer 6 o 7, pero desde que tenemos los Internet Explorer 8, Firefox 3 u Opera 9 podemos ir a por un nivel más.

Hoy en día es mucho más óptimo reducir el número de peticiones que no el hecho del tamaño de los elementos en sí. la velocidad de conexión media ha aumentado de tal forma que no es un problema que los ficheros ocupen mucho, sino que haya muchos ficheros distintos, y esto es lo que consiguen los Data URI. Este método básicamente permite insertar imágenes directamente en el código de ficheros CSS y HTML codificando los elementos en Base64.

Teniendo en cuenta los navegadores que dan soporte a los Data URI, tenemos una buena forma de actuar:

  • Firefox 2+
  • Opera 7.2+ (no más de 4.100 caracteres)
  • Chrome
  • Safari
  • Internet Explorer 8+ (menor de 32 KB)

¿Y cómo es un Data URI? Pues algo tans encillo como esto:

data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge
8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1h
LnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g
77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7

Este elemento, convertido en un CSS podría ser algo tal que así:

.icono {
  background: url(data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS
  /7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AA
  ARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguW
  w6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7) no-repeat;
}

Para aquellos que quieran automatizarlo, existen una opción en PHP que lo hace… algo tal que así:

<?php
echo base64_encode(file_get_contents("icono.gif"));
?>

Y ya tenemos más optimizadas las peticiones HTTP de nuestro sitio… menos peticiones, mayor velocidad (sobre todo teniendo en cuenta que los CSS se cachean si se organizan bien y se reducen también las peticiones para verificar imágenes actualizadas).

Crear un efecto “desbloquear” de iPhone

Seguro que en alguna ocasión te gustaría hacer una versión de tu web para dispositivos móviles y añadir un toque iPhone. Es por esto que Chris Coyier ha creado un efecto “slide to unlock” en el que podemos apreciar, sobretodo en motores WebKit, el efecto a todo rendimiento.

Entre otras cosas, hay ese efecto degradado y gracias a jQuery también la posibilidad de hacer ese efecto slide.

El sistema aprovecha códigos CSS como el -webkit-animation: slidetounlock 5s infinite; y la función -webkit-keyframes slidetounlock.

El ejemplo funciona en motores Webkit al 100% (Safari y Chrome), aunque se pueden analizar los códigos del CSS y JavaScript.

Código CSS


* { margin: 0; padding: 0; }
html { background: black; }
body {
  font: 14px Georgia, serif;
  background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #3b3b3b),color-stop(1, #000000));
  background-repeat: no-repeat;
  min-height: 350px;
}
#page-wrap { width: 720px; margin: 0 auto; padding-top: 100px; }
#well {
  padding: 14px 20px 20px 20px;
  -webkit-border-radius: 30px;
  background: -webkit-gradient(linear,left top,left bottom,color-stop(0, #010101),color-stop(1, #181818));
  border: 2px solid #454545;
  overflow: hidden;
}
h2 {
  font-size: 80px;
  background: -webkit-gradient(linear,left top,right top,color-stop(0, #4d4d4d),color-stop(0.4, #4d4d4d),color-stop(0.5, white),color-stop(0.6, #4d4d4d),color-stop(1, #4d4d4d));
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  -webkit-animation: slidetounlock 5s infinite;
  font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
  font-weight: 300;
  padding: 0;
  width: 200%;
}
h2 img {
  vertical-align: middle;
}
@-webkit-keyframes slidetounlock {
  0% {
    background-position: -720px 0;
  }
  100%{
    background-position: 720px 0;
  }
}

Código JavaScript


$(function() {
  $("h2 img").draggable({
    axis: 'x',
    containment: 'parent',
    drag: function(event, ui) {
      if (ui.position.left > 550) {
        $("#well").fadeOut();
      }
    },
    stop: function(event, ui) {
      if (ui.position.left < 551) {
        $(this).animate({
          left: 0
        })
      }
    }
  });
});

Reproductor HTML 5 para vídeo

Estamos muy mal acostumbrados a que nuestros vídeos se alojen en FLV en sitios como Youtube o Vimeo. Hoy en día teniendo en cuenta que el ancho de banda está tirado de precio, no entiendo porqué no se tiende a la calidad y a alojar la propia información si que otros decidan.

Con HTML 5 y su nuevo elemento <video> tenemos la posibilidad de incluir muchos formatos de vídeo con muchas opciones… y para hacerlo ya todo más sencillo, además de hacerlo compatible con versiones anteriores que no soportan los nuevos formatos, están apareciendo algunos sistemas que permiten estos reproductores de una forma “chula” y fácil.

Algunos de los que he encontrado son estos:

  • FlareVideo: Necesita de jQuery y el soporte es, a mi gusto, un poco reducido… hay que programar expresamente para ello.
  • MediaElementsJS: También necesita de jQuery, soporta todos los navegadores e incluso terminales móviles. Hay que incluir el nuevo tag <video> y unas pocas líneas más… Esto significa que cuando todos los navegadores den soporte, se quita y todo seguirá funcionando.
  • JW Player: La nueva versión de este tan utilizado reproductor ya es compatible con HTML 5. Necesita de jQuery y aun está en βeta.
  • VideoJS: No necesita de librerías externas y funciona gracias al elemento <video>, lo que, en principio, a mi me da mucha seguridad. Funciona con todos los navegadores y soporta los nuevos formatos.
  • SublimeVideo: Aunque aun no ha salido oficialmente, lo que se puede ver es parecido al VideoJS, es decir, que no necesita de librerías externas y funciona gracias al elemento <video>. En principio funciona con todos los navegadores, soporta la mayoría de formatos.

CSS hacks para Internet Explorer 6 y 7

En muchas ocasiones nos encontramos que necesitamos aplicar algún tipo de estilo específico a Internet Explorer 6 o 7, que son los navegadores que menos funcionalidades CSS soportan pero que aún tienen una cantidad elevada de usuarios.

En estos casos, y debido a algunos errores en el funcionamiento del navegador, tenemos la posibilidad de ejecutar un pequeño hack que no afecta al resto.

El sistema es sencillo. Internet Explorer tiene un fallo y es que los atributos de los CSS permiten los símbolos “*” y “_” delante. Tomando de ejemplo este código a continuación, podemos ver algunos detalles:

.fondo {
  background: Green; /* Todos los navegadores */
  *background: Yellow; /* Sólo Explorer 6 y 7 */
  _background: Red; /* Sólo Explorer 6 */
}

¿Qué significaría esto? Pues que, todos los navegadores excepto Internet Explorer sólo leerían la primera línea, que es la única correcta. En el caso de Internet Explorer 8, también sólo leería la primera (las otras dos ya no, porque son erróneas). En el caso de Internet Explorer 7, como lee en orden y prima la última cosa correcta, de las 3 líneas leería hasta la segunda, porque el 7 no entiende la tercera, claro está.

En el caso de Explorer 6 es bastante similar… va leyendo en orden, y como entiende las 3 líneas, se queda con la tercera “porque es la última”… De esta forma, si queremos jugar con algunos pequeños hacks para Internet Explorer 6, 7 y 8 podemos hacerlo mediante este curioso sistema (gracias a los fallos que llevan las versiones anteriores)…

HTML 5: las pseudo-clases para mayor interactividad

Está claro que hoy en día el HTML no es nada sin los CSS, y hay algunos elementos que tienen algunas pseudo-clases que permiten algunas mejoras a la hora de interactuar con los estilos o diseños.

Con la nueva versión, el HTML 5 tiene algunas clases que en las versiones anteriores no existían… aquí la lista de clases:

  • : link: Son enlaces (o elementos) que no hayan sido visitados.
  • : visited: Son enlaces (o elementos) que sí han sido visitados.
  • : active: Son enlaces (o elementos) que están activados (por ejemplo, en el momento en el que hace clic en ellos).
  • : enabled: Son elementos que están activos, como enlaces, botones, formularios…
  • : disabled: Para los elementos contrarios al anterior, aquellos que en ese momento están desactivados.
  • : checked: Para los formularios que tengan activada alguna opción.
  • : indeterminate: Para los input con el estado indeterminate.
  • : default: Cuando el formulario es por defecto.
  • : valid: Si la validación del formulario es correcta.
  • : invalid: Todo lo contrario, si falla al validar.
  • : in-range: si los valores del formulario están en el rango correcto.
  • : out-of-range: Como antes, pero al revés, si los valores se salen del rango.
  • : required: Si el valor es obligatorio en el formulario.
  • : optional: Cuando los valores son opcionales en el formulario.
  • : read-only: Si los valores del formulario (aunque casi todos los elementos del HTML lo permiten) son sólo lectura.
  • : read-write: Para aquellos elementos que se pueden editar.

A parte de estos, también esta el : target, aunque si he de decir la verdad, no queda muy claro exactamente su funcionamiento. Y, claro está, luego está todo el sistema de selectores que tiene específicamente el CSS 3 que permite hacer cosas muy interesantes incluidos los valores de los elementos y atributos.

CSSTidy: optimizar CSS es fácil

Una de las cosas por las que no solemos preocuparnos mucho es por los CSS. Solemos hacer un CSS más o menos bien formado, pero a partir de ahí nos limitamos a subirlo al servidor y poco más. Pero… si os digo que se puede ahorrar hasta un 25% en un CSS, ¿no sería interesante aplicarlo?

La idea es que los CSS, al ser un elemento de los que se han de cargar antes que “se pinte” el HTML interesa que sea rápido en descargar. Además, es un elemento que suele estar en todas las páginas, y aunque el navegador suele cachearlo, vale la pena que ocupe poco…

Una de las herramientas que podemos implementar directamente en nuestro servidor es el CSSTidy, que tiene unas opciones para PHP bastante sencillas.

El ejemplo básico podría ser este:

<?php
include('class.csstidy.php');
$css_code = "a {
  color:black;
  background-color:blue;
}";
$css = new csstidy();
$css->set_cfg('remove_last_;',TRUE);
$css->parse($css_code);
echo $css->print->formatted();
?>

Un ejemplo no tan básico podría ser este:

<?php
$css_code = file_get_contents("http://www.example.com/estilo.css");
include("class.csstidy.php");
$css = new csstidy();
$css->set_cfg("preserve_css",true);
$css->load_template('high_compression');
$css->parse($css_code);
$min = $css->print->plain();
?>

Las opciones que yo dejaría son (aunque puede que se pueda mejorar con alguna otra combinación):

  • remove_bslash = true;
  • compress_colors = true;
  • compress_font-weight = true;
  • lowercase_s = true;
  • optimise_shorthands = 0;
  • remove_last_; = true;
  • case_properties = 0;
  • sort_properties = true;
  • sort_selectors = true;
  • merge_selectors = 1;
  • discard_invalid_properties = true;
  • css_level = ‘CSS2.1′;
  • preserve_css = true;
  • timestamp = false;

En fin, una interesante herramienta que podemos ver en acción directamente en CSS Compressor, que es la herramienta que habitualmente utilizo yo.

Open Standard Media (OSM) Player

Uno de los poyos que siempre me he encontrado a la hora de poner un reproductor de vídeo en la web es que en la mayoría de casos sólo aceptaba vídeos flash (.flv). La cosa es que con el HTML 5 y con jQuery se han montado un reproductor llamado Open Standard Media que tiene muy buena pinta, es código abierto y gratuito.

Entre otras cosas, permite el uso de HTML 5, soporta los nuevos elementos audio y video del HTML 5 con los formatos estándar, para el resto de formatos monta un reproductor Flash, se le puede cambiar el diseño de una forma sencilla gracias al uso de ThemeRoller, permite la integraciónd e vídeos de Vimeo y Youtube (simplemente indicando la URL), tiene la opción de listados de vídeos.

La instalación es muy sencilla, ya que sólo hay que añadir un par de JavaScript en la cabecera, poner el código básico del reproductor, y al final de la página, puedes incorporar un listado de los vídeos o una llamada a un XML que los tenga. Aun así, creo que la opción más sencilla es la de usar la librería en PHP, que con unas pocas líneas funcionaría:

<?php
include("OSMPlayer.php");
$player = new OSMPlayer(array(
  'file' => 'http://www.mysite.com/files/myvideo.flv',
  'image' => 'http://www.mysite.com/files/myimage.jpg',
  'disablePlaylist' => true
));
?>
<html>
  <head>
    <title>Open Standard Media (OSM) Player: PHP Demo</title>
    <script type="text/javascript" src="jquery-ui/js/jquery.js"></script>
<?php
print $player->getHeader();
?>
  </head>
  <body>
    <h2>Open Standard Media (OSM) Player</h2><br/>
<?php
print $player->getPlayer();
?>
  </body>
</html>

Con esto tendríamos un reproductor sencillo, aunque también se puede complicar un poco si le añadimos una lista de reproducción que nos permita visualizar decenas de vídeos… o si queremos modificar algunos parámetros, aquí está la lista de todos los disponibles…

font dragr: prueba tus fuentes sólo arrastrándolas

Aunque hago un parón en cuanto a publicar de HTML 5, he encontrado esta herramienta, web o como queramos llamarlo que tiene su gracia, sobretodo si te dedicas a maquetar o eres diseñador.

El sitio se llama font dragr y básicamente es una página en la que arrastrando un fichero de tipo de letra -truetype (ttf), opentype (otf), scalable vector graphics (svg) o Web Open Font Format (WOFF)- te actualizará los textos de la página con esa fuente. Además, el contenido original de la página es editable, por lo que puedes poner un texto de ejemplo y así ver cómo quedaría directamente en el navegador web.

Otro detalle que ya avisan es que lo de arrastrar sólo funciona con in Firefox 3.6, que es, en estos momentos, el único que soporta esas funcionalidades de HTML5. Entre las cosas que se usan encontramos el uso del sitio en modo offline, la API de arrastrar y soltar, la de gestión de ficheros, la de editar contenidos, la del uso del @font-face, gradientes, bordes redondeados, sombras…

CSS Reset para HTML 5

Llevo varios días intentando encontrar un CSS Reset pero para HTML 5. Hasta ahora usaba el de Yahoo! YUI, pero incluso la versión 3 no da soporte a las nuevas etiquetas. Por eso me he decidido a revisar un poco los elementos que hay hasta ahora e intentar ofrecer una primera versión del CSS Reset para HTML 5.

html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td,hr,iframe,embed,object,legend{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var,optgroup,a,small,q,time,samp,kbd,sup,sub,mark,col,colgroup,tbody,thead,tfoot,tr,td,th,label,input,button,textarea,select,optgroup,option,label,output{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;font-variant:normal;}i{font-style:italic;}b{font-weight:bold;}del,ins{text-decoration:none;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:baseline;}sub{vertical-align:baseline;}legend{color:#000;}input,button,textarea,select{*font-size:100%;}header,article,section,aside,footer,nav,hgroup,address,figure,figcaption,video,audio,legend,datalist,optgroup,details,summary,command,menu{display:block;margin:0;padding:0;}

Se puede descargar el CSS Reset para HTML 5.

NOTA: Que conste que es una propuesta personal, basándome en la mayoría de los elementos que propone el HTML 5.

ACTUALIZACIÓN: Me han pasado este de Rich Clark.