<html id="top" lang="en" class="js">
<head>
<meta name="viewport" content="width=device-width">
<meta content-type="utf-8" />
<title>Tabs</title>
</head>
<body>
<ul role="tablist" class="tabs">
<li><a role="tab" aria-controls="dizzy" class="tab" href="#dizzy">Dizzy</a></li>
<li><a role="tab" aria-controls="ninja" class="tab" href="#ninja">Ninja</a></li>
<li><a role="tab" class="tab" aria-controls="missy" href="#missy">Missy</a></li>
</ul>
<div role="tabpanel" class="panel" id="dizzy">
<img src="https://jsbin-user-assets.s3.amazonaws.com/rem/dizzy.jpg" alt="Photo of Dizzy">
<dl>
<dt>Name</dt>
<dd>Dizzy</dd>
<dt>Colour</dt>
<dd>Tabby</dd>
<dt>Super power</dt>
<dd>Sleeping</dd>
</dl>
</div>
<div role="tabpanel" class="panel" id="ninja">
<img src="https://jsbin-user-assets.s3.amazonaws.com/rem/ninja.jpg" alt="Photo of Ninja">
<dl>
<dt>Name</dt>
<dd>Lord Ninja of Catville</dd>
<dt>Colour</dt>
<dd>Black & White</dd>
<dt>Super power</dt>
<dd>Most pathetic meow known to catkind</dd>
</dl>
</div>
<div role="tabpanel" class="panel" id="missy">
<img src="https://jsbin-user-assets.s3.amazonaws.com/rem/missy.jpg" alt="Photo of Missy">
<dl>
<dt>Name</dt>
<dd>Missy</dd>
<dt>Colour</dt>
<dd>Black</dd>
<dt>Super power</dt>
<dd>Computer hardware protection</dd>
</dl>
</div>
<small>The following content is demonstrate the effects of a tall page.</small>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Commodi excepturi molestias modi sed harum, assumenda, cupiditate deleniti magni eaque velit quidem voluptate mollitia, consequatur sit sint quos dolorum perspiciatis omnis!</p>
<a href="#top">top</a>
</body>
</html>
// adapterd from http://git.io/blingjs
var $ = document.querySelectorAll.bind(document);
Node.prototype.on = window.on = function (name, fn) {
this.addEventListener(name, fn);
return this;
};
NodeList.prototype.__proto__ = Array.prototype;
NodeList.prototype.on = NodeList.prototype.addEventListener = function (name, fn) {
this.forEach(function (el) {
el.on(name, fn);
});
return this;
};
// end of bling.js ----
// a temp value to cache *what* we're about to show
var target = null;
// collect all the tabs
var tabs = $('.tab').on('click', function () {
target = $(this.hash)[0];
target.id = '';
if (location.hash === this.hash) {
setTimeout(update);
}
}).map(function (el) {
el.tabindex = 0;
return el;
});
// get an array of the panel ids (from the anchor hash)
var targets = tabs.map(function (el) {
return el.hash;
});
// use those ids to get a jQuery collection of panels
var panels = $(targets.join(',')).map(function (el) {
// keep a copy of what the original el.id was
el.dataset.old = el.id;
return el;
});
function update() {
if (target) {
target.id = target.dataset.old;
target = null;
}
var hash = window.location.hash;
if (targets.indexOf(hash) !== -1) {
return show(hash);
}
if (!hash) {
show();
}
}
function show(id) {
// if no value was given, let's take the first panel
if (!id) {
id = targets[0];
}
// remove the selected class from the tabs,
// and add it back to the one the user selected
tabs.forEach(function (el) {
var match = el.hash === id;
el.classList[match ? 'add' : 'remove']('selected');
el.setAttribute('aria-selected', match);
});
// now hide all the panels, then filter to
// the one we're interested in, and show it
panels.forEach(function (el) {
var match = '#' + el.id === id;
el.style.display = match ? '' : 'none';
el.setAttribute('aria-hidden', !match);
});
}
window.addEventListener('hashchange', update);
// initialise
if (targets.indexOf(window.location.hash) !== -1) {
update();
} else {
show();
}
Output
300px
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |