SlideShare a Scribd company logo
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 “css
best 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/toggleClass

bad:    $(‘.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 objects
progress 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 studios
http://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?
images
jolly roger: http://flickr.com/photos/earlg
pirates:
           “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/
Ad

More Related Content

What's hot (20)

Intro to OOCSS Workshop
Intro to OOCSS WorkshopIntro to OOCSS Workshop
Intro to OOCSS Workshop
Julie Cameron
 
An in-depth look at jQuery
An in-depth look at jQueryAn in-depth look at jQuery
An in-depth look at jQuery
Paul Bakaus
 
The Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQueryThe Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQuery
colinbdclark
 
jQuery Learning
jQuery LearningjQuery Learning
jQuery Learning
Uzair Ali
 
jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009
Remy Sharp
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3
Karsten Dambekalns
 
jQuery for beginners
jQuery for beginnersjQuery for beginners
jQuery for beginners
Siva Arunachalam
 
An Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScriptAn Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScript
Peter-Paul Koch
 
Jquery ui
Jquery uiJquery ui
Jquery ui
adm_exoplatform
 
Structured Apps with Google Dart
Structured Apps with Google DartStructured Apps with Google Dart
Structured Apps with Google Dart
Jermaine Oppong
 
OOCSS Lightening Talk
OOCSS Lightening TalkOOCSS Lightening Talk
OOCSS Lightening Talk
Julie Cameron
 
JavaScript Libraries (@Media)
JavaScript Libraries (@Media)JavaScript Libraries (@Media)
JavaScript Libraries (@Media)
jeresig
 
Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...
Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...
Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...
RobotDeathSquad
 
Scalable and Modular CSS FTW!
Scalable and Modular CSS FTW!Scalable and Modular CSS FTW!
Scalable and Modular CSS FTW!
FITC
 
jQuery (MeshU)
jQuery (MeshU)jQuery (MeshU)
jQuery (MeshU)
jeresig
 
HTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymoreHTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymore
Remy Sharp
 
Web2.0 with jQuery in English
Web2.0 with jQuery in EnglishWeb2.0 with jQuery in English
Web2.0 with jQuery in English
Lau Bech Lauritzen
 
jQuery (BostonPHP)
jQuery (BostonPHP)jQuery (BostonPHP)
jQuery (BostonPHP)
jeresig
 
JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)
jeresig
 
Yearning jQuery
Yearning jQueryYearning jQuery
Yearning jQuery
Remy Sharp
 
Intro to OOCSS Workshop
Intro to OOCSS WorkshopIntro to OOCSS Workshop
Intro to OOCSS Workshop
Julie Cameron
 
An in-depth look at jQuery
An in-depth look at jQueryAn in-depth look at jQuery
An in-depth look at jQuery
Paul Bakaus
 
The Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQueryThe Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQuery
colinbdclark
 
jQuery Learning
jQuery LearningjQuery Learning
jQuery Learning
Uzair Ali
 
jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009
Remy Sharp
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3
Karsten Dambekalns
 
An Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScriptAn Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScript
Peter-Paul Koch
 
Structured Apps with Google Dart
Structured Apps with Google DartStructured Apps with Google Dart
Structured Apps with Google Dart
Jermaine Oppong
 
OOCSS Lightening Talk
OOCSS Lightening TalkOOCSS Lightening Talk
OOCSS Lightening Talk
Julie Cameron
 
JavaScript Libraries (@Media)
JavaScript Libraries (@Media)JavaScript Libraries (@Media)
JavaScript Libraries (@Media)
jeresig
 
Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...
Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...
Dr. Strangelove or: How I learned to stop worrying and love HTML, CSS and Jav...
RobotDeathSquad
 
Scalable and Modular CSS FTW!
Scalable and Modular CSS FTW!Scalable and Modular CSS FTW!
Scalable and Modular CSS FTW!
FITC
 
jQuery (MeshU)
jQuery (MeshU)jQuery (MeshU)
jQuery (MeshU)
jeresig
 
HTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymoreHTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymore
Remy Sharp
 
jQuery (BostonPHP)
jQuery (BostonPHP)jQuery (BostonPHP)
jQuery (BostonPHP)
jeresig
 
JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)
jeresig
 
Yearning jQuery
Yearning jQueryYearning jQuery
Yearning jQuery
Remy Sharp
 

Similar to OOCSS for Javascript pirates at jQueryPgh meetup (20)

CSS - OOCSS, SMACSS and more
CSS - OOCSS, SMACSS and moreCSS - OOCSS, SMACSS and more
CSS - OOCSS, SMACSS and more
Russ Weakley
 
