Diferencia entre revisiones de «Usuario:Juanda/html5/Introducción»

De WikiEducator
Saltar a: navegación, buscar
(Modernizr.load())
 
(59 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
{{Usuario:juanda/html5/nav }}
 
{{Usuario:juanda/html5/nav }}
  
{{#widget:Slides}} {{MiTitulo| HTML5}}  
+
{{#widget:Slides}} {{MiTitulo| HTML5 Boilerplate}}  
 
<div class="slides layout-regular template-default">
 
<div class="slides layout-regular template-default">
 
<div class="slide">
 
<div class="slide">
==H5BP==
+
=H5BP=
 
</div>
 
</div>
 +
 
<div class="slide">
 
<div class="slide">
===Introducción===
+
====Introducción====
*Pasos para crear un sitio web:
+
*Utilizaremos la versión 4.3.0 de HTML5 BoilerPlate, de septiembre de 2013
: Establecer la estructura básica del sitio web.
+
*Es una plantilla que ayuda a confeccionar un sitio web en múltiples aspectos: compatibilidad navegadores, configuración servidor Web, estadísticas de la web, rendimiento...
: Añadir contenidos, estilo y funcionalidad
+
*Quizá haya conceptos que queden todavía un poco "desconocidos". Tocaremos muchos temas durante el curso.  
: Probarla de forma local
+
*Echa otro ojo a este documento otra vez cuando acabes el curso :-)
: Opcionalmente ejecutar un script de automatización: ant build script o node build script.
+
: Desplegar el sitio web
+
 
</div>
 
</div>
 
  
 
<div class="slide">
 
<div class="slide">
 +
====Pasos para crear un sitio web====
 +
*Establecer la estructura básica del sitio web.
 +
*Añadir contenidos, estilo y funcionalidad
 +
*Probarla de forma local
 +
*Opcionalmente ejecutar un script para automatizar la optimización de la web: ant build script o node build script.
 +
*Desplegar el sitio web
 +
</div>
  
=== Estructura básica ===
+
<div class="slide">
 +
==== Estructura básica ====
 
Esta es la estructura básica sugerida por HTML5 Boilerplate:
 
Esta es la estructura básica sugerida por HTML5 Boilerplate:
 
<pre>
 
<pre>
Línea 41: Línea 47:
 
├── crossdomain.xml
 
├── crossdomain.xml
 
├── favicon.ico
 
├── favicon.ico
└── [apple-touch-icons]
 
 
</pre>
 
</pre>
 
</div>
 
</div>
 +
 
<div class="slide">
 
<div class="slide">
 
*Página index.html
 
*Página index.html
Línea 54: Línea 60:
 
     <head>
 
     <head>
 
         <meta charset="utf-8">
 
         <meta charset="utf-8">
         <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+
         <meta http-equiv="X-UA-Compatible" content="IE=edge">
 
         <title></title>
 
         <title></title>
 
         <meta name="description" content="">
 
         <meta name="description" content="">
         <meta name="viewport" content="width=device-width">
+
         <meta name="viewport" content="width=device-width, initial-scale=1">
  
 
         <!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
 
         <!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
Línea 63: Línea 69:
 
         <link rel="stylesheet" href="css/normalize.css">
 
         <link rel="stylesheet" href="css/normalize.css">
 
         <link rel="stylesheet" href="css/main.css">
 
         <link rel="stylesheet" href="css/main.css">
         <script src="js/vendor/modernizr-2.6.1.min.js"></script>
+
         <script src="js/vendor/modernizr-2.6.2.min.js"></script>
 
     </head>
 
     </head>
 
     <body>
 
     <body>
 
         <!--[if lt IE 7]>
 
         <!--[if lt IE 7]>
             <p class="chromeframe">You are using an outdated browser. <a href="http://browsehappy.com/">Upgrade your browser today</a> or <a href="http://www.google.com/chromeframe/?redirect=true">install Google Chrome Frame</a> to better experience this site.</p>
+
             <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
 
         <![endif]-->
 
         <![endif]-->
  
Línea 73: Línea 79:
 
         <p>Hello world! This is HTML5 Boilerplate.</p>
 
         <p>Hello world! This is HTML5 Boilerplate.</p>
  
         <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
+
         <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
         <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.8.0.min.js"><\/script>')</script>
+
         <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>
 
         <script src="js/plugins.js"></script>
 
         <script src="js/plugins.js"></script>
 
         <script src="js/main.js"></script>
 
         <script src="js/main.js"></script>
Línea 80: Línea 86:
 
         <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
 
         <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
 
         <script>
 
         <script>
             var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
+
             (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
             (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
+
             function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
             g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
+
            e=o.createElement(i);r=o.getElementsByTagName(i)[0];
             s.parentNode.insertBefore(g,s)}(document,'script'));
+
             e.src='//www.google-analytics.com/analytics.js';
 +
             r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
 +
            ga('create','UA-XXXXX-X');ga('send','pageview');
 
         </script>
 
         </script>
 
     </body>
 
     </body>
Línea 89: Línea 97:
 
</source>
 
</source>
 
</div>
 
</div>
 +
 +
 
<div class="slide">
 
<div class="slide">
===Hacks en CSS===
+
====Hacks en CSS====
 
*Comentarios condicionales
 
*Comentarios condicionales
Creados por Microsoft para su navegador. Cualquier otro navegador asumirá que es un comentario el código html intermedio:
+
Creados por Microsoft para su navegador. Cualquier otro navegador lo entenderá como un comentario.
 
<source lang="html4strict">
 
<source lang="html4strict">
 
<!--[if CONDICION]> Código HTML <![endif]–>
 
<!--[if CONDICION]> Código HTML <![endif]–>
Línea 98: Línea 108:
 
Ejemplo:
 
Ejemplo:
 
<source lang="html4strict">
 
<source lang="html4strict">
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
 
</source>
 
</source>
 +
Para indicar a IExplorer que utilice la última versión de su rendering engine (puede tener varias) o  Google Chrome Frame si está instalado:
 +
<source lang="html4strict">
 +
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 +
</source>
 +
</div>
 +
 +
<div class="slide">
 +
====viewport====
 +
*Por defecto los navegadores móviles muestran con un ancho determinado la página (en el caso del iPhone, 980px, por ejemplo).
 +
*Las páginas no sólo se mostrarán reducidas, sino que además no se aplicarán nunca nuestras @media queries que afecten a dispositivos móviles.
 +
*Lo ideal suele ser usar la palabra clave device-width (que representa el ancho del dispositivo), utilizando diseños fluidos y responsivos.
 +
<source lang="html4strict">
 +
<meta name="viewport" content="width=device-width, initial-scale=1">
 +
</source>
 +
Establecemos el viewport de nuestra web igual al viewport que tiene por defecto el dispositivo.
 +
</div>
 +
 +
<div class="slide">
 +
*Para páginas con contenido de un ancho fijo (no fluido), es posible usar un valor estático en píxels.
 +
*En este ejemplo veremos la web "a pantalla completa" pero con una configuración de zoom que provoca que no se vea bien:
 +
<source lang="html4strict">
 +
@viewport {
 +
  width: 980px;
 +
  min-zoom: 0.25;
 +
  max-zoom: 5;
 +
}
 +
</source>
 +
*Esto no encajaría en todos los user agent!!
 +
*con un mínimo zoom de 0.25 para un display de 240px de anchura, nos quedarían 20px sin poder ver.
 +
</div>
 +
 +
<div class="slide">
 +
====Librería normalice====
 +
*Librería que hace que los diferentes elementos renderizados por el navegador se comporten según estándares.
 +
*Es el equivalente mejorado a librerías anteriores que hacían un reset a los CSS del navegador.
 +
*Esta librería es mucho más popular que reset.css, corrige bugs y es menos intrusiva (no hace un unstyled completo de los css del navegador).
 +
<source lang="html4strict">
 +
<link rel="stylesheet" href="css/normalize.css">
 +
</source>
 +
</div>
 +
 +
<div class="slide">
 +
*Ejemplo:
 +
<source lang="html4strict">
 +
/**
 +
* Correct `block` display not defined in IE 6/7/8/9 and Firefox 3.
 +
*/
 +
article,
 +
aside,
 +
details,
 +
figcaption,
 +
figure,
 +
footer,
 +
header,
 +
hgroup,
 +
main,
 +
nav,
 +
section,
 +
summary {
 +
    display: block;
 +
}
 +
</source>
 +
*Las etiquetas html5 que no existen en determinados navegadores, se les dará un display de tipo block
 +
*Para hacer que "existan" será necesario crearlas mediante JavaScript utilizando por ejemplo Modernizr (html5shiv)
 +
</div>
 +
 +
 +
<div class="slide">
 +
====Librería main.css====
 +
<source lang="html4strict">
 +
<link rel="stylesheet" href="css/main.css">
 +
</source>
 +
*Viene con unos css por defecto, principalmente por las diferencias de estilos entre navegadores
 +
*Hay un espacio donde podríamos poner nuestro css específico:
 +
<source lang="html4strict">
 +
/* ==========================================================================
 +
  Author's custom styles
 +
  ========================================================================== */
 +
</source>
 +
</div>
 +
 +
<div class="slide">
 +
====Librería Modernizr====
 +
* Librería JavaScript que detecta si el navegador del usuario implementa las características de html5 y CSS3 de la página actual.
 +
*Único javascript que necesita estar en la parte superior del documento: ¡antes de que se empiece a renderizar la página!
 +
<source lang="html4strict">
 +
<script src="js/vendor/modernizr-2.6.1.min.js"></script>
 +
</source>
 +
</div>
 +
 +
<div class="slide">
 +
====jQuery: ¿CDN o local?====
 +
*CDN significa content delivery network: se suelen utilizar servidores cercanos y utilizados frecuentemente para que la carga de la página sea rápida: normalmente el js ya estará descargado de alguna otra página que utilice el mismo origen.
 +
*Si window.jQuery es undefined habrá habido algún problema al obtenerlo del CDN.
 +
*En este caso, procederemos a insertar en nuestra página la versión local de jQuery.
 +
<source lang="javascript">
 +
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.8.0.min.js"><\/script>')</script>
 +
</source>
 +
</div>
 +
 +
<div class="slide">
 +
 +
====plugins.js y main.js====
 +
*plugin.js: Para los plugin que instalemos (también se pueden incluir en el directorio vendor)
 +
*main.js: Para nuestro propio javascript
 +
<source lang="javascript">
 +
        <script src="js/plugins.js"></script>
 +
        <script src="js/main.js"></script>
 +
</source>
 +
</div>
 +
 +
<div class="slide">
 +
====Google Analytics====
 +
*Herramienta de análisis de las visitas a un sitio web.
 +
*Google recomienda ponerla en la parte superior, para contar todas las visitas
 +
*En la parte inferior, optimizamos el tiempo de carga de nuestra web.
 +
<source lang="javascript">
 +
        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
 +
        <script>
 +
            var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
 +
            (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
 +
            g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
 +
            s.parentNode.insertBefore(g,s)}(document,'script'));
 +
        </script>
 +
</source>
 +
*Veremos Google Analytics con más detalle cuando tratemos el SEO
 +
</div>
 +
 +
 +
<div class="slide">
 +
=Personalización=
 +
</div>
 +
 +
<div class="slide">
 +
====Fichero .htaccess====
 +
*Se trata de un fichero con directivas Apache que sobreescriben a las originales del servidor, a partir del directorio don de se cuelga el fichero
 +
*Se utiliza por ejemplo para:
 +
:Definir un documento html de personalización de errores
 +
:Definir cuando expiran las páginas por temas de caché
 +
:Configuración de mime-types
 +
:Definir reescrituras de URL's
 +
*Ejemplo:
 +
<source lang="html4strict">
 +
ErrorDocument 404 /404.html
 +
</source>
 +
*Si tenemos acceso al servidor, por temas de rendimiento, es mejor poner las directivas anteriores en la configuración del servidor (fichero httpd.conf normalmente).
 +
</div>
 +
 +
<div class="slide">
 +
====Fichero humans.txt====
 +
*Se coloca en la raíz del site y contiene la información de las personas que han colaborado en la web:
 +
:http://www.google.com/humans.txt
 +
*Se puede colgar sin más o también linkarlo mediante: <link rel="author" href="humans.txt" />
 +
*[http://humanstxt.org/humans.txt Ver ejemplo]
 +
*[http://humanstxt.org/ES/Standard.html Como usarlo]
 +
*En minúsculas
 +
</div>
 +
 +
<div class="slide">
 +
====Fichero robots.txt====
 +
*Se coloca en la raíz del site y contiene información sobre tu web para los buscadores: que directorios deben indexar y cuales no, con que frecuencia...
 +
*Ejemplo: Para cualquier robot indicamos que no deben indexar los directorios /cgi-bin, /tmp y /~joe
 +
<source lang="html4strict">
 +
User-agent: *
 +
Disallow: /cgi-bin/
 +
Disallow: /tmp/
 +
Disallow: /~joe/
 +
</source>
 +
*En minúsculas
 +
*Se ve con más detalle cuando estudiemos SEO.
 +
</div>
 +
 +
<div class="slide">
 +
====Fichero favicon.ico====
 +
*Se coloca en la raíz del site, será el icono de nuestra web y aparece junto al título de la misma.
 +
*El nombre del fichero va en minúsculas
 +
*Si el nombre no es favicon.ico, o cambiamos el directorio, se debe indicar en el html:
 +
<source lang="html4strict">
 +
<link rel="shortcut icon" href="http://example.com/myicon.ico" />
 +
</source>
 +
*Si utilizamos una imagen png, en vez de ico (cada vez más habitual), se debe especificar el type:
 +
<source lang="html4strict">
 +
<link rel="icon" type="image/png" href="http://example.com/image.png" />
 +
</source>
 +
</div>
 +
 +
<div class="slide">
 +
*Más cosas: sitemap, Canonical URL, Feeds... [https://github.com/h5bp/html5-boilerplate/blob/master/doc/extend.md lee documento de personalización]
 +
</div>
 +
 +
<div class="slide">
 +
=Modernizr=
 +
</div>
 +
 +
<div class="slide">
 +
====Introducción====
 +
*Librería para detectar la disponibilidad nativa de html5 o css3 en el navegador.
 +
*Se coloca siempre en el head, justo después de las hojas de estilos.
 +
*Hay dos versiones, desarrollo y producción (custom build, en la que seleccionaremos exclusivamente los componentes necesarios).
 +
*Detecta mediante decenas de tests en milisegundos, las características que funcionan o no del navegador actual y añade unas clases en caliente a los componentes de nuestra página:
 +
: <html> por ejemplo pasa a ser <html class="js flexbox canvas canvastext webgl no-touch....">
 +
: Las clases con prefijo no, representan las características que el navegador no soporta.
 +
<source lang="html4strict">
 +
<script>
 +
  if (Modernizr.canvas) {
 +
    alert("This browser supports HTML5 canvas!");
 +
  }
 +
</script>
 +
</source>
 +
*No se fija en el User Agent (propiedad navigator.userAgent) -> "feature detection" (mejor).
 +
*Permite usar polyfills.
 +
</div>
 +
<div class="slide">
 +
====Polyfills====
 +
*Código javascript para replicar el comportamiento de la API de html5 en navegadores antiguos.
 +
*Existe un polyfill para casi cualquier característica de html5 que Modernizr detecta.
 +
*[https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills Lista de Polyfills]
 +
*El uso de varios polyfills en una página puede afectar el tiempo de carga de la página.
 +
*No hay regla de oro: Podemos optar por no usarlos y dar menos funcionalidad con navegadores antiguos.
 +
</div>
 +
<div class="slide">
 +
====Modernizr.load()====
 +
*Normalmente para no recargar la página web de Polyfills, se hace un cargado condicional, basándonos en la libreria de JavaScript [http://yepnopejs.com/ yepnope.js]
 +
*Ejemplo de uso: Si el navegador no soporta geolocalización, se descargará el polyfill:
 +
<source lang="html4strict">
 +
Modernizr.load({
 +
  test: Modernizr.geolocation,
 +
  yep : 'geo.js',
 +
  nope: 'geo-polyfill.js'
 +
});
 +
</source>
 +
</div>
 +
<div class="slide">
 +
*Otro ejemplo con el input type="date" que [http://caniuse.com/#search=date no está muy soportado]
 +
<source lang="html4strict">
 +
<script src="modernizr.js"></script>
 +
<script>Modernizr.load({
 +
  test: Modernizr.inputtypes.date,
 +
  nope: ['http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js', 'jquery-ui.css'],
 +
  complete: function () {
 +
    $('input[type=date]').datepicker({
 +
      dateFormat: 'yy-mm-dd'
 +
    });
 +
  }
 +
});
 +
</script>
 +
</source>
 +
*En el ejemplo, se carga el componente de datetime del famework de JQuery User Interface. Para ello se debe cargar primero jQuery y luego jQuery User Interace (js y css).
 +
</div>
 
</div>
 
</div>

Última revisión de 12:47 28 oct 2013

Usuario:Juanda/html5/nav

Introducción

  • Utilizaremos la versión 4.3.0 de HTML5 BoilerPlate, de septiembre de 2013
  • Es una plantilla que ayuda a confeccionar un sitio web en múltiples aspectos: compatibilidad navegadores, configuración servidor Web, estadísticas de la web, rendimiento...
  • Quizá haya conceptos que queden todavía un poco "desconocidos". Tocaremos muchos temas durante el curso.
  • Echa otro ojo a este documento otra vez cuando acabes el curso :-)

Pasos para crear un sitio web

  • Establecer la estructura básica del sitio web.
  • Añadir contenidos, estilo y funcionalidad
  • Probarla de forma local
  • Opcionalmente ejecutar un script para automatizar la optimización de la web: ant build script o node build script.
  • Desplegar el sitio web

Estructura básica

Esta es la estructura básica sugerida por HTML5 Boilerplate:

.
├── css
│   ├── main.css
│   └── normalize.css
├── doc
├── img
├── js
│   ├── main.js
│   ├── plugins.js
│   └── vendor
│       ├── jquery.min.js
│       └── modernizr.min.js
├── .htaccess
├── 404.html
├── index.html
├── humans.txt
├── robots.txt
├── crossdomain.xml
├── favicon.ico
  • Página index.html
<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
 
        <!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
 
        <link rel="stylesheet" href="css/normalize.css">
        <link rel="stylesheet" href="css/main.css">
        <script src="js/vendor/modernizr-2.6.2.min.js"></script>
    </head>
    <body>
        <!--[if lt IE 7]>
            <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
        <![endif]-->
 
        <!-- Add your site or application content here -->
        <p>Hello world! This is HTML5 Boilerplate.</p>
 
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
        <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>
        <script src="js/plugins.js"></script>
        <script src="js/main.js"></script>
 
        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
        <script>
            (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
            function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
            e=o.createElement(i);r=o.getElementsByTagName(i)[0];
            e.src='//www.google-analytics.com/analytics.js';
            r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
            ga('create','UA-XXXXX-X');ga('send','pageview');
        </script>
    </body>
</html>


Hacks en CSS

  • Comentarios condicionales

Creados por Microsoft para su navegador. Cualquier otro navegador lo entenderá como un comentario.

<!--[if CONDICION]> Código HTML <![endif]–>

Ejemplo:

<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->

Para indicar a IExplorer que utilice la última versión de su rendering engine (puede tener varias) o Google Chrome Frame si está instalado:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

viewport

  • Por defecto los navegadores móviles muestran con un ancho determinado la página (en el caso del iPhone, 980px, por ejemplo).
  • Las páginas no sólo se mostrarán reducidas, sino que además no se aplicarán nunca nuestras @media queries que afecten a dispositivos móviles.
  • Lo ideal suele ser usar la palabra clave device-width (que representa el ancho del dispositivo), utilizando diseños fluidos y responsivos.
<meta name="viewport" content="width=device-width, initial-scale=1">

Establecemos el viewport de nuestra web igual al viewport que tiene por defecto el dispositivo.

  • Para páginas con contenido de un ancho fijo (no fluido), es posible usar un valor estático en píxels.
  • En este ejemplo veremos la web "a pantalla completa" pero con una configuración de zoom que provoca que no se vea bien:
@viewport {
  width: 980px;
  min-zoom: 0.25;
  max-zoom: 5;
}
  • Esto no encajaría en todos los user agent!!
  • con un mínimo zoom de 0.25 para un display de 240px de anchura, nos quedarían 20px sin poder ver.

Librería normalice

  • Librería que hace que los diferentes elementos renderizados por el navegador se comporten según estándares.
  • Es el equivalente mejorado a librerías anteriores que hacían un reset a los CSS del navegador.
  • Esta librería es mucho más popular que reset.css, corrige bugs y es menos intrusiva (no hace un unstyled completo de los css del navegador).
<link rel="stylesheet" href="css/normalize.css">
  • Ejemplo:
/**
 * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3.
 */
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
    display: block;
}
  • Las etiquetas html5 que no existen en determinados navegadores, se les dará un display de tipo block
  • Para hacer que "existan" será necesario crearlas mediante JavaScript utilizando por ejemplo Modernizr (html5shiv)


Librería main.css

<link rel="stylesheet" href="css/main.css">
  • Viene con unos css por defecto, principalmente por las diferencias de estilos entre navegadores
  • Hay un espacio donde podríamos poner nuestro css específico:
/* ==========================================================================
   Author's custom styles
   ========================================================================== */

Librería Modernizr

  • Librería JavaScript que detecta si el navegador del usuario implementa las características de html5 y CSS3 de la página actual.
  • Único javascript que necesita estar en la parte superior del documento: ¡antes de que se empiece a renderizar la página!
<script src="js/vendor/modernizr-2.6.1.min.js"></script>

jQuery: ¿CDN o local?

  • CDN significa content delivery network: se suelen utilizar servidores cercanos y utilizados frecuentemente para que la carga de la página sea rápida: normalmente el js ya estará descargado de alguna otra página que utilice el mismo origen.
  • Si window.jQuery es undefined habrá habido algún problema al obtenerlo del CDN.
  • En este caso, procederemos a insertar en nuestra página la versión local de jQuery.
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.8.0.min.js"><\/script>')</script>

plugins.js y main.js

  • plugin.js: Para los plugin que instalemos (también se pueden incluir en el directorio vendor)
  • main.js: Para nuestro propio javascript
        <script src="js/plugins.js"></script>
        <script src="js/main.js"></script>

Google Analytics

  • Herramienta de análisis de las visitas a un sitio web.
  • Google recomienda ponerla en la parte superior, para contar todas las visitas
  • En la parte inferior, optimizamos el tiempo de carga de nuestra web.
        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
        <script>
            var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
            (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
            g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
            s.parentNode.insertBefore(g,s)}(document,'script'));
        </script>
  • Veremos Google Analytics con más detalle cuando tratemos el SEO


Personalización

Fichero .htaccess

  • Se trata de un fichero con directivas Apache que sobreescriben a las originales del servidor, a partir del directorio don de se cuelga el fichero
  • Se utiliza por ejemplo para:
Definir un documento html de personalización de errores
Definir cuando expiran las páginas por temas de caché
Configuración de mime-types
Definir reescrituras de URL's
  • Ejemplo:
ErrorDocument 404 /404.html
  • Si tenemos acceso al servidor, por temas de rendimiento, es mejor poner las directivas anteriores en la configuración del servidor (fichero httpd.conf normalmente).

Fichero humans.txt

  • Se coloca en la raíz del site y contiene la información de las personas que han colaborado en la web:
http://www.google.com/humans.txt
  • Se puede colgar sin más o también linkarlo mediante: <link rel="author" href="humans.txt" />
  • Ver ejemplo
  • Como usarlo
  • En minúsculas

Fichero robots.txt

  • Se coloca en la raíz del site y contiene información sobre tu web para los buscadores: que directorios deben indexar y cuales no, con que frecuencia...
  • Ejemplo: Para cualquier robot indicamos que no deben indexar los directorios /cgi-bin, /tmp y /~joe
User-agent: *
Disallow: /cgi-bin/
Disallow: /tmp/
Disallow: /~joe/
  • En minúsculas
  • Se ve con más detalle cuando estudiemos SEO.

Fichero favicon.ico

  • Se coloca en la raíz del site, será el icono de nuestra web y aparece junto al título de la misma.
  • El nombre del fichero va en minúsculas
  • Si el nombre no es favicon.ico, o cambiamos el directorio, se debe indicar en el html:
<link rel="shortcut icon" href="http://example.com/myicon.ico" />
  • Si utilizamos una imagen png, en vez de ico (cada vez más habitual), se debe especificar el type:
<link rel="icon" type="image/png" href="http://example.com/image.png" />

Modernizr

Introducción

  • Librería para detectar la disponibilidad nativa de html5 o css3 en el navegador.
  • Se coloca siempre en el head, justo después de las hojas de estilos.
  • Hay dos versiones, desarrollo y producción (custom build, en la que seleccionaremos exclusivamente los componentes necesarios).
  • Detecta mediante decenas de tests en milisegundos, las características que funcionan o no del navegador actual y añade unas clases en caliente a los componentes de nuestra página:
<html> por ejemplo pasa a ser <html class="js flexbox canvas canvastext webgl no-touch....">
Las clases con prefijo no, representan las características que el navegador no soporta.
<script>
  if (Modernizr.canvas) {
    alert("This browser supports HTML5 canvas!");
  }
</script>
  • No se fija en el User Agent (propiedad navigator.userAgent) -> "feature detection" (mejor).
  • Permite usar polyfills.

Polyfills

  • Código javascript para replicar el comportamiento de la API de html5 en navegadores antiguos.
  • Existe un polyfill para casi cualquier característica de html5 que Modernizr detecta.
  • Lista de Polyfills
  • El uso de varios polyfills en una página puede afectar el tiempo de carga de la página.
  • No hay regla de oro: Podemos optar por no usarlos y dar menos funcionalidad con navegadores antiguos.

Modernizr.load()

  • Normalmente para no recargar la página web de Polyfills, se hace un cargado condicional, basándonos en la libreria de JavaScript yepnope.js
  • Ejemplo de uso: Si el navegador no soporta geolocalización, se descargará el polyfill:
Modernizr.load({
  test: Modernizr.geolocation,
  yep : 'geo.js',
  nope: 'geo-polyfill.js'
});
<script src="modernizr.js"></script>
<script>Modernizr.load({
  test: Modernizr.inputtypes.date,
  nope: ['http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js', 'jquery-ui.css'],
  complete: function () {
    $('input[type=date]').datepicker({
      dateFormat: 'yy-mm-dd'
    }); 
  }
});
</script>
  • En el ejemplo, se carga el componente de datetime del famework de JQuery User Interface. Para ello se debe cargar primero jQuery y luego jQuery User Interace (js y css).