SlideShare a Scribd company logo
1 of 36
Download to read offline
DR. STRANGELOVE OR:
           HOW I LEARNED TO STOP
            WORRYING AND LOVE
          HTML, CSS, AND JAVASCRIPT
Friday, September 10, 2010
POP QUIZ!!!!


Friday, September 10, 2010
Friday, September 10, 2010
git clone git://github.com/BJClark/Dr.-Strangelove.git




Friday, September 10, 2010
A LOVE STORY IN 3 PARTS


    • Writing                Beautiful HTML

    • CSS           for fun and profit

    • Javascript              like you give a shit Professional Javascript




Friday, September 10, 2010
Why?




Friday, September 10, 2010
Friday, September 10, 2010
SEMANTIC = MEANINGFUL


    • Know   your HTML elements
        (<samp> <abbr> <cite> <ol>)

    • Tables             for tables, lists for lists.

    • HTML5




Friday, September 10, 2010
IDS AND CLASSES

                                              <% div_for photo, :class => "hmedia" do %>
                                                  ...
                                              <% end -%>

                                              <div class="photo hmedia" id="photo_1">
                                                  . . .
    • IDs         are for identification       </div>



    • Classes                are categories   <%= dom_id @photo %>

                                              "photo_1"




Friday, September 10, 2010
MICROFORMATS

    • microformats.org                  <% div_for photo, :class => "hmedia" do %>
                                            <%= content_tag :h2, photo.title, :class => "fn"
                                        %>
    • Sensible               Defaults       <a rel="enclosure" type="image/jpeg" href="<%=
                                        url_for photo -%>">
                                                 <%= image_tag "strangelove.jpg", :alt => "Dr.
                                        Strangelove", :class => "photo" %>
    • Specific   HTML with                   </a>
                                            <div class="attribution">
        specific classes                          by <span class="contributor vcard">
                                                     <%= link_to photo.user, "http://
                                        example.com", :class => "url fn" %>

    • mofo, xoxo                                 </span>
                                            </div>
                                        <% end -%>




Friday, September 10, 2010
MICROFORMATS
                     XOXO - Microformat for Navigation Outlines
                                  <ol class='xoxo'>
                                    <li>Subject 1
                                      <ol>
                                           <li>subpoint a</li>
                                           <li>subpoint b</li>
                                      </ol>
                                    </li>
                                    <li>Subject 2
                                      <ol compact="compact">
                                           <li>subpoint c</li>
                                           <li>subpoint d</li>
                                      </ol>
                                    </li>
                                    <li>Subject 3
                                      <ol>
                                           <li>subpoint e</li>
                                      </ol>
                                    </li>
                                  </ol>



Friday, September 10, 2010
RESOURCEFUL VIEWS


    • Self-contained

    • Microformatted*

    • Matching               our domain
        objects



Friday, September 10, 2010
Cascading Style Sheets




Friday, September 10, 2010
WEBKIT




Friday, September 10, 2010
WEBKIT




Friday, September 10, 2010
WEBKIT



                      http://www.quirksmode.org/compatibility.html




Friday, September 10, 2010
CAN I USE. . .




Friday, September 10, 2010
CSS FRAMEWORKS

                                    • Sensible
                                            defaults! DRY!
                                     Convention over creativity.

                                    • Resets

                                    • Clearfix

                                    • Josef   Muller Brockman


Friday, September 10, 2010
GRACEFUL DEGRADATION




Friday, September 10, 2010
IT’S A SECRET




                             IE7              Webkit

