form slide left and right
備份一下自己寫的範例程式碼
<html>
<head>
<title>同一表單的上一步、下一步 JS效果</title>
<style>
form {
/*容器水平置中,本文為了Demo用,實務上或許不用*/
margin-left: auto;
margin-right: auto;
/*內容三個區塊水平排列&置中*/
display: flex;
justify-content: center; /*有設沒設都沒差*/
/*容器大小*/
width: 300px; /*視需求,有可能不必設width,由step內容物撐開width*/
height: 300px; /*最好三個step區塊的內容高度都一樣*/
transition: 350ms;/*如果須靠javascript改變容器高度就加上此轉場效果*/
}
/*預設各區塊要轉場效果*/
#step1, #step2, #step3 {
transition: 350ms; /*轉場效果*/
}
.my-opacity-0{
opacity: 0; /*透明&不佔用堆疊空間*/
width: 0;
/* display:none; 這個不好做動畫*/
}
/*區塊顏色*/
#step1 {
width:100%;/*由於會被容器的display:flex壓縮width,所以width要給100%*/
border: 1px solid red;/*border為了本文Demo顯眼區塊,實務上非必要*/
}
#step2 {
border: 1px solid blue; /*border為了本文Demo顯眼區塊,實務上非必要*/
}
#step3 {
border: 1px solid black; /*border為了本文Demo顯眼區塊,實務上非必要*/
}
</style>
</head>
<body>
<form>
<div id="step1">
<div>Step1</div>
<button type="button" id="btnGoStep2">下一步</button>
</div>
<div id="step2" class="my-opacity-0">
<div>Step2 </div>
<button type="button" id="btnGoStep1">上一步</button>
<button type="button" id="btnGoStep3">下一步</button>
</div>
<div id="step3" class="my-opacity-0">
<div>Step3</div>
<button type="button" id="btnGoStep2_by3">上一步</button>
<!--
<button type="submit">提交表單</button>
-->
</div>
</form>
<!--引用jQuery函式庫-->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$(function () {
/*panel步驟左右滑動效果*/
$("#btnGoStep2,#btnGoStep1,#btnGoStep3,#btnGoStep2_by3").click(function () {
$("#step1,#step2,#step3").css({ opacity: 0, width: 0 });//全panel變透明&不佔畫面空間
});
//下一步
$("#btnGoStep2").click(function () {
//為了適應RWD,每次重新取得容器的width
let stepWidth = $("form").width();//容器的width
console.log(stepWidth);//Debug
$("#step1").css({ transform: "translateX(" + (0 - stepWidth) + "px)" });
$("#step2").css({ opacity: 1, width: "100%" });
});
//下一步
$("#btnGoStep3").click(function () {
//為了適應RWD,每次重新取得容器的width
let stepWidth = $("form").width();//容器的width
console.log(stepWidth);//Debug
$("#step2").css({ transform: "translateX(" + (0 - stepWidth) + "px)" });
$("#step3").css({ opacity: 1, width: "100%" });
});
// 上一步
$("#btnGoStep1").click(function () {
$("#step1").css({ transform: "translateX(0px)", opacity: 1, width: "100%" });
});
// 上一步
$("#btnGoStep2_by3").click(function () {
$("#step2").css({ transform: "translateX(0px)", opacity: 1, width: "100%" });
});
});
</script>
</body>
</html>
線上 Live Demo:https://jsfiddle.net/ShadowKao/6wvjm3yo/
2024-04-13 追加
實務上我碰到三個step的內容高度都不一致,導致每次的下一步、上一步都必須使用 javascript 配合step的內容物來改變容器的高度↓
form {
/*容器大小*/
height: 300px; /*←若三個step區塊的內容高度都不一樣時,由於是flex排版,要用JS改變容器的height*/
transition: 350ms; /*如須使用javascript改變容器高度就加上此轉場效果*/
}
附上部份JS片段程式碼,大概類似以下的感覺。※附上RWD網頁的 javascript 處理
$("#btnGoStep2,#btnGoStep1,#btnGoStep3,#btnGoStep2_by3").click(function () {
$("#step1,#step2,#step3").css({ opacity: 0, width: 0 });//全panel變透明&不佔畫面空間
//手機版
if (window.matchMedia("(max-width: 767px)").matches) {
window.scrollTo({ top: 560, behavior: 'smooth' });
} else {
//PC版
window.scrollTo({ top: 160, behavior: 'smooth' });
}
});//end click event
//下一步
$("#btnGoStep2").click(function () {
//為了適應RWD,每次重新取得容器的width
let stepWidth = $("form").width();//容器的width
$("#step1").css({ transform: "translateX(" + (0 - stepWidth) + "px)" });
$("#step2").css({ opacity: 1, width: "100%" });
//手機版
if (window.matchMedia("(max-width: 767px)").matches) {
//改變容器高度
$("form").css({ height: "1150px" });
} else {
//PC版
//改變容器高度
$("form").css({ height: "780px" });
}
});
// 上一步
$("#btnGoStep1").click(function () {
$("#step1").css({ transform: "translateX(0px)", opacity: 1, width: "100%" });
//手機版
if (window.matchMedia("(max-width: 767px)").matches) {
//改變容器高度
$("form").css({ height: "680px" });
} else {
//PC版
//改變容器高度
$("form").css({ height: "580px" });
}
});//end click event