css & ecsstender [css summit 2011]

83
CSS Aaron Gustafson Easy Designs, LLC slideshare.net/AaronGustafson

Upload: aaron-gustafson

Post on 27-Jan-2015

142 views

Category:

Technology


4 download

DESCRIPTION

Say goodbye to the browser-specific properties and hacks cluttering your files and say hello to lean, mean CSS. With eCSStender, when you write the rules, browsers pay attention. In this session, Gustafson covers everything you would need to know to get up and running with eCSStender by: * demonstrating why we need a tool like eCSStender explaining how eCSStender works * showing how painlessly extensions can be implemented; and * demonstrating how to build an extension using a little jQuery.

TRANSCRIPT

Page 1: CSS & eCSStender [CSS Summit 2011]

CSSAaron GustafsonEasy Designs, LLCslideshare.net/AaronGustafson

Page 2: CSS & eCSStender [CSS Summit 2011]

?

Page 3: CSS & eCSStender [CSS Summit 2011]

?

Page 4: CSS & eCSStender [CSS Summit 2011]
Page 5: CSS & eCSStender [CSS Summit 2011]
Page 6: CSS & eCSStender [CSS Summit 2011]
Page 7: CSS & eCSStender [CSS Summit 2011]
Page 8: CSS & eCSStender [CSS Summit 2011]
Page 9: CSS & eCSStender [CSS Summit 2011]
Page 10: CSS & eCSStender [CSS Summit 2011]
Page 11: CSS & eCSStender [CSS Summit 2011]
Page 12: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Download...

eCSStender.org12

Page 13: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Download...

eCSStender.org13

Page 14: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Download...

github.com/easy-designs/eCSStender.js14

Page 15: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

...collect extensions...

15

Page 16: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

...collect extensions...

16

Page 17: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

...include...<script type="text/javascript" src="eCSStender.js"></script><script type="text/javascript" src="eCSStender.CSS3-backgrounds-and-borders.js"></script><script type="text/javascript" src="eCSStender.CSS3-transforms.js"></script><script type="text/javascript" src="eCSStender.CSS3-color.js"></script><script type="text/javascript" src="eCSStender.CSS3-transitions.js"></script>

17

Page 18: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

