JS实现APP中常见的Tab点击切换和隐藏标签页(纵向,可自适应屏幕)

示意图

实现效果

点击非活动tab标签会隐藏当前的活动tab页,并显示刚点击的tab页内容;向下滚动时标题栏会一直浮动于屏幕最上方。 

JS代码

window.onload=function(){
	    var toTop = new Array();
	    var queSize = new Array();
	    	for(i=1;i<=4;i++){
	    		var queid = "eleque_"+i;
	    		var Top = document.getElementById(queid).offsetTop; //获取各标题距顶部的距离
	    		toTop.push(Top);
	    		var queheight = document.getElementById(queid).offsetHeight;
	    		queSize.push(queheight);
	    	}
	  		window.onscroll=function(){
	  		for(i=1;i<=4;i++){
	  		var queid = "eleque_"+i;
	    	var contentid = "content_"+i;
	    	var content = document.getElementById(contentid);
	    	var showif = getStyle(content,"display");//判断该标题是否被点开展示
	    	if(showif=="block"){
                var topScroll =document.documentElement.scrollTop;
                var que  = document.getElementById(queid);
                var contentheight = document.getElementById(contentid).offsetHeight;
                if(topScroll > toTop[i-1]){  //滚动的距离大于距顶部的距离时,定位改为fixed
                    que.style.position = 'fixed';
                    que.style.top = '0';
                    que.style.zIndex = '9999';
                    document.getElementById("que_1").style.display = 'block'; //该DIV用于支撑标题脱离文档流后的位置
                    document.getElementById("que_1").style.height = queSize[i-1] + 'px';
                }else{
                    que.style.position = 'static'; //滚动距离小于距顶部距离时,定位恢复默认
                    document.getElementById("que_1").style.display = 'none';
                }
            			}else{
                var que  = document.getElementById(queid); //如果该标题没有被点击展开则为默认定位
                que.style.position = 'static';
            			}
	    }
	    }
            }
	    function getStyle(element, attr) {
        if(element.currentStyle) {
                return element.currentStyle[attr];
        } else {
                return getComputedStyle(element, false)[attr];
        }
		}
	    function show(num){
	    for(i=1;i<=4;i++){
	    	if(i!=num){
	    	var allid = "content_" + i;
	    	var all = document.getElementById(ansid);
	    	var imgid = "img_" + i;
	    	document.getElementById(allid).style.display="none";
	    	document.getElementById(imgid).src="../../images/down.png";
	    	}
	    }
	    var ansid = "content_" + num;
	    var ans = document.getElementById(ansid);
	    var imgid = "img_" + num;
	    var ifshow = getStyle(ans,"display");
	    if(ifshow == "none"){
	    	document.getElementById(ansid).style.display="block";
	    	document.getElementById(imgid).src="../../images/up.png";
	    }else{
	    	document.getElementById(ansid).style.display="none";
	    	document.getElementById(imgid).src="../../images/down.png";
	    	document.getElementById("que_1").style.display = 'none';
	    }
	    
	    }

HTML代码

 

<div class="content">
    <div class="que" id="eleque_1" onclick="show(1)">
        <p>在配电室、变电站、高压线路等附近居住对人体是否有害?</p><img id="img_1" src="../../images/down.png">
    </div>
    <div id="que_1" style="width:100%;display:none"></div>
    <div class="content" id="content_1">
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在配电室、变电站、高压线路等供电设施附近居住对人体不会有伤害。</p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.首先配电室、变电站、高压线路等供电设施不会产生电磁辐射,
            这是因为交流输变电设施是通过电磁感应对周围环境产生影响的,产生的工频电场和工频磁场属于极低频场,
            其频率只有50赫兹,波长很长,达6000公里,而输电线路本身,由于其长度一般远小于这个波长,
            因此不能构成有效的电磁辐射(频率在100千赫兹及以上的才能形成辐射)。
            在国际权威机构的文件中,交流输变电设施产生的电场和磁场被明确地称为工频电场和工频磁场,而不是电磁辐射。
            电网企业的员工长时间从事输变电设施的运行和维护工作,也没有发现员工身体健康受到电网设备电磁场的不良影响。</p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            2.配电室、变电站、高压线路等供电设施的设立与规划都是经过市规划局、环保局的严格审批,
            符合环境安全标准,对人体的健康是没有危害的。
        </p>
    </div>
    <div class="que" id="eleque_2" onclick="show(2)">
        <p>用户发生哪些用电事故,应及时向供电企业报告?</p><img id="img_2" src="../../images/down.png">
    </div>
    <div class="content" id="content_2">
        <p>(1)人身触电死亡;</p>
        <p>(2)导致电力系统停电;</p>
        <p>(3)专线掉闸或全厂停电;</p>
        <p>(4)电气火灾;</p>
        <p>(5)重要或大型电气设备损坏;</p>
        <p>(6)停电期间向电力系统倒送电。</p>
        <p>供电企业接到用户上述事故报告后,应派员赴现场调查,在七天内协助用户提出事故调查报告。</p>
    </div>
    <div class="que" id="eleque_3" onclick="show(3)">
        <p>违章用电行为有哪些?</p><img id="img_3" src="../../images/down.png">
    </div>
    <div class="content" id="content_3">
        <p>(1)擅自改变用电类别;</p>
        <p>(2)擅自超过合同约定的容量用电;</p>
        <p>(3)擅自使用已经在供电企业办理暂停使用手续的电力设备,或者擅自启用已经被供电企业查封的电力设备;</p>
        <p>(4)擅自迁移、更动或者擅自操作供电企业的用电计量装置、电力负荷控制装置、供电设施以及约定由供电企业调度的客户受电设备;</p>
        <p>(5)未经供电企业许可,擅自引入、供出电源或者将自备电源擅自并网。</p>
    </div>
    <div class="que" id="eleque_4" onclick="show(4)">
        <p>安全电压的标准</p><img id="img_4" src="../../images/down.png">
    </div>
    <div class="content" id="content_4">
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所谓安全电压,是指为了防止触电事故而由特定电源供电时采用的电压系列。
            这个电压系列的上限值,即两导体间或任一与地之间的电压,在任何情况下,都不超过交流有效值50伏。</p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我国规定安全电压额定值的等级为42、36、24、12、6伏。
            当电气设备采用的电压超过安全电压时,必须按规定采取防止直接接触带电体的保护措施。</p>
    </div>
    </div>

