CSS實現頁面切換時的滑動效果

小豬碎碎念發表於2021-02-25

最近在開發手機端APP頁面功能時遇到一個需求:某個頁面查詢的資料有三種分類,需要展示在同一頁面上,使用者通過點選分類標籤來檢視不同型別的資料, 期望效果是
使用者點選標籤切換時另一個頁面能夠以一個平滑切入的方式展示資料.
示意圖如下:

話不多說了.

首先上CSS

<style type="text/css">
 html, body{
    height: 100%; 
 }
 body{
	overflow:hidden; /*設定超出頁面部分隱藏*/
	margin: 0;/*初始化頁面預設邊距*/
        padding: 0;
        font-family: sans-serif;
 }
.page-title-text {
    padding-left: 17%;
}

 .layui-select-condition {
 	position:fixed;
 	padding-top: 16px;
 	width:100%;
        display: none;
        z-index:999;
        background-color: white;
 }
 
.layui-form-select .layui-input {
    padding-right: 30px;
    cursor: pointer;
    border: 0px;
}
.layui-bottom button{
    border: none;
    line-height: 50px;
    height: 50px;
    width: 100%;
}

.line-block-container{
	display: inline;
    width: 100%;
    line-height: 20px;
    margin-left: 3%;
    padding: 0;
}
.layui-tab-title li a{
    display: inline-block;
    background: rgb(255 255 255);
    color: #5d5d5d;
    border: 1px solid #5d5d5d;
    width: 26%;
    height: 20px;
    line-height: 20px;
    text-align: center;
    font-size: 12px;
    position: absolute;
    top: 22%;
}
.layui-tab-title li a {
    display: inline-block;
}
.zui-col-fitable{
	margin-left: 5%;
    margin-right: 6%;
    padding: 0;
    position:relative;
}
.zui-line-separater{
    height: 2px;
    margin-left: 3%;
}
hr{
	margin:3px 0;
}
.zui-col-fitable input{
		border:0;
		outline:none;
    }
#alarmTime:focus{
        border:1px solid #66ccff!important;
    }
 /*給三個子頁面的容器新增CSS,設定佈局為相對佈局的原因是為了實現頁面切換效果*/   
.zui-slide-container{
	position:relative;
	margin-top: 50px; 
	height:100%;
	width:100%;
	overflow:hidden;
	text-align: center;
}
/*給子頁面的div設定為絕對定位與父容器的相對定位結合使用實現div佈局*/
.zui-slide-container>div{
	position: absolute;
        width: 100%;
        height: 100%;
        box-sizing: border-box;
        -webkit-transition: all 0.25s ease-in-out; /*為頁面設定顯示時的切換效果與切換速度,可以在瀏覽器中調整切換速度來找到自己合適的速度*/
        transition: all 0.25s ease-in-out;
        top: 0;	
}
/*
  設定各個頁面的初始位置,後面會有用到
*/
#alarmLevel1{
	left:-100%
}
#alarmLevel2{
	left:-100%
}
#alarmLevel3{
	left:-100%
}
/*
    設定當各個子DIV新增move的CSS時,div的位置  
*/
#alarmLevel1.move{
    left: 0;
}
#alarmLevel2.move{
    left: 0;
}
#alarmLevel3.move{
    left: 0;
}


.div-align-right{
	left:100%
}
.div-align-left{
	left:-100%
}
#tpl span{
    margin: 0;
    padding: 0;
    float: left;
}
.zui-this{
}
</style>

上頁面佈局:

<div class="div-main">
		<div class="page-title">
			<div class="layui-row" style="color:#ffffff">
				<div class="layui-col-xs4">
		      		<div class="back-area">
						<i class = "layui-icon layui-icon-left" onclick="getBack()"></i>
					</div>
		      	</div>
				<div class="layui-col-xs4">
		      			<div class="page-title-text">	
							預警層級
						</div>
		      	</div>
				<div class="layui-col-xs4">
		      	</div>
		    </div>
		</div>
		<div class="div-main-body">
			<div class="layui-tab layui-row layui-tab-brief" lay-filter="dataContainer" style="margin: 0px;">
				<ul class="layui-tab-title">
					<li style="display:inline;padding:0px;">
						<div style="position:relative;height:40px;">
							<a href="#alarmLevel1" data-level = "1" data-brother="alarmLevel2,alarmLevel3" style="border-radius:5px 0px 0px 5px;left: 11%;">層級一</a>
							<a href="#alarmLevel2" data-level = "2" data-brother="alarmLevel1,alarmLevel3" style="border-radius: unset;left:37%">層級二</a>
							<a href="#alarmLevel3" data-level = "3" data-brother="alarmLevel2,alarmLevel1" style="border-radius:0px 5px 5px 0px;left:63%">層級三</a>
						</div>
					</li>
				</ul>
			</div>
			<div class="zui-slide-container">
			  		<div id="alarmLevel1" style="width:100%;height:100%;position:absolute;">
			  			<table id="alarmLevelGrid1" lay-filter="alarmLevel1" class="layui-hide"></table>
			  		</div>
			  		<div id="alarmLevel2" style="width:100%;height:100%;position:absolute;" >
			  			<table id="alarmLevelGrid2" lay-filter="alarmLevel2" class="layui-hide"></table>
			  		</div>
			  		<div id="alarmLevel3" style="width:100%;height:100%;position:absolute;">
			  			<table id="alarmLevelGrid3" lay-filter="alarmLevel3" class="layui-hide"></table>
			  		</div>
			 </div>
		</div>
</div>		

佈局沒什麼好說的,主要就是根據原型圖來設定各個div的位置.

javascript程式碼

