Slide 1

Slide 1 text

Desvendando os limites do universo front-end: um panorama de ferramentas e técnicas revisada

Slide 2

Slide 2 text

jcemer.com github.com/jcemer twitter.com/jcemer speakerdeck.com/jcemer

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

O importante é que seu produto funcione e entregue valor

Slide 5

Slide 5 text

...mas se você quer que ele seja prático de desenvolver

Slide 6

Slide 6 text

...tenha uma manutenção descomplicada

Slide 7

Slide 7 text

...e sobretudo, ir além no seu fluxo de trabalho

Slide 8

Slide 8 text

esta palestra é especialmente destinada a você!

Slide 9

Slide 9 text

A Serious Man http:/ /www.imdb.com/title/tt1019452

Slide 10

Slide 10 text

Quero saber como começo meu projeto ?

Slide 11

Slide 11 text

Boilerplates

Slide 12

Slide 12 text

Base sólida e reusável para seu projeto entalhada com boas práticas

Slide 13

Slide 13 text

Boa organização de arquivos Estrutura inicial de HTML, CSS e JS Robots.txt e humans.txt Favicon e apple icons HTML5 Boilerplate http:/ /html5boilerplate.com

Slide 14

Slide 14 text

HTML Define viewport para projetos responsivos

Slide 15

Slide 15 text

Viewport para site não responsivo HTML

Slide 16

Slide 16 text

Inclui Modernizr com todas as detecções apenas html5shiv (IE8,7) ou o Modernizr customizado que inclui o html5shiv HTML

Slide 17

Slide 17 text

Página de erro 404 UTF-8 para CSS e JS Entrega de arquivos compactados Define expiração dos arquivos para estratégia de cache Apache

Slide 18

Slide 18 text

Na versão 2.0.0 mudou de Reset.css para Normalize.css CSS

Slide 19

Slide 19 text

/*! normalize.css v2.1.2 | MIT License | gi /** * Correct `block` display not defined in I */ article, aside, details, figcaption, figure header, hgroup, main, nav, section, summary display: block; } /** * Correct `inline-block` display not defin */ audio, canvas, video { display: inline-block; } /** * Prevent modern browsers from displaying * Remove excess height in iOS 5 devices. */ audio:not([controls]) { display: none; height: 0; } /** * Address styling not present in IE 8/9. */ Normalize.css Institui uma aparência padrão para cada elemento Corrige alguns bugs comuns normalize.css http:/ /necolas.github.io/normalize.css

Slide 20

Slide 20 text

