vue不使用其他插件实现新闻app中左右滑动切换tab菜单和div内容的动画效果(移动端)

在这里插入图片描述

实现如图的效果,当前的tab菜单也是左右可滑动的

首先tab的滑动
如图效果在这里插入图片描述

	<div id="apps">
        <nav>
          <p
            v-for="(item,$index) in arrs"
            @click="toggle($index)"
            :class="{active:$index==active}"
          >{{item}}</p>
        </nav>
      </div>

在data中的参数,和点击事件,文章结尾有修改后的toggle事件,点击切换内容

data() {
    return {
      active: 0,
      arrs: ["菜单1", "菜单2", "菜单3", "菜单3",'菜单5','菜单6','菜单7']
    };
 },
 methods: {
	toggle(index) {
 	 	this.active = index;
	},

style样式

#apps{ width: 100%; overflow:hidden; } 
#apps nav{ padding: 0 10px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: middle; -ms-flex-align: middle; align-items: middle; overflow: auto; } 
#apps p{ text-align: center; font-size: 16px; -ms-flex-negative: 0; flex-shrink: 0; padding: 10px; margin: 5px; }
#apps p.active{ color: #ffff00; background-color: #000000; }


这是tab的滑动代码
接下来是,内容页的滑动切换div和tab的动画的实现代码

页面代码如下:

<div
        class="back"
        @touchstart.prevent="touchStart"
        @touchmove.prevent="touchMove"
        @touchend="touchEnd"
        ref="back"
      >
        <div class="back-l" ref="left"></div>
        <div class="back-m" ref="middle"></div>
        <div class="back-r" ref="right"></div>
      </div>

样式:

<style scoped lang="stylus" rel="stylesheet/stylus">
.back {
  position: fixed;
  width: 100%;
  height: 100px;
  white-space: nowrap;

  .back-l {
    position: relative;
    vertical-align: top;
    display: inline-block;
    width: 100%;
    height: 100%;
    background-color: red;
  }
   .back-m {
    position: relative;
    vertical-align: top;
    display: inline-block;
    width: 100%;
    height: 100%;
    background-color: blue;
  }

  .back-r {
    display: inline-block;
    vertical-align: top;
    position: relative;
    width: 100%;
    height: 100%;
    background-color: yellow;
  }
}
</style>

没有安装stylus的使用以下命令安装使用

npm install stylus stylus-loader --save-dev

以下是js代码

js中data参数:

data() {
    return {
      active: 0,
      currentPlay: "red",
      percent: 0,
      arrs: ["red", "blue", "yellow"]
    };
  },

滑动动作开始:

touchStart(e) {
      const touch = e.touches[0];
      this.touch.startX = touch.pageX;
      this.touch.startY = touch.pageY	;
    },

滑动动作:

touchMove(e) {
      const touch = e.touches[0];
      //横向和纵向偏离位置
      const deltaX = touch.pageX - this.touch.startX;
      const deltaY = touch.pageY - this.touch.startY;
      if (Math.abs(deltaY) > Math.abs(deltaX)) {
        return;
      }
      if(this.currentPlay=='red'){
        var left=0;
        var offsetWidth = Math.min(
        0,
        Math.max(-window.innerWidth, left + deltaX)
        );
      }
      else if(this.currentPlay=='blue'){
         var left=-window.innerWidth;
         if(deltaX>0){  //判断动作 是左滑还是右滑
           var offsetWidth = Math.min(
            0,
            Math.max(-window.innerWidth, left + deltaX)
            );
         }else{
           var offsetWidth = Math.min(
              -window.innerWidth,
              Math.max(-window.innerWidth*2, left + deltaX)
            );
         }
      }
      else{
        var left=-window.innerWidth*2;
        var offsetWidth = Math.min(
          -window.innerWidth,
          Math.max(-window.innerWidth*2, left + deltaX)
        );
      }
      //记录滑动的距离占屏幕宽度的百分比,如果滑动太少则不切换
      this.percent = deltaX / window.innerWidth;
      //动画中滑块的移动
      this.$refs.back.style["transform"] = `translate3d(${offsetWidth}px,0,0)`;
      //设置动画时间
      this.$refs.back.style["transitionDuration"] = 10;
      console.log('');
    },

这个方法简单的介绍一下几个参数把,个人的理解修改offsetWidth ,参数的变化就可以在滑动时产生动画效果,
当最左边滑块时(red)
也就是red的时候offsetWidth= Math.min(0, Math.max(-window.innerWidth, left + deltaX));
当前Math.min中的第一个参数是当前滑块div左边的x坐标为0,Math.max中的第一个参数为当前滑块右边的x的坐标,

当滑块在中间时(blue)
判断当前动作时左滑还是右滑,当左滑时 左边模块为red所以
offsetWidth=Math.min(0, Math.max(-window.innerWidth, left + deltaX));
右滑是为yellow
var offsetWidth = Math.min(-window.innerWidth,Math.max(-window.innerWidth2, left + deltaX));
当前Math.min中的第一个参数是当前滑块div左边的x坐标为-window.innerWidth,Math.max中的第一个参数为当前滑块右边的x的坐标
当滑块在中间时(yellow)
也就是yellow的时候var offsetWidth = Math.min( -window.innerWidth,Math.max(-window.innerWidth
2, left + deltaX));
当前Math.min中的第一个参数是左边滑块div左边的x坐标为0,Math.max中的第一个参数为左边滑块右边的x的坐标

滑动结束的js:

touchEnd() {
      let offsetWidth;
      let percent;
      //当前为红色,滑动占比小于-0.1则切换,否则回到原位置
      if (this.currentPlay === "red") {
        if (this.percent < -0.1) {
          this.currentPlay = "blue";
          this.active=1;
          offsetWidth = -window.innerWidth;
        } else {
          offsetWidth = 0;
        }
      }else if(this.currentPlay === "blue"){
        if (this.percent > 0.1) {
          this.active=0;
          this.currentPlay = "red";
          offsetWidth = 0;
        }
        else if (this.percent < -0.1) {
          this.currentPlay = "yellow";
          this.active=2;
          offsetWidth = -window.innerWidth*2;
        }
        else {
          offsetWidth = -window.innerWidth;
        }
      }
       else {
        //当前为黄色,滑动占比大于0.9则切换,否则回到原位置
        if (this.percent > 0.1) {
          this.currentPlay = "blue";
          this.active=1;
          offsetWidth = -window.innerWidth;
        } else {
          offsetWidth = -window.innerWidth*2;
        }
      }
      //这里的transform是针对最开始的位置而言,而不是移动过程中的位置
      this.$refs.back.style["transform"] = `translate3d(${offsetWidth}px,0,0)`;
      this.$refs.back.style["transitionDuration"] = 10;
    }


补上一个点击tab是切换内容
修改js中的toggle方法,修改成这样,就能同时满足点击切换或者滑动切换

toggle(index) {
      this.active = index;
      if(index==0){
        var offsetWidth = 0;
        this.currentPlay = "red";
      }
      else if(index==1){
        var offsetWidth = -window.innerWidth;
        this.currentPlay = "blue";
      }
      else if(index==2){
        this.currentPlay = "yellow";
        var offsetWidth = -window.innerWidth*2;
      }
      //这里的transform是针对最开始的位置而言,而不是移动过程中的位置
      this.$refs.back.style["transform"] = `translate3d(${offsetWidth}px,0,0)`;
    },

以上就是实现的全部代码,参考与 https://blog.csdn.net/tjzc1352640/article/details/79381155https://blog.csdn.net/jinyuyang78/article/details/78958527
在这两个基础上做了自己的理解和改动,如果需要多个tab菜单和页面添加修改 touchMove 和 touchEnd 中的两个判断中的内容即可。

[removed] $(function() { function setCurrentSlide(ele, index) { $(".swiper1 .swiper-slide").removeClass("selected"); ele.addClass("selected"); //swiper1.initialSlide=index; } var swiper1 = new Swiper('.swiper1', { // 设置slider容器能够同时显示的slides数量(carousel模式)。 // 可以设置为number或者 'auto'则自动根据slides的宽度来设定数量。 // loop模式下如果设置为'auto'还需要设置另外一个参数loopedSlides。 slidesPerView: 5.5, paginationClickable: true,//此参数设置为true时,点击分页器的指示点分页器会控制Swiper切换。 spaceBetween: 10,//slide之间的距离(单位px)。 freeMode: true,//默认为false,普通模式:slide滑动时只滑动一格,并自动贴合wrapper,设置为true则变为free模式,slide会根据惯性滑动且不会贴合。 loop: false,//是否可循环 onTab: function(swiper) { var n = swiper1.clickedIndex; } }); swiper1.slides.each(function(index, val) { var ele = $(this); ele.on("click", function() { setCurrentSlide(ele, index); swiper2.slideTo(index, 500, false); //mySwiper.initialSlide=index; }); }); var swiper2 = new Swiper('.swiper2', { //freeModeSticky 设置为true 滑动会自动贴合 direction: 'horizontal',//Slides的滑动方向,可设置水平(horizontal)或垂直(vertical)。 loop: false, // effect : 'fade',//淡入 //effect : 'cube',//方块 //effect : 'coverflow',//3D流 // effect : 'flip',//3D翻转 autoHeight: true,//自动高度。设置为true时,wrapper和container会随着当前slide的高度而发生变化。 onSlideChangeEnd: function(swiper) { //回调函数,swiper从一个slide过渡到另一个slide结束时执行。 var n = swiper.activeIndex; setCurrentSlide($(".swiper1 .swiper-slide").eq(n), n); swiper1.slideTo(n, 500, false); } }); }); [removed]
### 回答1: 好的,我可以为您提供一些参考。首先,使用 Vue 和 JavaScript 实现 tab 切换菜单的基本思路是:创建菜单组件,选择默认显示的选项卡,当点击选项卡切换对应的内容。以下是一个简单的实例: HTML: ```html <div id="app"> <ul class="tabs"> <li v-for="(tab, index) in tabs" :key="index" @click="activeTab = tab">{{ tab }}</li> </ul> <div class="content"> <div v-for="(content, index) in contents" :key="index" v-show="activeTab === tab">{{ content }}</div> </div> </div> ``` JavaScript: ```javascript var app = new Vue({ el: '#app', data: { tabs: ['Tab 1', 'Tab 2', 'Tab 3'], contents: ['Content for Tab 1', 'Content for Tab 2', 'Content for Tab 3'], activeTab: 'Tab 1' } }); ``` CSS: ```css .tabs { list-style: none; margin: 0; padding: 0; display: flex; } .tabs li { padding: 12px 24px; background-color: #ddd; cursor: pointer; } .tabs li.active { background-color: #fff; } .content div { display: none; } .content div.show { display: block; } ``` 这个例子,我们创建了一个菜单组件,包含选项卡和相应的内容。当用户点击选项卡时,我们使用 `v-show` 指令来切换显示对应的内容。我们还设置了一个 `activeTab` 变量来追踪当前活动的选项卡。 希望这个例子能帮到您。如果您有任何问题,请随时问我。 ### 回答2: 使用Vue和JS实现Tab切换菜单的方法如下: 1. 在HTML定义菜单的容器,并为每个菜单项添加对应的索引值,例如: ```html <div id="app"> <ul class="menu"> <li class="menu-item" :class="{active: activeTab === 1}" @click="setActiveTab(1)">菜单1</li> <li class="menu-item" :class="{active: activeTab === 2}" @click="setActiveTab(2)">菜单2</li> <li class="menu-item" :class="{active: activeTab === 3}" @click="setActiveTab(3)">菜单3</li> </ul> <div v-show="activeTab === 1">内容1</div> <div v-show="activeTab === 2">内容2</div> <div v-show="activeTab === 3">内容3</div> </div> ``` 2. 在Vue的实例定义相关的数据和方法,在data添加activeTab变量,并在methods添加setActiveTab方法,用于设置当前点击的菜单项对应的索引值,并切换显示相应的内容,例如: ```javascript new Vue({ el: '#app', data: { activeTab: 1 }, methods: { setActiveTab(tabIndex) { this.activeTab = tabIndex; } } }); ``` 3. 使用CSS样式来设置菜单项的样式和切换时的选状态,例如: ```css .menu-item { display: inline-block; padding: 10px 20px; cursor: pointer; } .menu-item.active { background-color: #ccc; } ``` 这样,点击不同的菜单项时,对应的内容将会显示出来,并且菜单项也会有选的样式。 ### 回答3: 使用Vue和JavaScript可以轻松实现Tab切换菜单。首先,在Vue的data属性定义一个用于存储当前选Tab的变量。 ``` data() { return { activeTab: 'tab1' } } ``` 然后,在HTML模板添加一个包含Tab标题的菜单,并为每个Tab添加一个点击事件,用于切换Tab。 ``` <div> <div class="tab-menu"> <button @click="activeTab = 'tab1'" :class="{ 'active': activeTab === 'tab1' }">Tab 1</button> <button @click="activeTab = 'tab2'" :class="{ 'active': activeTab === 'tab2' }">Tab 2</button> <button @click="activeTab = 'tab3'" :class="{ 'active': activeTab === 'tab3' }">Tab 3</button> </div> <div class="tab-content"> <div v-if="activeTab === 'tab1'">Tab 1的内容</div> <div v-if="activeTab === 'tab2'">Tab 2的内容</div> <div v-if="activeTab === 'tab3'">Tab 3的内容</div> </div> </div> ``` 在上述代码,每个按钮都添加了一个点击事件来更新activeTab的值,关联了对应的Tab内容。同时,使用Vue的条件渲染指令v-if,根据activeTab的值来显示对应的Tab内容。 最后,可以根据需要自定义样式,给当前选Tab按钮添加一个active类来突出显示: ``` <style> .tab-menu button.active { background-color: #ccc; } </style> ``` 以上就是使用Vue和JavaScript实现Tab切换菜单的基本步骤,通过修改activeTab的值来更新所显示的Tab内容
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值