Slide 1

Slide 1 text

Diseñar webs rápidas, flexibles y potentes

Slide 2

Slide 2 text

twitter.com/manz

Slide 3

Slide 3 text

¿Qué idea tenemos de una web?

Slide 4

Slide 4 text

> emezeta.com

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

? > pero… ¿qué ocurre aquí?

Slide 7

Slide 7 text

¿Cómo funciona una web por dentro ?

Slide 8

Slide 8 text

> front-end

Slide 9

Slide 9 text

> front-end > back-end

Slide 10

Slide 10 text

> back-end > front-end

Slide 11

Slide 11 text

> back-end > servidores web Apache, nginx, LiteSpeed...

Slide 12

Slide 12 text

> back-end > servidores web Apache, nginx, LiteSpeed... > bases de datos MySQL, PostgreSQL, MongoDB...

Slide 13

Slide 13 text

> back-end > servidores web Apache, nginx, LiteSpeed... > bases de datos MySQL, PostgreSQL, MongoDB... > lenguajes PHP, NodeJS, Python, Ruby, Java...

Slide 14

Slide 14 text

Pero en esta ocasión vamos a hablar de front-end...

Slide 15

Slide 15 text

> front-end > Lenguaje HTML Estructura y contenido web

Slide 16

Slide 16 text

> front-end > Lenguaje HTML Estructura y contenido web > Lenguaje CSS Diseño y aspecto visual

Slide 17

Slide 17 text

> front-end > Lenguaje HTML Estructura y contenido web > Lenguaje CSS Diseño y aspecto visual > Lenguaje JS Programación web en front-end

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Antes de empezar, varios detalles...

Slide 22

Slide 22 text

> Hay 3 formas de hacer una web

Slide 23

Slide 23 text

> Hay 3 formas de hacer una web Llamar al que sabe

Slide 24

Slide 24 text

> Hay 3 formas de hacer una web Pagar al que sabe

Slide 25

Slide 25 text

> Hay 3 formas de hacer una web Hacer que Chuck Norris se sienta orgulloso de nosotros

Slide 26

Slide 26 text

Canary Chrome Firefox Dev Opera Dev

Slide 27

Slide 27 text

> Chrome Dev Tools [CTRL+SHIFT+I]

Slide 28

Slide 28 text

> Aprende a a la terminal

Slide 29

Slide 29 text

> nodejs > (Javascript en el servidor) Node Package Manager

Slide 30

Slide 30 text

¿Cuál es la peor pesadilla de un diseñador/desarrollador web?

Slide 31

Slide 31 text

¿Cuál es la peor pesadilla de un diseñador/desarrollador web? (A parte de Internet Explorer)

Slide 32

Slide 32 text

> ¿Consumo de RAM? [SHIFT+ESC] Bueno, podría... pero no...

Slide 33

Slide 33 text

> Fragmentación web En un navegador se ve genial, pero cuando intentamos verlo en otro...

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

> Fragmentación web

Slide 36

Slide 36 text

> Fragmentación web

Slide 37

Slide 37 text

> CanIUse.com

Slide 38

Slide 38 text

HTML TEST.COM

Slide 39

Slide 39 text

CSS TEST.COM

Slide 40

Slide 40 text

> DoIUse.com

Slide 41

Slide 41 text

> objetivos > Rápida Debe cargar lo más rápido posible.

Slide 42

Slide 42 text

> objetivos > Rápida Debe cargar lo más rápido posible. > Flexible Debe ser fácil de mantener.

Slide 43

Slide 43 text

> objetivos > Rápida Debe cargar lo más rápido posible. > Flexible Debe ser fácil de mantener. > Potente y eficiente Usar los recursos a tu alcance.

Slide 44

Slide 44 text

HTML5 Estructura y contenido

Slide 45

Slide 45 text

> HTML5

Selecciona tu opción:

Opción #1 Opción #2 Opción #3
lenguajehtml.com

Slide 46

Slide 46 text

> HTML5

Slide 47

Slide 47 text

> Minificación de código Objetivo: Reducir el peso del archivo. Minify, Uglify (minificadores) Prettify, Beautify (desminificadores)

Slide 48

Slide 48 text

> Minificación de código

Información

@Manz Web
...

Infor mación

@Manz< /a>Web
... 11KB 32KB

Slide 49

Slide 49 text

