Sunday, 9 June 2013

jQuery Sliding Pages

I wanted a series of HTML pages to act like a wizard where they would slide in and out. The show and hide methods of jQuery provide a nice animation using slide but the key was to have each content div be a fixed size with absolute positioning. This places each content div behind the previous one allowing them to appear to slide to the next. 

Here's the code:

<!doctype html>
<html>
<head>
<title>Pages</title>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<style>
.page {
position: absolute;
height: 300px;
width: 300px;
display: none;
}
#pages {
height: 300px;
}
</style>
<script>
var curPage = 1;
var numPages = 3;
var slideSpeed = 1000;
$(document).ready(function() {
$("#page1").show();
$("#prev").attr("disabled", "disabled");
});
function prev() {
if(curPage > 1) {
$("#page" + curPage).hide("slide", { direction: "right" }, slideSpeed);
curPage = curPage - 1;
$("#page" + curPage).show("slide", { direction: "left" }, slideSpeed);
if(curPage == 1) {
$("#prev").attr("disabled", "disabled");
}
if(curPage == numPages - 1) {
$("#next").removeAttr("disabled");
}
}
}
function next() {
if(curPage < numPages) {
$("#page" + curPage).hide("slide", { direction: "left" }, slideSpeed);
curPage = curPage + 1;
$("#page" + curPage).show("slide", { direction: "right" }, slideSpeed);
if(curPage == numPages) {
$("#next").attr("disabled", "disabled");
} else if(curPage == numPages - 1) {
$("#prev").removeAttr("disabled");
}
}
}
</script>
</head>
<body>
<div id="pages">
<div id="page1" class="page" style="border: solid 1px red;">
<h2>Page 1</h2>
</div>
<div id="page2" class="page" style="border: solid 1px green;">
<h2>Page 2</h2>
</div>
<div id="page3" class="page" style="border: solid 1px blue;">
<h2>Page 3</h2>
</div>
</div>
<div>
<input type="button" id="prev" value="&lt;&lt;" onclick="prev()" />
<input type="button" id="next" value="&gt;&gt;" onclick="next()" />
</div>
</body>
</html>