Uso de los pseudoelementos :before y :after de CSS3

¿Cuántas veces has tenido que poner una coletilla al lado de varios elementos en una web? Por ejemplo, poner la palabra «Error» antes de un mensaje de error. ¿No te encantaría que eso pudiera automatizarse?.

Pues con CSS3 puedes hacerlo. Con los pseudoelementos :before y :after. Estos te permiten añadir un contenido html antes (:before) o después (:after) de un elemento desde vuestra hoja de estilos. Para ello utilizaremos la propiedad «content». Vamos con un ejemplo, en el que añadiremos la palabra «Error» antes de un mensaje de error (vamos primero con lo más simple)

.error:before{
  content:"Error: ";
}

Furrula hasta en IE8 (7 no, no pidáis milagros), así que podéis ir trasteando con esto. Hay más posibilidades, claro, porque si sólo pudiéramos meter un textillo la cosa quedaría sosa. Lo primero, podemos dar estilos al contenido generado por estos elementos, como con cualquier otro elemento textual de la web:

.error:before{
  content:"Error: ";
  color:#FF0000;
  font-weight: bold;
}

O podemos incluir una imagen en lugar de un texto:

.error:before{
  content:url("carpetaimagen/imagenejemplo.png");
}

O crear un contenedor:

.error:before{
  content:"";
  display:block;
  background-color:#666;
  width:32px;
  height:32px;
  border:2px solid #ff0000;
}

Eso sí, hay una cosa que debemos tener en cuenta: a la hora de accesibilidad y del uso de lectores de pantalla, por ejemplo, estos textos/imágenes están generados por CSS, no son parte del DOM, no forman parte del contenido en si de la web, por lo que no serán interpretados por estos. Es decir, mejor no crear contenido relevante con esto, tanto por la accesibilidad como por el hecho de que los buscadores no lo indizarán.

La propiedad css background-size y como hacerla funcionar en IE8

Si usas una imagen de fondo en alguna ocasión te habrás visto en la necesidad de usar una que se adapte al tamaño del elemento contenedor. La propiedad CSS3 background-size permite definir el tamaño de esta imagen, ya sea en píxeles o con un porcentaje relativo al tamaño del contenedor. Se definen dos parámetros para el tamaño: el primero es el alto y el segundo el ancho.

/*Este daría un alto de 250px y un ancho de 50*/
background-size:250px 50px; 
/*Este cubriría todo el contenedor*/
background-size:100% 100%;

Como os podéis imaginar, si andáis modificando tamaños la imagen se deformará al romperse la proporción de las medidas.

Existen además de estas medidas dos propiedades que podéis aplicar: cover y contain.

  • Contain: Esta propiedad escala la imagen de forma que mantenga las proporciones y ocupa o el alto o el ancho (dependiendo de la proporción)
  • Cover:Esta propiedad escala la imagen al mínimo tamaño, manteniendo también las proporciones, para que ocupe todo el contenedor. Es posible que esto provoque que parte de la imagen no se vea.
background-size:contain; 
background-size:cover;

Y ahora vamos con el problema (con el que me vi esta tarde): hemos acabado de maquetar, probamos en todos los navegadores y funciona. Entonces en Explorer empezamos con los modos de compatibilidad, y sin problemas en Explorer 10 y 9 pero, al llegar al 8, todo a tomar por culo… tras maldecir a Bill Gates, a Windows, al Explorer y compartir mis cuitas con los compañeros de curro toca buscar una solución… y aparece en StackOverflow, como no.

Con lo que basándome en eso, dejo el css como está, con su background-size que está furrulando en todos los navegadores (menos en Explorer 8 y previos) y en el marcado html modifico el div con el siguiente código, para que así la imagen ocupe todo el contenido:

<div style='filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/logo.gif',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/logo.gif',sizingMethod='scale')";'></div>

En fin, hasta que no queden eliminados todos los IE8 habrá que recurrir a este truquito para hacer funcionar esto. Conste que no soy partidario de usar imágenes de fondo, la verdad.

Etiquetas META

A la hora de elaborar una web y posicionarla en buscadores las etiquetas META (Metatags) son fundamentales, ya que nos permiten añadir cierta información que será invisible para el usuario de la web pero visible en las búsquedas. Vamos a verlas

  • Title: Empezamos por esta etiqueta dado que es fundamental en el posicionamiento y además tiene un comportamiento distinto al resto. Distinto porque será visible para el usuario, ya que será el título en la cabecera del navegador/pestaña. Según las especificaciones de la W3C es obligatoria y cada página de tu web debe tener una title distinta, dado que el contenido repetido será sancionado por Google (en cuanto a Bing y Yahoo ya no se, pero no os vendrá mal). Se suelen recomendar sobre 70-80 caracteres de longitud, más o menos.
  • Keywords: Hace años era fundamental para el SEO pero actualmente el abuso de esta etiqueta, en la que se listaban palabras clave, ha provocado que los navegadores las ignoren, al menos según dice Google (algunos sostienen que siguen funcionando), que afirman que tienen una cierta relevancia a la hora de definir el contenido de la página, pero no a la hora de posicionar. No metas muchas, no más de 15 palabras.
  • Description: Fundamental en los últimos años, la etiqueta description nos permite añadir una descripción de la página que será usada por el navegador para posicionar la web, además de ofrecer al usuario una explicación del sitio. Cuando compongáis el texto descriptivo intentad meter una gran densidad de palabras clave (sin excesos que provoquen que el texto sea un galimatías) y con una longitud de entre 250 y 300 caracteres, haciendo una pequeña sinopsis del contenido de la web.
  • Robots: La etiqueta robots es una alternativa al robots.txt, aceptando los pares de valores Index/NoIndex y Follow/NoFollow. Como ya te imaginas te permite configurar las opciones de rastreo e indexación.
  • Otras: Existen, además, otras etiquetas menos usadas como Author, Subject, Language… que han caído en desuso ya que no eran usadas por los buscadores, o incluso eran contraproducentes para la web.

