Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Keeping the web native!

Keeping the web native!

My slides from this year's webinale. Why use JavaScript when the web platform is capable of doing a lot more than you think. We'll look at how to style custom forms and what you can use input elements for, as well as find a natural way of doing Parallax Scrolling just in pure CSS.

Avatar for Stefan Baumgartner

Stefan Baumgartner

June 02, 2014
Tweet

More Decks by Stefan Baumgartner

Other Decks in Technology

Transcript

  1. K E E P I N G T H E

    W E B N A T I V E S T E F A N B AU M G A R T N E R - @ D D P R R T
  2. 2 0 1 1 W A S A B A

    D Y E A R • Lots and lots of JavaScript to make IE7 behave like a modern browser • Lots and lots of Images to recreate CSS3 features • People just wanted to do the same flash as before, but it had “to work on the iPad”
  3. J AVA S C R I P T I S

    A L I T T L E L I K E A M U S H R O O M I N S U P E R M A R I O
  4. I T ’ S A N E X T R

    A C H A N C E W H E N D E A L I N G W I T H A R T D I R E C T O R S
  5. B U T O N E C A N G

    E T G R E E D Y
  6. Y O U WA N T T O K E

    E P T H E O R I G I N A L S E L E C T S vs
  7. <select name="lang" id="lang"> <option value="*">Select your Language</option> <option value="AT">Austrian</option> <option

    value="DE">German</option> <option value="EN">English</option> <option value="FR">French</option> </select>
  8. select { appearance: none; border: 1px solid black; border-radius: 0;

    font-size: 20px; padding: 5px 40px 5px 5px; font-family: Helvetica; background: white; }
  9. select { appearance: none; border: 1px solid black; border-radius: 0;

    font-size: 20px; padding: 5px 40px 5px 5px; font-family: Helvetica; background: white url(…selectBox-arrow.gif) no-repeat 95% center; }
  10. select { appearance: none; border: 1px solid black; border-radius: 0;

    font-size: 20px; padding: 5px 40px 5px 5px; font-family: Helvetica; background: white url(…selectBox-arrow.gif) no-repeat 95% center; } http://codepen.io/ddprrt/pen/leLab
  11. T H E R E I S M O R

    E http://bit.ly/1jKqgou ::-ms-check ::-ms-browse ::-ms-reveal ::-ms-clear
  12. T H E R E I S M O R

    E http://bit.ly/1jKqgou ::-ms-check ::-ms-browse ::-ms-reveal ::-ms-clear HANDLE WITH CARE
  13. S T Y L I N G F O R

    M E L E M E N T S • Styling form elements with proprietary selectors might be good for one platform ! • Don’t expect any of those features to become standard ! • Rely on standard CSS features when styling, and just tweak when necessary
  14. F O R M S : C H E C

    K B O X / R A D I O S
  15. input[type="checkbox"] + label:before { content: ''; position: absolute; width: 30px;

    height: 30px; font-size: 30px; line-height: 30px; margin-left: -40px; margin-top: 5px; }
  16. input[type="checkbox"]:focus + label:before { outline: 3px solid blue; } F

    U L L D E M O : http://codepen.io/ddprrt/pen/xsiDz
  17. T H E P R O S • Native click

    behaviour for labels - no need to reimplement “checking” • Can use any image or style you like • Keyboard accessible
  18. T H E P R O S • Native click

    behaviour for labels - no need to reimplement “checking” • Can use any image or style you like • Keyboard accessible T H E CO N S • Accesibilty: Does need CSS or Icon Fonts for high contrast mode
  19. T H E R E I S A N I

    N V I S I B L E L I N K B E T W E E N L A B E L A N D I N P U T
  20. E X T E N D I N G F

    U R T H E R <label for="navtoggler">☰</label>
  21. E X T E N D I N G F

    U R T H E R <label for="navtoggler">☰</label>
  22. E X T E N D I N G F

    U R T H E R <label for="navtoggler">☰</label> <input type="checkbox" id=“navtoggler"> <nav> … </nav>
  23. E X T E N D I N G F

    U R T H E R nav { height: 0px; max-height: 0px; overflow: hidden; transition: max-height 0.5s; } ! #navtoggler:checked + nav { height: auto; max-height: 1000px }
  24. E X T E N D I N G T

    H E I D E A …
  25. E X T E N D I N G T

    H E I D E A …
  26. E X T E N D I N G T

    H E I D E A … fieldset { width: 550px; border: none; transition: margin-left 1s ease; }
  27. E X T E N D I N G T

    H E I D E A … $('input[type="radio"]').on('change', function(){ var pos = $(this).next('label').data('offset');; $('fieldset').css('margin-left', -pos + 125); }); ! $('input[type="radio"]').each(function(){ var lbl = $(this).next('label'); lbl.data('offset',lbl.offset().left); });
  28. F L O A T L A B E L

    P A T T E R N - C S S O N L Y ? <input type="text" required> form input:valid { //… do something } http://bradfrostweb.com/blog/post/float-label-pattern/ http://css-tricks.com/float-labels-css/
  29. F L O A T L A B E L

    P A T T E R N - C S S O N L Y ? <input type="text" required> form input:valid { //… do something } http://bradfrostweb.com/blog/post/float-label-pattern/ http://css-tricks.com/float-labels-css/
  30. F L O A T L A B E L

    P A T T E R N - C S S O N L Y ? <input type="text" required> form input:valid { //… do something } HANDLE WITH CARE http://bradfrostweb.com/blog/post/float-label-pattern/ http://css-tricks.com/float-labels-css/
  31. U S I N G J AVA S C R

    I P T • Use JavaScript to handle states which cannot be handled by CSS ! • Use JavaScript for styling only if you have to calculate values. ! • For animations, use CSS animations/transitions
  32. N O P S E U D O S O

    N I N P U T • Pseudo Elements need Content <p> <before goes here> Content <after goes there> </p> http://fettblog.eu/blog/2013/10/21/content-vs-value/
  33. N O P S E U D O S O

    N I N P U T • Pseudo Elements need Content <p>this is content</p> <span>this is also content</span> <input>THIS IS NOT POSSIBLE</input> <p> <before goes here> Content <after goes there> </p> http://fettblog.eu/blog/2013/10/21/content-vs-value/
  34. P A R A L L A X S C

    R O L L I N G
  35. When using skrollr on mobile you don't actually scroll. When

    detecting a mobile browser, skrollr disables native scrolling and instead listens for touch events and moves the content using CSS transforms.
  36. R E I N V E N T I N

    G T H E W H E E L
  37. R E I N V E N T I N

    G T H E W H E E L $(‘a’).on(‘click’, function() { window.location.href = $(this).attr(‘href’); }
  38. R E I N V E N T I N

    G T H E W H E E L $(‘a’).on(‘click’, function() { window.location.href = $(this).attr(‘href’); } http://uglyjs.github.io/2011/10/13/links-plus/ <a href="#" onclick="visit_url(<?php echo $url; ?>)”> ! function visit_url(url) { window.location = url; }
  39. Parallax Scrolling originally was a way to simulate 3D !

    For the Web: Let’s use real 3D to simulate Parallax Scrolling
  40. header:after { content: ‘’; background-image: …; background-size: cover; background-position: 50%

    50%; position: absolute; top: 0; left: 0; bottom: 0; right: 0; transform: translateZ(-1px); }
  41. header:after { content: ‘’; background-image: …; background-size: cover; background-position: 50%

    50%; position: absolute; top: 0; left: 0; bottom: 0; right: 0; transform: translateZ(-1px) scale(2); }
  42. header:after { content: ‘’; background-image: …; background-size: cover; background-position: 50%

    50%; position: absolute; top: 0; left: 0; bottom: 0; right: 0; transform: translateZ(-1px) scale(2); z-index: -1000; }
  43. header:after { content: ‘’; background-image: …; background-size: cover; background-position: 50%

    50%; position: absolute; top: 0; left: 0; bottom: 0; right: 0; transform: translateZ(-1px) scale(2); z-index: -1000; }
  44. header:after { content: ‘’; background-image: …; background-size: cover; background-position: 50%

    50%; position: absolute; top: 0; left: 0; bottom: 0; right: 0; transform: translateZ(-1px) scale(2); z-index: -1000; }
  45. h1 { position: absolute; top: 50%; width: 100%; text-align: center;

    color: white; text-shadow: 2px 2px 2px #000; font-size: 3rem; transform: translateZ(-0.5px) scale(1.5) translateY(-50%); z-index: -500; }
  46. h1 { position: absolute; top: 50%; width: 100%; text-align: center;

    color: white; text-shadow: 2px 2px 2px #000; font-size: 3rem; transform: translateZ(-0.5px) scale(1.5) translateY(-50%); z-index: -500; }
  47. h1 { position: absolute; top: 50%; width: 100%; text-align: center;

    color: white; text-shadow: 2px 2px 2px #000; font-size: 3rem; transform: translateZ(-0.5px) scale(1.5) translateY(-50%); z-index: -500; }
  48. header:after { content: ''; height: 100vh; width: 100%; position: absolute;

    top: 70vh; background-image: linear-gradient(to bottom, transparent 0, black 70%); }
  49. header:after { content: ''; height: 100vh; width: 100%; position: absolute;

    top: 70vh; background-image: linear-gradient(to bottom, transparent 0, black 70%); transform: translateZ(0.4px) scale(0.9); z-index: 400; }
  50. header:after { content: ''; height: 100vh; width: 100%; position: absolute;

    top: 70vh; background-image: linear-gradient(to bottom, transparent 0, black 70%); transform: translateZ(0.4px) scale(0.9); z-index: 400; }
  51. header:after { content: ''; height: 100vh; width: 100%; position: absolute;

    top: 70vh; background-image: linear-gradient(to bottom, transparent 0, black 70%); transform: translateZ(0.4px) scale(0.9); z-index: 400; }
  52. S CO T T K E L L U M

    ’ S S A S S / CO M P A S S P A R A L L A X M I X I N @mixin parallax( $distance : 0, $perspective : 1 ) { @include transform( translateZ($distance * $perspective * 1px) scale(abs($distance - 1)) ); z-index: $distance * 1000; }
  53. S CO T T K E L L U M

    ’ S S A S S / CO M P A S S P A R A L L A X M I X I N @mixin parallax( $distance : 0, $perspective : 1 ) { @include transform( translateZ($distance * $perspective * 1px) scale(abs($distance - 1)) ); z-index: $distance * 1000; } ! http://codepen.io/scottkellum/pen/bHEcA
  54. T H E P R O S • Works on

    Smartphone Browsers • No scroll hi-jacking - everything is native • Natural barrier against humbug parallax • No 3D available? Won’t break!
  55. T H E P R O S • Works on

    Smartphone Browsers • No scroll hi-jacking - everything is native • Natural barrier against humbug parallax • No 3D available? Won’t break! T H E CO N S • Does not work in any IE version (up to 11) and is not feature- testable (transform-style does exist, but just with ‘flat’) • Smartphone browser scrolling is clumsy (tough not as clumsy as with JS parallax)
  56. 3.0

  57. https://github.com/Modernizr/Modernizr/issues/805 New noPrefixes build option, which forces feature detects to

    only return true if the feature is supported without a vendor prefix http://fettblog.eu/blog/2014/02/20/no-prefixes/ https://github.com/Modernizr/Modernizr/issues/1082
  58. I N S T A G R A M !

    I O S 5 S I N C E J U L Y 2 0 1 3
  59. P R O G R E S S I V

    E E N H A N C E M E N T
  60. C H O O S E W I S E

    L Y • Each element has a purpose • button, label, input, a 
 are meant to be interacted with • a is meant to have an URL
  61. S T Y L E • Use standard CSS features

    • Use prefixes only if you 
 know what’s the deal • proprietary features might
 disappear in the future - 
 use carefully
  62. J AVA S C R I P T T O

    H A N D L E S T A T E S
  63. J AVA S C R I P T T O

    H A N D L E S T A T E S