arquitetura css

129
ARQUITETURA CSS @rafaelrinaldi

Upload: rafael-rinaldi

Post on 12-Jul-2015

690 views

Category:

Design


4 download

TRANSCRIPT

Page 1: Arquitetura CSS

ARQUITETURA CSS

@rafaelrinaldi

Page 2: Arquitetura CSS
Page 3: Arquitetura CSS

https://magnetis.com.brⓞ

Page 4: Arquitetura CSS

https://magnetis.com.brⓞ

Estamos contratando!

Page 5: Arquitetura CSS

https://sp.femug.comⓞ

FEMUG

Page 6: Arquitetura CSS

Disclaimer

Page 7: Arquitetura CSS

Não vou utilizar o gif to Peter Griffin durante a palestra!peter_griffin_css.gif

Page 8: Arquitetura CSS

Desenvolver interfaces para a web é muito mais do que um problema exclusivo do CSS

Page 9: Arquitetura CSS

Conteúdo

Apresentação (e agora também animações)

Comportamento e interações mais complexas

http://alistapart.com/article/understandingprogressiveenhancementⓞ

Page 10: Arquitetura CSS

CSS funciona. Poderia ser muito pior!

Page 11: Arquitetura CSS

Técnicas

Page 12: Arquitetura CSS

Técnicas Frameworks / Bibliotecas≠

Page 13: Arquitetura CSS

OOCSS

https://github.com/stubbornella/oocss/wikiⓞ

Page 14: Arquitetura CSS

https://github.com/stubbornella/oocss/wikiⓞ

Object Oriented CSS

Page 15: Arquitetura CSS

Influenciado pelo paradigma da orientação a objetos

Técnicas → OOCSS

Page 16: Arquitetura CSS

CSS “object”

Técnicas → OOCSS

Page 17: Arquitetura CSS

Padrão visual que se repete e que pode ser abstraído em um contexto próprio

Técnicas → OOCSS

Page 18: Arquitetura CSS

Separar estrutura de marcação de variações visuais

Técnicas → OOCSS

Page 19: Arquitetura CSS

Separar o conteúdo seu contexto

Técnicas → OOCSS

Page 20: Arquitetura CSS

SMACSS

http://smacss.comⓞ

Page 21: Arquitetura CSS

Scalable and Modular Architecture for CSS

http://smacss.comⓞ

Page 22: Arquitetura CSS

Feito para resolver problemas específicos do Yahoo! Mail

Técnicas → SMACSS

Page 23: Arquitetura CSS

›❯ Base; ›❯ Layout; ›❯ Module; ›❯ State; ›❯ Theme.

Técnicas → SMACSS

Page 24: Arquitetura CSS

SMACSS → Base

Técnicas → SMACSS → Base

Page 25: Arquitetura CSS

Regras padrão de estilo

Técnicas → SMACSS → Base

Page 26: Arquitetura CSS

html { box-sizing: border-box; }

*, *::before, *::after { box-sizing: inherit; }

