Pure Accessible JavaScript Tabs
Found some code I did a while ago (pre jQuery) of a simple tabbed navigation implementation using JavaScript and basic CSS. Posting if anyone is interested.
HTML
<ul id="tabnav"> <li><a href="#tab1">Tab 1</a></li> <li><a href="#tab2">Tab 2</a></li> <li><a href="#tab3">Tab 3</a></li> </ul> <div id="tabs"> <div id="tab1"><a name="tab1"></a> <h1>Tab 1</h1> This is the contents of Tab 1 </div> <div id="tab2"><a name="tab2"></a> <h1>Tab 2</h1> This is the contents of Tab 2 </div> <div id="tab3"><a name="tab3"></a> <h1>Tab 3</h1> This is the contents of Tab 3 </div> </div>
CSS
#tabnav {
width: 100%;
overflow: hidden;
list-style-type: none;
margin: 0;
padding: 0;
}
#tabnav li {
float: left;
padding: 6px;
margin: 0;
}
#tabnav li.activetab {
font-weight: bold;
}
JavaScript (hopefully the inline comments should explain how it works). Add in script tag after HTML
// setup tabs, default is 'tab2'
setupTabs("tab2");
function setupTabs(tabDefault) {
if (document.getElementById) {
// get tab navigator
var tabnav = document.getElementById('tabnav');
if(tabnav) {
// get list items in tab navigator
var tablist = tabnav.getElementsByTagName('li');
// loop through list items
for (i=0;i<tablist.length;i++) {
// get tab links (i.e. anchor tags)
var tablinks = tablist[i].getElementsByTagName('a');
// loop through tab links
for (j=0;j<tablinks.length;j++) {
// get hash for current tablink (i.e. the #tabname portion)
var hash = tablinks[j].hash;
// set onclick attribute to toggle the tabs (does not work in IE)
tablinks[j].setAttribute("onclick","toggleTabs('"+hash.substring(1)+"'); return false;");
// detect IE (other browsers don't support attachEvent)
if (tablinks[j].attachEvent) {
// set onclick to toggle tabs
tablinks[j].onclick = Function("toggleTabs('"+hash.substring(1)+"'); return false;");
}
// if has is default tab
if (hash == ("#" + tabDefault)) {
// set parent nodes css class to 'activetab' (i.e. 'li' tag) and show tab
tablinks[j].parentNode.className = "activetab";
showTab(tabDefault);
} else {
// set parent nodes css class to empty (i.e. 'li' tag) and hide tab
tablinks[j].parentNode.className = ""
hideTab(hash.substring(1));
}
}
}
}
}
}
function showTab(tabId) {
if (document.getElementById) {
// get current tab
var currentTab = document.getElementById(tabId);
// show tab by setting display style to blank string
currentTab.style.display = "";
// get anchor tags in current tab
var currentTabAnchors = currentTab.getElementsByTagName('a');
// loop through anchor tags
for (k=0;k<currentTabAnchors.length;k++) {
// if anchor tag has same name as current tag id, hide it
if(currentTabAnchors[k].name==tabId) {
currentTabAnchors[k].style.display = "none";
}
}
}
}
function hideTab(tabId) {
if (document.getElementById) {
document.getElementById(tabId).style.display = "none";
}
}
function toggleTabs(tabId) {
if (document.getElementById) {
// an array of all the sections
var sectionnames = new Array();
// get tab navigator
var tabnav = document.getElementById('tabnav');
// get list items in tab navigator
var tablist = tabnav.getElementsByTagName('li');
// loop through list items
for (i=0;i<tablist.length;i++) {
// get tab links (i.e. anchor tags)
var tablinks = tablist[i].getElementsByTagName('a');
// loop through tab links
for (j=0;j<tablinks.length;j++) {
// get hash for current tablink (i.e. the #tabname portion)
var hash = tablinks[j].hash;
// add has to sections array
sectionnames.push(hash.substr(1));
// if hash is selected tab
if (hash == ("#" + tabId)) {
// set parent nodes css class to 'activetab' (i.e. 'li' tag)
tablinks[j].parentNode.className = "activetab";
} else {
// set parent nodes css class to empty (i.e. 'li' tag)
tablinks[j].parentNode.className = ""
}
}
}
// get tabs
var tabs = document.getElementById('tabs');
// get tab sections
var sections = tabs.childNodes;
// loop through sections
for (i=0;i<sections.length;i++) {
// if node is not a div, then continue to next loop item
if (sections[i].nodeName!='DIV') continue;
// if current section id matches tabId show it
if(sections[i].id==tabId) {
showTab(sections[i].id);
} else {
// get child anchor nodes
var atags = sections[i].getElementsByTagName("a");
// if anchor nodes have been found
if (atags.length > 0) {
// loop through the section names
for (j=0;j<sectionnames.length;j++) {
// if first anchor tags name matches the current section id, hide the tab
if(sectionnames[j] == atags[0].getAttribute("name")) {
hideTab(sections[i].id);
}
}
}
}
}
}
return false;
}
Comments