Movatterモバイル変換


[0]ホーム

URL:


Brian Cavalier, profile picture
Uploaded byBrian Cavalier
ZIP, PDF3,278 views

OOCSS for Javascript pirates at jQueryPgh meetup

oocss for javascript pirates provides an overview of object-oriented CSS (OOCSS) principles and how they can be applied when developing with JavaScript. OOCSS focuses on separating container and content, structure and skin, and identity versus state. It emphasizes maximizing CSS reuse and creating maintainable, concise styles. JavaScript developers can benefit from OOCSS's loose coupling of components and separation of concerns between CSS/HTML and JavaScript code. The document demonstrates how to identify OOCSS objects and implement identity and state CSS classes to control visual states from JavaScript.

Embed presentation

Downloaded 49 times
oocss for javascript pirates  with @jquerypgh rigging, full speed ahead!                brian cavalier
ahoy! demo!http://bit.ly/css3-digital-clock         fork it on github!
part I – oocss distilled                  aye!   is it good fer drinkin’, matey?
what is oocss? term coined by nicole sullivan*. but what is it? css with a focus on objects plain-old css 2.1 and css 3 works with html4 or html5 works with all major browsers**                                      * http://stubbornella.org                         **well… ie 6 needs some help, as usual
basics of oocss
basics of oocss  maximizes reuse of css rules
basics of oocss  maximizes reuse of css rules  creates maintainable, concise css
basics of oocss  maximizes reuse of css rules  creates maintainable, concise css  relies on two core principles:     separation of container from content     separation of structure from skin
basics of oocss  maximizes reuse of css rules  creates maintainable, concise css  relies on two core principles:     separation of container from content     separation of structure from skin  and, for js pirates: identity vs. state
container vs. content  content objects flow naturally  container objects restrict where/how  content objects flow  containers don’t have to be only grids  and columns!
container vs. content<!-- container --><section class=“my-oocss-container”> <!-- content --> <p class=“my-oocss-content” >…</p> <span>some other content</span></section>
container vs. content  content can now be laid-out differently  by changing the container object /  container class  the container and content objects don’t  always have to be separate, but often  they are!
structure vs. skin  structure classes determine layout  skin classes determine the look (aka  “theme”, “styling”)
structure vs. skin<aside class=“structure skin”>…</aside>.structure {                      .skin { float: left;                       color: #2faced; width: 8em;                       border: 1px; max-height: 20em;                      }}
structure v. skin  if we want to reuse the skin class, the  structure declarations don’t tag along  if we want to reuse the structure class, we  don’t have skin “stowaways”, either
aaaarrrrrhh!!not another “cssbest practices”!?!             blimey!!this oocss stuff is already startin’  to make me trigger finger itch!
“learn to love grids”*  use grid layouts to position content  grid columns determine content width  content height flows naturally   *http://www.slideshare.net/stubbornella/object-oriented-css
aaaarrrrrhh!!i ain’t buildin’no cms system!        shiver me timbers!*all this lollygagging with grids,     columns, and content… i want dialogs! data-linking!             templates!               *translation: “wut the f___!”
oocss vs. architecture   “Each layer in the web stack has its own   architecture.”* – Nicole   oocss objects don’t correlate with back-end   components / views – they are completely   independent* http://www.stubbornella.org/content/2010/06/12/visual-semantics-in-html-and-css/
aaaarrrrrhh!!    this oocss concoction ain’t   drinkable!there’s no way i’m going to rejigger   every one of me mvc-based php templates so it can work the “oocss                way”
it’s too bad, too…  some of that oocss stuff seemed        useful… hmmm…let’s take a look at oocss from the eye        of a javascript pirate…
part II – oocss in the pirate’s eye       in your good eye, anyway, Brendan!                (aaarrrrrrhhh!!!)
oocss objects  an oocss object consists of the following  parts:  1) an html fragment / dom nodes  2)associated css rules and resources    (fonts, images)  3)javascript (behavior, events, etc.)
oocss “construction” an oocss object is not actually constructed rather, its parts are associated via a css class name:   1)<tag class=“my-oocss-class”>…</tag>   2).my-oocss-class { /* … */ }   3)$(‘.my-oocss-class’)     .click(function () { /*…*/ });
oocss inheritance oocss objects inherit from     other oocss objects  (sound familiar? it should to a js pirate!)
oocss inheritance                    base specializations / mixins                 {                 - <tag class=“class1 class2 class3”>…</tag>      inheritance is defined in html and css      this isn’t broken, but isn’t ideal**sass and less.css attempt to “fix” this (and do a good job of it)
oocss inheritance              order doesn’t matter                     {<tag class=“class1 class2 class3”>…</tag>.class1 { }                overrides                            matters!                             order.class2 { }.class3 { }
oocss inheritance
oocss inheritance classical oo: classes inherit attributes + behavior
oocss inheritance classical oo: classes inherit attributes + behavior pure prototypal: objects inherit attributes + behavior
oocss inheritance classical oo: classes inherit attributes + behavior pure prototypal: objects inherit attributes + behavior oocss: objects inherit attributes + run-time state inheritance is defined two different ways
oocss inheritance type 1<section class=“base special”>…</section>.base {             .special { float: left;        margin-right: -0.5em; width: 8em;        width: 8.5em;}                   }
oocss inheritance type 2      span inherits from button    - <button class=“simple-action with-icon”>  <span>content / data</span> </button>.with-icon { color: #bada55; }.with-icon span { /* inherits with-icon! */ margin-left: 32px;}
oocss state inheritance             identity       state            {            {<tag class=“base special state1 state2”/>.base { }.special { /* inherits .base */ }.state1 { /* run-time overrides */ }.state2 { /* more overrides */ }
oocss state inheritance<div class=“base-view my-view unbound”> <h4>some title</h4> <span>raw content / data</span></div>.base-view.unbound { color: #abacab; }.base-view.unbound span { visibility: hidden; }
part III – fringe benefits       fortune and glory!        (aaarrrrrhhhh!!!!)
loose coupling   message passing == loose coupling        state classes are messages!        change html/css without changing js   API == add/remove/toggleClassbad:    $(‘.my-widget ul’).css(‘display’, ‘none’);        $(‘.my-widget’).addClass(‘no-list’);good:        .no-list ul { display: none; }
separation of concerns    styling / layout separated from behavior    css/html and js dev work independently          bad:                       good:$(‘.my-view’)              $(‘.my-view’) .find(‘li’)                .addClass(‘filtered’); .css(‘color’, ‘red’)     –––––––––––––––– .filter(‘.obsolete’)      .filtered li { color: red; } .css(‘color’, ‘gray’);   .filtered li.obsolete {                            color: gray; }
organized css   css is organized into object “classes” just   like all of your other code.progress-bar { }.progress-bar .cancel-button { }.progress-bar .spinner { }.progress-bar .progress-frame div span { }.progress-bar.progress-complete { }.progress-bar.progress-error { }
part IV – step by step      aaacckkk! too much rope!show me how not to get meself hanged!
identify objects  #1 rule: ignore the HTML!  scan the wireframes for oocss objects:     can it be reused?     does it have it’s own behavior?  For each:     “What is it?” -> Identity     list run-time states
identify objectsprogress bar object   states    content         containers
Identity + state classes  Identity (“is a”): progress-bar  specialization: progress-upload  states     progress-initializing     progress-uploading     progress-finalizing     progress-complete     progress-canceled     progress-error
html template<div class="progress-bar progress-upload"> <h2>progress title</h2> <div class="progress-frame">  <div><span></span></div> </div> <a href="#" class="cancel-action">x</a> <p>transaction status</p></div>
css classes.progress-bar { }.progress-bar.progress-canceled h2 { }.progress-bar.progress-complete h2 { }.progress-bar.progress-error h2 { }....progress-frame { }.progress-frame div { }.progress-frame div span { }.progress-display .cancel-action { }....progress-upload { }
javascript controller$(‘.progress-bar’).each(function () { var progressBar = $(this); progressBar.find(‘.cancel-action’)  .click(function () {   progressBar.addClass(‘progress-canceled’)    .find(‘h2’).text(‘Canceled’);   /* coordinate actual cancel work here */   return false;  });});
part V – demo!yo ho ho and a hogshead of rum!
part VI – pitfalls + antipatterns   follow this sage advice or ye’ll end up in a gibbet!!
.css() is EVIL
.css() is EVIL  css does not belong in your javascript!*  (*except when it does)
.css() is EVIL  css does not belong in your javascript!*  (*except when it does)  animations, too!  fadeIn(), fadeOut(), animate(), hide(),  show()
.css() is EVIL  css does not belong in your javascript!*  (*except when it does)  animations, too!  fadeIn(), fadeOut(), animate(), hide(),  show()     css3 + progressive enhancement or
.css() is EVIL  css does not belong in your javascript!*  (*except when it does)  animations, too!  fadeIn(), fadeOut(), animate(), hide(),  show()     css3 + progressive enhancement or     regressive enhancement:     jquery css transitions, cujo.js
avoid IDs and elements  bad:  div.my-class {}  #myNode.my-class {}  these create unnecessary specificity  ids lure you into creating non-reusable  rules
oocss vs. ie6  gotcha:  .base.state { /* ie6 ignores .base */ }  solutions:     name-spaced (unambiguous) states     e.g.: .base.base-state     selectivizr, cujo.js
belay that HTML, mate In any reasonably complex system, writing HTML and CSS first is an antipattern Start with wireframes, identify objects and their states, then write HTML
discrete vs. continuous    Trying to model continuous values with    OOCSS state be askin’ fer a flogging..progress-0 .progress-frame div span { width: 0% }.progress-1 .progress-frame div span { width: 1% }....progress-99 .progress-frame div span { width: 99% }.progress-100 .progress-frame div span { width: 100%}
horizontal class explosion <section class=“intro colorful-intro orange has- callout has-second-callout exclusive front- page”>   Use the cascade: “colorful-intro” is   probably a specialization of “intro”   Consolidate non-states: e.g. “orange” may   be a characteristic of “colorful-intro”   Consider SASS/SCSS or Less.css
vertical class explosion<div class="progress-bar progress-upload"> <h2 class="progress-canceled">progress title</h2> <div class="progress-frame progress-canceled">  <div><span class="progress-canceled"></span></div> </div> <a href="#" class="cancel-action progress-canceled">x</a> <p class="progress-canceled">canceled!</p></div>
vertical class explosion   Place state classes as high up in the   component’s HTML as possible   Use OOCSS inheritance. Remember that   descendant nodes can inherit run-time state!<div class="progress-bar progress-upload progress-canceled"> <h2>progress title</h2>  ...</div>
Keelhauled HTML Having sections of permanently hidden HTML is a bad code smell   analog clock: nearly half the HTML   elements are permanently hidden Review your objects and wireframes Probably time to refactor HTML & CSS
part VII - what be next?weigh anchor and hoist the jib, me hearties, we be               all in the wind!
oocss design patterns!  codifying oocss design patterns  3 so far:     Initial State Pattern     Revealing Specialization Pattern     Inherited Specialization Pattern  more on the way!
thanks!      john hann                brian cavalier    @unscriptable             @briancavalier   life image, inc.          hovercraft studioshttp://lifeimage.com   http://hovercraftstudios.com
questions?ye must phrase all queries like a true seadog!       landlubbers will be keel-hauled(or tarred-and-feathered – choose yer poison)
Go Steelers!You didn’t think it’d be all Pirates, did you?
imagesjolly roger: http://flickr.com/photos/earlgpirates:           “Don’t mess with pirates - Declan Hann”           http://www.flickr.com/photos/slipstreamblue/2716444681/           http://www.flickr.com/photos/brothermagneto/3476288029/           http://www.flickr.com/photos/jsconf/4587502948/           http://www.flickr.com/photos/fenchurch/237726110/moon shine still: http://flickr.com/photos/seanlloyd/gold coins: http://www.flickr.com/photos/myklroventine/3400039523/dead pirate: http://www.flickr.com/photos/jeffreykeefer/540423620/corsair: http://www.flickr.com/photos/portofsandiego/4952170821/ducks: http://www.flickr.com/photos/tiefpunkt/2571937817/piece of eight: http://flickr.com/photos/woodysworld1778/pirate daleks!: http://flickr.com/photos/54459164@N00/5003883529/

Recommended

PDF
OOCSS for JavaScript Pirates jQcon Boston
PDF
Organizing Code with JavascriptMVC
PDF
Scalable vector ember
PPTX
Windows 8 JavaScript (Wonderland)
PDF
Write Less Do More
PDF
Using jQuery to Extend CSS
KEY
An in-depth look at jQuery UI
PDF
jQuery Features to Avoid
PDF
Intro to OOCSS Workshop
KEY
An in-depth look at jQuery
KEY
The Inclusive Web: hands-on with HTML5 and jQuery
PPT
jQuery Learning
PDF
jQuery Loves Developers - Oredev 2009
PDF
Transparent Object Persistence with FLOW3
PDF
jQuery for beginners
PDF
An Event Apart Boston: Principles of Unobtrusive JavaScript
PPT
Jquery ui
PDF
Structured Apps with Google Dart
PDF
OOCSS Lightening Talk
PDF
JavaScript Libraries (@Media)
KEY
Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...
PPTX
Scalable and Modular CSS FTW!
 
PDF
jQuery (MeshU)
PDF
HTML5: where flash isn't needed anymore
PDF
Web2.0 with jQuery in English
PDF
jQuery (BostonPHP)
PDF
JavaScript Libraries (Kings of Code)
PDF
Yearning jQuery
PPTX
Css methods architecture
KEY
Slow kinda sucks

More Related Content

PDF
OOCSS for JavaScript Pirates jQcon Boston
PDF
Organizing Code with JavascriptMVC
PDF
Scalable vector ember
PPTX
Windows 8 JavaScript (Wonderland)
PDF
Write Less Do More
PDF
Using jQuery to Extend CSS
KEY
An in-depth look at jQuery UI
PDF
jQuery Features to Avoid
OOCSS for JavaScript Pirates jQcon Boston
Organizing Code with JavascriptMVC
Scalable vector ember
Windows 8 JavaScript (Wonderland)
Write Less Do More
Using jQuery to Extend CSS
An in-depth look at jQuery UI
jQuery Features to Avoid

What's hot

PDF
Intro to OOCSS Workshop
KEY
An in-depth look at jQuery
KEY
The Inclusive Web: hands-on with HTML5 and jQuery
PPT
jQuery Learning
PDF
jQuery Loves Developers - Oredev 2009
PDF
Transparent Object Persistence with FLOW3
PDF
jQuery for beginners
PDF
An Event Apart Boston: Principles of Unobtrusive JavaScript
PPT
Jquery ui
PDF
Structured Apps with Google Dart
PDF
OOCSS Lightening Talk
PDF
JavaScript Libraries (@Media)
KEY
Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...
PPTX
Scalable and Modular CSS FTW!
 
PDF
jQuery (MeshU)
PDF
HTML5: where flash isn't needed anymore
PDF
Web2.0 with jQuery in English
PDF
jQuery (BostonPHP)
PDF
JavaScript Libraries (Kings of Code)
PDF
Yearning jQuery
Intro to OOCSS Workshop
An in-depth look at jQuery
The Inclusive Web: hands-on with HTML5 and jQuery
jQuery Learning
jQuery Loves Developers - Oredev 2009
Transparent Object Persistence with FLOW3
jQuery for beginners
An Event Apart Boston: Principles of Unobtrusive JavaScript
Jquery ui
Structured Apps with Google Dart
OOCSS Lightening Talk
JavaScript Libraries (@Media)
Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...
Scalable and Modular CSS FTW!
 
jQuery (MeshU)
HTML5: where flash isn't needed anymore
Web2.0 with jQuery in English
jQuery (BostonPHP)
JavaScript Libraries (Kings of Code)
Yearning jQuery

Similar to OOCSS for Javascript pirates at jQueryPgh meetup

PPTX
Css methods architecture
KEY
Slow kinda sucks
PPTX
CSS Walktrough Internship Course
PDF
Evolution of CSS
PDF
More of less (take 2)
PPTX
Hardcore CSS
PDF
Modular HTML & CSS Turbo Workshop
KEY
What is Object Oriented CSS?
PDF
CSS - OOCSS, SMACSS and more
PDF
Object Oriented CSS for rapid, scalable and maintainable development
KEY
The Cascade, Grids, Headings, and Selectors from an OOCSS Perspective, Ajax ...
PPTX
CSS Fundamentals: selectors and Properties
PPTX
Cascading Style Sheets
PDF
Girl Develop It Cincinnati: Intro to HTML/CSS Class 4
PDF
Webpage style with CSS
PDF
OOCSS
PDF
Dangerous CSS
PDF
Create a landing page
PDF
CSS: a rapidly changing world
PDF
CSMess to OOCSS: Refactoring CSS with Object Oriented Design
Css methods architecture
Slow kinda sucks
CSS Walktrough Internship Course
Evolution of CSS
More of less (take 2)
Hardcore CSS
Modular HTML & CSS Turbo Workshop
What is Object Oriented CSS?
CSS - OOCSS, SMACSS and more
Object Oriented CSS for rapid, scalable and maintainable development
The Cascade, Grids, Headings, and Selectors from an OOCSS Perspective, Ajax ...
CSS Fundamentals: selectors and Properties
Cascading Style Sheets
Girl Develop It Cincinnati: Intro to HTML/CSS Class 4
Webpage style with CSS
OOCSS
Dangerous CSS
Create a landing page
CSS: a rapidly changing world
CSMess to OOCSS: Refactoring CSS with Object Oriented Design

Recently uploaded

PPTX
THIS IS CYBER SECURITY NOTES USED IN CLASS ON VARIOUS TOPICS USED IN CYBERSEC...
PPTX
Chapter 3 Introduction to number system.pptx
PDF
Decoding the DNA: The Digital Networks Act, the Open Internet, and IP interco...
PPTX
Software Analysis &Design ethiopia chap-2.pptx
PDF
Day 2 - Network Security ~ 2nd Sight Lab ~ Cloud Security Class ~ 2020
PDF
Vibe Coding vs. Spec-Driven Development [Free Meetup]
PDF
Security Forum Sessions from Houston 2025 Event
PDF
Day 1 - Cloud Security Strategy and Planning ~ 2nd Sight Lab ~ Cloud Security...
PDF
Our Digital Tribe_ Cultivating Connection and Growth in Our Slack Community 🌿...
PDF
Eredità digitale sugli smartphone: cosa resta di noi nei dispositivi mobili
PDF
Is It Possible to Have Wi-Fi Without an Internet Provider
PDF
Unser Jahresrückblick – MarvelClient in 2025
PDF
Internet_of_Things_IoT_for_Next_Generation_Smart_Systems_Utilizing.pdf
PDF
December Patch Tuesday
 
PDF
Security Technologys: Access Control, Firewall, VPN
PDF
Usage Control for Process Discovery through a Trusted Execution Environment
PDF
Energy Storage Landscape Clean Energy Ministerial
PPTX
Cybercrime in the Digital Age: Risks, Impact & Protection
PDF
TrustArc Webinar - Looking Ahead: The 2026 Privacy Landscape
PDF
Day 3 - Data and Application Security - 2nd Sight Lab Cloud Security Class
THIS IS CYBER SECURITY NOTES USED IN CLASS ON VARIOUS TOPICS USED IN CYBERSEC...
Chapter 3 Introduction to number system.pptx
Decoding the DNA: The Digital Networks Act, the Open Internet, and IP interco...
Software Analysis &Design ethiopia chap-2.pptx
Day 2 - Network Security ~ 2nd Sight Lab ~ Cloud Security Class ~ 2020
Vibe Coding vs. Spec-Driven Development [Free Meetup]
Security Forum Sessions from Houston 2025 Event
Day 1 - Cloud Security Strategy and Planning ~ 2nd Sight Lab ~ Cloud Security...
Our Digital Tribe_ Cultivating Connection and Growth in Our Slack Community 🌿...
Eredità digitale sugli smartphone: cosa resta di noi nei dispositivi mobili
Is It Possible to Have Wi-Fi Without an Internet Provider
Unser Jahresrückblick – MarvelClient in 2025
Internet_of_Things_IoT_for_Next_Generation_Smart_Systems_Utilizing.pdf
December Patch Tuesday
 
Security Technologys: Access Control, Firewall, VPN
Usage Control for Process Discovery through a Trusted Execution Environment
Energy Storage Landscape Clean Energy Ministerial
Cybercrime in the Digital Age: Risks, Impact & Protection
TrustArc Webinar - Looking Ahead: The 2026 Privacy Landscape
Day 3 - Data and Application Security - 2nd Sight Lab Cloud Security Class

OOCSS for Javascript pirates at jQueryPgh meetup

  • 1.
    oocss for javascriptpirates with @jquerypgh rigging, full speed ahead! brian cavalier
  • 2.
  • 3.
    part I –oocss distilled aye! is it good fer drinkin’, matey?
  • 4.
    what is oocss?term coined by nicole sullivan*. but what is it? css with a focus on objects plain-old css 2.1 and css 3 works with html4 or html5 works with all major browsers** * http://stubbornella.org **well… ie 6 needs some help, as usual
  • 5.
  • 6.
    basics of oocss maximizes reuse of css rules
  • 7.
    basics of oocss maximizes reuse of css rules creates maintainable, concise css
  • 8.
    basics of oocss maximizes reuse of css rules creates maintainable, concise css relies on two core principles: separation of container from content separation of structure from skin
  • 9.
    basics of oocss maximizes reuse of css rules creates maintainable, concise css relies on two core principles: separation of container from content separation of structure from skin and, for js pirates: identity vs. state
  • 10.
    container vs. content content objects flow naturally container objects restrict where/how content objects flow containers don’t have to be only grids and columns!
  • 11.
    container vs. content<!--container --><section class=“my-oocss-container”> <!-- content --> <p class=“my-oocss-content” >…</p> <span>some other content</span></section>
  • 12.
    container vs. content content can now be laid-out differently by changing the container object / container class the container and content objects don’t always have to be separate, but often they are!
  • 13.
    structure vs. skin structure classes determine layout skin classes determine the look (aka “theme”, “styling”)
  • 14.
    structure vs. skin<asideclass=“structure skin”>…</aside>.structure { .skin { float: left; color: #2faced; width: 8em; border: 1px; max-height: 20em; }}
  • 15.
    structure v. skin if we want to reuse the skin class, the structure declarations don’t tag along if we want to reuse the structure class, we don’t have skin “stowaways”, either
  • 16.
    aaaarrrrrhh!!not another “cssbestpractices”!?! blimey!!this oocss stuff is already startin’ to make me trigger finger itch!
  • 17.
    “learn to lovegrids”* use grid layouts to position content grid columns determine content width content height flows naturally *http://www.slideshare.net/stubbornella/object-oriented-css
  • 18.
    aaaarrrrrhh!!i ain’t buildin’nocms system! shiver me timbers!*all this lollygagging with grids, columns, and content… i want dialogs! data-linking! templates! *translation: “wut the f___!”
  • 19.
    oocss vs. architecture “Each layer in the web stack has its own architecture.”* – Nicole oocss objects don’t correlate with back-end components / views – they are completely independent* http://www.stubbornella.org/content/2010/06/12/visual-semantics-in-html-and-css/
  • 20.
    aaaarrrrrhh!! this oocss concoction ain’t drinkable!there’s no way i’m going to rejigger every one of me mvc-based php templates so it can work the “oocss way”
  • 21.
    it’s too bad,too… some of that oocss stuff seemed useful… hmmm…let’s take a look at oocss from the eye of a javascript pirate…
  • 22.
    part II –oocss in the pirate’s eye in your good eye, anyway, Brendan! (aaarrrrrrhhh!!!)
  • 23.
    oocss objectsan oocss object consists of the following parts: 1) an html fragment / dom nodes 2)associated css rules and resources (fonts, images) 3)javascript (behavior, events, etc.)
  • 24.
    oocss “construction” anoocss object is not actually constructed rather, its parts are associated via a css class name: 1)<tag class=“my-oocss-class”>…</tag> 2).my-oocss-class { /* … */ } 3)$(‘.my-oocss-class’) .click(function () { /*…*/ });
  • 25.
    oocss inheritance oocssobjects inherit from other oocss objects (sound familiar? it should to a js pirate!)
  • 26.
    oocss inheritance base specializations / mixins { - <tag class=“class1 class2 class3”>…</tag> inheritance is defined in html and css this isn’t broken, but isn’t ideal**sass and less.css attempt to “fix” this (and do a good job of it)
  • 27.
    oocss inheritance order doesn’t matter {<tag class=“class1 class2 class3”>…</tag>.class1 { } overrides matters! order.class2 { }.class3 { }
  • 28.
  • 29.
    oocss inheritance classicaloo: classes inherit attributes + behavior
  • 30.
    oocss inheritance classicaloo: classes inherit attributes + behavior pure prototypal: objects inherit attributes + behavior
  • 31.
    oocss inheritance classicaloo: classes inherit attributes + behavior pure prototypal: objects inherit attributes + behavior oocss: objects inherit attributes + run-time state inheritance is defined two different ways
  • 32.
    oocss inheritance type1<section class=“base special”>…</section>.base { .special { float: left; margin-right: -0.5em; width: 8em; width: 8.5em;} }
  • 33.
    oocss inheritance type2 span inherits from button - <button class=“simple-action with-icon”> <span>content / data</span> </button>.with-icon { color: #bada55; }.with-icon span { /* inherits with-icon! */ margin-left: 32px;}
  • 34.
    oocss state inheritance identity state { {<tag class=“base special state1 state2”/>.base { }.special { /* inherits .base */ }.state1 { /* run-time overrides */ }.state2 { /* more overrides */ }
  • 35.
    oocss state inheritance<divclass=“base-view my-view unbound”> <h4>some title</h4> <span>raw content / data</span></div>.base-view.unbound { color: #abacab; }.base-view.unbound span { visibility: hidden; }
  • 36.
    part III –fringe benefits fortune and glory! (aaarrrrrhhhh!!!!)
  • 37.
    loose coupling message passing == loose coupling state classes are messages! change html/css without changing js API == add/remove/toggleClassbad: $(‘.my-widget ul’).css(‘display’, ‘none’); $(‘.my-widget’).addClass(‘no-list’);good: .no-list ul { display: none; }
  • 38.
    separation of concerns styling / layout separated from behavior css/html and js dev work independently bad: good:$(‘.my-view’) $(‘.my-view’) .find(‘li’) .addClass(‘filtered’); .css(‘color’, ‘red’) –––––––––––––––– .filter(‘.obsolete’) .filtered li { color: red; } .css(‘color’, ‘gray’); .filtered li.obsolete { color: gray; }
  • 39.
    organized css css is organized into object “classes” just like all of your other code.progress-bar { }.progress-bar .cancel-button { }.progress-bar .spinner { }.progress-bar .progress-frame div span { }.progress-bar.progress-complete { }.progress-bar.progress-error { }
  • 40.
    part IV –step by step aaacckkk! too much rope!show me how not to get meself hanged!
  • 41.
    identify objects#1 rule: ignore the HTML! scan the wireframes for oocss objects: can it be reused? does it have it’s own behavior? For each: “What is it?” -> Identity list run-time states
  • 42.
    identify objectsprogress barobject states content containers
  • 43.
    Identity + stateclasses Identity (“is a”): progress-bar specialization: progress-upload states progress-initializing progress-uploading progress-finalizing progress-complete progress-canceled progress-error
  • 44.
    html template<div class="progress-barprogress-upload"> <h2>progress title</h2> <div class="progress-frame"> <div><span></span></div> </div> <a href="#" class="cancel-action">x</a> <p>transaction status</p></div>
  • 45.
    css classes.progress-bar {}.progress-bar.progress-canceled h2 { }.progress-bar.progress-complete h2 { }.progress-bar.progress-error h2 { }....progress-frame { }.progress-frame div { }.progress-frame div span { }.progress-display .cancel-action { }....progress-upload { }
  • 46.
    javascript controller$(‘.progress-bar’).each(function (){ var progressBar = $(this); progressBar.find(‘.cancel-action’) .click(function () { progressBar.addClass(‘progress-canceled’) .find(‘h2’).text(‘Canceled’); /* coordinate actual cancel work here */ return false; });});
  • 47.
    part V –demo!yo ho ho and a hogshead of rum!
  • 48.
    part VI –pitfalls + antipatterns follow this sage advice or ye’ll end up in a gibbet!!
  • 49.
  • 50.
    .css() is EVIL css does not belong in your javascript!* (*except when it does)
  • 51.
    .css() is EVIL css does not belong in your javascript!* (*except when it does) animations, too! fadeIn(), fadeOut(), animate(), hide(), show()
  • 52.
    .css() is EVIL css does not belong in your javascript!* (*except when it does) animations, too! fadeIn(), fadeOut(), animate(), hide(), show() css3 + progressive enhancement or
  • 53.
    .css() is EVIL css does not belong in your javascript!* (*except when it does) animations, too! fadeIn(), fadeOut(), animate(), hide(), show() css3 + progressive enhancement or regressive enhancement: jquery css transitions, cujo.js
  • 54.
    avoid IDs andelements bad: div.my-class {} #myNode.my-class {} these create unnecessary specificity ids lure you into creating non-reusable rules
  • 55.
    oocss vs. ie6 gotcha: .base.state { /* ie6 ignores .base */ } solutions: name-spaced (unambiguous) states e.g.: .base.base-state selectivizr, cujo.js
  • 56.
    belay that HTML,mate In any reasonably complex system, writing HTML and CSS first is an antipattern Start with wireframes, identify objects and their states, then write HTML
  • 57.
    discrete vs. continuous Trying to model continuous values with OOCSS state be askin’ fer a flogging..progress-0 .progress-frame div span { width: 0% }.progress-1 .progress-frame div span { width: 1% }....progress-99 .progress-frame div span { width: 99% }.progress-100 .progress-frame div span { width: 100%}
  • 58.
    horizontal class explosion<section class=“intro colorful-intro orange has- callout has-second-callout exclusive front- page”> Use the cascade: “colorful-intro” is probably a specialization of “intro” Consolidate non-states: e.g. “orange” may be a characteristic of “colorful-intro” Consider SASS/SCSS or Less.css
  • 59.
    vertical class explosion<divclass="progress-bar progress-upload"> <h2 class="progress-canceled">progress title</h2> <div class="progress-frame progress-canceled"> <div><span class="progress-canceled"></span></div> </div> <a href="#" class="cancel-action progress-canceled">x</a> <p class="progress-canceled">canceled!</p></div>
  • 60.
    vertical class explosion Place state classes as high up in the component’s HTML as possible Use OOCSS inheritance. Remember that descendant nodes can inherit run-time state!<div class="progress-bar progress-upload progress-canceled"> <h2>progress title</h2> ...</div>
  • 61.
    Keelhauled HTML Havingsections of permanently hidden HTML is a bad code smell analog clock: nearly half the HTML elements are permanently hidden Review your objects and wireframes Probably time to refactor HTML & CSS
  • 62.
    part VII -what be next?weigh anchor and hoist the jib, me hearties, we be all in the wind!
  • 63.
    oocss design patterns! codifying oocss design patterns 3 so far: Initial State Pattern Revealing Specialization Pattern Inherited Specialization Pattern more on the way!
  • 64.
    thanks! john hann brian cavalier @unscriptable @briancavalier life image, inc. hovercraft studioshttp://lifeimage.com http://hovercraftstudios.com
  • 65.
    questions?ye must phraseall queries like a true seadog! landlubbers will be keel-hauled(or tarred-and-feathered – choose yer poison)
  • 66.
    Go Steelers!You didn’tthink it’d be all Pirates, did you?
  • 67.
    imagesjolly roger: http://flickr.com/photos/earlgpirates: “Don’t mess with pirates - Declan Hann” http://www.flickr.com/photos/slipstreamblue/2716444681/ http://www.flickr.com/photos/brothermagneto/3476288029/ http://www.flickr.com/photos/jsconf/4587502948/ http://www.flickr.com/photos/fenchurch/237726110/moon shine still: http://flickr.com/photos/seanlloyd/gold coins: http://www.flickr.com/photos/myklroventine/3400039523/dead pirate: http://www.flickr.com/photos/jeffreykeefer/540423620/corsair: http://www.flickr.com/photos/portofsandiego/4952170821/ducks: http://www.flickr.com/photos/tiefpunkt/2571937817/piece of eight: http://flickr.com/photos/woodysworld1778/pirate daleks!: http://flickr.com/photos/54459164@N00/5003883529/

Editor's Notes


[8]ページ先頭

©2009-2025 Movatter.jp