CSS代码

 #content_1,#content_2,#content_3,#content_4{
     	display:none;
     	border-bottom:1px #EDEDED solid;
     	margin-top:0;
     }
*{margin: 0;padding: 0;}
html,body{height: 100%;background:#f2f2f2;}
.content{margin:0;}
.content p{margin: 10px;color: #666;line-height: 25px;}
.que{
     	background:#ffffff;
     	border-bottom:1px #EDEDED solid;
     	padding:10px;
     	margin:0;
     	line-height:30px;
     	width:100%;
     	display: flex;
    	align-items: center;
    	justify-content: space-between;
     }
.que img{
	    width: 20px;
    	height: 20px;
    	margin-right: 25px;
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现tab自动居屏幕显示,并且循环滚动,可以使用 `scroll-view` 组件,并且在点tab时,计算出当前tab的位置,然后通过设置 `scroll-view` 的 `scroll-left` 属性来实现滚动到当前tab的效果。同时,可以通过监听 `scroll-view` 的滚动事件来实现循环滚动。 以下是一个示例: ```html <scroll-view scroll-x style="white-space: nowrap;" bindscroll="onScroll"> <div wx:for="{{tabs}}" wx:key="index" style="display: inline-block; margin-right: 20px;" data-index="{{index}}" bindtap="onTabClick">{{item}}</div> </scroll-view> ``` 在这个示例,`scroll-view` 设置了 `scroll-x` 属性来实现横向滚动,同时设置了 `white-space: nowrap` 属性来让列表项不换行。每个列表项使用 `display: inline-block` 属性来让它们在同一行显示,并通过设置 `margin-right` 来制定它们之间的间距。通过 `wx:for` 循环渲染出tab列表,并通过 `bindtap` 绑定点事件 `onTabClick`。 接下来实现 `onTabClick` 方法: ```javascript onTabClick(e) { const index = e.currentTarget.dataset.index; this.setData({ activeIndex: index, scrollLeft: this.calcScrollLeft(index) }); }, calcScrollLeft(index) { const query = wx.createSelectorQuery().in(this); query.select(`#tab_${index}`).boundingClientRect(); query.select('#scroll-view').boundingClientRect(); query.select('#scroll-view').scrollOffset(); return new Promise((resolve) => { query.exec((res) => { const tabRect = res[0]; const scrollRect = res[1]; const scrollOffset = res[2]; const offsetLeft = tabRect.left + tabRect.width / 2 - scrollRect.width / 2; resolve(scrollOffset.scrollLeft + offsetLeft); }); }); } ``` 在 `onTabClick` 方法,通过 `e.currentTarget.dataset.index` 获取当前点tab的索引,然后通过 `calcScrollLeft` 方法计算出当前tab时,`scroll-view` 的 `scroll-left` 值,并设置到页面的数据。 接下来实现 `calcScrollLeft` 方法。该方法通过 `wx.createSelectorQuery` 创建一个选择器对象,然后通过 `query.select` 方法选择当前点tab和 `scroll-view` 组件,并通过 `boundingClientRect` 方法获取它们的位置和大小信息。最后,根据这些信息计算出当前tab时,`scroll-view` 的 `scroll-left` 值,并返回一个 Promise 对象。 最后,实现循环滚动: ```javascript onScroll(e) { const query = wx.createSelectorQuery().in(this); query.select('#scroll-view').boundingClientRect(); query.selectAll('.tab-item').boundingClientRect(); query.exec((res) => { const scrollRect = res[0]; const tabRects = res[1]; const scrollLeft = e.detail.scrollLeft; const activeIndex = this.data.activeIndex; if (scrollLeft < tabRects[0].left - scrollRect.width / 2) { this.setData({ activeIndex: (activeIndex + tabRects.length - 1) % tabRects.length, scrollLeft: this.calcScrollLeft((activeIndex + tabRects.length - 1) % tabRects.length) }); } else if (scrollLeft > tabRects[tabRects.length - 1].left + tabRects[tabRects.length - 1].width - scrollRect.width / 2) { this.setData({ activeIndex: (activeIndex + 1) % tabRects.length, scrollLeft: this.calcScrollLeft((activeIndex + 1) % tabRects.length) }); } }); } ``` 在 `onScroll` 方法,通过 `wx.createSelectorQuery` 创建一个选择器对象,然后选择 `scroll-view` 和所有的tab元素,并通过 `boundingClientRect` 方法获取它们的位置和大小信息。然后根据 `scroll-view` 的 `scroll-left` 值和tab元素的位置信息,判断当前是否需要循环滚动,并通过 `setData` 方法更新数据。 注意:在模板,需要给每个tab元素加上一个 `class`,例如:`.tab-item`,然后在 `onScroll` 方法通过 `query.selectAll('.tab-item')` 选择所有的tab元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千变小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值