Slide 1

Slide 1 text

ACCELERATED STYLESHEETS WYNN NETHERLAND NATHAN SMITH ...or more style with less typing

Slide 2

Slide 2 text

CSS3 is BIG

Slide 3

Slide 3 text

New properties Hot

Slide 4

Slide 4 text

border-radius

Slide 5

Slide 5 text

border-image

Slide 6

Slide 6 text

www.zurb.com/playground/awesome-overlays

Slide 7

Slide 7 text

background-size

Slide 8

Slide 8 text

gradients

Slide 9

Slide 9 text

RGBA, HSL, HSLA colors rgba (0,0,0,1) is the new black!

Slide 10

Slide 10 text

text-shadow

Slide 11

Slide 11 text

box-shadow

Slide 12

Slide 12 text

word wrap

Slide 13

Slide 13 text

outline

Slide 14

Slide 14 text

columns

Slide 15

Slide 15 text

@font-face Typographic freedom! means

Slide 16

Slide 16 text

New selectors Cool

Slide 17

Slide 17 text

* E .class #id E F E > F E + F E[attribute] E[attribute=value] E[attribute~=value] E[attribute|=value] :first-child :link :visited :lang() :before ::before :after ::after :first-letter ::first-letter :first-line ::first-line E[attribute^=value] E[attribute$=value] E[attribute*=value] E ~ F :root :last-child :only-child :nth-child() :nth-last-child() :first-of-type :last-of-type :only-of-type :nth-of-type() :nth-last-of-type() :empty :not() :target :enabled :disabled :checked CSS3 selectors (and some golden oldies) :header Steal this from jQuery, please

Slide 18

Slide 18 text

WE  CSS

Slide 19

Slide 19 text

This is not a talk about CSS.

Slide 20

Slide 20 text

We think you write too much CSS.

Slide 21

Slide 21 text

You have an ADDICTION.

Slide 22

Slide 22 text

Slide 23

Slide 23 text

Slide 24

Slide 24 text

⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘ ⌘

Slide 25

Slide 25 text

It’s time to ⎋.

Slide 26

Slide 26 text

“Design web systems, not just web pages or web sites.” — Todd Nienkerk aka @toddross co-founder, FourKitchens.com

Slide 27

Slide 27 text

REAL stylesheet innovation We want to talk about

Slide 28

Slide 28 text

HOW we write stylesheets We want to talk about

Slide 29

Slide 29 text

how we MAINTAIN stylesheets We want to talk about

Slide 30

Slide 30 text

how we SIMPLIFY stylesheets We want to talk about

Slide 31

Slide 31 text

when OLD SCHOOL beats the NEW SHINY We want to talk about

Slide 32

Slide 32 text

CSS Frameworks Tool #1

Slide 33

Slide 33 text

Rapidly prototype your layouts

Slide 34

Slide 34 text

Examples:

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

Percentage-based grid, screenshot in Firefox 4.0 http://host.sonspring.com/yui3_grid

Slide 38

Slide 38 text

Understand the underlying CSS Tools. Not crutches.

Slide 39

Slide 39 text

JavaScript Tool #2

Slide 40

Slide 40 text

JavaScript? You mean like jQuery?

Slide 41

Slide 41 text

What’s JavaScript got to do with CSS?

Slide 42

Slide 42 text

Mobile

Slide 43

Slide 43 text

Responsive Design & Media Queries

Slide 44

Slide 44 text

Adapt.js

Slide 45

Slide 45 text

Adapt.js - Serve 960’s (or any) CSS dynamically http://adapt.960.gs

Slide 46

Slide 46 text

How to use Adapt.js = A human-readable config // Edit to suit your needs. var ADAPT_CONFIG = { // Where is your CSS? path: 'assets/css/', // false = Only run once, when page first loads. // true = Change on window resize and page tilt. dynamic: true, // Optional callback... myCallback(i, width) callback: myCallback, // First range entry is the minimum. // Last range entry is the maximum. // Separate ranges by "to" keyword. range: [ '0px to 760px = mobile.css', '760px to 980px = 720.css', '980px to 1280px = 960.css', '1280px to 1600px = 1200.css', '1600px to 1920px = 1560.css', '1920px = fluid.css' ] };