Estas etiquetas no son la panacea en cuanto a SEO, su uso no te garantiza un buen posicionamiento en los buscadores, pero el descuidarlas o tenerlas mal en cambio sí ue puede perjudicaros profundamente.

Un ejemplo de cómo se usarían en una cabecera

<head>
	<title>Macariowar | Tienda | Sacacorchos</title>
	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
	<meta name="description" content="Sección de sacacorchos de la tienda Online de Macariowar, nombre absurdo inspirado por Manowar."/>
	<meta name="keywords" content="Aragón, Macariowar, tienda, hostelería, sacacorchos, sacachapas" />
<!-- Aquí los enlaces a css y javascript-->
</head>

Pie de página siempre al final de la web

Seguro que alguna vez os ha pasado que os trabajáis una maquetación que se ve de puta madre en vuestra pantalla de 15 pulgadas, pero al verla en una 22… ale, el pie al medio de la página. No hay contenido suficiente para llenar toda esa pantalla. Una opción es usar un posicionamiento absoluto, pero claro, si es una web con varias páginas igual en otra sí tienes suficiente contenido y entonces te queda un pie fijo en la parte de abajo del monitor aunque tengas que scrollear para ver toda la info.

Pero hay una solución, básicametne consiste en envolver todo el contenido superior al footer en un div contenedor, darle un alto mínimo del 100% de la pantalla, meterle debajo un margen negativo y allí insertar el pie. Ok, dicho así suena muy árido. Vamos con un ejemplo progresivo. Imaginemos que el que sigue es nuestro código:

<div id="header">Aquí la cabecera</div>
    <div id="nav">
       <ul>
          <li><a href="#">Inicio</a></li>
          <li><a href="#">Primera</a></li>
          <li><a href="#">Segunda</a></li>
       </ul>
     </div>
<div id="content">Contenido interesante y original que te hará ganar posicionamiento en google.</div>

<div id="footer">Y aquí ese pie que no se nos queda abajo.</div>

Bueno, pues lo primero es el marcado (luego ya nos ponemos con el CSS). La idea es, como he dicho, encerrar todo el contenido en un div que será un contenedor general, y por si acaso al final de este metemos un div vacío con la misión de evitar problemas si hay elementos flotados encima.

<div id="container"> <!--El container-->
  <div id="header">Aquí la cabecera</div>
    <div id="nav">
       <ul>
          <li><a href="#">Inicio</a></li>
          <li><a href="#">Primera</a></li>
          <li><a href="#">Segunda</a></li>
       </ul>
     </div>
  <div id="content">Contenido interesante y original que te hará ganar posicionamiento en google.</div>
  <div class="clear"></div><!--El citado div para evitar problemas con "flotaciones"-->
</div><!--cerramos el container-->
<div id="footer">Y aquí ese pie que no se nos queda abajo.</div>

Bueno, eso está listo. Ahora toca ceeseesear (CSS) todo. Como ya he dicho, la idea es dar a todo el contenedor un tamaño mínimo del 100% de la altura, meterle un margen negativo por abajo y allí insertar el pie. Vamos a meter un pie de 50px de alto en el ejemplo.

/*Lo primero, todo el cuerpo que ocupe el 100%*/
html, body {    
   height: 100%; 
}

/*Lo segundo, el container, con algura mínima del 100% y un margen inferior negativo igual al alto que queramos darle al pie*/
#container {
   min-height: 100%;
   margin-bottom: -50px;
   position: relative;
}

/*Lo tercero, el pie con la altura deseada (igual al margen negativo de antes)*/
#footer {
   height: 50px;
   position: relative;
}

/*Y terminamos con el clear, que ha de ser tan alto como el pie y "limpiar" todos los floats*/
.clear{
   height: 50px;
   clear: both;
}

Y con esto ya está, en todos los navegadores superiores a IE6 (y como IE6 está descontinuado por Microsoft ni me voy a molestar en buscar solución, aunque creo que basta con cambiar el min-height del container por height).

Artículo dedicado con cariño a Gaius Baltar, que se lo había prometido en el feisbuck… jojojo

Crear un archivo robots.txt