Styling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS EditionStyling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS Edition
bensmithett
 
Styling components with JavaScript
Styling components with JavaScriptStyling components with JavaScript
Styling components with JavaScript
bensmithett
 
Slow kinda sucks
Slow kinda sucksSlow kinda sucks
Slow kinda sucks
Tim Wright
 
CSS: A Slippery Slope to the Backend
CSS: A Slippery Slope to the BackendCSS: A Slippery Slope to the Backend
CSS: A Slippery Slope to the Backend
FITC
 
Sass Essentials at Mobile Camp LA
Sass Essentials at Mobile Camp LASass Essentials at Mobile Camp LA
Sass Essentials at Mobile Camp LA
Jake Johnson
 
The New UI - Staying Strong with Flexbox, SASS, and {{Mustache.js}}
The New UI - Staying Strong with Flexbox, SASS, and {{Mustache.js}}The New UI - Staying Strong with Flexbox, SASS, and {{Mustache.js}}
The New UI - Staying Strong with Flexbox, SASS, and {{Mustache.js}}
Eric Carlisle
 
Implementing Awesome: An HTML5/CSS3 Workshop
Implementing Awesome: An HTML5/CSS3 WorkshopImplementing Awesome: An HTML5/CSS3 Workshop
Implementing Awesome: An HTML5/CSS3 Workshop
Shoshi Roberts
 
CSMess to OOCSS: Refactoring CSS with Object Oriented Design
CSMess to OOCSS: Refactoring CSS with Object Oriented DesignCSMess to OOCSS: Refactoring CSS with Object Oriented Design
CSMess to OOCSS: Refactoring CSS with Object Oriented Design
Kate Travers
 
Even faster web sites
Even faster web sitesEven faster web sites
Even faster web sites
Felipe Lavín
 
JavaScript for Flex Devs
JavaScript for Flex DevsJavaScript for Flex Devs
JavaScript for Flex Devs
Aaronius
 
How to create a basic template
How to create a basic templateHow to create a basic template
How to create a basic template
vathur
 
The Future State of Layout
The Future State of LayoutThe Future State of Layout
The Future State of Layout
Stephen Hay
 
How to Extend Axure's Animation Capability
How to Extend Axure's Animation CapabilityHow to Extend Axure's Animation Capability
How to Extend Axure's Animation Capability
Svetlin Denkov
 
A XSSmas carol
A XSSmas carolA XSSmas carol
A XSSmas carol
cgvwzq
 
Introduction to CSS3
Introduction to CSS3Introduction to CSS3
Introduction to CSS3
RAHUL SHARMA
 
CSS3 Takes on the World
CSS3 Takes on the WorldCSS3 Takes on the World
CSS3 Takes on the World
Jonathan Snook
 
Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011
Chris Alfano
 
The Creative New World of CSS
The Creative New World of CSSThe Creative New World of CSS
The Creative New World of CSS
Rachel Andrew
 
BEM Methodology — @Frontenders Ticino —17/09/2014
BEM Methodology — @Frontenders Ticino —17/09/2014BEM Methodology — @Frontenders Ticino —17/09/2014
BEM Methodology — @Frontenders Ticino —17/09/2014
vzaccaria
 
CSS - OOCSS, SMACSS and more
CSS - OOCSS, SMACSS and moreCSS - OOCSS, SMACSS and more
CSS - OOCSS, SMACSS and more
Russ Weakley
 
Styling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS EditionStyling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS Edition
bensmithett
 
Styling components with JavaScript
Styling components with JavaScriptStyling components with JavaScript
Styling components with JavaScript
bensmithett
 
Slow kinda sucks
Slow kinda sucksSlow kinda sucks
Slow kinda sucks
Tim Wright
 
CSS: A Slippery Slope to the Backend
CSS: A Slippery Slope to the BackendCSS: A Slippery Slope to the Backend
CSS: A Slippery Slope to the Backend
FITC
 
Sass Essentials at Mobile Camp LA
Sass Essentials at Mobile Camp LASass Essentials at Mobile Camp LA
Sass Essentials at Mobile Camp LA
Jake Johnson
 
The New UI - Staying Strong with Flexbox, SASS, and {{Mustache.js}}
The New UI - Staying Strong with Flexbox, SASS, and {{Mustache.js}}The New UI - Staying Strong with Flexbox, SASS, and {{Mustache.js}}
The New UI - Staying Strong with Flexbox, SASS, and {{Mustache.js}}
Eric Carlisle
 
Implementing Awesome: An HTML5/CSS3 Workshop
Implementing Awesome: An HTML5/CSS3 WorkshopImplementing Awesome: An HTML5/CSS3 Workshop
Implementing Awesome: An HTML5/CSS3 Workshop
Shoshi Roberts
 
