Best practice for making a multi step form to post adds
css, html, jquery, jquery-mobile, user-interface
Solution
You can simply create several sections and navigate between them. I have created this for you, using JQuery, CSS and jQM's built-in transitions.
The idea is simply hide/show sections by swiping left and right. You can add validation before showing next section if you want. (1)
First of all, you need to create a "progress bar" on top of sections. I have used CSS3 `flex` since it is responsive and doesn't require too much code. It is straight-forward.
Progress bar
HTML
<div class="ui-content" role="main">
<div class="progress">
<p>1</p>
<div class="line"></div>
<p>2</p>
<div class="line"></div>
<p>3</p>
<div class="line"></div>
<p>4</p>
<div class="line"></div>
<p>5</p>
</div>
<!-- sections here -->
</div>
CSS
.ui-content .progress {
display: flex;
display: -webkit-flex;
flex-flow: row nowrap;
-webkit-flex-flow: row nowrap;
justify-content: space-around;
-webkit-justify-content: space-around;
width: 100%;
background: skyblue;
align-items: center;
padding: .5em;
}
.ui-content .progress * {
margin: 0;
}
.ui-content .progress p {
background: lightblue;
height: 22px;
width: 22px;
border-radius: 22px;
text-align: center;
}
.ui-content .progress .line {
border-top: 1px solid black;
flex-grow: 1;
-webkit-align-self: center; /* center line on mobile browsers */
-ms-flex-item-align: center;
align-self: center;
}
Sections and their wrapper
HTML
<div class="steps"> <!-- wrapper -->
<div class="step">
<!-- contents 1 -->
</div>
<div class="step">
<!-- contents 2 -->
</div>
...etc
</div>
CSS
.ui-content .steps {
padding: 1em;
width: 100%;
height: 100%;
overflow: hidden;
}
General CSS
.ui-page .ui-content {
padding:0;
}
.ui-content * {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
/* active step - progress bar */
.progress .currentStep {
background: tomato !important;
font-weight: bold;
}
jQuery
$(document).on("pagecreate", "#wizard", function () {
$(".step").not(":eq(0)").addClass("ui-screen-hidden");
$(".step:eq(0)").addClass("active");
$(".progress p:eq(0)").addClass("currentStep");
$(".ui-content").on("swipeleft swiperight", function (e) {
var swipe = e.type,
nextStep = $(".steps").find(".active").next(".step"),
prevStep = $(".steps").find(".active").prev(".step");
switch (true) {
case (swipe == "swipeleft" && nextStep.length > 0):
$(".step.active")
.toggleClass("slide out");
break;
case (swipe == "swiperight" && prevStep.length > 0):
$(".step.active")
.toggleClass("slide out reverse");
break;
}
});
}).on("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", ".step", function (e) {
var elm = $(e.target);
switch (true) {
case (elm.hasClass("out") && !elm.hasClass("reverse")):
$(elm).toggleClass("slide out ui-screen-hidden active");
$(elm).next(".step").toggleClass("slide in active ui-screen-hidden");
break;
case (elm.hasClass("out") && elm.hasClass("reverse")):
$(elm).toggleClass("slide out ui-screen-hidden reverse active");
$(elm).prev(".step").toggleClass("slide in active reverse ui-screen-hidden");
break;
case (elm.hasClass("in") && !elm.hasClass("reverse")):
elm.toggleClass("slide in");
break;
case (elm.hasClass("in") && elm.hasClass("reverse")):
elm.toggleClass("slide in reverse");
break;
}
var dot = $(".active").index();
/* highlight all previous numbers */
$("p:eq(" + dot + ")").prevAll("p").addBack().addClass("currentStep");
$("p:eq(" + dot + ")").nextAll("p").removeClass("currentStep");
});
Explanation
On `pagecreate`, all sections will be hidden except for first one by adding `ui-screen-hidden` which is a built-in class in jQM `display: none;`. Also, `.currentStep` class will be added to first element "`p`" in progress bar.
On `swipeleft` or `swiperight`, the code checks if active section has any sibling section before or after it. If `true`, it moves to that section, otherwise `false`.
Navigating between sections uses jQM built-in transition, the same ones used for page transition. In this demo `.slide` is used, however, you can use any of jQM transitions. `.in`, `.out` and `.reverse` are also built-in transition classes, `.out` is added to active section, `.in` is added to next/prev section and `.reverse` combines both aforementioned classes in case you navigate to previous section.
Listening Animation End event(s) `animationend` is used to remove `.in`, `.out` and `.reverse`, in addition to giving active section a `.active` class.
Last block of code is used to update progress bar with the number of active section. Updated
Demo (2) - Code
(1) This example can be used also as a simple gallery carousel without the need to use plugins.
(2) Tested on iPhone 5 - Safari & Chrome
Problem
I am working on a post your free adds page. Its a mobile website I am using JQM for the UI design. My question is what would be the best practice for making this UI design one link which I got after researching in google LINK explains most of it but it would be really great to have more inputs from any of you who has experience in UI design . I am including an image which I have designed for the UI to give you a better explanation of my question Thanks in advance .