Right I think my last bit of experimentation with this.
Have built in a delay for the tab key. It will set a timer which fires off the toggle function after 300ms. If the tab key is clicked again prior to the 300ms being up it cancels the last timer and sets a new one. In other words you can tab through the selections without them immediately opening. Seems to work ok.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Accordion</title>
<style>
body, h1, h2, h3, dl, dt, dd, ul, li, p {margin: 0; padding: 0;}
body {color: #333333;
font-family: "Trebuchet MS",Helvetica,sans-serif;
font-size: 100%;
line-height: 1.4;
background-color: #EDEDED;
}
#page {width: 100%;
max-width: 58em;
margin: auto;
background-color: #fff;
}
p {padding: 0.5em 0;}
.accordionItem h3 {
margin: 0;
font-size: 1.1em;
padding: 0.4em;
color: #fff;
background-color: #88F;
border-bottom: 1px solid #66d;
/* prevent h3 being highlighted */
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.accordionItem h3:hover { cursor: pointer; }
.accordionItem h3:focus { outline: 2px solid #0000FF; }
.accordionItem div {
margin: 0;
padding: 1em 0.4em;
background-color: #fff;
border-bottom: 1px solid #66d;
display: block;
}
.accordionItem div.show { display: block; }
.accordionItem div.hide { display: none; }
</style>
</head>
<body>
<div id="page">
<h2>Page Heading</h2>
<div class="accordionItem">
<h3 tabindex="0">First Question</h3>
<div>
<p>Lorem ipsum dolor sit amet, consecteteur. Netus semper ve ante elit hymenaeos. Vitae dapibus, ultricies eu ullamcorper ut, cursus cum. Tortor vitae hendrerit rhoncus purus odio. Sapien. Vitae. Cras elit neque eros sem odio luctus fringilla nonummy. Taciti, luctus, urna sit. Dui sem consectetuer ut, lacus in erat, class.</p>
</div>
</div>
<div class="accordionItem">
<h3 tabindex="0">Second Question</h3>
<div>
<p>Lorem ipsum dolor sit. Varius praesent ullamcorper interdum, cras mi nulla dui maecenas habitasse ut, penatibus. Vehicula placerat libero nunc ut cras. Suspendisse laoreet morbi duis platea, sapien, bibendum pede. Hac eu elit fusce, urna rutrum, dictum orci. Felis penatibus sit, malesuada lacus ac luctus aliquam egestas odio. Cras. Ultrices aliquam posuere odio feugiat vivamus. Mollis, hendrerit adipiscing nibh. Hymenaeos. Eros senectus etiam diam facilisi vestibulum gravida cum ante nibh.</p>
</div>
</div>
<div class="accordionItem">
<h3 tabindex="0">Third Question</h3>
<div>
<p>Lorem ipsum dolor sit amet, consecteteur adipiscing elit elit. Porta at fames aenean. Sapien libero. Mauris hymenaeos ut, at ad risus nam platea.</p>
</div>
</div>
<div class="accordionItem">
<h3 tabindex="0">Fourth Question</h3>
<div>
<p>Lorem ipsum dolor sit amet, consecteteur adipiscing elit. Mauris euismod semper nisi urna lacinia eu, auctor at, interdum nec, natoque a, mattis fames magna turpis rutrum. Consectetuer cubilia vitae. Velit lectus consectetuer fermentum aenean neque adipiscing odio morbi tristique blandit. Sit. Purus. Semper pede, viverra laoreet diam ultrices nunc. Facilisis ante duis quisque in, convallis nisi. Potenti nibh lobortis odio, sit. Turpis. Mi. Libero, id lectus fringilla faucibus aenean. Cursus amet, arcu erat. Purus facilisis aliquet ante maecenas curabitur. Suspendisse arcu, odio, luctus aliquam. Nisi rhoncus et.</p>
<p>Pulvinar auctor curae condimentum pede. Nunc parturient curabitur morbi at consectetuer eget egestas. Sollicitudin integer, donec diam lorem, elementum dis. Duis odio. Porta potenti elit diam posuere convallis leo. Vel justo sociis diam gravida sit, vestibulum tortor, torquent aliquet fusce class. Elit non molestie. Et. Erat sollicitudin adipiscing cras. Sociis. Vel, eros. Ullamcorper. Diam, eu velit vitae duis feugiat.</p>
</div>
</div>
<div class="accordionItem">
<h3 tabindex="0">Fifth Question</h3>
<div>
<p>Lorem ipsum dolor sit amet, consecteteur adipiscing elit vehicula. A. Lacus proin ornare vulputate rhoncus. Ac nunc nunc natoque et, sem at lobortis fusce duis potenti eu, tempor. Pretium, donec neque felis, accumsan. Ante placerat augue. Tellus. Euismod dui, in fringilla eget.</p>
</div>
</div>
<div class="accordionItem">
<h3 tabindex="0">Sixth Question</h3>
<div>
<p>Lorem ipsum dolor sit amet, consecteteur adipiscing elit. Integer, iaculis ultricies habitant auctor lectus fusce posuere ut. Dolor netus, interdum dignissim. Tellus neque scelerisque eu lectus. Arcu semper id dictum massa parturient suspendisse tortor ut class neque morbi. Quis risus gravida metus amet arcu vivamus. Fringilla etiam nunc iaculis. Tempor. Consectetuer feugiat, augue nunc imperdiet. Odio. In, ac congue sit aenean, ad id curae lobortis felis id tristique. Consectetuer facilisis curae eu platea pharetra dui aliquam sagittis quisque taciti purus.</p>
</div>
</div>
</div>
<script type="text/javascript">
(function() {
var addClass = function(el, clName) {
if ((' '+el.className+' ').indexOf(' '+clName+' ') === -1) { el.className = el.className+' '+clName; }
},
replaceClass = function(el, clName, newClName) {
var elClName = ' '+el.className+' ';
while (elClName.indexOf(' '+clName+' ') !== -1) { elClName = elClName.replace(' '+clName+' ',' '+newClName+' '); }
el.className = elClName.replace(/^\\s+|\\s+$/g, '');
},
addEvent = function(el, type, fn) {
if(el.addEventListener) {
el.addEventListener(type, fn, false); return fn;
} else {
// bind 'this' to element
var callback = function(){ return fn.apply(el, arguments); };
el.attachEvent('on'+type, callback); return callback;
}
},
toggleItem = function(root){
var div = root.querySelector('div'),
divToHide = document.querySelector('.accordionItem div.show');
replaceClass(div, 'hide', 'show');
if(divToHide) { replaceClass(divToHide, 'show', 'hide'); }
},
items = document.querySelectorAll('.accordionItem'),
len = items.length, i,
timer = null,
toggleHandler = function(e) {
var root = this;
e = (e || window.event);
switch (e.which) { // which key presses.
case 16: return false; // if Shift key ignore and return
case 9: // if Tab key first clear previously set Timer and create a new one to call toggleItem
clearTimeout(timer); timer = null;
timer = setTimeout(function(){ toggleItem(root); }, 300); break; // approx 300mx delay before toggleItem is called.
default: toggleItem(root); // otherwise call toggleIItem as normal
}
};
items[0].querySelector('h3').focus(); // good idea Frank:)
for (i = 0; i < len; i += 1) {
addEvent(items[i], 'mouseup', toggleHandler);
addEvent(items[i], 'keyup', toggleHandler);
addClass(items[i].querySelector('div'), 'hide');
}
}());
</script>
</body>
</html>