SlideShare a Scribd company logo
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 (20)

PDF
HTML5 - getting started
Ted Drake
 
PDF
lecture2_public
tutorialsruby
 
PDF
lecture2_public
tutorialsruby
 
PDF
WordPress Front End Optimizations
Scott Taylor
 
PDF
Getting Started with Dojo Toolkit
Thomas Koch
 
PDF
CSS Bloat!
Nicole Sullivan
 
PDF
Introduction to HTML5
Adrian Olaru
 
PDF
A Primer on HTML 5 - By Nick Armstrong
Nick Armstrong
 
PDF
Html5/CSS3 in shanghai 2010
Zi Bin Cheah
 
KEY
Topsy Turvy Design
Rich Quick
 
PDF
BDD and Cucumber at barcampGZ
leondu
 
PDF
HTML5: Building for a Faster Web
Eric Bidelman
 
PDF
Look ma! No images!
Lennart Schoors
 
PPTX
Hardcore CSS
PDX Web & Design
 
PDF
Http _css-tricks
Daniel Downs
 
PDF
HTML5 & CSS3 Flag
Christopher Schmitt
 
PDF
Html5 coredevsummit
Jen Simmons
 
PDF
Attractive HTML5~開発者の視点から~
Sho Ito
 
KEY
Slow kinda sucks
Tim Wright
 
KEY
RWD in the Wild
Rich Quick
 
HTML5 - getting started
Ted Drake
 
lecture2_public
tutorialsruby
 
lecture2_public
tutorialsruby
 
WordPress Front End Optimizations
Scott Taylor
 
Getting Started with Dojo Toolkit
Thomas Koch
 
CSS Bloat!
Nicole Sullivan
 
Introduction to HTML5
Adrian Olaru
 
A Primer on HTML 5 - By Nick Armstrong
Nick Armstrong
 
Html5/CSS3 in shanghai 2010
Zi Bin Cheah
 
Topsy Turvy Design
Rich Quick
 
BDD and Cucumber at barcampGZ
leondu
 
HTML5: Building for a Faster Web
Eric Bidelman
 
Look ma! No images!
Lennart Schoors
 
Hardcore CSS
PDX Web & Design
 
Http _css-tricks
Daniel Downs
 
HTML5 & CSS3 Flag
Christopher Schmitt
 
Html5 coredevsummit
Jen Simmons
 
Attractive HTML5~開発者の視点から~
Sho Ito
 
Slow kinda sucks
Tim Wright
 
RWD in the Wild
Rich Quick
 

Recently uploaded (20)

PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
PPTX
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PDF
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PPT
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
Ad

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