<script type="text/javascript">
	"use strict"
	var table = layui.table;
	var $ = layui.jquery;
	
	loadTableData();
	
	function loadTableData(){
		var alarmLevel = $("zui-this").attr("data-level");
		loadData({"alarmLevel":alarmLevel});
	}
	
	function loadData(searchParams){
			  table.render({
			    elem: '#alarmLevelGrid1'
			    ,id:'alarmLevelGrid1'
			    ,url:'xxxx/xxx/getData'
			    ,toolbar: false
			    ,title: '預警層級記錄表'
			    ,totalRow: false
			    ,limits:[3,5,10,20]
			    ,limit:5
			    ,cols: [[
			      {
					  field:'alarmLevel',  // 只需要在此處選擇一個必定存在的元素作為渲染條件即可
					  title:'預警層級', 
					  width:400, 
					  templet:'#alarmLevelTpl'
				}
			    ]]
			    ,page: true
			    ,where :{"alarmLevel":"1"}
			    ,response: {
			      statusCode: 200 //重新規定成功的狀態碼為 200,table 元件預設為 0
			    }
			    ,parseData: function(res){ 
			     return {
			        "code": res.code==0?200:404, //解析介面狀態
			        "msg": res.msg, //解析提示文字
			        "count": res.total, //解析資料長度
			        "data": res.level //解析資料列表
			      };
			    }
				,done: function (res, curr, count){
                                              // done函式的妙用,利用表格資料完成後,調整對應的css可以將layui的pc端表格設定成相容手機端模式
						$("div[lay-id=alarmLevelGrid1]").css("margin-top", "11%");
						layui.$('.layui-table-view .layui-table').css("width","100%");
						layui.$('table tbody tr td div').attr("class","");
						layui.$('table tbody tr td').css("display","inline-flex");
						layui.$('table tbody tr td').css("border-width","1px");
						layui.$('table tbody tr td').css("border-color","#66CCFF");
						layui.$('table tbody tr td').css("border-radius","1rem");
						layui.$('table tbody tr td').css("border-style","solid");
						layui.$('table tbody tr td').css("margin-left","3%");
						layui.$('table tbody tr td').css("width","94%");
						layui.$('table tbody tr td').css("padding-left","12px");
						layui.$('table tbody tr td').removeAttr("data-content");
						layui.$('table tbody tr td').removeAttr("data-edit");
						// 隱藏手機端不需要的部分
						layui.$('.layui-table-header').css("display","none");
						layui.$('.layui-table-tool').css("display","none");  
						layui.$('.layui-table-total').css("display","none");
						
						// 處理分頁條內容
						layui.$('.layui-table-page').css("width","100%");
						
						$('.layui-laypage-skip').remove();
						layui.$('table').css("border-collapse","separate");
						layui.$('table').css("border-spacing","0px 10px");
					
					}
			  });
			  
			   table.render({
			    elem: '#alarmLevelGrid2'
			    ,id:'alarmLevelGrid2'
			    ,url:'xxxx/assf/xx/getData'
			    ,toolbar: false
			    ,title: '預警層級記錄表'
			    ,totalRow: false
			    ,limits:[3,5,10,20]
			    ,limit:5
			    ,cols: [[
			      {
					  field:'alarmLevel',  // 只需要在此處選擇一個必定存在的元素作為渲染條件即可
					  title:'預警層級', 
					  width:400, 
					  event: 'viewDetail',
					  templet:'#alarmLevelTpl'
				}
			    ]]
			    ,page: true
			    ,where :{"alarmLevel":"2"}
			    ,response: {
			      statusCode: 200 //重新規定成功的狀態碼為 200,table 元件預設為 0
			    }
			    ,parseData: function(res){ 
			     return {
			        "code": res.code==0?200:404, //解析介面狀態
			        "msg": res.msg, //解析提示文字
			        "count": res.total, //解析資料長度
			        "data": res.level //解析資料列表
			      };
			    }
				,done: function (res, curr, count){
						$("div[lay-id=alarmLevelGrid2]").css("margin-top", "11%");
						layui.$('.layui-table-view .layui-table').css("width","100%");
						layui.$('table tbody tr td div').attr("class","");
						layui.$('table tbody tr td').css("display","inline-flex");
						layui.$('table tbody tr td').css("border-width","1px");
						layui.$('table tbody tr td').css("border-color","#66CCFF");
						layui.$('table tbody tr td').css("border-radius","1rem");
						layui.$('table tbody tr td').css("border-style","solid");
						layui.$('table tbody tr td').css("margin-left","3%");
						layui.$('table tbody tr td').css("width","94%");
						layui.$('table tbody tr td').css("padding-left","12px");
						layui.$('table tbody tr td').removeAttr("data-content");
						layui.$('table tbody tr td').removeAttr("data-edit");
						// 隱藏手機端不需要的部分
						layui.$('.layui-table-header').css("display","none");
						layui.$('.layui-table-tool').css("display","none");  
						layui.$('.layui-table-total').css("display","none");
						
						// 處理分頁條內容
						layui.$('.layui-table-page').css("width","100%");
						
						$('.layui-laypage-skip').remove();
						layui.$('table').css("border-collapse","separate");
						layui.$('table').css("border-spacing","0px 10px");
					
					}
			  });
			table.render({
			    elem: '#alarmLevelGrid3'
			    ,id:'alarmLevelGrid3'
			    ,url:'xxxx/sxxx/getData'
			    ,toolbar: false
			    ,title: '預警層級記錄表'
			    ,totalRow: false
			    ,limits:[3,5,10,20]
			    ,limit:5
			    ,cols: [[
			      {
					  field:'alarmLevel',  // 只需要在此處選擇一個必定存在的元素作為渲染條件即可
					  title:'預警層級', 
					  width:400, 
					  event: 'viewDetail',
					  templet:'#alarmLevelTpl'
				}
			    ]]
			    ,page: true
			    ,where :{"alarmLevel":"3"}
			    ,response: {
			      statusCode: 200 //重新規定成功的狀態碼為 200,table 元件預設為 0
			    }
			    ,parseData: function(res){ 
			     return {
			        "code": res.code==0?200:404, //解析介面狀態
			        "msg": res.msg, //解析提示文字
			        "count": res.total, //解析資料長度
			        "data": res.level //解析資料列表
			      };
			    }
				,done: function (res, curr, count){
						$("div[lay-id=alarmLevelGrid3]").css("margin-top", "11%");
						layui.$('.layui-table-view .layui-table').css("width","100%");
						layui.$('table tbody tr td div').attr("class","");
						layui.$('table tbody tr td').css("display","inline-flex");
						layui.$('table tbody tr td').css("border-width","1px");
						layui.$('table tbody tr td').css("border-color","#66CCFF");
						layui.$('table tbody tr td').css("border-radius","1rem");
						layui.$('table tbody tr td').css("border-style","solid");
						layui.$('table tbody tr td').css("margin-left","3%");
						layui.$('table tbody tr td').css("width","94%");
						layui.$('table tbody tr td').css("padding-left","12px");
						layui.$('table tbody tr td').removeAttr("data-content");
						layui.$('table tbody tr td').removeAttr("data-edit");
						// 隱藏手機端不需要的部分
						layui.$('.layui-table-header').css("display","none");
						layui.$('.layui-table-tool').css("display","none");  
						layui.$('.layui-table-total').css("display","none");
						
						// 處理分頁條內容
						layui.$('.layui-table-page').css("width","100%");
						
						$('.layui-laypage-skip').remove();
						layui.$('table').css("border-collapse","separate");
						layui.$('table').css("border-spacing","0px 10px");
					
					}
			  });
	  }

	function selectDefault(){
		$("a[data-level = 1]").click();
	}
	// 為導航欄目新增繫結事件
        /*
          該段js程式碼的核心就是當點選型別標籤時,為對應的div 新增move 樣式(上述css中有寫),
          同時移除其他兩個div的move樣式,這樣就可以實現頁面滑動切換的效果啦.這樣的動態效果還有很
          多例如:旋轉,柵格等等,感興趣的讀者朋友可以自行試驗
        */
	$('a[data-level=1]').click(function(e){
	  if($(this).hasClass("zui-this"))
		return;
	  reloadTable("alarmLevelGrid1",{"alarmLevel":"1"});
	  resetSelectedStyle();
          $(".zui-this").removeClass("zui-this");
          $(this).addClass("zui-this");
	  renderSelectedStyle(this);
           e.preventDefault();
    	 $('#alarmLevel2').removeClass("move");
    	 $('#alarmLevel1').removeClass("div-align-left");
    	 $('#alarmLevel2').removeClass("div-align-right");
    	 $('#alarmLevel3').removeClass("div-align-right");
    	 $('#alarmLevel3').removeClass("move");
    	 $('#alarmLevel1').toggleClass('move');
     });	
	
	$('a[data-level=2]').click(function(e){
		
		if($(this).hasClass("zui-this"))
			return;
		reloadTable("alarmLevelGrid2",{"alarmLevel":"2"});
		resetSelectedStyle();
        $(".zui-this").removeClass("zui-this");
        $(this).addClass("zui-this");
		renderSelectedStyle(this);
         e.preventDefault();
         $('#alarmLevel2').toggleClass('move');
         $('#alarmLevel2').removeClass("div-align-right");
         $('#alarmLevel2').removeClass("div-align-left");
    	 
         $('#alarmLevel1').removeClass("move");
    	 $('#alarmLevel3').removeClass("move");
     });		

	$('a[data-level=3]').click(function(e){
		if($(this).hasClass("zui-this"))
			return;
		reloadTable("alarmLevelGrid3",{"alarmLevel":"3"});	
	 	resetSelectedStyle();
        $(".zui-this").removeClass("zui-this");
        $(this).addClass("zui-this");
		renderSelectedStyle(this);
         e.preventDefault();
         $('#alarmLevel1').removeClass("move");
    	 $('#alarmLevel2').removeClass("move");
    	 $('#alarmLevel1').toggleClass("div-align-right");
    	 $('#alarmLevel2').toggleClass("div-align-right");
    	 $('#alarmLevel1').removeClass("div-align-left");
         $('#alarmLevel3').toggleClass('move');
     });
     
    // 由於css的就近原則,使用class 無法達到預期效果,使用jquery增加樣式
    function resetSelectedStyle(){
    	$(".zui-this").css("color","#333");
	 	$(".zui-this").css("background-color","white");
    } 
     
    function renderSelectedStyle(elem){
        $(elem).css("color","white");
        $(elem).css("background-color","#1e9fff");
    }  
     
	// 表格過載
	function reloadTable(gridLayId,params){
		let baseParam = {"isMobile":true};
		$.extend(true,baseParam,params);
		table.reload(gridLayId,{
			   page: {
	                    curr: 1 
	                },
			 	where : baseParam			 		
			});	
	}
	// 返回	
	function getBack(){
		clearContext();
		history.back(-1);
	}
	
	// 清理空間
	function clearContext(){
		c.remove("searchParams");
	} 
	
	function getUserName(d){
		if(d.writeUser){
			return d.writeUser.empName;
		}
		return "";
	}
	$(document).ready(function(){
		 selectDefault();
	});
</script>

相關文章