Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Arquitetura CSS

Rafael Rinaldi
December 05, 2014

Arquitetura CSS

Hoje em dia quando o assunto é CSS muito se fala em modularização e arquitetura de código. Mas o que de fato é isso? Quais abordagens podemos utilizar para tornar o código do nosso CSS mais organizado?

Nessa apresentação procuro passar uma visão geral das técnicas mais populares, detalhando suas particularidades e a ideologia por traz de cada uma.

Também falo de técnicas mais recentes que abordam o desenvolvimento de CSS de perspectivas diferentes e algumas dicas gerais de como deixar seu código mais flexível a mudanças.

--

Video
https://www.eventials.com/locaweb/arquitetura-css-com-rafael-rinaldi/?playlist=4o-seminario-locaweb-desenvolvimento-sao-paulo

Anotações sobre a palestra no blog do Tableless
http://tableless.com.br/arquitetura-css-anotacoes-da-palestra-rafael-rinaldi

Rafael Rinaldi

December 05, 2014
Tweet

More Decks by Rafael Rinaldi

Other Decks in Design

Transcript

  1. ›❯ Não é muito expressivo; ›❯ Ordem de definição de

    dependências; ›❯ Especificidade; ›❯ Cheio de truques.
  2. ›❯ Falta de conhecimento sobre o proprio projeto; ›❯ Caos

    na estrutura; ›❯ Documentação inexistente ou muito ruim; ›❯ Não analisar o que já existe antes de criar algo do zero.
  3. Conteúdo Apresentação (e agora também animações) Comportamento e interações mais

    complexas http://alistapart.com/article/understandingprogressiveenhancement ⡗
  4. Padrão visual que se repete e que pode ser abstraído

    em um contexto próprio Técnicas → OOCSS
  5. html { box-sizing: border-box; } *, *::before, *::after { box-sizing:

    inherit; } body { background: #bada55; } input[type=text] { border: 2px solid #444; } Técnicas → SMACSS → Base
  6. ›❯ 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
  7. #header { font-size: 2em; color: fuchsia; width: 100%; height: 15em;

    /* Dica: não precisa especificar unidade p/ line height */ line-height: 1.5; } #sidebar { font-size: .75em; color: gray; float: right; } .l-inverse #sidebar { float: left; } Técnicas → SMACSS → Layout
  8. ›❯ Trechos de código reutilizáveis; ›❯ Partes modulares do design;

    ›❯ Padrões. Técnicas → SMACSS → Modules
  9. ›❯ Como os módulos irão se apresentar em estados específicos;

    ›❯ Representado por classes com o prefixo is . Técnicas → SMACSS → State
  10. .sidebar.is-expanded { opacity: 1; } .button.is-disabled { cursor: not-allowed; background:

    lightgray; opacity: .75; pointer-events: none; /* Capeta */ } Técnicas → SMACSS → State
  11. /* 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
  12. ›❯ 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
  13. ›❯ Parte de um bloco com uma função específica; ›❯

    Não possui um contexto próprio. Técnicas → BEM → Element
  14. Uma propriedade de um bloco ou elemento que altera seu

    comportamento Técnicas → BEM → Modifier
  15. ›❯ 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
  16. <ul class="list list_size_big list_type_links"> <li class=“list__item”> <a href=“/seminario-locaweb”>Seminário Locaweb</a> </li>

    <li class="list__item list__item_state_active”> <a href=“/femug-sp">FEMUG-SP</a> </li> </ul> Técnicas → BEM → Nomenclatura
  17. Criado por desenvolvedores do Twitter numa tentativa de focar numa

    arquitetura baseada em componentes Técnicas → SUIT CSS
  18. ›❯ Utiliza-se camelCase para separar palavras em nomes longos; ›❯

    Utilitários devem começar com o prefixo u . Técnicas → SUIT CSS → Nomenclatura
  19. /* 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
  20. <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
  21. /* Inline de imports procura por libs instaladas via NPM

    */ @import "normalize.css"; /* Atalhos para lidar com media queries */ @custom-media --wide-screen (min-width: 80em); /* Valores padrão */ :root { --base-font-size: 16px; } @media (--wide-screen) { html { /* Utiliza Autoprefixer p/ lidar c/ vendor prefixes */ font-size: calc(var(--base-font-size) * 2); } } Técnicas → SUIT CSS → Nomenclatura
  22. ›❯ Settings: variáveis e configurações; ›❯ Tools: mixins e funções;

    ›❯ Generic: resets, configuração de box sizing, etc; ›❯ Base: estilos atrelados a tags, sem o uso de classes; ›❯ Objects: padrões visuais que se repetem; ›❯ Components: elementos de interface com contexto específico; ›❯ Trumps: overrides (geralmente utiliza-se !important ). Técnicas → itcss
  23. ›❯ Evita redundância na descrição de regras de estilo; ›❯

    Elimina problemas com especificidade; ›❯ Estrutura granular; ›❯ Elimina a necessidade de “escrever CSS para remover CSS”. Técnicas → itcss
  24. Outras Abordagens → csstyle <a class="button --action +rounded +glass"> Cadastre-se

    <span class="button__icon --rocket"></span> </a> Component
  25. Outras Abordagens → csstyle <a class="button --action +rounded +glass"> Cadastre-se

    <span class="button__icon --rocket"></span> </a> Option Option
  26. Outras Abordagens → csstyle <a class="button --action +rounded +glass"> Cadastre-se

    <span class="button__icon --rocket"></span> </a> Tweaks
  27. Outras Abordagens → csstyle <a class="button --action +rounded +glass"> Cadastre-se

    <span class="button__icon --rocket"></span> </a> Parts
  28. 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; } }
  29. Outras Abordagens → AMCSS <!-- Botão padrão --> <a am-Button>Inscrever-se

    no Seminário Locaweb</a> <!-- Variações do botão --> <a am-Button="primary large”>Informações</a> <a am-Button="info small”>Cancelar inscrição</a>
  30. A mágica está no seletor ~= que nos permite selecionar

    qualquer atributo que contenha uma lista de regras separadas por espaço Outras Abordagens → AMCSS
  31. <!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
  32. 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
  33. Depende de um runtime (que roda em um web worker)

    e de um pré-processador Outras Abordagens → Grid Style Sheets
  34. 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.
  35. CSS na Magnetis ›❯ Sass com a sintaxe SCSS; ›❯

    Autoprefixer; ›❯ Sistema de grid Susy; ›❯ Breakpoint; ›❯ SVG; ›❯ Rails (partials & Sprockets = ❤); ›❯ Bower.
  36. /* 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` */ .menu-item.has-icon {} /* Elemento `icon` dentro do componente `menu` */ .menu-item__icon {} CSS na Magnetis
  37. app ├── assets │ └── stylesheets │ ├── application.scss │

    ├── base │ │ ├── _breakpoints.scss │ │ ├── _defaults.scss │ │ ├── _grid.scss │ │ ├── _typography.scss │ │ └── _variables.scss │ ├── components │ │ ├── _button.scss │ │ ├── _dropdown.scss │ │ ├── _gallery.scss │ │ └── _link.scss │ ├── helpers │ │ ├── _classes.scss │ │ ├── _functions.scss │ │ ├── _mixins.scss │ │ └── _placeholders.scss │ └── layout │ ├── _footer.scss │ ├── _header.scss │ └── sections │ ├── _dashboard.scss │ └── _homepage.scss ├── bower.json └── vendor └── assets └── bower ├── normalize-css └── susy
  38. //= require 'normalize-css' @import // Estilos e configurações base 'base/variables',

    'base/grid', 'base/breakpoints', 'base/typography', 'base/deafults', // Utilitários 'helpers/*', // Componentes 'components/*', // Arquivos de layout 'layout/**/*'; CSS na Magnetis
  39. Facilita o uso de ferramentas e a criação de um

    guia de estilo Pontos positivos
  40. <style> navigation ul li a { /* Valores hexadecimais sempre

    em minúsculo, por favor */ color: #c0ffee; } </style> <navigation> <ul> <li><a href="/seminario">Seminário Locaweb</a></li> <li><a href="/femug-sp">FEMUG-SP</a></li> </ul> </navigation> Pontos positivos
  41. <style> .link { color: #coffee; } </style> <navigation> <ul> <li>

    <a class="link" href=“/seminario">Seminário Locaweb</a> </li> <li> <a class="link" href="/femug-sp">FEMUG-SP</a> </li> </ul> </navigation> Pontos positivos
  42. <div class="nav__bar is-moved-by-drawer headroom 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
  43. Pense no seu time na hora de tomar decisões de

    arquitetura Não existe bala de prata
  44. /* ============================================================== 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