Slide 47

Slide 47 text

How to use Adapt.js = A human-readable config // Edit to suit your needs. var ADAPT_CONFIG = { // Where is your CSS? path: 'assets/css/', // false = Only run once, when page first loads. // true = Change on window resize and page tilt. dynamic: true, // Optional callback... myCallback(i, width) callback: myCallback, // First range entry is the minimum. // Last range entry is the maximum. // Separate ranges by "to" keyword. range: [ '0px to 760px = mobile.css', '760px to 980px = 720.css', '980px to 1280px = 960.css', '1280px to 1600px = 1200.css', '1600px to 1920px = 1560.css', '1920px = fluid.css' ] };

Slide 48

Slide 48 text

Forms

Slide 49

Slide 49 text

Formalize

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

Sass & Compass Tool #3

Slide 52

Slide 52 text

“GET OFF MY LAWN.” Nathan Smith Creator, 960.gs Big Design Speaker (and Reformed Curmudgeon)

Slide 53

Slide 53 text

History of web presentation A brief

Slide 54

Slide 54 text

In the beginning...

Slide 55

Slide 55 text

HTML

Slide 56

Slide 56 text

HTML + for layout

Slide 57

Slide 57 text

HTML was invented in 1989

Slide 58

Slide 58 text

added in 1997

Slide 59

Slide 59 text

Still rockin' after 20 years!

Slide 60

Slide 60 text

Then came

Slide 61

Slide 61 text

HTML + CSS

Slide 62

Slide 62 text

HTML + CSS = Content + Presentation

Slide 63

Slide 63 text

CSS 1 published in 1996.

Slide 64

Slide 64 text

No more tags.

Slide 65

Slide 65 text

font styling, color, borders & more!

Slide 66

Slide 66 text

CSS 2 published in 1998.

Slide 67

Slide 67 text

Improved selectors

Slide 68

Slide 68 text

* E .class #id E F E > F E + F E[attribute] E[attribute=value] E[attribute|=value] :first-child :link :visited :lang() :before ::before :after ::after :first-letter :first-line CSS2 selectors

Slide 69

Slide 69 text

... and even more stuff no browsers supported until years later.

Slide 70

Slide 70 text

Which brings us back to...

Slide 71

Slide 71 text

CSS 3 published in 20__?

Slide 72

Slide 72 text

“Web 2.0” brought new demands

Slide 73

Slide 73 text

Round corners

Slide 74

Slide 74 text

Drop shadows

Slide 75

Slide 75 text

Gradients

Slide 76

Slide 76 text

But we already covered that.

Slide 77

Slide 77 text

That's the 70+ slide introduction Titles are the new bullets.

Slide 78

Slide 78 text

14 years of CSS has basically given us

Slide 79

Slide 79 text

more selectors + more properties

Slide 80

Slide 80 text

Until now...

Slide 81

Slide 81 text

Metaframeworks = high fidelity stylesheets

Slide 82

Slide 82 text

Metaframeworks output CSS.

Slide 83

Slide 83 text

Nested rules

Slide 84

Slide 84 text