Como sabréis, los motores de búsqueda se sirven de «robots», programas que indexan las páginas web alojadas en un servidor, para que estas puedan ser localizadas por el buscador (Google, yahoo…). Por defecto todos los robots tendrán el acceso permitido y podrán ver todo lo que tengamos alojado en la raíz de nuestro servidor, y en muchos casos eso no nos interesa.

¿Cómo arreglamos esto? Con el robots.txt, archivo que generalmente guardaremos en la raíz de nuestro servidor. En él podemos incluir qué directorios queremos desactivar y para qué bots. Un ejemplo simple: este robots.txt bloquería todo el directorio raíz (con todos sus subdirectorios) para todos los bots:

User-agent: *
Disallow: /
#y si quieres poner comentarios, que no serán interpretados por los bots/crawler basta con comenzar la línea con este carater#

Las utilidades del robots.txt pueden ser más de las que a priori imaginas. Obviamente evita que se indexe contenido que quieras mantener oculto o protegido, pero también te permite evitar que se indexe contenido duplicado (recuerda, el contenido duplicado rebaja tu page-rank), impedir la idexación de bots no deseados (no todos los bots son de buscadores legítimos) y si tienes un site con mucho tráfico evitará una carga de trabajo extra sobre el servidor.

Vamos a ir por partes, explicando algunas peculiaridades.

La primera es que puedes incluir varios Disallow bajo un mismo user agent, pero no varios user agent encima de un disallow.

#así sí
User-agent: bingbot
Disallow: /wp-content/
Disallow: /js/

User-agent: Googlebot
Disallow: /wp-content/
Disallow: /js/

#así NOOOOOOO
User-agent: bingbot
User-agent: Googlebot
Disallow: /wp-content/
Disallow: /js/

En cuanto al uso de comodines y expresiones regulares… puedes usarlos específicamente para
Googlebot y Slurp (el bot de Yahoo). Por lo que he leído el resto no las aceptan, así que no lo intentes usar de forma general ya que muchos crawlers no lo entenderán y sí indizarán esa página.

#esto bloquería todos los archivos .js para Slurp
User-agent: Slurp
Disallow: /*.js?

#esto lo bloquería para Slurp y Googlebot, pero el resto no lo entenderían e indizarían
User-agent: *
Disallow: /*.js?

Si tienes un sitemap en el servidor puedes incluirlo en el robots.txt con una simple línea:

Sitemap: http://miservidor/sitemap.xml

Y, como te decía arriba, también puedes reducir la frecuencia de rastreo para que los bots no estén entrando todo el día. Si tienes una web con muchas visitas pero pocas actualizaciones basta con especificarlo con Crawl-delay. Eso sí, no todos los bots lo soportan:

#así le dirías al robot de Bing que sólo entre cada 45 días
User-agent: bingbot
Crawl-delay:45

También se puede usar la palabra Allow en lugar de Disallow… pero por defecto todos los directorios y archivos están permitidos y, además, no todos los bots lo van a entender. Así que mejor Disallow para restringir zonas que Allow para habilitarlas.

Recuperar una contraseña perdida en Ubuntu

Me pasó ayer que a una amiga mía le dejaron un equipo con Ubuntu 12.10 instalado y quería que le ayudara con algunas cosillas. Era la primera vez que usaba un sistema Linux. Si recordáis vuestra «primera vez» os imagináis que estaría llena de dudas (yo estaba lleno de dudas, y eso que llegué a Linux mayor y curtido, después de haber bregado en MS-DOS y con el BASIC de Amstrad en mis inicios informáticos) así que fui para echarle un ojo al equipo e intentar aclararle las preguntas que pudiera tener. Y claro, el primer problema que me encuentro es que el le dejó el equipo le dijo la contraseña, pero no se la escribió… eran varios caracteres pero por cuestiones fonéticas y de mayúsculas/minúsculas y espacios teníamos como… no sé, un huevo y medio de combinaciones. Conclusión, acabo antes cambiando la contraseña que intentando sacar esa por fuerza bruta.

Lo primero para recuperar la contraseña es arrancar en el modo recovery. Para hacer esto tienes que arrancar el equipo y después de que cargue la BIOS, y antes de que aparezca el logo de Ubuntu, pulsáis SHIFT para entrar a GRUB. Allí váis a la línea «Advanced Options» y tras ello seleccionáis la línea que acaba con (recovery mode).Y finalmente elegís la opción Drop to root shell prompt.

Bueno, ya estáis en una consola con permisos de root. Ahora os toca «montar» la partición / para poder escribir en ella:

mount -o remount,rw /
#y si tienes otras particiones las puedes montar con
mount --all

Muy bien, con la partición montada ya puedes escribir en el disco, ahora sólo te queda escribir

passwd nombre_de_usuario

Tras esto te pedirá que escribas dos veces la nueva contraseña (dos veces para confirmar que la escribes bien, por seguridad). Ahora sólo te queda apagar o reiniciar. Tienes varias opciones que pueden ser las siguientes:

#reiniciar
init 6
#apagar
init 0
#apagar (otra forma)
shutdown -r now
#reiniciar (otra forma)
reboot

Y contraseña perdida reseteada.