body { background: #bada55; }

input[type=text] { border: 2px solid #444; }

Técnicas → SMACSS → Base

Page 27: Arquitetura CSS

SMACSS → Layout

Técnicas → SMACSS → Layout

Page 28: Arquitetura CSS

›❯ Utilizado por elementos fixos da aplicação; ›❯ Seletor único, não reutilizável; ›❯ Variações são representadas por classes com o prefixo l .

Técnicas → SMACSS → Layout

Page 29: Arquitetura CSS

#header { font-size: 2em; color: fuchsia; width: 100%; height: 15em; line-height: 1.5; /* dica: não precisa especificar unidade aqui */ }

#sidebar { font-size: .75em; color: gray; float: right; }

.l-inverse #sidebar { float: left; }

Técnicas → SMACSS → Layout

Page 30: Arquitetura CSS

SMACSS → Modules

Técnicas → SMACSS → Modules

Page 31: Arquitetura CSS

›❯ Trechos de código reutilizáveis; ›❯ Partes modulares do design; ›❯ Padrões.

Técnicas → SMACSS → Modules

Page 32: Arquitetura CSS

SMACSS → State

Técnicas → SMACSS → State

Page 33: Arquitetura CSS

›❯ Como os módulos irão se apresentar em estados específicos; ›❯ Representado por classes com o prefixo is .

Técnicas → SMACSS → State

Page 34: Arquitetura CSS

.sidebar.is-expanded { opacity: 1; }

.button.is-disabled { cursor: not-allowed; background: lightgray; opacity: .75; pointer-events: none; /* capeta */ }

Técnicas → SMACSS → State

Page 35: Arquitetura CSS

SMACSS → Theme

Técnicas → SMACSS → Theme

Page 36: Arquitetura CSS

Utilizado apenas em aplicações que possuem opções de variação visual

Técnicas → SMACSS → Theme

Page 37: Arquitetura CSS

/* No arquivo do componente botão */ .button { border: 1px solid; }

/* No arquivo de tema do botão */ .button { border-color: fuchsia; background: seagreen; font-family: 'Ubuntu Mono', monospace; }

Técnicas → SMACSS → Theme

Page 38: Arquitetura CSS

BEM

http://bem.infoⓞ

Page 39: Arquitetura CSS

Block Element Modifier

http://bem.infoⓞ

Page 40: Arquitetura CSS

Feito para resolver problemas específicos do Yandex

Técnicas → BEM

Page 41: Arquitetura CSS

›❯ Facilitar a manutenção de projetos de longa duração; ›❯ Facilidade de entendimento do código; ›❯ Diminuir curva de aprendizado em novos membros do time; ›❯ Reutilização de código.

Técnicas → BEM

Page 42: Arquitetura CSS

BEM → Block

Técnicas → BEM → Block

Page 43: Arquitetura CSS

Entidade independente que é capaz de conter outros blocos

Técnicas → BEM → Block

Page 44: Arquitetura CSS

Técnicas → BEM → Block

Page 45: Arquitetura CSS

Técnicas → BEM → Block

Page 46: Arquitetura CSS

BEM → Element

Técnicas → BEM → Element

Page 47: Arquitetura CSS

›❯ Parte de um bloco com uma função específica; ›❯ Não possui um contexto próprio.

Técnicas → BEM → Element

Page 48: Arquitetura CSS

Técnicas → BEM → Element

Page 49: Arquitetura CSS

Técnicas → BEM → Element

Page 50: Arquitetura CSS

BEM → Modifier

Técnicas → BEM → Modifier

Page 51: Arquitetura CSS

Uma propriedade de um bloco ou elemento que altera seu comportamento

Técnicas → BEM → Modifier

Page 52: Arquitetura CSS

Técnicas → BEM → Modifier

Page 53: Arquitetura CSS

Técnicas → BEM → Modifier

Page 54: Arquitetura CSS

BEM → Nomenclatura

Técnicas → BEM → Nomenclatura

Page 55: Arquitetura CSS

›❯ Utiliza-se hífen para separar palavras em nomes longos; ›❯ Underscore duplo para separar um bloco de um elemento; ›❯ PascalCase e camelCase são aceitos.

Técnicas → BEM → Nomenclatura

Page 56: Arquitetura CSS

<ul class="list list_size_big list_type_links"> <li class=“list__item”> <a href="/meetup-css">Meetup CSS</a> </li> <li class="list__item list__item_state_active”> <a href=“/femug-sp">FEMUG-SP</a> </li> </ul>

Técnicas → BEM → Nomenclatura

Page 57: Arquitetura CSS

SUIT CSS

https://suitcss.github.ioⓞ

Page 58: Arquitetura CSS

Criado por desenvolvedores do Twitter numa tentativa de mudar para uma arquitetura

baseada em componentes

Técnicas → SUIT CSS

Page 59: Arquitetura CSS

SUIT CSS → Nomenclatura

Técnicas → SUIT CSS → Nomenclatura

Page 60: Arquitetura CSS

›❯ Utiliza-se camelCase para separar palavras em nomes longos; ›❯ Utilitários devem começar com o prefixo u .

Técnicas → SUIT CSS → Nomenclatura

Page 61: Arquitetura CSS

/* Definição de um componente */ .MyComponent {}

/* Definição de um estado */ .MyComponent.is-animating {}

/* Definição de um modificador */ .MyComponent--modifier {}

/* Definição de subelementos */ .MyComponent-part {} .MyComponent-anotherPart {}

Técnicas → SUIT CSS → Nomenclatura

Page 62: Arquitetura CSS

<div class="u-cf"> <a class="u-floatLeft" href="{{url}}"> <img class="u-block" src="{{src}}" alt=""> </a> <p class="u-sizeFill u-textBreak"> </p> </div>

Técnicas → SUIT CSS → Nomenclatura

Page 63: Arquitetura CSS

/* Faz o inline de imports procurando por libs instaladas via NPM */ @import "normalize.css";

/* Atalhos para lidar com media queries */ @custom-media --wide-screen (min-width: 80em);

/* Valores default */ :root { --base-font-size: 16px; }

@media (--wide-screen) { html { /* Utiliza Autoprefixer para lidar c/ vendor prefixes por padrao */ font-size: calc(var(--base-font-size) * 2); } }

Técnicas → SUIT CSS → Nomenclatura

Page 64: Arquitetura CSS

https://github.com/suitcss/componentsⓞ

Page 65: Arquitetura CSS

Outras abordagens

Page 66: Arquitetura CSS
Page 67: Arquitetura CSS

http://www.csstyle.ioⓞ

Page 68: Arquitetura CSS

Utiliza mixins de Sass para definir estilos

Outras Abordagens → csstyle

Page 69: Arquitetura CSS

Outras Abordagens → csstyle

<a class="button --action +rounded +glass"> Register Now <span class="button__icon --rocket"></span> </a>

Page 70: Arquitetura CSS

Outras Abordagens → csstyle

<a class="button --action +rounded +glass"> Register Now <span class="button__icon --rocket"></span> </a>

Component

Page 71: Arquitetura CSS

Outras Abordagens → csstyle

<a class="button --action +rounded +glass"> Register Now <span class="button__icon --rocket"></span> </a>

Option

Page 72: Arquitetura CSS

Outras Abordagens → csstyle

<a class="button --action +rounded +glass"> Register Now <span class="button__icon --rocket"></span> </a>

Tweaks

Page 73: Arquitetura CSS

Outras Abordagens → csstyle

<a class="button --action +rounded +glass"> Register Now <span class="button__icon --rocket"></span> </a>

Parts

Page 74: Arquitetura CSS

Outras Abordagens → csstyle

@include component(button) { background: #6bd9ed; padding: 15px;

@include option(action){ color: #1f1f1f; background: #a7e040; padding-top: 0; }

@include part(icon){ font-size: 34px; position: relative; top: 10px; }

@include tweak(rounded) { border-radius: 10px; } }

Page 75: Arquitetura CSS

https://amcss.github.ioⓞ

Page 76: Arquitetura CSS

Utiliza atributos HTML para definir estilos

Outras Abordagens → AMCSS

Page 77: Arquitetura CSS

Outras Abordagens → AMCSS

<!-- Botão padrão --> <a am-Button>Inscrever-se no Meetup CSS SP</a>

<!-- Variações do botão --> <a am-Button="primary large”>Informações</a> <a am-Button="info small”>Cancelar inscrição</a>

Page 78: Arquitetura CSS

Outras Abordagens → AMCSS

.btn [am-Button] {}

.btn-primary [am-Button~="primary"] {}

.btn-large [am-Button~="large"] {}

Page 79: Arquitetura CSS

http://uilang.comⓞ

Page 80: Arquitetura CSS

Uma linguagem própria para lidar com interface

Outras Abordagens → uilang

Page 81: Arquitetura CSS

<!doctype html> <title>Exemplo uilang</title> <script src=uilang.js></script>

<style> /* Definição de estilos e transições */ #notification { transition: .8s } #notification.hidden { opacity: 0 } </style>

<div id=notification> <p>Você tem três mensagens não lidas.</p> <button class=hide>Esconder</button> </div>

<code> clicking on ".hide" adds class "hidden" on "#notification" </code>

Outras Abordagens → uilang

Page 82: Arquitetura CSS

http://gridstylesheets.orgⓞ

Page 83: Arquitetura CSS

Utiliza o algoritmo Cassowary Constraint Solver para lidar com layouts

Outras Abordagens → Grid Style Sheets

Page 84: Arquitetura CSS

Outras Abordagens → Grid Style Sheets

~Cassowary Constraint Solver~

Page 85: Arquitetura CSS

p { color: purple; line-height: >= 16; line-height: <= ::window[height] / 12; }

#product { $col-width: == ::[width] / 12 !require; $col-left: == ::[left] + ::[$col-width]; .price { left: == ::parent[$col-left]; width: == ::parent[$col-width]; } .description { left: == ::parent[$col-left] + ::parent[$col-width]; } }

.sprite { z-index: >= #bg[z-index] >= 50; }

Outras Abordagens → Grid Style Sheets

Page 86: Arquitetura CSS

Depende de um runtime (que roda em um web worker) e de um pré-processador

Outras Abordagens → Grid Style Sheets

Page 87: Arquitetura CSS

http://getbootstrap.com/cssⓞ

Page 88: Arquitetura CSS

Framework CSS à frente de seu tempo

Outras Abordagens → Bootstrap

Page 89: Arquitetura CSS

Ensinou e popularizou boas práticas de arquitetura CSS modular

Outras Abordagens → Bootstrap

Page 90: Arquitetura CSS

Conceito de helper classes

Outras Abordagens → Bootstrap

Page 91: Arquitetura CSS

<p class="text-muted"></p> <p class="text-primary"></p> <p class="text-success"></p> <p class="text-info"></p> <p class="text-warning"></p> <p class="text-danger"></p>

Outras Abordagens → Bootstrap

Page 92: Arquitetura CSS

Conceito de modificadores incrementais

Outras Abordagens → Bootstrap

Page 93: Arquitetura CSS

<button type="button" class="btn btn-default">Default</button> <button type="button" class="btn btn-primary">Primary</button> <button type="button" class="btn btn-success">Success</button> <button type="button" class="btn btn-info">Info</button>

Outras Abordagens → Bootstrap

Page 94: Arquitetura CSS

Conceito de estados

Outras Abordagens → Bootstrap

Page 95: Arquitetura CSS

<button class="btn btn-primary btn-lg active">Primary button</button> <button class="btn btn-default btn-lg" disabled>Button</button>

Outras Abordagens → Bootstrap

Page 96: Arquitetura CSS

CSS na Magnetis

Page 97: Arquitetura CSS

https://github.com/magnetis/styleguideⓞ

Page 98: Arquitetura CSS

Uma adaptação das partes que julgamos boas em algumas técnicas populares

CSS na Magnetis

Page 99: Arquitetura CSS

CSS na Magnetis

›❯ Conceito de categorização do SMACSS; ›❯ Conceito de estados do SMACSS; ›❯ Conceito de elementos do BEM; ›❯ Conceito de modificadores do SUIT CSS.

Page 100: Arquitetura CSS

CSS na Magnetis

›❯ Sass com a sintaxe SCSS; ›❯ Autoprefixer; ›❯ Sistema de grid Susy; ›❯ Breakpoint; ›❯ SVG; ›❯ Rails (partials & Sprockets = ❤); ›❯ Bower.

Page 101: Arquitetura CSS

/* Componente sidebar */ .accordion {}

/* Componente sidebar no estado expandido */ .accordion.is-expanded {}

/* Modificador `big` do componente botão */ .button--big {}

/* Componente `menu` */ .menu {}

/* Componente `menu-item` */ .menu-item {}

/* Para definir estados, utilizamos `is`, `has`, `should` e `can` */ .menu-item.has-icon {}

/* Elemento `icon` dentro do componente `menu` */ .menu-item__icon {}

CSS na Magnetis

Page 102: Arquitetura CSS
Page 103: Arquitetura CSS

Pontos positivos

Page 104: Arquitetura CSS

Todos no time conseguem falar a mesma língua

Pontos positivos

Page 105: Arquitetura CSS

Facilita o uso de ferramentas e a criação de um guia de estilo

Pontos positivos

Page 106: Arquitetura CSS

Desenvolvimento de interface baseado em componentes ❤

Pontos positivos

Page 107: Arquitetura CSS

Resolve problemas de “depth of applicability”

Pontos positivos

profundidade de aplicabilidade

Page 108: Arquitetura CSS

Evita depender de como o markup está estruturado na hora de criar estilos

Pontos positivos

Page 109: Arquitetura CSS

<style> navigation ul li a { color: #c0ffee; /* valores hexadecimais sempre em minúsculo, pfv */ } </style>

<navigation> <ul> <li><a href="/meetup-css">Meetup CSS</a></li> <li><a href="/femug-sp">FEMUG-SP</a></li> </ul> </navigation>

Pontos positivos

Page 110: Arquitetura CSS

<style> .navigation-list-link { color: #coffee; } </style>

<navigation> <ul> <li> <a class="navigation-list-link" href="/meetup-css">Meetup CSS</a> </li> <li> <a class="navigation-list-link" href=“/femug-sp">FEMUG-SP</a> </li> </ul> </navigation>

Pontos positivos

Page 111: Arquitetura CSS

A ideia de componentes pequenos e com pouca responsabilidade evita problemas de performance na renderização da página e

também problemas com especificidade de seletores

Pontos positivos

Page 112: Arquitetura CSS

Navegadores começam a renderizar a página antes mesmo do documento estar completamente carregado,

fazendo uma leitura da direita pra esquerda

Pontos positivos

Page 113: Arquitetura CSS

Evitar excesso de detalhes nos seletores é uma boa prática

Pontos positivos

Page 114: Arquitetura CSS

ul#menu > li { text-align: right; }

Pontos positivos

Page 115: Arquitetura CSS

Força uma análise contextual antes de programar

Pontos positivos

Page 116: Arquitetura CSS

Maior flexibilidade na hora de lidar com design responsivo

Pontos positivos

Page 117: Arquitetura CSS

Não existe bala de prata

Page 118: Arquitetura CSS

Have a convention, document it, and stick to it.

Não existe bala de prata

Page 119: Arquitetura CSS

http://www.shopify.comⓞ

Page 120: Arquitetura CSS

<div class="nav__bar is-moved-by-drawer headroom headroom--verytop headroom--top"> <div class="nav nav--main" id="ShopifyMainNav"> <nav class="page-width"> <button type="button" class="icon nav__hamburger"> <span class="visuallyhidden">Mobile Navigation</span> </button>

<div class="nav__logo-wrapper"> <a class="icon nav__logo--full-color" href="/"> <span class="visuallyhidden">Home</span> </a> </div> </nav> </div> </div>

Não existe bala de prata

Page 121: Arquitetura CSS

Não existe bala de prata

Page 122: Arquitetura CSS

Não existe bala de prata

Page 123: Arquitetura CSS

Pense no seu time na hora de tomar decisões de arquitetura

Não existe bala de prata

Page 124: Arquitetura CSS

Documente seu código!

Não existe bala de prata

Page 125: Arquitetura CSS

/* ================================================================= Grid layout ================================================================= */

/** * Column layout with horizontal scroll. * * This creates a single row of full-height, non-wrapping columns that can * be browsed horizontally within their parent. * * Example HTML: * * <div class="grid"> * <div class="cell cell-3"></div> * <div class="cell cell-3"></div> * <div class="cell cell-3"></div> * </div> */

Não existe bala de prata

Page 126: Arquitetura CSS

Coisas mudam. O tempo todo.

Não existe bala de prata

Page 127: Arquitetura CSS

Seu código precisa ser flexível e adaptável

Não existe bala de prata

Page 128: Arquitetura CSS

Foque em processos e resultados, não em ferramentas ou frameworks

Não existe bala de prata

Page 129: Arquitetura CSS

@rafaelrinaldi

Muito obrigado