> Minificación de código - Eliminar (colapsar) espacios y/o saltos de línea. - Eliminar comentarios. - Reducir código (borrar redundancias, usar alternativas...). - Reagrupar selectores CSS. - Redondear unidades a “X” decimales. Objetivo: Reducir el peso del archivo. Minify, Uglify (minificadores) Prettify, Beautify (desminificadores)

Slide 50

Slide 50 text

> npm install -g html-minifier > html-minifier index.html --minify-css --minify-js --remove-script- type-attributes --remove-style-link-type- attributes --use-short-doctype --remove- comments --collapse-whitespace -o index.min.html > cat index.html | html-minifier > Minificación HTML Minifica el CSS o el JS “inline” (requiere cleancss / uglifyjs) Elimina atributos “type” o simplifica DocType (HTML5) Elimina los comentarios HTML del documento Elimina (colapsa) los espacios en blanco del HTML

Slide 51

Slide 51 text

> Selectores CSS div#info div.flat ul.links a
Info
...

Slide 52

Slide 52 text

> EMMET select#tipo>option[value=$]{Opción #$}*3 bit.ly/emmetcheat Opción #1 Opción #2 Opción #3 TAB

Slide 53

Slide 53 text

> HAML > JADE > Slim slim-lang.com jade-lang.com haml.info

Slide 54

Slide 54 text

> HAML #panel %h3 Selecciona tu opción: %select#tipo.flat %option{:value => "1"} Opción #1 %option{:value => "2"} Opción #2 %option{:value => "3"} Opción #3 haml.info

Slide 55

Slide 55 text

> JADE #panel h3 Selecciona tu opción: select#tipo.flat option(value='1') Opción #1 option(value='2') Opción #2 option(value='3') Opción #3 jade-lang.com

Slide 56

Slide 56 text

> JADE include info.include.jade - var title = "Selecciona tu opción" #panel h3= title select#tipo.flat ul each val in [1, 2, 3] option(value=val) Opción ##{val} jade-lang.com Incluir código HTML de forma muy organizada. Variables personalizadas con contenido. Estructuras de control, bucles o facilidades.

Slide 57

Slide 57 text

> APIS de HTML5 WebStorage API Multimedia Geolocalización Vibración

Slide 58

Slide 58 text

michelacosta.com > APIS de HTML5

Slide 59

Slide 59 text

La web debe ser rápida ...para los usuarios ...para los buscadores

Slide 60

Slide 60 text

> emezeta.com DNS Conexión SSL Subida Espera Descarga Dominio Alojamiento Contenido html Redirección Backend ¿Depende del usuario? Se puede optimizar

Slide 61

Slide 61 text

> Velocidad > Fuente: Google Analytics Dominio Conexión Redirección Respuesta Descarga Total Restante 0,02s 0,10s 0,24s 0,30s 0,15s 5,69s 4,88s Dominio Alojamiento Web

Slide 62

Slide 62 text

CSS html PNG PNG JPG JPG JS > esto ocurre por cada recurso de la web al principio al final

Slide 63

Slide 63 text

> Chrome Dev Tools

Slide 64

Slide 64 text

> Pingdom Tools > Google PageSpeed > Web Page Test http://tools.pingdom.com/fpt/ https://developers.google.com/speed/pagespeed/ http://www.webpagetest.org/

Slide 65

Slide 65 text

> Reducir número de peticiones

Slide 66

Slide 66 text

zerosprites.com > Reducir número de peticiones spritecow.com

Slide 67

Slide 67 text

> Reutilizar peticiones cdnjs.com jsdelivr.com caché

Slide 68

Slide 68 text

> Tipo datos > Fuente: http://httparchive.org/ Imágenes Scripts Videos Fuentes CSS HTML 1332KB 337KB 227KB 100KB 64KB 54KB

Slide 69

Slide 69 text

> Imágenes > Fuente: http://httparchive.org/ JPG PNG GIF Otros WebP 46% 29% 23% 2% ~1%

Slide 70

Slide 70 text

> Fuentes > Fuente: http://httparchive.org/ Fuentes Sin fuentes 53% 47%

Slide 71

Slide 71 text

¿Hay otra forma de reducir peticiones?

Slide 72

Slide 72 text

> FontAwesome fontawesome.io

Slide 73

Slide 73 text

> WebFont PNG A B C

Slide 74

Slide 74 text

> WebFonts > No pierden resolución al ampliar/reducir > Son fuentes, puedes tratarlas con CSS

