Top Banner
Advanced Design Techniques: JavaScript to the Rescue Peter-Paul Koch (ppk) http://www.quirksmode.org VTM Conference, Oct. 24th, 2007
73

Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Feb 11, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Advanced Design Techniques: JavaScript to the Rescue

Peter-Paul Koch (ppk)http://www.quirksmode.orgVTM Conference, Oct. 24th, 2007

Page 2: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

1998

Page 3: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

if (browser == 'Netscape') document.write

('<body background=”pix/bg_nn.gif”>');

else if (browser == 'IE') document.write

('<body background=”pix/bg_ie.gif”>');

<noscript><body background=”pix/bg_nn.gif”></noscript>

Page 4: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

if (browser == 'Netscape') document.write

('<body background=”pix/bg_nn.gif”>');

else if (browser == 'IE') document.write

('<body background=”pix/bg_ie.gif”>');

<noscript><body background=”pix/bg_nn.gif”></noscript>

Maybe this isn't such a good ideaafter all.(Still, the principle remains valid.)

Page 5: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Fast forward to 2007

Page 6: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Using JavaScriptresponsibly

to plug a few holesin browsers' CSS

support

Page 7: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Zebra Lists

Page 8: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li:nth-child(even) {background-color: #00cc00;

}

Opera: YesIE: NoFirefox: NoSafari: No

Page 9: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

<ul id=”navigation”><li><a href=”#”>My books</a></li><li><a href=”#”>Other books</a></li>

</ul>

<p>Titles</p><ul>

<li>PPK on JavaScript</li><li>Designing with Web Standards<li><li>Bulletproof Web Design</li>

</ul>

Page 10: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

<ul id=”navigation”><li><a href=”#”>My books</a></li><li><a href=”#”>Other books</a></li>

</ul>

<p>Titles</p><ul class=”zebra”>

<li>PPK on JavaScript</li><li>Designing with Web Standards<li><li>Bulletproof Web Design</li>

</ul>

Page 11: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Rule #1Use hooks to indicate which HTML elements should be affected.Typical hooks:● id● class

Page 12: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

var lists = getElementsByTagNames('ol,ul');

for (var i=0,list;list=lists[i];i++) {

if (list.className != 'zebra') continue;

var lis = list.getElementsByTagName('li');

for (var j=0;j<lis.length;j+=2) {

lis[j].style.backgroundColor = '#00cc00';

}

}

Page 13: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

What if JavaScript is not supported?

Users won't see the zebra listbut they don't know it's supposed to be there,and the effect is not vital, anyway.

Page 14: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Rule #2If JavaScript is not supported, usability suffers.

(Can't be helped.)(Sorry.)

Page 15: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Focus:focus

Page 16: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

input:focus { border-width: thick;}

Opera: YesFirefox: YesSafari: YesIE: No

Page 17: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

input.onfocus = function () {this.style.borderWidth = 'thick';

}

input.onblur = function () {this.style.borderWidth = '';

}

Page 18: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Rule #3JavaScript needs more precise instructions than CSS.(It's stupider but more versatile.)

Page 19: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

input.onfocus = function () {this.style.borderWidth = 'thick';

}

input.onblur = function () {this.style.borderWidth = '';

}

Page 20: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

input.onfocus = function () {this.style.borderWidth = 'thick';this.className += ' focused';

}

input.onblur = function () {this.style.borderWidth = '';this.className =

this.className.replace(/focused/g,'');}

.focused {border-width: thick;

}

Page 21: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Rule #4Add class names; do not change styles.(Ease of maintenance)Adding class names keeps all CSS classes intact.

Page 22: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

var lists = getElementsByTagNames('ol,ul');

for (var i=0,list;list=lists[i];i++) {

if (list.className != 'zebra') continue;

var lis = list.getElementsByTagName('li');

for (var j=0;j<lis.length;j+=2) {

lis[j].style.backgroundColor = '#00cc00';

}

}

Page 23: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

var lists = getElementsByTagNames('ol,ul');

for (var i=0,list;list=lists[i];i++) {

if (list.className != 'zebra') continue;

var lis = list.getElementsByTagName('li');

for (var j=0;j<lis.length;j+=2) {

lis[j].style.backgroundColor = '#00cc00';

lis[j].className = 'even';

}

}

Page 24: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

:hover

Page 25: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

<ul id=”navigation”>

<li><a href=”#”>Multimedialize</a><li>

<li><a href=”#”>Ajaxify</a>

<ul>

<li><a href=”#”>Web 1.0</a></li>

<li><a href=”#”>Web 2.0</a></li>

<li><a href=”#”>Web 3.0</a></li>

</ul></li>

</ul>

Page 26: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li ul {display: none;

}

Page 27: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li:hover ul {display: block;

}

IE 7: YesFirefox: YesSafari: YesOpera: YesIE 6: No

Page 28: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li.onmouseover = function () {this.className += ' hovered';

}

li.onmouseout = function () {this.className =

this.className.replace(/hovered/g,'');}

li.hovered ul {display: block;

}

Page 29: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li.onmouseover = function () {this.className += ' hovered';

}

li.onmouseout = function () {this.className =

this.className.replace(/hovered/g,'');}

li.hovered ul {display: block;

}

It's MUCH more complicated than that.

Page 30: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode
Page 31: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Event bubbling

Mouse events only!

Page 32: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode
Page 33: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li.onmouseover = function () {this.className += ' hovered';

}

li.onmouseout = function () {this.className =

this.className.replace(/hovered/g,'');}

Page 34: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

ul.onmouseover = function () {var li = [find correct li];li.className += ' hovered';

}

ul.onmouseout = function () {var li = [find correct li];

li.className = li.className.replace(/hovered/g,'');

}

Event delegation

Page 35: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Event bubblingThe down side

Page 36: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li.mouseover, li.mouseout, a.mouseover, a.mouseout, li.mouseover, li.mouseout

Page 37: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

ul.onmouseover = function () {var li = [find correct li];li.className += ' hovered';

}

ul.onmouseout = function () {var li = [find correct li];if (this event is relevant)

li.className = li.className.replace(/hovered/g,'');

}

Page 38: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

a.onmouseover, a.onmouseout

Page 39: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Rule #5When creating a dropdown,make sure the <ul> and<li>s have no visible area.

(Keep it simple.)

Page 40: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

The true JavaScript equivalent of :hoveris not mouseover/out

Page 41: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

The true JavaScript equivalent of :hoveris mouseenter/leave

IE only!

Page 42: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li.mouseenter, li.mouseleave

Page 43: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li.onmouseenter = function () {var li = [find correct li];this.className += ' hovered';

}

li.onmouseleave = function () {var li = [find correct li];if (this event is relevant)

this.className = this.className.replace(/hovered/g,'');

}

Page 44: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Rule #6mouseenter and mouseleave are the true JavaScript equivalents of :hover.(IE only!)(As yet...)

Page 45: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

ul.onmouseover = function () {var li = [find correct li];li.className += ' hovered';

}

ul.onmouseout = function () {var li = [find correct li];if (this event is relevant)

li.className = li.className.replace(/hovered/g,'');

}

Page 46: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

ul.onmouseover = function () {var li = [find correct li];

li.className += ' hovered';}

ul.onmouseout = function () {var li = [find correct li];if (this event is relevant)

li.className = li.className.replace(/hovered/g,'');

}

That's it, right?

Wrong!

Page 47: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Device Independence!

Page 48: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

:hover and onmouseoverare mouse only.

We need a keyboard handler

Page 49: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

:hover and onmouseoverare mouse only.

We need a keyboard handler

:focus / onfocus

Page 50: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li:hover ul, li:focus ul {display: block;

}

Page 51: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li:hover ul, li:focus ul {display: block;

}

Doesn't work.You can't put the keyboardfocus on an <li>.

Page 52: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Rule #7Only links, form fields, and the location bar can receive the keyboard focus in all browsers.

Page 53: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li:hover ul, (li < a:focus) ul {display: block;

}

(Don't try this at home.)

Page 54: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li:hover ul, (li < a:focus) ul {display: block;

}

(Don't try this at home.)Not supported.(Pity, isn't it?)

Page 55: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Rule #8CSS currently does not allow keyboard-accessible hover effects.

(You need JavaScript for perfect accessibility.)

Page 56: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li.onmouseover = li.onfocus = function () {this.className += ' hovered';

}

li.onmouseout = li.onblur = function () {this.className =

this.className.replace(/hovered/g,'');}

Page 57: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

li.onmouseover = li.onfocus = function () {this.className += ' hovered';

}

li.onmouseout = li.onblur = function () {this.className =

this.className.replace(/hovered/g,'');}

Same problem: you can't focus on an <li>.

Page 58: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

CSS:

li:hover ul {display: block;

}

JavaScript:

li.onmouseover = function () {this.className += ' hovered';

}

Page 59: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

CSS:

(li < a:focus) ul {display: block;

}

JavaScript:

a.onfocus = function () {this.parentNode.className += ' hovered';

}

Page 60: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

ul.onmouseover = function () {var li = [find correct li];

li.className += ' hovered';}

a.onfocus = function () {this.parentNode.className += ' hovered';

}

Page 61: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

ul.onmouseout = function () {var li = [find correct li];if (this event is relevant)

li.className = li.className.replace(/hovered/g,'');

}

a.onblur = function () {if (this event is relevant)

this.parentNode.className = this.parentNode.className.replace(/hovered/g,'');

}

Page 62: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

:before and :after

Page 63: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

a.external:after {content: “ (external link)”;

}

Firefox: YesSafari: YesOpera: YesIE: No

Page 64: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

var afterNode = document

.createTextNode(' (external link)');

var links = document

.getElementsByTagName('a');

for (var i=0;i<links.length;i++) {

if (links[i].className != 'external') continue;

links[i].appendChild(afterNode

.cloneNode(true));

}

Page 65: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

What happens if both the CSS and the JavaScript are executed?

“Their findings (external link) (external link) suggest ...“

(Oops)

Page 66: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Situation:- JavaScript for IE- CSS for all other browsers

Page 67: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Conditional comments

<!--[if IE]><script type=”text/javascript” src=”after.js”></script>

<![endif]-->

Page 68: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Rule #9If a script is for IE only, use an IE-only way of including it.

(Conditional comments)

Page 69: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Option #2:Don't use CSS at all.

Is the “ (external link)” text absolutely required?If so, it should go in the HTML (accessibility).

If not, is it presentation or behavior?

Page 70: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

(Personal opinion warning)

The CSS content property should not be used.Using it is akin to using text in images.

Text belongs either in the HTML structural layer, or in the JavaScript behavior layer;but never in the CSS presentation layer.

Page 71: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Using JavaScriptresponsibly

to plug a few holesin browsers' CSS

support

Page 72: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Need any help?

Page 73: Advanced Design Techniques: JavaScript to the Rescue - QuirksMode

Have fun!