...and write your CSSsection,article,blockquote { border-radius: 10px; box-shadow: 0 0 15px 1px #000; color: rgb(255, 255, 255); transform-origin: 50% 50%; transition: all 0.5s linear;}section:hover,body:focus section,section:hover blockquote,body:focus blockquote { transform: rotate(-15deg);}section:hover article,body:focus article { transform: rotate(30deg);}

18

Page 19: CSS & eCSStender [CSS Summit 2011]
Page 20: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Need selectors?<script type="text/javascript" src="eCSStender.js"></script><script type="text/javascript" src="sizzle.js"></script><script type="text/javascript"> // <![CDATA[ eCSStender.addMethod('findBySelector',Sizzle); // ]]></script><script type="text/javascript" src="eCSStender.CSS3-selectors.js"></script>

20

Page 21: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Compound classes in IE6?p.test { color: green;}p.alt.test { color: red;}

21

Page 22: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Adjacent siblings?p + p { color: green;}

22

Page 23: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

General siblings?p ~ p { color: green;}

23

Page 24: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Advanced pseudo-classes?tr { background: white;}td:empty { background: green;}

24

Page 25: CSS & eCSStender [CSS Summit 2011]
Page 26: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Consider border-radius#foo { border-radius: 3px;}

26

Page 27: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Consider border-radius#foo { -moz-border-radius: 3px; -webkit-border-radius: 3px; -o-border-radius: 3px; -khtml-border-radius: 3px; border-radius: 3px;}

27

Page 28: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Consider border-radius#foo { border-radius: 10px 5px;}

28

Page 29: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Consider border-radius#foo { -moz-border-radius: 10px 5px; -webkit-border-top-left-radius: 10px; -webkit-border-top-right-radius: 5px; -webkit-border-bottom-right-radius: 10px; -webkit-border-bottom-left-radius: 10px; -o-border-radius: 10px 5px; -khtml-border-top-left-radius: 10px; -khtml-border-top-right-radius: 5px; -khtml-border-bottom-right-radius: 10px; -khtml-border-bottom-left-radius: 10px; border-radius: 10px 5px;}

29

Page 30: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Ah, memories...#foo { padding: 10px; width: 200px; w\idth: 180px; height: 200px; heigh\t: 180px;}

/* or */

#foo { padding: 10px; width: 200px; height: 200px;}* html #foo { width: 180px; height: 180px;}

30

Page 31: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Simpli!ed CSS3?<script type="text/javascript" src="eCSStender.js"></script><script type="text/javascript" src="eCSStender.CSS3-backgrounds-and-borders.js"></script><script type="text/javascript" src="eCSStender.CSS3-transforms.js"></script><script type="text/javascript" src="eCSStender.CSS3-color.js"></script><script type="text/javascript" src="eCSStender.CSS3-transitions.js"></script>

31

Page 32: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Yup!section,article,blockquote { border-radius: 10px; box-shadow: 0 0 15px 1px #000; color: rgb(255, 255, 255); transform-origin: 50% 50%; transition: all 0.5s linear;}section:hover,body:focus section,section:hover blockquote,body:focus blockquote { transform: rotate(-15deg);}section:hover article,body:focus article { transform: rotate(30deg);}

32

http://ecsstender.org/demos/spoon/

Page 33: CSS & eCSStender [CSS Summit 2011]
Page 34: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Valid extension of CSS

-prefix-

34

Page 35: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Browser vendors do it

-webkit--moz- -o--ms-

35

Page 36: CSS & eCSStender [CSS Summit 2011]
Page 37: CSS & eCSStender [CSS Summit 2011]

THE FUTURE OF CSS

Page 38: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Pointless, but possible.bowling-alley img { -easy-physics-fill: lead;}.beach img { -easy-physics-fill: rubber;}.disney img { -easy-physics-fill: helium;}

38

http://ecsstender.org/demos/physics/

Page 39: CSS & eCSStender [CSS Summit 2011]
Page 40: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 1: Register extensions

Register

40

Page 41: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Inspect<html>

CSS

Step 2: Find stylesheets

41

Page 42: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 3: Collect the rules

CollectCSS

42

Page 43: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 4: parse process

Process

&

43

Page 44: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 5: Trigger extensions

44

Page 45: CSS & eCSStender [CSS Summit 2011]
Page 46: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

๏ Dean Edward’s IE scripts

๏ Selectivizr

๏ css3-mediaqueries.js

๏ Respond.js

Helping hands

BrowserPatchers

46

Page 47: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

๏ SASS (Syntactically Awesome Stylesheets)

๏ LESS (Leaner CSS)

๏ OO CSS (purely conceptual)

Alternative syntax

BrowserPatchers

ShorthandParsers

47

Page 48: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

๏ Modernizr

Capability checking

BrowserPatchers

TestingScripts

ShorthandParsers

48

Page 49: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

๏ More CSS

Something new

BrowserPatchers

ShorthandParsers

CustomCSS

Parsers

TestingScripts

49

Page 50: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

๏ jQuery plug-ins

๏ CSS Sandpaper

๏ CVI scripts

Ecosystem

BrowserPatchers

ShorthandParsers

CustomCSS

Parsers

TestingScripts

One-off CSSscripts libraries&

50

Page 51: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Unity!

BrowserPatchers

ShorthandParsers

CustomCSS

Parsers

TestingScripts

One-off CSSscripts libraries&

51

Page 52: CSS & eCSStender [CSS Summit 2011]

Let’s make something awesome!

I thought you’d never ask.

Page 53: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Pointless, but possible

53

Page 54: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 1: Dependencies<script type="text/javascript" src="eCSStender.js"></script><script type="text/javascript" src="jquery.js"></script><script type="text/javascript" src="jquery.EasyPhysics.js"></script>

54

Page 55: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 1: Dependencies// jquery.EasyPhysics.jsEasyPhysics.Balloon = function( el ) { new PhysicalObject( el, // element 0, // velocity -0.5, // kinetic energy -0.1 // gravitational effect );};EasyPhysics.RubberBall = function( el ) { new PhysicalObject( el, 0, -0.8, 0.5 );};EasyPhysics.BowlingBall = function( el ) { new PhysicalObject( el, 1, -0.4, 0.9 );};

55

Page 56: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 2: RegistrationeCSStender.register(

);

56

Page 57: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 2: RegistrationeCSStender.register( { property: '-easy-physics-fill', fingerprint: 'net.easy-designs.-easy-physics' },

);

57

Page 58: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 2: RegistrationeCSStender.register( { property: '-easy-physics-fill', fingerprint: 'net.easy-designs.-easy-physics' }, false,

);

58

Page 59: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Step 2: RegistrationeCSStender.register( { property: '-easy-physics-fill', fingerprint: 'net.easy-designs.-easy-physics' }, false, function( selector, properties ){ var $el = $(selector); switch ( properties['-easy-physics-fill'] ) { case 'helium': new EasyPhysics.Balloon( $el ); break; case 'rubber': new EasyPhysics.RubberBall( $el ); break; case 'lead': new EasyPhysics.BowlingBall( $el ); break; } });

59

Page 60: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Pointless, but possible.bowling-alley img { -easy-physics-fill: lead;}.beach img { -easy-physics-fill: rubber;}.disney img { -easy-physics-fill: helium;}

60

http://ecsstender.org/demos/physics/

Page 61: CSS & eCSStender [CSS Summit 2011]

I love you you know.

I know.

Page 62: CSS & eCSStender [CSS Summit 2011]

Does the browser support border-radius?

Nope.

isSupported()

Page 63: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

isSupported()eCSStender.isSupported( 'property', 'visibility: hidden');// true

eCSStender.isSupported( 'property', 'foo: bar');// false

63

Page 64: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

isSupported()eCSStender.isSupported( 'property', 'visibility', 'hidden');// true

eCSStender.isSupported( 'property', 'color', ['#000000','black','rgb(0,0,0)']);// true

64

Page 65: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

isSupported()varel = document.createElement('b'),html = document.createElement('p');html.appendChild(el);

eCSStender.isSupported( 'selector', 'p b', html, el);// true

eCSStender.isSupported( 'selector', 'p ?? b', html, el);// false

65

Page 66: CSS & eCSStender [CSS Summit 2011]

Can you make myCSS smarter?

Of course.

Page 67: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

Inline style sucks...<div style="display: none;"> <p>Some content</p></div>

67

Page 68: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

...don’t do it!<div style="display: none;"> <p>Some content</p></div>

68

Page 69: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

makeUniqueClass()

excerpt from :checked CSS3 Selectors extensiongithub.com/easy-designs/eCSStender.CSS3-selectors.js

(function(){ var e = eCSStender, the_class = e.makeUniqueClass(), the_regex = /:checked/, classify = function() { var inputs = document.getElementsByTagName('input'), i = inputs.length; while ( i-- ) { if ( inputs[i].checked ) { e.addClass( inputs[i], the_class ); } else { e.removeClass( inputs[i], the_class ); } } };

// ...})();

69

Page 70: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

embedCSS()eCSStender.embedCSS( 'p { color: red; }', 'screen', false);// embeds the rule set in a// screen-specific stylesheet immediately

70

Page 71: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

applyWeightedStyle()eCSStender.applyWeightedStyle( el, { 'visibility': 'hidden' }, 10 );// el now has visibility: hidden set// with a specificity of 10

eCSStender.applyWeightedStyle( el, { 'visibility': 'visible' }, 1 );// el is not set to visible because // the specificity is not high enough

eCSStender.applyWeightedStyle( el, { 'visibility': 'visible' }, 10 );// el is now “visible” because the specificity// is equal to the prior specificity

eCSStender.applyWeightedStyle( el, { 'visibility': 'hidden' }, 100 );// el is now “hidden” again because the// specificity is greater than the prior one

71

Page 72: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

excerpt from CSS3 Selectors extensiongithub.com/easy-designs/eCSStender.CSS3-selectors.js

As "exible as possiblefunction embed( selector, properties, medium ){ var style_block = '', prop; for ( prop in properties ) { if ( eCSStender.isInheritedProperty( properties, prop ) ) { continue; }; style_block += prop + ':' + properties[prop] + ';'; } if ( style_block != EMPTY ) { eCSStender.embedCSS( selector + '{' + style_block + '}', medium ); }}

72

Page 73: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

excerpt from CSS3 Selectors extensiongithub.com/easy-designs/eCSStender.CSS3-selectors.js

As "exible as possiblefunction inline( selector, properties, medium, specificity ) { if ( medium != 'screen' ){ return; } try { var $els = $( selector ), i = $els.length; while ( i-- ) { eCSStender.applyWeightedStyle( $els[i], properties, specificity ); } $els = null; } catch(e) { // throw new Error( LIB_ERROR + selector ); }}

73

Page 74: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

excerpt from :checked CSS3 Selectors extensiongithub.com/easy-designs/eCSStender.CSS3-selectors.js

As "exible as possibleeCSStender.register( // ... function( selector, properties, medium, specificity ) { var calc = 'p:nth-child(2n+1)', d = div.cloneNode(true), p = para.cloneNode(true), func = inline; d.appendChild( p ); // embedding is the way to go if ( ( eCSStender.isSupported( 'selector', 'p:nth-child(odd)', d, p ) && ! eCSStender.isSupported( 'selector', calc, d, p ) && selector.match( /:nth-child\(\s*(?:even|odd)\s*\)/ ) != null ) || eCSStender.isSupported( 'selector', calc, d, p ) ) { func = embed; } func( selector, properties, medium, specificity ); return func; });

74

Page 75: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

addRules()var style = eCSStender.embedCSS( 'p { color: red; }', 'screen', false);

// ...

eCSStender.addRules( style, 'p { color: blue; }');

75

Page 76: CSS & eCSStender [CSS Summit 2011]

Can you look something up for me?

No problemo.

Page 77: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

lookup()var matches = eCSStender.lookup( { selector: 'h1', specificity: { min: 0, max: 2 } }, '*');// looks for rules where the// selector includes an h1 and the// specificity is between 0 and 2// e.g.// [ { medium: 'all' // selector: 'h1',// specificity: 1// properties: { color: 'red' }// }, ... ]

77

Page 78: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

elementMatchesSelector()if ( eCSStender.elementMatchesSelector( el, 'div:last-child' ) ){ // do something with the div}else{ // element wasn’t what we were looking for}

78

Page 79: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

matchMedia()if ( eCSStender.matchMedia( 'screen and (max-width=1024)' ) ){ // screen might be a tablet}

79

Page 80: CSS & eCSStender [CSS Summit 2011]

CSS & eCSStender

CSS Summit - July 2011

getCSSValue()if ( eCSStender.getCSSValue( element, 'display' ) == 'none' ){ // element is currently hidden}

80

Page 81: CSS & eCSStender [CSS Summit 2011]
Page 82: CSS & eCSStender [CSS Summit 2011]

Help make me better!

MIT Licensed

Fork: github.com/easy-designs/eCSStender.jsDiscuss: groups.google.com/group/ecsstender

Page 83: CSS & eCSStender [CSS Summit 2011]

CSS eCSStenderby Aaron Gustafson

Slides available athttp://slideshare.net/AaronGustafson

This presentation is licensed underCreative Commons

Attribution-Noncommercial-Share Alike 3.0

More on eCSStender:http://eCSStender.org

@eCSStender

flickr Photo Credits“Everyone loves books but I thought this was the

dullest photo i had ever taken. I guess not.“ by boltron-“Sharing” by bengrey

“Three wise monkeys” by Anderson Mancini“Chemcraft manual” by underwhelmer

“crawfordmarketcarrotman” by Rigmarole“Röck!! on the right” by Adactio

“Internals” by alexsnaps“Wood” by Joost J. Bakker IJmuiden

“Tribute to Willy Puchner's ‘The Penguins Longing’” by Curnenhttp://!ickr.com/photos/aarongustafson/galleries/72157625226185257/

&