Friday, September 10, 2010
GRACEFUL DEGRADATION
                     .editable_tag {
                       padding: 5px 10px;
                       margin: 5px 10px 0 0;
                       background: #bfbfbf; /* lowest common denominator */
                       float: left;
                       background: -webkit-gradient(linear, left top, left
                     bottom, from(#bfbfbf), to(#e4e4e4));
                       background: -moz-linear-gradient(top, #bfbfbf, #e4e4e4);
                       -webkit-border-radius: 4px; /* Safari 4 */
                       -moz-border-radius: 4px; /* Firefox */
                       border-radius: 4px; /* Safari 5 & Chrome */
                       box-shadow: rgba(0,0,0,1) 0 1px 0;
                     }




Friday, September 10, 2010
OBJECT ORIENTED CSS

    • CSS isn’t that different than
        OOP in other languages             .photo_navigation div.empty_photo{
                                             width: 60px;
                                             height: 60px;
                                             padding: 10px;
    • IDs         are singletons             background: silver;
                                             color: white;
                                             font-size: .8em;
    • Classes                are Objects   }
                                           .photo_navigation
                                           img, .photo_navigation
    • Inheritance and                      div.empty_photo {

        Composition                          float: left;
                                             padding-right: 10px;
                                           }

    • Namespacing

Friday, September 10, 2010
OBJECT ORIENTED CSS

   .photo_navigation div.empty_photo{
     width: 60px;                             class PhotoNavigation::EmptyPhoto
     height: 60px;                                width "60px"
                                                  height "60px"
     padding: 10px;
                                                  padding "10px"
     background: silver;                      end
     color: white;
     font-size: .8em;                         class PhotoNavigation::OtherOptions
   }                                            float "left"
                                                padding_right "10px"
   .photo_navigation img, .photo_navigation
                                              end
   div.empty_photo {
     float: left;                             empty_photo = PhotoNavigation::EmptyPhoto.new
     margin-right: 10px;                      empty_photo.extend(PhotoNavigation::OtherOptions)
   }




Friday, September 10, 2010
PROFESSIONAL JAVASCRIPT


    • Build           page to work without Javascript?

    • Inline           JS = Legacy code

    • Writing                reusable Javascript




Friday, September 10, 2010
WITHOUT JAVASCRIPT?




Friday, September 10, 2010
WITHOUT JAVASCRIPT?



    • Do    your users turn off
        javascript?




Friday, September 10, 2010
WITHOUT JAVASCRIPT?



    • Do    your users turn off
        javascript?

    • Do          you like testing?




Friday, September 10, 2010
WITHOUT JAVASCRIPT?



    • Do    your users turn off
        javascript?

    • Do          you like testing?




Friday, September 10, 2010
THE CASE FOR UJS

                                        <a href="#" onclick="new
                                        Ajax.Updater('foo', 'http://
    • Very            painful to test   strangelove.local/tags/1',
                                        {asynchronous:true,
                                        evalScripts:true,
    • Impossible             to reuse   parameters:'authenticity_token=' +
                                        encodeURIComponent('xXnuBemPMRAar/
    • Hard             to debug         EUBB9GbcXD/
                                        +HUhOaUxoAnkm5KSy8=')}); return
                                        false;">Zip</a>




Friday, September 10, 2010
WRITING REUSABLE
                                JAVASCRIPT
     var Photor = {};

     Photor.Tags = (function($){

        return {
          init: function(){
                                     • Namespaced
            }
        }

     })(jQuery);
                                     • Public   vs Private Methods
     $(document).ready(function(){
       Photor.Tags.init();

     });




Friday, September 10, 2010
INIT METHOD
     return {
         init: function(){
           $('.edit_tags').live('click', function(event){
              event.preventDefault();
              editTags(event.target);
           });

                 $('.destroy_tag').live('click', function(event){
                   event.preventDefault();
                   removeTag(event.target);
                 });

                 $('.add_tags').live('submit', function(event){
                   event.preventDefault();
                   addTags(event.target);
                 });

             }
         }



Friday, September 10, 2010
REMOVING A TAG

        var removeTag = function(tag){
          var editable_tag = $(tag).closest('.editable_tag');
          $(editable_tag).hide(); //instant user feedback
          $.ajax({url: $(tag).attr('href'),
                type: "POST",
                data: {"_method": 'delete'},
                success: function(data){
                   $(editable_tag).remove();
                   hideErrors(editable_tag);
                },
                error: function(data){
                   $(editable_tag).show();
                   handleError(data, editable_tag);
                }
          });
        }




Friday, September 10, 2010
SHOWING ADD TAGS
     //INCORRECT (and how every jQuery tutorial out there tells you how to do it)
     $('.edit_tags').click(function(event){
       event.preventDefault();
       $('.add_tags').show();
       $(event.target).hide();
     });




        var editTags = function(target){
          var parent_div = $(target).closest('.tags');
          $('.add_tags', parent_div).show();
          $(target).hide();
        }




Friday, September 10, 2010
ADDING TAGS

        var addTags = function(form) {
          $.ajax({url: $(form).attr('action') + ".js",
                type: "POST",
                data: $(form).serialize(),
                dataType: "html",
                success: function(data){
                   var tags_div = $(form).closest('.tags');
                   $('.editable_tag', tags_div).remove();
                   $('.error_messages', tags_div).after(data);
                   hideErrors();
                   $(form).find('input[type=text]').val("");
                },
                error: function(data){
                   handleError(data, form);
                }
          });




Friday, September 10, 2010
THINGS TO NOTE


    • No          use of “this”

    • Not           using IDs

    • Closures  allow for multiples of the same elements to act
        independently



Friday, September 10, 2010
BJ CLARK
                             UX Developer @ http://goldstar.com


                                    @RobotDeathSquad
                                   http://github.com/BJClark
                                       http://bjclark.me



Friday, September 10, 2010

More Related Content

Similar to Dr. Strangelove: or How I learned to love HTML, CSS, and Javascript

HTML5 - getting started
HTML5 - getting startedHTML5 - getting started
HTML5 - getting startedTed Drake
 
WordPress Front End Optimizations
WordPress Front End OptimizationsWordPress Front End Optimizations
WordPress Front End OptimizationsScott Taylor
 
Getting Started with Dojo Toolkit
Getting Started with Dojo ToolkitGetting Started with Dojo Toolkit
Getting Started with Dojo ToolkitThomas Koch
 
Introduction to HTML5
Introduction to HTML5Introduction to HTML5
Introduction to HTML5Adrian Olaru
 
A Primer on HTML 5 - By Nick Armstrong
A Primer on HTML 5 - By Nick ArmstrongA Primer on HTML 5 - By Nick Armstrong
A Primer on HTML 5 - By Nick ArmstrongNick Armstrong
 
Html5/CSS3 in shanghai 2010
Html5/CSS3 in shanghai 2010Html5/CSS3 in shanghai 2010
Html5/CSS3 in shanghai 2010Zi Bin Cheah
 
Topsy Turvy Design
Topsy Turvy DesignTopsy Turvy Design
Topsy Turvy DesignRich Quick
 
BDD and Cucumber at barcampGZ
BDD and Cucumber at barcampGZBDD and Cucumber at barcampGZ
BDD and Cucumber at barcampGZleondu
 
HTML5: Building for a Faster Web
HTML5: Building for a Faster WebHTML5: Building for a Faster Web
HTML5: Building for a Faster WebEric Bidelman
 
Html5 coredevsummit
Html5 coredevsummitHtml5 coredevsummit
Html5 coredevsummitJen Simmons
 
Attractive HTML5~開発者の視点から~
Attractive HTML5~開発者の視点から~Attractive HTML5~開発者の視点から~
Attractive HTML5~開発者の視点から~Sho Ito
 
Slow kinda sucks
Slow kinda sucksSlow kinda sucks
Slow kinda sucksTim Wright
 
RWD in the Wild
RWD in the WildRWD in the Wild
RWD in the WildRich Quick
 

Similar to Dr. Strangelove: or How I learned to love HTML, CSS, and Javascript (20)

HTML5 - getting started
HTML5 - getting startedHTML5 - getting started
HTML5 - getting started
 
lecture2_public
lecture2_publiclecture2_public
lecture2_public
 
lecture2_public
lecture2_publiclecture2_public
lecture2_public
 
WordPress Front End Optimizations
WordPress Front End OptimizationsWordPress Front End Optimizations
WordPress Front End Optimizations
 
Getting Started with Dojo Toolkit
Getting Started with Dojo ToolkitGetting Started with Dojo Toolkit
Getting Started with Dojo Toolkit
 
CSS Bloat!
CSS Bloat!CSS Bloat!
CSS Bloat!
 
Introduction to HTML5
Introduction to HTML5Introduction to HTML5
Introduction to HTML5
 
A Primer on HTML 5 - By Nick Armstrong
A Primer on HTML 5 - By Nick ArmstrongA Primer on HTML 5 - By Nick Armstrong
A Primer on HTML 5 - By Nick Armstrong
 
Html5/CSS3 in shanghai 2010
Html5/CSS3 in shanghai 2010Html5/CSS3 in shanghai 2010
Html5/CSS3 in shanghai 2010
 
Topsy Turvy Design
Topsy Turvy DesignTopsy Turvy Design
Topsy Turvy Design
 
BDD and Cucumber at barcampGZ
BDD and Cucumber at barcampGZBDD and Cucumber at barcampGZ
BDD and Cucumber at barcampGZ
 
HTML5: Building for a Faster Web
HTML5: Building for a Faster WebHTML5: Building for a Faster Web
HTML5: Building for a Faster Web
 
Look ma! No images!
Look ma! No images!Look ma! No images!
Look ma! No images!
 
Hardcore CSS
Hardcore CSSHardcore CSS
Hardcore CSS
 
Http _css-tricks
Http  _css-tricksHttp  _css-tricks
Http _css-tricks
 
HTML5 & CSS3 Flag
HTML5 & CSS3 FlagHTML5 & CSS3 Flag
HTML5 & CSS3 Flag
 
Html5 coredevsummit
Html5 coredevsummitHtml5 coredevsummit
Html5 coredevsummit
 
Attractive HTML5~開発者の視点から~
Attractive HTML5~開発者の視点から~Attractive HTML5~開発者の視点から~
Attractive HTML5~開発者の視点から~
 
Slow kinda sucks
Slow kinda sucksSlow kinda sucks
Slow kinda sucks
 
RWD in the Wild
RWD in the WildRWD in the Wild
RWD in the Wild
 

Recently uploaded

H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DaySri Ambati
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 

Recently uploaded (20)

H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 

Dr. Strangelove: or How I learned to love HTML, CSS, and Javascript

  • 1. DR. STRANGELOVE OR: HOW I LEARNED TO STOP WORRYING AND LOVE HTML, CSS, AND JAVASCRIPT Friday, September 10, 2010
  • 5. A LOVE STORY IN 3 PARTS • Writing Beautiful HTML • CSS for fun and profit • Javascript like you give a shit Professional Javascript Friday, September 10, 2010
  • 8. SEMANTIC = MEANINGFUL • Know your HTML elements (<samp> <abbr> <cite> <ol>) • Tables for tables, lists for lists. • HTML5 Friday, September 10, 2010
  • 9. IDS AND CLASSES <% div_for photo, :class => "hmedia" do %> ... <% end -%> <div class="photo hmedia" id="photo_1"> . . . • IDs are for identification </div> • Classes are categories <%= dom_id @photo %> "photo_1" Friday, September 10, 2010
  • 10. MICROFORMATS • microformats.org <% div_for photo, :class => "hmedia" do %> <%= content_tag :h2, photo.title, :class => "fn" %> • Sensible Defaults <a rel="enclosure" type="image/jpeg" href="<%= url_for photo -%>"> <%= image_tag "strangelove.jpg", :alt => "Dr. Strangelove", :class => "photo" %> • Specific HTML with </a> <div class="attribution"> specific classes by <span class="contributor vcard"> <%= link_to photo.user, "http:// example.com", :class => "url fn" %> • mofo, xoxo </span> </div> <% end -%> Friday, September 10, 2010
  • 11. MICROFORMATS XOXO - Microformat for Navigation Outlines <ol class='xoxo'> <li>Subject 1 <ol> <li>subpoint a</li> <li>subpoint b</li> </ol> </li> <li>Subject 2 <ol compact="compact"> <li>subpoint c</li> <li>subpoint d</li> </ol> </li> <li>Subject 3 <ol> <li>subpoint e</li> </ol> </li> </ol> Friday, September 10, 2010
  • 12. RESOURCEFUL VIEWS • Self-contained • Microformatted* • Matching our domain objects Friday, September 10, 2010
  • 13. Cascading Style Sheets Friday, September 10, 2010
  • 16. WEBKIT http://www.quirksmode.org/compatibility.html Friday, September 10, 2010
  • 17. CAN I USE. . . Friday, September 10, 2010
  • 18. CSS FRAMEWORKS • Sensible defaults! DRY! Convention over creativity. • Resets • Clearfix • Josef Muller Brockman Friday, September 10, 2010
  • 20. IT’S A SECRET IE7 Webkit Friday, September 10, 2010
  • 21. GRACEFUL DEGRADATION .editable_tag { padding: 5px 10px; margin: 5px 10px 0 0; background: #bfbfbf; /* lowest common denominator */ float: left; background: -webkit-gradient(linear, left top, left bottom, from(#bfbfbf), to(#e4e4e4)); background: -moz-linear-gradient(top, #bfbfbf, #e4e4e4); -webkit-border-radius: 4px; /* Safari 4 */ -moz-border-radius: 4px; /* Firefox */ border-radius: 4px; /* Safari 5 & Chrome */ box-shadow: rgba(0,0,0,1) 0 1px 0; } Friday, September 10, 2010
  • 22. OBJECT ORIENTED CSS • CSS isn’t that different than OOP in other languages .photo_navigation div.empty_photo{ width: 60px; height: 60px; padding: 10px; • IDs are singletons background: silver; color: white; font-size: .8em; • Classes are Objects } .photo_navigation img, .photo_navigation • Inheritance and div.empty_photo { Composition float: left; padding-right: 10px; } • Namespacing Friday, September 10, 2010
  • 23. OBJECT ORIENTED CSS .photo_navigation div.empty_photo{ width: 60px; class PhotoNavigation::EmptyPhoto height: 60px; width "60px" height "60px" padding: 10px; padding "10px" background: silver; end color: white; font-size: .8em; class PhotoNavigation::OtherOptions } float "left" padding_right "10px" .photo_navigation img, .photo_navigation end div.empty_photo { float: left; empty_photo = PhotoNavigation::EmptyPhoto.new margin-right: 10px; empty_photo.extend(PhotoNavigation::OtherOptions) } Friday, September 10, 2010
  • 24. PROFESSIONAL JAVASCRIPT • Build page to work without Javascript? • Inline JS = Legacy code • Writing reusable Javascript Friday, September 10, 2010
  • 26. WITHOUT JAVASCRIPT? • Do your users turn off javascript? Friday, September 10, 2010
  • 27. WITHOUT JAVASCRIPT? • Do your users turn off javascript? • Do you like testing? Friday, September 10, 2010
  • 28. WITHOUT JAVASCRIPT? • Do your users turn off javascript? • Do you like testing? Friday, September 10, 2010
  • 29. THE CASE FOR UJS <a href="#" onclick="new Ajax.Updater('foo', 'http:// • Very painful to test strangelove.local/tags/1', {asynchronous:true, evalScripts:true, • Impossible to reuse parameters:'authenticity_token=' + encodeURIComponent('xXnuBemPMRAar/ • Hard to debug EUBB9GbcXD/ +HUhOaUxoAnkm5KSy8=')}); return false;">Zip</a> Friday, September 10, 2010
  • 30. WRITING REUSABLE JAVASCRIPT var Photor = {}; Photor.Tags = (function($){ return { init: function(){ • Namespaced } } })(jQuery); • Public vs Private Methods $(document).ready(function(){ Photor.Tags.init(); }); Friday, September 10, 2010
  • 31. INIT METHOD return { init: function(){ $('.edit_tags').live('click', function(event){ event.preventDefault(); editTags(event.target); }); $('.destroy_tag').live('click', function(event){ event.preventDefault(); removeTag(event.target); }); $('.add_tags').live('submit', function(event){ event.preventDefault(); addTags(event.target); }); } } Friday, September 10, 2010
  • 32. REMOVING A TAG var removeTag = function(tag){ var editable_tag = $(tag).closest('.editable_tag'); $(editable_tag).hide(); //instant user feedback $.ajax({url: $(tag).attr('href'), type: "POST", data: {"_method": 'delete'}, success: function(data){ $(editable_tag).remove(); hideErrors(editable_tag); }, error: function(data){ $(editable_tag).show(); handleError(data, editable_tag); } }); } Friday, September 10, 2010
  • 33. SHOWING ADD TAGS //INCORRECT (and how every jQuery tutorial out there tells you how to do it) $('.edit_tags').click(function(event){ event.preventDefault(); $('.add_tags').show(); $(event.target).hide(); }); var editTags = function(target){ var parent_div = $(target).closest('.tags'); $('.add_tags', parent_div).show(); $(target).hide(); } Friday, September 10, 2010
  • 34. ADDING TAGS var addTags = function(form) { $.ajax({url: $(form).attr('action') + ".js", type: "POST", data: $(form).serialize(), dataType: "html", success: function(data){ var tags_div = $(form).closest('.tags'); $('.editable_tag', tags_div).remove(); $('.error_messages', tags_div).after(data); hideErrors(); $(form).find('input[type=text]').val(""); }, error: function(data){ handleError(data, form); } }); Friday, September 10, 2010
  • 35. THINGS TO NOTE • No use of “this” • Not using IDs • Closures allow for multiples of the same elements to act independently Friday, September 10, 2010
  • 36. BJ CLARK UX Developer @ http://goldstar.com @RobotDeathSquad http://github.com/BJClark http://bjclark.me Friday, September 10, 2010