Slide 75

Slide 75 text

> WebFonts > No pierden resolución al ampliar/reducir > Son fuentes, puedes tratarlas con CSS > Desventaja: Sólo un color > Desventaja: Quiero un icono específico

Slide 76

Slide 76 text

> ¿Solución?

Slide 77

Slide 77 text

> ¿Solución?

Slide 78

Slide 78 text

> IcoMoon icomoon.io/app

Slide 79

Slide 79 text

> Reducir tiempo de descarga Reducir tamaño

Slide 80

Slide 80 text

¿¿Cómo??

Slide 81

Slide 81 text

> Utilizar compresión HTTP (GZip) GZip? GZip? 15KB 85KB html GZip! 85KB html

Slide 82

Slide 82 text

> curl -L -H Accept-encoding:gzip -I emezeta.com HTTP/1.1 200 OK Server: nginx Date: Thu, 02 Jul 2015 03:28:17 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 20 Connection: keep-alive Vary: Accept-Encoding Content-Encoding: gzip > ¿Usa compresión HTTP? El sitio web comprime en gzip los documentos Sólo algunos formatos pueden usar compresión HTTP: html, json, css, js, xml, svg... Pregunto si el sitio web soporta compresión HTTP

Slide 83

Slide 83 text

> npm install -g imagemin [email protected] postinstall √ gifsicle pre-build test passed successfully [email protected] postinstall √ jpegtran pre-build test passed successfully [email protected] postinstall √ optipng pre-build test passed successfully [email protected] ├── [email protected] ├── [email protected] ├── [email protected] ... > Optimización de imágenes

Slide 84

Slide 84 text

> ls -lh image.png -rw-r--r-- Manz 447k image.png > imagemin image.png > ls -lh build\image.png -rw-r--r-- Manz 369k image.png > Optimización de imágenes

Slide 85

Slide 85 text

> npm install -g jpgo > jpgo image.jpg 䘠 image.jpg before=153.6 kB after=144.93 kB reduced= 8.67 kB > Optimización de imágenes

Slide 86

Slide 86 text

CSS3 Diseño y apariencia

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