/** * Eric Meyer's Reset CSS v2.0 */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } /* HTML5 display-role reset for older browsers article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; Reset.css Remove toda a aparência Elementos de título, parágrafo e lista com mesma aparência CSS Tools: Reset CSS http:/ /meyerweb.com/eric/tools/ css/reset

Slide 21

Slide 21 text

X reset normalize

Slide 22

Slide 22 text

Sophisto Boilerplate Browsers modernos (IE9+) Stylus: pré processador de CSS Rye.js: biblioteca JS leve substituta da jQuery Build task e script de deploy via Git Sophisto Boilerplate https:/ /github.com/grifo/sophisto-boilerplate

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Aparência inicial Diversas APIs Suporte offline Firefox OS Boilerplate App Firefox OS Boilerplate App http:/ /github.com/robnyman/Firefox-OS-Boilerplate-App

Slide 25

Slide 25 text

Quero saber de aparência e como definir componentes ?

Slide 26

Slide 26 text

Frameworks de CSS

Slide 27

Slide 27 text

Guia de estilo com componentes reusáveis e configuráveis para seu projeto

Slide 28

Slide 28 text

Cuidado, não existe uma maneira de testar CSS

Slide 29

Slide 29 text

body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; font-size: 14px; direction: ltr; } Foundation 3.0 Divs ou tds não herdam o tamanho da fonte de seus elementos pais

Slide 30

Slide 30 text

Pure CSS Seu formulário deve sempre terminar com um radio

Slide 31

Slide 31 text

Usar frameworks engessa o HTML a sua maneira

Slide 32

Slide 32 text

Ótimo, muito bom!
E o quanto isto é diferente
daquilo?
Twitter Bootstrap 2.3 Marcação usando classes nomeadas pelo framework

Slide 33

Slide 33 text

CSS to the heaven Tags e classes devem se referir ao seu conteúdo e não a sua aparência Seletores devem ser o mais globais possíveis ou função, caso esteja projetando componentes

Slide 34

Slide 34 text

CSS to the heaven: classes .button .small-button .secondary-button .remove-button .margin10px .row .span4 .post .dark-slider .left .active .video-title .btn, .ctnr, .act estado tá valendo :) diagramação é aparência sem abreviaturas, pf

Slide 35

Slide 35 text

E agora, como eu reuso e organizo meu código? ?

Slide 36

Slide 36 text

CSS on Steroids

Slide 37

Slide 37 text

body { width: 960px; } .wrapper { width: 940px; } .speaker-list { width: 480px; } Largura do site Largura do site menos respiro Meia largura ?!

Slide 38

Slide 38 text

$site-width: 960px; $site-gap: 20px; body { width: $site-width; } .wrapper { width: $site-width - $site-gap; } .speaker-list { width: $site-width / 2; } Variáveis Qualquer mudança reflete em todo projeto

Slide 39

Slide 39 text

body { color: #3F4955; } .about { background: #3F4955; } .contact a:hover { color: #3F4956; } .speaker-list { border: 1px solid #3F4955; } PSD estava com uma pequena variação :P Que diabo de cor é essa? ?!

Slide 40

Slide 40 text

$grey-color: #3F4955; $main-color: $grey-color; body { color: $main-color; } .about { background: $main-color; } .contact a:hover { color: $main-color; } .speaker-list { border: 1px solid $main-color; } Variáveis Muito mais organizado e fácil de entender

Slide 41

Slide 41 text

body { color: #3F4955; } .slider { color: #293038; } .carousel { background: rgba(63, 73, 85, 0.8); } Você não faz ideia, mas sou o cinza escuro E eu sou cinza com transparência ?!

Slide 42

Slide 42 text

$grey-color: #3F4955; $grey-dark-color: darken($grey-color, 10); $transparent-grey-color: rgba($grey-color, .8); body { color: $grey-color; } .slider { color: $grey-dark-color; } .carousel { background: $transparent-grey-color; } Funções transforma em rgb e adiciona o alpha

Slide 43

Slide 43 text

.slider { background: #1e5799; /* Old browsers */ background: -moz-linear-gradient(left, #1e5799 0%, #7db9e8 100%); /* background: -webkit-gradient(linear, left top, right top, color-stop background: -webkit-linear-gradient(left, #1e5799 0%,#7db9e8 100%); background: -o-linear-gradient(left, #1e5799 0%,#7db9e8 100%); /* Op background: -ms-linear-gradient(left, #1e5799 0%,#7db9e8 100%); /* I background: linear-gradient(to right, #1e5799 0%,#7db9e8 100%); /* W filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='# } Ultimate CSS Gradient Generator http:/ /www.colorzilla.com/gradient-editor Manutenção bem fácil #sqn ?!

Slide 44

Slide 44 text

$blue-color: #1E5799; $light-blue-color: #7DB9E8; .slider { $gradient: linear-gradient($blue-color, $light-blue-color); @include background-image($gradient); } Mixins: vendor prefixes Bourbon.io http:/ /bourbon.io/docs/#linear-gradient-function

Slide 45

Slide 45 text

@mixin user-select($arg: none) { -webkit-user-select: $arg; -moz-user-select: $arg; -ms-user-select: $arg; user-select: $arg; } .editor { @include user-select(none); } Mixins: vendor prefixes CSS user-select: none http:/ /caniuse.com/#search=user-select

Slide 46

Slide 46 text

.slider p { margin-bottom: 1em; } .very-easy-to-add-rules-between { color: white; } .slider a { font-weight: bold; } .slider a:hover { background: $color-secondary; } Ops, um intruso aqui! ?!

Slide 47

Slide 47 text

.slider { } .slider p { margin-bottom: 1em; } .slider a { font-weight: bold; } .slider a:hover { background: $color-secondary; } Seletor vazio :( ?!

Slide 48

Slide 48 text

.slider { p { margin-bottom: 1em; } a { font-weight: bold; &:hover { background: $color-secondary; } } } Nested rules Mais fácil de ler e modularizar

Slide 49

Slide 49 text

Não reescreva a árvore de elementos do HTML no CSS

Slide 50

Slide 50 text

CSS Explain http:/ /josh.github.io/css-explain html { body { background: black; section { padding: 20px; p { margin-bottom: 10px; a { color: blue; &:hover { text-decoration: none; } } } } } } Repara no resultado: html body section p a:hover

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

.address { width: 200em; height: 300em; background: #666; color: white; } // ... .profile { width: 200em; height: 300em; background: #666; color: white; font-size: 20em; } Código repetido ?!

Slide 53

Slide 53 text

.address { width: $box-width; height: $box-height; background: $box-color; color: white; } // ... .profile { @extend .address; font-size: 20em; } Extend .address, .profile { width: 200em; height: 300em; background: #666; color: white; } // ... .profile { font-size: 20em; } É estranho que o profile estenda o addresss

Slide 54

Slide 54 text

%box { width: $box-width; height: $box-height; background: $box-color; color: white; } .address { @extend %box; } // ... .profile { @extend %box; font-size: 20em; } Placeholders Este primeiro bloco é apenas uma abstração

Slide 55

Slide 55 text

.profile { position: relative; width: 100px; background: red; } .profile:before { content: ""; position: absolute; width: 0; height: 0; border: 7px solid transparent; left: 50%; margin-left: -7px; top: -13px; border-bottom: 7px red solid; } Eu não tenho ideia doque isto representa ?!

Slide 56

Slide 56 text

%arrow-top { position: relative; &:before { content: ""; position: absolute; width: 0; height: 0; border: 7px solid transparent; left: 50%; margin-left: -7px; top: -13px; border-bottom: 7px red solid; } } .profile { width: 100px; background: red; @extend %arrow-top; } Helpers A cor da nossa seta está estática

Slide 57

Slide 57 text

@mixin arrow-top-color($color) { &:before { border-bottom-color: $color; } } .profile { width: 100px; background: blue; @extend %arrow-top; @include arrow-top-color(blue); } Helpers Tudo o que recebe argumentos é um mixin The Extend Concept http:/ /css-tricks.com/the-extend-concept

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

$distance: (100% - $size) / 2; &:#{$type} { content : ''; position: absolute; z-index: 1; @if $mode == horizontal { left: $distance; right: $distance; height: $thickness; } @else { top: $distance; bottom: $distance; width: $thickness; } } } @mixin line-gradient($pos, $opacity) { @include radial-gradient($pos, rgba(black, $opacity) } @mixin left-line($size, $opacity: .15, $thickness: 10p @include line(vertical, before, $size, $thickness); &:before { left: 0; @include line-gradient(left center, $opacity); } } @mixin bottom-line($size, $opacity: .15, $thickness: 1 @include line(horizontal, after, $size, $thickness); &:after { bottom: 0; @include line-gradient(center bottom, $opacity); } } @mixin top-line($size, $opacity: .15, $thickness: 10px @include line(horizontal, before, $size, $thickness) &:before { top: 0; @include line-gradient(center top, $opacity); } } @mixin inverse-bottom-line($size, $opacity: .15, $thic @include line(horizontal, after, $size, $thickness); &:after { bottom: -$thickness; @include line-gradient(center top, $opacity); } } @mixin hide-bottom-line { &:after { display: none; Helpers Line helpers https:/ /gist.github.com/jcemer/7130218 .section-title { font-size: rem(28px); color: $blue; @include inverse-bottom-line(80%); } .collaborate-item:last-child { @include left-line(90%); padding-left: 10%; } .address-map { @include top-line(100%, .25); @include bottom-line(100%, .25); }

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

Pré-processadores Linguagem para adicionar açucar sintático não nativos ao CSS Resultam em CSS Nova camada que precisa ser trans-compilada

Slide 64

Slide 64 text

@base: #f938ab; .box-shadow(@style, @c) when (iscolor( box-shadow: @style @c; -webkit-box-shadow: @style @c; -moz-box-shadow: @style @c; } .box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) { .box-shadow(@style, rgba(0, 0, 0, @a } .box { color: saturate(@base, 5%); border-color: lighten(@base, 30%); div { .box-shadow(0 0 5px, 30%) } } @the-border: 1px; @base-color: #111; @red: #842210; #header { color: (@base-color * 3); border-left: @the-border; border-right: (@the-border * 2); } #footer { color: (@base-color + #003300); border-color: desaturate(@red, 10%); } Padrão do Twitter Bootstrap Não possui placeholders Repetições bastante estranhas e engessadas

Slide 65

Slide 65 text

border-radius() -webkit-border-radius: arguments -moz-border-radius: arguments border-radius: arguments body font: 12px Helvetica, Arial, sans-se background: linear-gradient(top, whi black) a.button border-radius: 5px @keyframes foo { from { color: black } to { color: white } } button { color: rgba(red, .5) border-radius: bottom 10px; } Mixins transparentes Mixins com Nib (vendor prefixor) Sintaxe bastante livre Muita liberdade causa confusão

Slide 66

Slide 66 text

Projeto maduro Bibliotecas poderosas como Compass e Bourbon Duas sintaxes que não podem se misturar $blue: #3bbfce; $margin: 16px; .content-navigation { border-color: $blue; color: darken($blue, 9%); } .border { padding: $margin / 2; margin: $margin / 2; border-color: $blue; } @mixin table-base() { th { text-align: center; font-weight: bold; } td, th { padding: 2px; } } @mixin left($dist) { float: left; margin-left: $dist; } #data { @include left(10px); @include table-base; } Sintaxe SCSS

Slide 67

Slide 67 text

$blue: #3bbfce $margin: 16px .content-navigation border-color: $blue color: darken($blue, 9%) .border padding: $margin / 2 margin: $margin / 2 border-color: $blue @mixin table-base th text-align: center font-weight: bold td, th padding: 2px @mixin left($dist) float: left margin-left: $dist #data @include left(10px) @include table-base Sintaxe SASS Projeto maduro Bibliotecas poderosas como Compass e Bourbon Duas sintaxes que não podem se misturar

Slide 68

Slide 68 text

<3 <3 <3

Slide 69

Slide 69 text

Libsass: biblioteca escrita em C/C++ Módulo node-sass já utiliza esta biblioteca e compila nativamente seu arquivo

Slide 70

Slide 70 text

Mixins e placeholders são muito úteis para definir grids Grid semântico

Slide 71

Slide 71 text

Grid semântico

Bourbon Neat

Neat é um framework de grid semântico.

Sass e Bourbon são seus requisitos.

.tool { @include outer-container; } http:/ /neat.bourbon.io .tool-title { @include span-columns(3); } .tool-content { @include span-columns(9); }

Slide 72

Slide 72 text

Organizando o CSS // Libraries @import "compass"; @import "settings"; @import "helper"; // Core @import "core/normalize"; @import "core/layout"; // Shared @import "shared/header"; @import "shared/footer"; variáveis mixins e placeholders estilizar ,

, elementos comuns

Slide 73

Slide 73 text

Organizando o CSS // ... continuação // Modules @import "modules/grade"; @import "modules/map"; // Pages @import "pages/home"; @import "pages/about"; modularização! regras muito específicas que são guiadas por uma classe no

Slide 74

Slide 74 text

E o que faço com a disposição dos elementos do meu layout?

Slide 75

Slide 75 text

CSS Layout

Slide 76

Slide 76 text

Box model Define tamanhos, margens, paddings... Posiciona elementos em relação a outros ou fixa eles na viewport

Slide 77

Slide 77 text

Box model Ordena os elementos em direção vertical (block) ou horizontal (inline)

Slide 78

Slide 78 text

Box model Ordena os elementos em direção vertical (block) ou horizontal (inline)

Slide 79

Slide 79 text

Box model Ordena os elementos em direção vertical (block) ou horizontal (inline)

Slide 80

Slide 80 text

Flexbox model E que tal um novo modelo?

Slide 81

Slide 81 text

Flexbox: flex grown e shrink grown 0 0 1

Slide 82

Slide 82 text

Flexbox: flex grown e shrink grown 0 0 1

Slide 83

Slide 83 text

Flexbox: flex grown e shrink shrink 1 1 0 0 0 1 grown

Slide 84

Slide 84 text

Flexbox: flex grown e shrink shrink 1 1 0 0 0 1 grown

Slide 85

Slide 85 text

Flexbox: align itens flex-start flex-end center stretch

Slide 86

Slide 86 text

Flexbox: justify content flex-start flex-end center space-between

Slide 87

Slide 87 text

Flexbox: flow e order Holy Grail Layout example https:/ /developer.mozilla.org/en-US/docs/Web/Guide/CSS/ Flexible_boxes

Slide 88

Slide 88 text

Flexbox: flow e order Holy Grail Layout example https:/ /developer.mozilla.org/en-US/docs/Web/Guide/CSS/ Flexible_boxes

Slide 89

Slide 89 text

Flexbox model Flexbox é ideal para componentes W3C Candidate Recommendation Compatível com Chrome 29+ e IE 11 display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; } @mixin flex($values) { -webkit-box-flex: $values; -moz-box-flex: $values; -webkit-flex: $values; -ms-flex: $values; flex: $values; } @mixin order($val) { -webkit-box-ordinal-group: $val; -moz-box-ordinal-group: $val; -ms-flex-order: $val; -webkit-order: $val; order: $val; } .wrapper { @include flexbox(); } .item { @include flex(1 200px); @include order(2); A Complete Guide to Flexbox http:/ /css-tricks.com/snippets/ css/a-guide-to-flexbox/

Slide 90

Slide 90 text

Grid model Ideal para definir disposição dos componentes Especificação compatível apenas com IE 10+

Slide 91

Slide 91 text

No content

Slide 92

Slide 92 text

Boilerplates conclusão Boas práticas são sempre bem vindas Nunca esqueça do reset.css ou normalize.css

Slide 93

Slide 93 text

Frameworks de CSS conclusão Use apenas os mixins e funções para pré-processadores de CSS Aproveite a vontade código JavaScript não atrelado a classes HTML

[...][...]

// Mixins em LESS do Twitter Boot .tool { .makeRow(); } .tool-title { .makeColumn(3); } .tool-content { .makeColumn(9); }

Slide 94

Slide 94 text

Pré processadores conclusão Deixe de bobagem e turbine seu workflow Prefira o pré-processador que sua equipe se sente mais a vontade

Slide 95

Slide 95 text

CSS Layout conclusão Box model ainda é o caminho, aprenda ao máximo! Use flexbox e grid em ambientes controlados, ainda tem baixa compatibidade e especificação não concluída Learn CSS Layout http:/ /learnlayout.com

Slide 96

Slide 96 text

Obrigado! @jcemer