modular html & css turbo workshop
TRANSCRIPT
@shayhowe & @darbyfrey Modular HTML & CSS
Shay Howe@shayhowe
learn.shayhowe.com
Darby Frey@darbyfrey
darbyfrey.com
@shayhowe & @darbyfrey Modular HTML & CSS
1. The Problem2. Groundwork3. Assembling Layout4. Accommodating Content5. Turbo with SCSS 6. Onward
OUR SCHEDULE
@shayhowe & @darbyfrey Modular HTML & CSS
THEPROBLEM
The Gust by Willem van de Velde the Younger
@shayhowe & @darbyfrey Modular HTML & CSS
COMMON PROBLEMS• Websites have difficulty scaling
• Code becomes brittle
• Files and code bases begin to swell
@shayhowe & @darbyfrey Modular HTML & CSS
WHAT’S WRONG• Best practices aren’t exactly best practices
• Standards need to evolve
@shayhowe & @darbyfrey Modular HTML & CSS
BEST BAD PRACTICES• Avoid extra elements
• Avoid classes
• Leverage type selectors
• Leverage descendent selectors
@shayhowe & @darbyfrey Modular HTML & CSS
BEST BAD PRACTICESAvoiding classessection ul#nav li {...}section:nth-‐child(2) div:nth-‐child(7) > a {...}
Leveraging selectorsa.btn {...}#main a.btn {...}#main div.feature a.btn {...}
@shayhowe & @darbyfrey Modular HTML & CSS
BEST BAD PRACTICESBad#contact li:nth-‐child(1) input,#contact li:nth-‐child(2) input { width: 160px;}#contact li:nth-‐child(3) textarea { width: 280px;}
@shayhowe & @darbyfrey Modular HTML & CSS
BEST BAD PRACTICESGood.col-‐1 { width: 160px;}.col-‐2 { width: 280px;}
@shayhowe & @darbyfrey Modular HTML & CSS
SPECIFICITY?• Specificity determines which styles are applied
• Each selector has a specificity weight
• High specificity beats low specificity
• Low specificity is key
@shayhowe & @darbyfrey Modular HTML & CSS
MEASURING SPECIFICITYFormula
• IDs, Classes/Pseudo-classes/Attributes, Elements
High Specificity (Bad)
#primary #main div.gallery figure.mediaIDs: 2, Classes: 2, Elements: 2 — Compiled: 2–2–2
Low Specificity (Good)
.gallery-‐mediaIDs: 0, Classes: 1, Elements: 0 — Compiled: 0–1–0
@shayhowe & @darbyfrey Modular HTML & CSS
@shayhowe & @darbyfrey Modular HTML & CSS
WATCH SPECIFICITY• Be explicit
• Keep specificity low
• Never use IDs or !important
• Avoid nested selectors (#main .spotlight strong span)
@shayhowe & @darbyfrey Modular HTML & CSS
WATCH SPECIFICITYBad#primary #main div.gallery { text-‐transform: uppercase;}#primary #main div.gallery figure.media { background: #ccc;}
@shayhowe & @darbyfrey Modular HTML & CSS
WATCH SPECIFICITYGood.gallery { text-‐transform: uppercase;}.gallery-‐media { background: #ccc;}
Parade of the Black Sea Fleet by Ivan Aivazovsky
@shayhowe & @darbyfrey Modular HTML & CSS
MAINTAINABILITYCode must be...
• Organized
• Modular
• Performant
@shayhowe & @darbyfrey Modular HTML & CSS
METHODOLOGIESOOCSS
• Object-Oriented CSSFrom Nicole Sullivan – oocss.org
SMACSS
• Scalable and Modular Architecture for CSSFrom Jonathan Snook – smacss.com
@shayhowe & @darbyfrey Modular HTML & CSS
GROUNDWORK
@shayhowe & @darbyfrey Modular HTML & CSS
REUSE CODE• Do not duplicate code
• Remove old code
• Defer loading subsequent styles
@shayhowe & @darbyfrey Modular HTML & CSS
REUSE CODEBad.news { background: #eee; color: #666;}.social { background: #eee; color: #666;}
@shayhowe & @darbyfrey Modular HTML & CSS
REUSE CODEGood.news,.social { background: #eee; color: #666;}
Better.feat-‐box { background: #eee; color: #666;}
@shayhowe & @darbyfrey Modular HTML & CSS
USE CLASSES• Write understandable class names
• Avoid unnecessary nesting
• Use same strength specificity
@shayhowe & @darbyfrey Modular HTML & CSS
USE CLASSESBad.feat-‐box .callout .pr { font-‐size: 12px;}.feat-‐box .callout .pr .un { color: #39f;}
@shayhowe & @darbyfrey Modular HTML & CSS
USE CLASSESGood.feat-‐box .price { font-‐size: 12px;}.feat-‐box .unit { color: #39f;}
@shayhowe & @darbyfrey Modular HTML & CSS
USE CLASSESBad.btn.large { font-‐size: 24px; padding: 15px 30px;}
<div class="btn large">...</div>
@shayhowe & @darbyfrey Modular HTML & CSS
USE CLASSESGood.btn-‐large { font-‐size: 24px; padding: 15px 30px;}
<div class="btn-‐large">...</div>
@shayhowe & @darbyfrey Modular HTML & CSS
ASSEMBLINGLAYOUT
@shayhowe & @darbyfrey Modular HTML & CSS
ABSTRACT STRUCTURE• Separate presentation (or theme) from layout
• Create an object layer for layout
• Create a skin layer for theme
• Use a grid
@shayhowe & @darbyfrey Modular HTML & CSS
ABSTRACT STRUCTUREBad.news { background: #eee; color: #666; margin: 0 10px; width: 400px;}
<div class="news">...</div>
@shayhowe & @darbyfrey Modular HTML & CSS
ABSTRACT STRUCTUREGood.grid-‐4 { margin: 0 10px; width: 400px;}.feat-‐box { background: #eee; color: #666;}
<div class="grid-‐4 feat-‐box">...</div>
@shayhowe & @darbyfrey Modular HTML & CSS
TRANSPARENTIZE ELEMENTS• Stylize elements to be transparent
• Keep visual properties apart from layout properties
@shayhowe & @darbyfrey Modular HTML & CSS
TRANSPARENTIZE ELEMENTSBad.pagination { border-‐radius: 5px; border: 1px solid #eee; margin: 0 10px; width: 620px;}
<ul class="pagination">...</ul>
@shayhowe & @darbyfrey Modular HTML & CSS
TRANSPARENTIZE ELEMENTSGood.grid-‐8 { margin: 0 10px; width: 620px;}.offset-‐box { border-‐radius: 5px; border: 1px solid #eee;}
<ul class="grid-‐8 offset-‐box">...</ul>
@shayhowe & @darbyfrey Modular HTML & CSS
CREATE ADAPTABLE LAYOUTS• Height and width should be flexible
• Height should extend with content
• Width should extend with a grid
@shayhowe & @darbyfrey Modular HTML & CSS
CREATE ADAPTABLE LAYOUTSBad#main { float: left; margin: 0 10px; width: 620px;}#aside { float: left; margin: 0 10px; width: 300px;}
@shayhowe & @darbyfrey Modular HTML & CSS
CREATE ADAPTABLE LAYOUTSGood.grid-‐4,.grid-‐8 { float: left; margin: 0 10px;}.grid-‐4 { width: 300px;}.grid-‐8 { width: 620px;}
@shayhowe & @darbyfrey Modular HTML & CSS
ASSEMBLING LAYOUT
IN PRACTICEhttp://bit.ly/modular-html-css
@shayhowe & @darbyfrey Modular HTML & CSS
ACCOMMODATINGCONTENT
@shayhowe & @darbyfrey Modular HTML & CSS
SEPARATE CONTENT• Separate content from container
• Stylize content regardless of container
@shayhowe & @darbyfrey Modular HTML & CSS
SEPARATE CONTENTBad.alert { background: #f2dede; border-‐radius: 10px; color: #b94a48; padding: 10px 20px;}
<div class="alert">...</div>
@shayhowe & @darbyfrey Modular HTML & CSS
SEPARATE CONTENTGood.alert { border-‐radius: 10px; padding: 10px 20px;}.alert-‐error { background: #f2dede; color: #b94a48;}
<div class="alert alert-‐error">...</div>
@shayhowe & @darbyfrey Modular HTML & CSS
AVOID PARENT DEPENDENCY• Remove parent container dependency
• Decouple CSS from HTML
• Create components to be used anywhere
@shayhowe & @darbyfrey Modular HTML & CSS
AVOID PARENT DEPENDENCYBad.feat-‐box { background: #eee;}article .feat-‐box { background: #fff;}
<article> <div class="feat-‐box">...</div></article>
@shayhowe & @darbyfrey Modular HTML & CSS
AVOID PARENT DEPENDENCYGood.feat-‐box { background: #eee;}.feat-‐box-‐alt { background: #fff;}
<article> <div class="feat-‐box-‐alt">...</div></article>
@shayhowe & @darbyfrey Modular HTML & CSS
FAVOR SEMANTICS• Allow elements to adapt
• Uses individual classes to extend modules
@shayhowe & @darbyfrey Modular HTML & CSS
FAVOR SEMANTICSBad.feat-‐box h2 { color: #f60; font: 18px Helvetica, sans-‐serif;}
<div class="feat-‐box"> <h2>...</h2></div>
@shayhowe & @darbyfrey Modular HTML & CSS
FAVOR SEMANTICSGood.feat-‐subhead { color: #f60; font: 18px Helvetica, sans-‐serif;}
<div class="feat-‐box"> <h2 class="feat-‐subhead">...</h2></div>
@shayhowe & @darbyfrey Modular HTML & CSS
ACCOMMODATING CONTENT
IN PRACTICEhttp://bit.ly/modular-html-css
@shayhowe & @darbyfrey Modular HTML & CSS
TURBOWITH SCSS
@shayhowe & @darbyfrey Modular HTML & CSS
SETUP
@shayhowe & @darbyfrey Modular HTML & CSS
SCSS• CSS preprocessor
• Extension of CSS3
• Compiled using Ruby
• Adds nested rules, variables, mixins, selector inheritance, and more
@shayhowe & @darbyfrey Modular HTML & CSS
SCSSSCSS Syntax.new { color: #f60; .item { font-‐size: 24px; }}
Compiled CSS.new { color: #f60;}.new .item { font-‐size: 24px;}
@shayhowe & @darbyfrey Modular HTML & CSS
SCSS VS. SASSSCSS Syntax.new { color: #f60; .item { font-‐size: 24px; }}
Sass Syntax.new color: #f60 .item font-‐size: 24px
@shayhowe & @darbyfrey Modular HTML & CSS
COMPASS• Built on top of Sass
• Includes reusable patterns
• Provides cross browser CSS3 mixins
@shayhowe & @darbyfrey Modular HTML & CSS
SCOUT APP• GUI for compiling Sass and Compass
• Available for both Mac and Windows
@shayhowe & @darbyfrey Modular HTML & CSS
SETUP
IN PRACTICEhttp://bit.ly/modular-html-css
@shayhowe & @darbyfrey Modular HTML & CSS
ORGANIZATION
@shayhowe & @darbyfrey Modular HTML & CSS
TECHNIQUESettings• Utility styles (Extends, Mixins, Variables)
Base• Core styles for entire site (Layout, Typography)
Components• UI concepts & design patterns (Buttons, List, Navigation)
Modules• Business logic (Aside, Header, Footer)
@shayhowe & @darbyfrey Modular HTML & CSS
TECHNIQUE
@shayhowe & @darbyfrey Modular HTML & CSS
PARTIALS• Must begin with an underscore, _
• Must have a file extension of .scss, not .css.scss
@shayhowe & @darbyfrey Modular HTML & CSS
IMPORTSworkshop.css.scss// Compass@import "compass/css3";
// Settings@import "settings/variables";
// Base@import "base/layout";
...
@shayhowe & @darbyfrey Modular HTML & CSS
ORGANIZATION
IN PRACTICEhttp://bit.ly/modular-html-css
@shayhowe & @darbyfrey Modular HTML & CSS
SETTINGS
@shayhowe & @darbyfrey Modular HTML & CSS
VARIABLES• Allow common values to be shared
• Assigned with a dollar sign, name, colon, and value
• May be a number, string, boolean, null, or multiple comma separated values
@shayhowe & @darbyfrey Modular HTML & CSS
VARIABLESSCSS Syntax$font-‐base: 14px;$sans-‐serif: "Open Sans", sans-‐serif;p { font: $font-‐base $sans-‐serif;}
Compiled CSSp { font: 14px "Open Sans", sans-‐serif;}
@shayhowe & @darbyfrey Modular HTML & CSS
EXTENDS• Share common styles without duplicating them
• Keep code weight low
• Generates detailed selectors
• Assigned with the @extend rule followed by the
selector
@shayhowe & @darbyfrey Modular HTML & CSS
EXTENDSSCSS Syntax.alert { border-‐radius: 10px;}.alert-‐error { @extend .alert; color: #b94a48;}.alert-‐success { @extend .alert; color: #468847;}
Compiled CSS.alert,.alert-‐error,.alert-‐success { border-‐radius: 10px;}.alert-‐error { color: #b94a48;}.alert-‐success { color: #468847;}
@shayhowe & @darbyfrey Modular HTML & CSS
PLACEHOLDERS• Similar to extends
• Selector is assigned with a percentage sign
• Extended selector is not output, only the styles
@shayhowe & @darbyfrey Modular HTML & CSS
PLACEHOLDERSSCSS Syntax%alert { border-‐radius: 10px;}.alert-‐error { @extend %alert; color: #b94a48;}.alert-‐success { @extend %alert; color: #468847;}
Compiled CSS.alert-‐error,.alert-‐success { border-‐radius: 10px;}.alert-‐error { color: #b94a48;}.alert-‐success { color: #468847;}
@shayhowe & @darbyfrey Modular HTML & CSS
MIXINS• Share similar styles based off given arguments
• Duplicates properties, providing different values
• Assigned with the @mixin rule followed by the
name and arguments
@shayhowe & @darbyfrey Modular HTML & CSS
MIXINSSCSS Syntax@mixin btn($color) { color: $color;}.btn { @mixin btn(#f60);}
Compiled CSS.btn { color: #f60;}
@shayhowe & @darbyfrey Modular HTML & CSS
SETTINGS
IN PRACTICEhttp://bit.ly/modular-html-css
@shayhowe & @darbyfrey Modular HTML & CSS
REFACTOR
@shayhowe & @darbyfrey Modular HTML & CSS
COMMENTS• Two different types of comments
• Standard CSS comments as normal
• Silent comments, assigned with two forward slashes, not compiled in the output
@shayhowe & @darbyfrey Modular HTML & CSS
COMMENTSSCSS Syntax/* Normal comment */.awesome { color: #3276b1;}// Omitted comment.very-‐awesome { color: #47a447;}
Compiled CSS/* Normal comment */.awesome { color: #3276b1;}.very-‐awesome { color: #47a447;}
@shayhowe & @darbyfrey Modular HTML & CSS
PARENT SELECTOR• Add styles to a previous selector
• Commonly used with pseudo classes
• Assigned with an ampersand
• May also be used as the key selector
@shayhowe & @darbyfrey Modular HTML & CSS
PARENT SELECTORSCSS Syntaxa { color: #8ec63f; &:hover { color: #f7941d; }}
Compiled CSSa { color: #8ec63f;}a:hover { color: #f7941d;}
@shayhowe & @darbyfrey Modular HTML & CSS
INTERPOLATION• Occasionally SCSS need to be interpolated
• Most commonly happens as part of a class name, property name, or inside a string plain text
• Assigned by placing the value inside #{...}
@shayhowe & @darbyfrey Modular HTML & CSS
INTERPOLATIONSCSS Syntax$logo: twitter;$offset: left;.#{$logo} { #{$offset}: 20px;}
Compiled CSS.twitter { left: 20px;}
@shayhowe & @darbyfrey Modular HTML & CSS
REFACTOR
IN PRACTICEhttp://bit.ly/modular-html-css
@shayhowe & @darbyfrey Modular HTML & CSS
COMPILE
@shayhowe & @darbyfrey Modular HTML & CSS
OUTPUT STYLES• SCSS has multiple output styles
• Nested or expanded is best for development
• Compact or compressed is best for production
@shayhowe & @darbyfrey Modular HTML & CSS
COMPILE
IN PRACTICEhttp://bit.ly/modular-html-css
@shayhowe & @darbyfrey Modular HTML & CSS
ONWARD
Ships on the Roadstead by Willem van de Velde the Younger
@shayhowe & @darbyfrey Modular HTML & CSS
APPROACH• Stop thinking about pages
• Start thinking about components
• Take visual inventory
@shayhowe & @darbyfrey Modular HTML & CSS
THEMES• Decouple HTML and CSS
• Separate presentation from layout
• Separate content from container
• Extend elements with classes
@shayhowe & @darbyfrey Modular HTML & CSS
OUTCOMES• Maintainability!
• Reusable code, less duplication
• Flexibility and extensibility
• Improved standards
@shayhowe & @darbyfrey Modular HTML & CSS
WHAT’S NEXTBuild a style guide
• Twitter Bootstrap, Zurb Foundation
Review methodologies
• OOCSS, SMACSS
Test your code
• CSS Lint, Inspector, PageSpeed
@shayhowe & @darbyfrey Modular HTML & CSS
THANK YOU!Questions?
@shayhowe
@darbyfrey