> CSS3 button.flat { border: 0; border-radius: 25px; padding: 10px; background: RGBA(0,0,0, 0.5); color: white; transition: all 2s ease-in-out; } button.flat:hover { background: #A00; cursor: pointer; transition: all 1s ease; } lenguajecss.com

Slide 89

Slide 89 text

> CSS3

Slide 90

Slide 90 text

lenguajecss.com/css/

Slide 91

Slide 91 text

#contenedor { border: 4px solid white; padding: 10px; display: flex; } .item { width: 25px; } .item-1 { background: red; order: 1 } .item-2 { background: green; order: 2 } .item-3 { background: blue; order: 3 } 1 2 3 > FlexBox

Slide 92

Slide 92 text

#contenedor { border: 4px solid white; padding: 10px; display: flex; } .item { width: 25px; } .item-1 { background: red; order: 3 } .item-2 { background: green; order: 2 } .item-3 { background: blue; order: 1 } 3 1 2 > FlexBox

Slide 93

Slide 93 text

#contenedor { border: 4px solid white; padding: 10px; display: flex; flex-direction: column; } .item { width: 25px; } .item-1 { background: red; order: 3 } .item-2 { background: green; order: 2 } .item-3 { background: blue; order: 1 } > FlexBox 3 1 2

Slide 94

Slide 94 text

img { border: 2px solid white; width: 300px; margin: .4em; } .original { } .sepia { filter: sepia(1) } .brillo { filter: brightness(1.5) } .contraste { filter: contrast(1.5) } .grayscale { filter: grayscale(1) } .hue { filter: hue-rotate(150deg) } > Filtros CSS Codepen: RPMbbx

Slide 95

Slide 95 text

> CSS es muy potente http://i.imgur.com/47xkq4v.jpg

Slide 96

Slide 96 text

#earth { width: 300px; height: 300px; border-radius: 50%; background: url(http://i.imgur.com/47xkq4v.jpg); background-repeat: repeat-x; margin: 5em auto; animation: rotacion 6s linear infinite; box-shadow: inset 0 0 25px 5px #000; } @keyframes rotacion { 0% { background-position: 620px } 100% { background-position: 0 } } > CSS es muy potente Codepen: OVQYEY

Slide 97

Slide 97 text

> Animaciones CSS bit.ly/animacionescss

Slide 98

Slide 98 text

> npm install -g clean-css > cleancss index.css --keep-line-breaks --rounding-precision 1 --s0 --skip-shorthand-compacting --skip-advanced -o index.min.css > cat index.css | cleancss > Minificación CSS Respeta los saltos de línea (no une en una sola línea) Elimina comentarios CSS. Redondea unidades CSS a 1 decimales (def: 2) Desactiva optimizaciones (shorthands, compresión...)

Slide 99

Slide 99 text

> EMMET animps:r bit.ly/emmetcheat animation-play-state: running;| TAB TAB mr margin-right: |; TAB margin-right: 5px;| mr:5

Slide 100

Slide 100 text

> LESS > SASS > Stylus bit.ly/styluscss sass-lang.com lesscss.org

Slide 101

Slide 101 text

> LESS @import "core.less"; .transition(@time: 1s) { transition: all @time ease; -webkit-transition: all @time ease; } button.flat { border: 0; border-radius: 25px; padding: 10px; background: RGBA(0,0,0, 0.5); color: white; .transition(2s); &:hover { background: #A00; cursor: pointer; .transition; } } lesscss.org

Slide 102

Slide 102 text

> autoprefixer img#mario { image-rendering: -webkit-optimize-contrast; image-rendering: -moz-crisp-edges; image-rendering: -o-pixelated; image-rendering: pixelated; } bit.ly/aprefixer img#mario { image-rendering: pixelated; } (ahora forma parte de postcss)

Slide 103

Slide 103 text

> cssnext a:hover { color: color( red blackness(80%) ); // Oscurecer colores background-color: #44556677; // Soporta c. alfa en hex } :root { --mainColor: red; // Define variable CSS “mainColor” } a { color: var(--mainColor); // Usa variable CSS } img.sepia { filter: sepia(1); // Organiza código (autoprexifer, minify…) } cssnext.io

Slide 104

Slide 104 text

> npm install -g uncss > uncss http://www.emezeta.com/ > out.css > CSS no utilizado Elimina estilos CSS sin utilizar. Guarda los cambios en el archivo out.css

Slide 105

Slide 105 text

> SVG

Slide 106

Slide 106 text

> Inkscape 2,1KB

Slide 107

Slide 107 text

> Optimización de SVG > npm install -g svgo > svgo -i manz.svg -p 2 --pretty -o manz.min. svg Done in 72 ms! 2.113 KiB - 88.3% = 0.247 KiB Redondea a 2 decimales las unidades utilizadas. Respeta los saltos de línea y usa indentaciones. 0,2KB

Slide 108

Slide 108 text

> SVG path { fill: none; /* Trazos sin relleno */ stroke: #222; stroke-dasharray: 2000px 2000px; /* line,space */ stroke-dashoffset: 2000px; /* Desplazamiento */ stroke-width: 8px; } /* Al mover sobre la región SVG... */ svg:hover path { stroke-dashoffset: 0; transition: stroke-dashoffset 8s linear; }

Slide 109

Slide 109 text

> SVG+CSS codepen.io/manz/pen/OVQLbG (¡con apenas 4 líneas de código HTML y 9 de CSS!)

Slide 110

Slide 110 text

responsivelogos.co.uk

Slide 111

Slide 111 text

d3js.org > d3

Slide 112

Slide 112 text

Javascript Programación en cliente

Slide 113

Slide 113 text

> JavaScript var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], fives = [] nums.forEach(v => { if (v % 5 === 0) fives.push(v) }) console.log(fives) lenguajejs.com

Slide 114

Slide 114 text

> npm install -g uglifyjs > uglifyjs index.js --comments all --compress --lint -o index.min.js > cat index.min.js | uglifyjs --beautify 2>null > Minificación JS Preserva todos los comentarios JS (permite RegExp) Activa el compresor de código JS. Parsea y avisa de errores Javascript. Des-minifica el código Javascript mostrado con cat.

Slide 115

Slide 115 text

> CoffeeScript var i, j; for (i = j = 0; j <= 10; i = ++j) { alert(i); } coffeescript.org alert i for i in [0..10]

Slide 116

Slide 116 text

También tenemos fragmentación... =

Slide 117

Slide 117 text

Estándar ECMAScript ES5 ES6 ES7 JUN/2015 DIC/2009 En progreso kangax.github.io/compat-table/es6

Slide 118

Slide 118 text

> babel const PI = 3.14 let func = e => console.log(e) func(5) func(`El valor de PI es ${PI}.`) babeljs.io "use strict" var PI = 3.14 var func = function(e) { return console.log(e) } func(5) func("El valor de PI es " + PI + ".")

Slide 119

Slide 119 text

> JQuery jquery.com var request = new XMLHttpRequest(); request.open('GET', '/url', true); request.onreadystatechange = function() { if (this.readyState === 4) if (this.status >= 200 && this.status < 400) var data = JSON.parse(this.responseText); }; request.send(); $.getJSON('/url', function(data) { // código });

Slide 120

Slide 120 text

> Rendimiento codepen.io/manz/pen/JdEXKW

Slide 121

Slide 121 text

youmightnotneedjquery.com $('#users li') document.querySelectorAll('#users li')

Slide 122

Slide 122 text

Datos Formatos ligeros

Slide 123

Slide 123 text

> XML w3.org/XML/ 1 2 3 4 5 true 4 Texto

Slide 124

Slide 124 text

> JSON json.org { "array": [1, 2, 3, 4, 5], "booleano": true, "objeto": { "a": 4, "b": "Texto", "c": null } } ejemplo.json 1 2 3 4 5 䘟 4 Texto Compatible con JS

Slide 125

Slide 125 text

bit.ly/chromejsonview

Slide 126

Slide 126 text

> YAML yaml.org --- array: [1, 2, 3, 4, 5] booleano: true objeto: a: 4 b: 'Texto' c: null

Slide 127

Slide 127 text

jekyllrb.com --- layout: post category: tecnología tags: [web, blogs] --- # Título Esto es un **pequeño ejemplo** de un artículo escrito con *markdown* y *YAML Front Matter*. Nuevos CMS: Generadores estáticos

Slide 128

Slide 128 text

JSON 0,09KB 0,1KB 0,3KB

Slide 129

Slide 129 text

¡Quiero algo más cómodo! ¡Pero todo esto es mucho trabajo!

Slide 130

Slide 130 text

sitioweb src index.jade menu.include.jade css index.less js index.js lazyload-plugin.js img logo.psd logo.png sitioweb dist index.html css index.css index.min.css js index.js index.min.js img logo.png src: Carpeta fuente dist: Carpeta destino

Slide 131

Slide 131 text

Editores Programas flexibles

Slide 132

Slide 132 text

> Atom atom.io

Slide 133

Slide 133 text

> Sublime Text sublimetext.com

Slide 134

Slide 134 text

> Sublime > Atom > Brackets brackets.io atom.io sublimetext.com

Slide 135

Slide 135 text

Task Runners Programadores de tareas

Slide 136

Slide 136 text

> Grunt > Gulp > Broccoli broccolijs.com gulpjs.com gruntjs.com

Slide 137

Slide 137 text

> Gulp gulpjs.com GULP GULP

Slide 138

Slide 138 text

> Gulp gulpjs.com CSS MIN.CSS LESS

Slide 139

Slide 139 text

> Gulp gulpjs.com > gulp TIDY

Slide 140

Slide 140 text

> gulpfile.js gulpjs.com var gulp = require('gulp') var minifycss = require('gulp-minify-css') var autoprefixer = require('gulp-autoprefixer') var rename = require('gulp-rename') gulp.task('default', function() { return gulp.src('index.css') .pipe(autoprefixer()) .pipe(minifycss()) .pipe(rename('index.min.css')) .pipe(gulp.dest('dist/css')) }) Requiere instalar previamente: npm install -g gulp npm install --save-dev gulp gulp-minify-css gulp-autoprefixer gulp-rename > gulp

Slide 141

Slide 141 text

> plugins gulpjs.com/plugins/ > gulp-minify-css > gulp-autoprefixer > gulp-concat > gulp-coffee > gulp-webserver > gulp-image > gulp-htmlmin > gulp-run > gulp-less > gulp-jade > gulp-babel > gulp-newer (con livereload) (jpg, png, svg...)

Slide 142

Slide 142 text

> ¿Mucha información?

Slide 143

Slide 143 text

bit.ly/aprendehtml5 bit.ly/aprendecss3 > Cursos de CSS3 y HTML5

Slide 144

Slide 144 text

Próximamente > Curso de Javascript

Slide 145

Slide 145 text

> ¡Gracias!