CSMess to OOCSS: Refactoring CSS with Object Oriented Design
CSMess to OOCSS: Refactoring CSS with Object Oriented DesignCSMess to OOCSS: Refactoring CSS with Object Oriented Design
CSMess to OOCSS: Refactoring CSS with Object Oriented Design
Kate Travers
 
Even faster web sites
Even faster web sitesEven faster web sites
Even faster web sites
Felipe Lavín
 
JavaScript for Flex Devs
JavaScript for Flex DevsJavaScript for Flex Devs
JavaScript for Flex Devs
Aaronius
 
How to create a basic template
How to create a basic templateHow to create a basic template
How to create a basic template
vathur
 
The Future State of Layout
The Future State of LayoutThe Future State of Layout
The Future State of Layout
Stephen Hay
 
How to Extend Axure's Animation Capability
How to Extend Axure's Animation CapabilityHow to Extend Axure's Animation Capability
How to Extend Axure's Animation Capability
Svetlin Denkov
 
A XSSmas carol
A XSSmas carolA XSSmas carol
A XSSmas carol
cgvwzq
 
Introduction to CSS3
Introduction to CSS3Introduction to CSS3
Introduction to CSS3
RAHUL SHARMA
 
CSS3 Takes on the World
CSS3 Takes on the WorldCSS3 Takes on the World
CSS3 Takes on the World
Jonathan Snook
 
Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011
Chris Alfano
 
The Creative New World of CSS
The Creative New World of CSSThe Creative New World of CSS
The Creative New World of CSS
Rachel Andrew
 
BEM Methodology — @Frontenders Ticino —17/09/2014
BEM Methodology — @Frontenders Ticino —17/09/2014BEM Methodology — @Frontenders Ticino —17/09/2014
BEM Methodology — @Frontenders Ticino —17/09/2014
vzaccaria
 
Ad

Recently uploaded (20)

The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...
Vishnu Singh Chundawat
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx
Samuele Fogagnolo
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Technology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data AnalyticsTechnology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data Analytics
InData Labs
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Special Meetup Edition - TDX Bengaluru Meetup #52.pptx
Special Meetup Edition - TDX Bengaluru Meetup #52.pptxSpecial Meetup Edition - TDX Bengaluru Meetup #52.pptx
Special Meetup Edition - TDX Bengaluru Meetup #52.pptx
shyamraj55
 
Build Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For DevsBuild Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For Devs
Brian McKeiver
 
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...
Vishnu Singh Chundawat
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx
Samuele Fogagnolo
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Technology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data AnalyticsTechnology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data Analytics
InData Labs
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Special Meetup Edition - TDX Bengaluru Meetup #52.pptx
Special Meetup Edition - TDX Bengaluru Meetup #52.pptxSpecial Meetup Edition - TDX Bengaluru Meetup #52.pptx
Special Meetup Edition - TDX Bengaluru Meetup #52.pptx
shyamraj55
 
Build Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For DevsBuild Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For Devs
Brian McKeiver
 
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
Ad

OOCSS for Javascript pirates at jQueryPgh meetup

  • 1. oocss for javascript pirates with @jquerypgh rigging, full speed ahead! brian cavalier
  • 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
  • 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 <aside class=“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 “css best practices”!?! blimey!! this oocss stuff is already startin’ to make me trigger finger itch!
  • 17. “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
  • 18. 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___!”
  • 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 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.)
  • 24. 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 () { /*…*/ });
  • 25. oocss inheritance oocss objects 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 { }
  • 29. oocss inheritance classical oo: classes inherit attributes + behavior
  • 30. oocss inheritance classical oo: classes inherit attributes + behavior pure prototypal: objects inherit attributes + behavior
  • 31. 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
  • 32. oocss inheritance type 1 <section class=“base special”>…</section> .base { .special { float: left; margin-right: -0.5em; width: 8em; width: 8.5em; } }
  • 33. 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; }
  • 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 <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; }
  • 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/toggleClass bad: $(‘.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 objects progress bar object states content containers
  • 43. Identity + state classes 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-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>
  • 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!!
  • 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 and elements 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 <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>
  • 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 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
  • 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 studios http://lifeimage.com http://hovercraftstudios.com
  • 65. questions? ye must phrase all queries like a true seadog! landlubbers will be keel-hauled (or tarred-and-feathered – choose yer poison)
  • 66. Go Steelers! You didn’t think it’d be all Pirates, did you?
  • 67. images jolly roger: http://flickr.com/photos/earlg pirates: “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