table.users tr td {background: #111} table.users tr td a {color: #333} Nested rules - selectors

Slide 85

Slide 85 text

table.users { tr { td { background: #d1d1d; a { color: #111; } } } } Nested rules - selectors

Slide 86

Slide 86 text

table.users { tr { td { color: #111; &.alt { color: #333; } &:hover { color: #666; } } } } Nested rules - selectors

Slide 87

Slide 87 text

.users { font: { size: 1.2em; style: italics; weight: bold; } } Nested rules - properties

Slide 88

Slide 88 text

Syntax options

Slide 89

Slide 89 text

table.users { tr { td { background: #d1d1d; a { color: #111; } } } } Syntax options - SCSS Sassy CSS!

Slide 90

Slide 90 text

table.users tr td background: #d1d1d a color: #111 Syntax options - Indented I — whitespace

Slide 91

Slide 91 text

Variables

Slide 92

Slide 92 text

.user { background: #333; border-size: 2px; } .owner { background: #333; border-size: 2px; } .admin { background: #666; border-size: 4px; } Variables

Slide 93

Slide 93 text

$gray: #333; $default_border: 2px; .user { background: $gray; border-size: $default_border;} .owner { background: $gray; border-size: $default_border;} .admin { background: $gray + #333; border-size: $default_border + 2px; } Variables Even math! and color mixing!

Slide 94

Slide 94 text

Mixins

Slide 95

Slide 95 text

.avatar { padding: 2px; border: solid 1px #ddd; position: absolute; top: 5px; left: 5px; } p img { padding: 2px; border: solid 1px #ddd; } Mixins

Slide 96

Slide 96 text

@mixin frame($padding_width: 2px, $border_color: #ddd) { padding: $padding_width; border: { width: 1px; style: solid; color $border_color; } } .avatar { @include frame; position: absolute; top: 5px; left: 5px; } p img { @include frame(1px, #ccc);} Mixins defines the mixin mixes in the rules

Slide 97

Slide 97 text

Extend

Slide 98

Slide 98 text

.flash { padding: 5px; border-width: 1px; font-weight: bold; } .error { color: #8a1f11; background: #fbe3e4; } .notice { color: #514721; background: #fff6bf; } Mixins

Slide 99

Slide 99 text

.flash { padding: 5px; border-width: 1px; font-weight: bold; } .error { @extend .flash; color: #8a1f11; background: #fbe3e4; } .notice { @extend .flash; color: #514721; background: #fff6bf; } Mixins

Slide 100

Slide 100 text

.flash, .error, .notice { padding: 5px; border-width: 1px; font-weight: bold; } .error { color: #8a1f11; background: #fbe3e4; } .notice { color: #514721; background: #fff6bf; } Mixins now we can use a single class in our markup

Slide 101

Slide 101 text

Imports

Slide 102

Slide 102 text

@import url(/css/reset.css) @import url(/css/typography.css) @import url(/css/layout.css) Imports parent + 3 @imports = 4 HTTP requests

Slide 103

Slide 103 text

@import "reset.scss" # _reset.scss @import "typography" # _typography.scss @import "layout.css" # url(layout.css) Imports Included at compile time - just one http request

Slide 104

Slide 104 text

Imports + Mixins Now it gets fun!

Slide 105

Slide 105 text

A brief detour

Slide 106

Slide 106 text

“It’s time to abolish all vendor prefixes. They’ve become solutions for which there is no problem, and they are actively harming web standards.” — Peter-Paul Koch aka @ppk http://www.quirksmode.org/blog/archives/2010/03/css_vendor_pref.html

Slide 107

Slide 107 text

Ummm. Not so fast.

Slide 108

Slide 108 text

@import "compass/css3.scss"; .callout { @include border-radius(5px); @include linear-gradient("left top", "left bottom", #fff, #ddd); } .callout { -moz-border-radius: 5px; -webkit-border-radius: 5px; -border-radius: 5px; background-image: -moz-linear-gradient(top, bottom, from(#fff), to(#ddd)); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0.00, #fff), color-stop(1.00, #ddd)); } Compass CSS3 mixins very different syntax

Slide 109

Slide 109 text

“Well, reactions to my proposal to abolish vendor prefixes are mixed, and I might have overshot my target here.” -Peter-Paul Koch aka @ppk http://www.quirksmode.org/blog/archives/2010/03/css_vendor_pref_1.html

Slide 110

Slide 110 text

Solutions?

Slide 111

Slide 111 text

beta-new-css8-property-dilly isn't that just like not having it? ...and we're back.

Slide 112

Slide 112 text

Vendor specific stylesheets Maybe. But I'd like to retain Internet Explorer's special status unto itself

Slide 113

Slide 113 text

CSS preprocesors Hey, funny you should ask!

Slide 114

Slide 114 text

Bring your favorite CSS Framework

Slide 115

Slide 115 text

...
...
...
A Blueprint example boo? / Yay?

Slide 116

Slide 116 text

#wrapper { @include container; #content { @include column(7); @include append(1); #featured { @include column(5, true); } } #sidebar { @include column(3, true); @include prepend(1); } } A Blueprint example

Slide 117

Slide 117 text

Look, Ma! No math!

Slide 118

Slide 118 text

Functions

Slide 119

Slide 119 text

Very. Powerful. Functions.

Slide 120

Slide 120 text

hue(#cc3) => 60deg saturation(#cc3) => 60% lightness(#cc3) => 50% adjust-hue(#cc3, 20deg) => #9c3 saturate(#cc3, 10%) => #d9d926 desaturate(#cc3, 10%) => #bfbf40 lighten(#cc3, 10%) => #d6d65c darken(#cc3, 10%) => #a3a329 grayscale(#cc3) => desaturate(#cc3, 100%) = #808080 complement(#cc3) => adjust-hue(#cc3, 180deg) = #33c mix(#cc3, #00f) => #e56619 mix(#cc3, #00f, 10%) => #f91405 mix(#cc3, #00f, 90%) => #d1b72d Sass 2.4 color functions http://nex-3.com/posts/89-powerful-color-manipulation-with-sass

Slide 121

Slide 121 text

mix(rgba(51, 255, 51, 0.75), #f00) => rgba(178, 95, 19, 0.875) mix(rgba(51, 255, 51, 0.90), #f00) => rgba(163, 114, 22, 0.95) alpha(rgba(51, 255, 51, 0.75)) => 0.75 opacity(rgba(51, 255, 51, 0.75)) => 0.75 opacify(rgba(51, 255, 51, 0.75), 0.1) => rgba(51, 255, 51, 0.85) fade-in(rgba(51, 255, 51, 0.75), 0.1) => rgba(51, 255, 51, 0.85) transparentize(rgba(51, 255, 51, 0.75), 0.1) => rgba(51, 255, 51, 0.65) fade-out(rgba(51, 255, 51, 0.75), 0.1) => rgba(51, 255, 51, 0.65) Sass color functions with alpha support! http://nex-3.com/posts/89-powerful-color-manipulation-with-sass

Slide 122

Slide 122 text

No content

Slide 123

Slide 123 text

Blueprint

Slide 124

Slide 124 text

Blueprint ★ Buttons ★ Colors ★ Debug ★ Fancy Type ★ Form ★ Grid ★ Interaction ★ Internet Explorer ★ Link Icons ★ Liquid ★ Print ★ Reset ★ Rtl ★ Scaffolding ★ Typography ★ Utilities

Slide 125

Slide 125 text

CSS3

Slide 126

Slide 126 text

CSS3 ★ Appearance ★ Background Clip ★ Background Origin ★ Background Size ★ Border Radius ★ Box ★ Box Shadow ★ Box Sizing ★ CSS3 Pie ★ Columns ★ Font Face ★ Gradient ★ Images ★ Inline Block ★ Opacity ★ Shared Utilities ★ Text Shadow ★ Transform ★ Transform (legacy) ★ Transition

Slide 127

Slide 127 text

Image sprites

Slide 128

Slide 128 text

@import "icon/*.png" .actions .new +icon-sprite(new) .edit +icon-sprite(edit) .save +icon-sprite(save) .delete +icon-sprite(delete) Image sprites .icon-sprite, .actions .new, .actions .edit, .actions .save, .actions .delete { background: url('/images/icon-34fe0604ab.png') no-repeat; } .actions .new { background-position: 0 -64px; } .actions .edit { background-position: 0 -32px; } .actions .save { background-position: 0 -96px; } .actions .delete { background-position: 0 0; } @import "icon/*.png" public/images/icon/new.png public/images/icon/edit.png public/images/icon/save.png public/images/icon/delete.png 1. 2. 3. I like the Sprite in you®

Slide 129

Slide 129 text

URL helpers

Slide 130

Slide 130 text

#nav background: image-url("nav_bg.png") repeat-x top center DEVELOPMENT #nav { background: url("/images/nav_bg.png") repeat-x top center; } PRODUCTION #nav { background: url("http://assets.example.com/images/nav_bg.png") repeat-x top center; } URL helpers relative paths for development, absolute for production

Slide 131

Slide 131 text

stylesheet-url($path) font-url($path) image-url($path) URL helpers

Slide 132

Slide 132 text

Stats

Slide 133

Slide 133 text

Stats | --------------------------------- | ----- | ---------- | -------------- | ----------- | --------- | -------------- | | Filename | Rules | Properties | Mixins Defs | Mixins Used | CSS Rules | CSS Properties | | --------------------------------- | ----- | ---------- | -------------- | ----------- | --------- | -------------- | | app/stylesheets/_960.sass | 198 | 141 | 0 | 0 | -- | -- | | app/stylesheets/_animation.sass | 2 | 2 | 0 | 0 | -- | -- | | app/stylesheets/application.sass | 268 | 607 | 0 | 33 | 1131 | 3684 | | app/stylesheets/_data_table.sass | 39 | 66 | 0 | 4 | -- | -- | | app/stylesheets/_datepicker.sass | 125 | 242 | 0 | 0 | -- | -- | | app/stylesheets/_formalize.sass | 82 | 78 | 0 | 4 | -- | -- | | app/stylesheets/_forms.sass | 227 | 242 | 0 | 21 | -- | -- | | app/stylesheets/ie.sass | 0 | 0 | 0 | 0 | 0 | 0 | | app/stylesheets/_jscrollpane.sass | 20 | 43 | 0 | 0 | -- | -- | | app/stylesheets/_prettify.sass | 16 | 16 | 0 | 0 | -- | -- | | app/stylesheets/print.sass | 0 | 0 | 0 | 0 | 0 | 0 | | app/stylesheets/_reset.sass | 111 | 18 | 0 | 0 | -- | -- | | app/stylesheets/_text.sass | 27 | 18 | 0 | 0 | -- | -- | | app/stylesheets/_tiptip.sass | 19 | 40 | 0 | 0 | -- | -- | | app/stylesheets/_util.sass | 56 | 54 | 0 | 0 | -- | -- | | app/stylesheets/_vars.sass | 0 | 6 | 2 | 0 | -- | -- | | --------------------------------- | ----- | ---------- | -------------- | ----------- | --------- | -------------- | | Total (16 files): | 1190 | 1573 | 2 | 62 | 1131 | 3684 | | --------------------------------- | ----- | ---------- | -------------- | ----------- | --------- | -------------- |

Slide 134

Slide 134 text

Share your patterns

Slide 135

Slide 135 text

http://brandonmathis.com/projects/fancy-buttons/

Slide 136

Slide 136 text

@import "fancy-buttons" button, a.button +fancy-button(#2966a8)

Slide 137

Slide 137 text

compass-960

Slide 138

Slide 138 text

$ninesixty-columns: 16 #wrap +grid-container #left-nav +alpha +grid(5) #main-content +grid-prefix(1) +grid(10) +omega Compass 960 https://github.com/chriseppstein/compass-960-plugin

Slide 139

Slide 139 text

$ gem install sass $ gem install compass Call it from the command line $ sass watch screen.scss Compass-ize your project $ compass init rails -f blueprint Watch a folder $ compass watch Sass & Compass

Slide 140

Slide 140 text

compass-wordpress

Slide 141

Slide 141 text

$ gem install compass-wordpress Crank out a new Wordpress theme $ compass -r compass-wordpress \ -f wordpress -p thematic \ --sass-dir=sass --css-dir=css \ -s compressed my_awesome_theme Autocompile your changes $ compass watch Compass and WordPress shameless plug

Slide 142

Slide 142 text

compass-formalize

Slide 143

Slide 143 text

$ gem install compass_formalize $ compass create my-project -r compass_formalize compass install formalize/dojo compass install formalize/extjs compass install formalize/jquery compass install formalize/mootools compass install formalize/prototype compass install formalize/yui Compass and Formalize shameless plug #2 And one of these

Slide 144

Slide 144 text

Isn’t she Sassy, folks? GET THE BOOK.

Slide 145

Slide 145 text

sass40 Save 40% and get early access! Sadly, sass100 is not a valid code.

Slide 146

Slide 146 text

DEMO and code spelunking

Slide 147

Slide 147 text

No content