Last active
April 6, 2021 19:43
-
-
Save HarryAdney/6d15d55d6fa93709fed43a8d29172a05 to your computer and use it in GitHub Desktop.
accessible navigation example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- examples.anysurfer.be/dropdown/ --> | |
<!doctype html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Accessible Dropdown Menu with Bootstrap</title> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> | |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> | |
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script> | |
<script src="js/simpleAccessible.js"></script> | |
<link rel="stylesheet" href="css/style.css"> | |
<style> | |
.navbar-default .navbar-nav > li > ul > li > a nav { | |
text-transform: uppercase; | |
} | |
.navbar { | |
margin-bottom: 0px; | |
} | |
.navbar-brand { | |
padding-top: 5px; | |
padding-bottom: 5px; | |
} | |
.navbar a, .subnav a { | |
text-decoration: inherit; | |
} | |
.nav, .nav ul, .nav li { | |
list-style: none; | |
} | |
@media (min-width: 768px) { | |
.nav, .nav ul { | |
margin: 0; | |
padding: 0; | |
list-style: none; | |
} | |
.nav { | |
float: left; | |
margin: 0; | |
} | |
.nav ul { | |
background: #f8f8f8; | |
position: absolute; | |
top: 3.10em; | |
left: -9999px; | |
opacity: 0; | |
} | |
.nav li { | |
float: left; | |
position: relative; | |
} | |
.nav li > a { | |
float: left; | |
padding: 16px; | |
} | |
.nav li > a:hover, .nav li > a:focus { | |
background: #F0C425; | |
} | |
.nav li:focus > a, .nav li:hover > a { | |
background: #f8f8f8; | |
} | |
.nav > li:first-child > a { | |
border-left: 0; | |
} | |
.nav > li:last-child > a { | |
border-right: 0; | |
} | |
.nav li:hover ul, .nav li:focus ul, ul.show-menu { | |
left: 0; | |
opacity: 0.99; | |
} | |
.nav ul li { | |
float: none; | |
position: static; | |
} | |
.nav ul a { | |
float: none; | |
display: block; | |
color: #FFF; | |
font-size: 12px; | |
text-shadow: none; | |
border: 1px solid #e7e7e7; | |
border-width: 0 0 1px; | |
-webkit-transition: 0.1s linear all; | |
transition: 0.1s linear all; | |
} | |
.nav ul, .nav ul li:last-child a { | |
border: 0; | |
} | |
.nav ul a:hover, .nav ul a:focus { | |
background: #1F2E54; | |
color: #777; | |
text-shadow: none; | |
} | |
} | |
.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { | |
color: #777; | |
background-color: #16213C; | |
} | |
.navbar-toggle { | |
background-color: #fff; | |
} | |
.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { | |
background-color: #F0C425; | |
} | |
.navbar-default .navbar-toggle .icon-bar { | |
background-color: #1F2E54; | |
} | |
.navbar-default .navbar-nav > li > ul > li > a { | |
color: #777; | |
} | |
.navbar-default .navbar-nav > li > ul > li > a:hover, .navbar-default .navbar-nav > li > ul > li > a:focus { | |
color: #000; | |
background: #f8f8f8; | |
} | |
.navbar-collapse { | |
max-height: 500px; | |
} | |
</style> | |
</head> | |
<body> | |
<div class="navbar navbar-default navbar-static-top"> | |
<div class="container narrow-nav"> | |
<div class="navbar-header"> | |
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | |
<span class="sr-only" >Show Navigation</span> | |
<span class="icon-bar"></span> | |
<span class="icon-bar"></span> | |
<span class="icon-bar"></span> | |
</button> | |
</div> | |
<div class="navbar-collapse collapse" style="height: auto;"> | |
<nav> | |
<ul class="nav navbar-nav"> | |
<li> | |
<a href="http://example.com">Option 1</a> | |
</li> | |
<li> | |
<a href="#">Option 2</a> | |
<ul> | |
<li> | |
<a href="http://example.com">Sub 21</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 22</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 23</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 24</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 25</a> | |
</li> | |
</ul> | |
</li> | |
<li> | |
<a href="http://example.com#">Option 3</a> | |
</li> | |
<li class=""> | |
<a href="#">Option 4</a> | |
<ul> | |
<li> | |
<a href="http://example.com">Sub 41</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 42</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 43</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 44</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 45</a> | |
</li> | |
</ul> | |
</li> | |
<li class=""> | |
<a href="">Option 5</a> | |
<ul> | |
<li> | |
<a href="http://example.com">Sub 51</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 52</a> | |
</li> | |
<li> | |
<a href="http://example.com">Sub 53</a> | |
</li> | |
</ul> | |
</li> | |
<li> | |
<a href="http://example.com">Option 6</a> | |
</li> | |
</ul> | |
</nav> | |
</div> | |
</div> | |
</div> | |
<div class="container"> | |
<h1>Accessible and responsive dropdown for navigation</h1> | |
<p>Based on: <a href="http://simplyaccessible.com/examples/css-menu/option-2/">http://simplyaccessible.com/examples/css-menu/option-2/</a> and Bootstrap</p> | |
<p>Download on <a href="https://github.com/AnySurfer/dropdown">Github</a></p> | |
<h2>Features</h2> | |
<ul> | |
<li>Keyboard accessible</li> | |
<li>The navigation is marked up as nested unordered lists and visible to screenreaders at all time, including the submenu-items. <br> They are visually hidden off screen with CSS (left: -9999px;).</li> | |
<li>All links show up in a screenreaders link list.</li> | |
</ul> | |
<h2>Screenreader tests</h2> | |
<ul> | |
<li>Jaws 13, 15 and 16 with IE9 in Windows 7</li> | |
<li>Jaws 13, 15, 16 with Firefox 35 in Windows 7</li> | |
<li>NVDA 2015.1 with IE9 in Windows 7</li> | |
<li>NVDA 2015.1 with Firefox 35 in Windows 7</li> | |
<li>VoiceOver 7 with Safari 8 in Mac OS X 10.10.3</li> | |
<li>VoiceOver with Safari 8 in iOS 8.3</li> | |
</ul> | |
</div> | |
<script> | |
$(function () { | |
$(".navbar-toggle").click(function(){ | |
$( this ).children( ".sr-only" ).html($( this ).children( ".sr-only" ).html()=="Show Navigation" ? "Hide Navigation" : "Show Navigation"); | |
}); | |
}); | |
</script> | |
<script> | |
// http://simplyaccessible.com/examples/css-menu/option-2/ | |
$(function() { | |
$('.nav').setup_navigation(); | |
}); | |
$.fn.setup_navigation = function(settings) { | |
settings = jQuery.extend({ | |
menuHoverClass: 'show-menu', | |
}, settings); | |
// Set tabIndex to -1 so that links can't receive focus until menu is open | |
$(this).find('> li > a').next('ul').find('a').attr('tabIndex', -1); | |
$(this).find('> li > a').hover(function() { | |
$(this).closest('ul').find('.' + settings.menuHoverClass).removeClass(settings.menuHoverClass).find('a').attr('tabIndex', -1); | |
}); | |
$(this).find('> li > a').focus(function() { | |
$(this).closest('ul').find('.' + settings.menuHoverClass).removeClass(settings.menuHoverClass).find('a').attr('tabIndex', -1); | |
$(this).next('ul') | |
.addClass(settings.menuHoverClass) | |
.find('a').attr('tabIndex', 0); | |
}); | |
// Hide menu if click or focus occurs outside of navigation | |
$(this).find('a').last().keydown(function(e) { | |
if (e.keyCode == 9) { | |
// If the user tabs out of the navigation hide all menus | |
$('.' + settings.menuHoverClass).removeClass(settings.menuHoverClass).find('a').attr('tabIndex', -1); | |
} | |
}); | |
$(document).click(function() { | |
$('.' + settings.menuHoverClass).removeClass(settings.menuHoverClass).find('a').attr('tabIndex', -1); | |
}); | |
$(this).click(function(e) { | |
e.stopPropagation(); | |
}); | |
} | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment