• vue-awesome-swiper 子项目内容高度适配问题


       2020年1月份去了南京,返回工作城市后,慢慢的从外界接收到“新冠肺炎”的消息,1月份2月份的一段日子,每个人都在等待疫情好转的那一刻,也是由于疫情原因,春节过后,无法回公司办公,维持了大概1个半月的在家办公时间,感觉到在家办公,比较大的问题其实是沟通的问题,能够电话/语音沟通说明白的事情,绝对不要浪费时间去发文字描述。

    切入今天的正题 : 

      需求背景:实现tab切换 ,并且每个tab内容区域底部还存在一个固定定位的按钮,在tab所在内容区域实现手势切换tab ,tab切换时内容存在切换动效,并且tab切换后回到原初始位置

      需求分析:如果在功能上只是tab切换,无其他交互,可以按照常用的方式进行实现,但是由于交互动效,我们可以选择使用vue的第三方插件vue-awesome-swiper进行实现

      需求主要点:

        a.按钮在页面底部固定

        b.左滑切换tab

        c.tab切换时左滑右滑的动态效果

        d.tab切换后,记录当前滚动高度,切换回来时回到原来位置

    进入实现

    1.引用

    import 'swiper/dist/css/swiper.css'
    import { swiper, swiperSlide } from 'vue-awesome-swiper' 

    2.配置使用

     swiperOption: {
            antoplay: false,   
          }, 
    

    3.在vue中template使用(此处略过)

    此时实现了需求点b、c,也能够左右切换 但是存在一个问题,就是 swiperSlide的两个元素,内容高度是等高度的,如果两个tab的高度不一致,导致高度较低的内容高度存在底部过多空白的问题,出现了一个新的问题" m :两个swiperSlide的内容高度不一致时,如何保证低内容高度不留空白

    思考空白问题:利用js去控制swiper盒子的高度,当切换过来时候,将swiper的高度设置成当前盒子的高度。

      this.styleHeight ='min-height:'+clinetHeight+'px!important;'+'height:'+ document.getElementById('myplan'+index).scrollHeight+'px';
       
    

      

     此时高度适配问题也解决了 至于为什么会有min-height 则是因为 如果内容区域少于当前屏幕的可视区域,本身的高度是根据内容的高度一样的,所以可能存在内容区域上部分可进行手滑切换tab,而下部分不能进行手滑切换tab ,

     实现需求d 也是比较简单了,利用一个object去记录滑走的时候当前tab的高度,然后切换过来的时候,进醒取值和赋值即可

    that.gloabalScrollHeight[recordIndex] = document.getElementById("my-wiper").scrollTop
    
     document.getElementById("my-wiper").scrollTop=that.gloabalScrollHeight[that.activeIndex];    

    swiper滑动的过程中可能遇到问题,就是swiper为滚动完毕,就执行了高度的滚动,此时回出现,高度滚到指定值失效的问题,借助进行解决。

     that.$nextTick(function(){
                document.getElementById("my-wiper").scrollTop=that.gloabalScrollHeight[that.activeIndex];     
       })
    

    ***************另外一种方式******************

    就是swiper自己提供了一个属性autoHeight:true,设置了这个属性后,我们的高度就会根据内容的高度进行自适应,很好的解决了高度不适应的问题,

    虽然达到了高度自适应,但是存在如果内容区域不满屏,下方空白区域部分无法进行左滑效果,因此关于高度,还是需要在切换时候进行实时计算高度和赋值。 

    4.对于需求a,页面滑动时候固定在底部的按钮跟着当前的内容进行左滑和右滑

     思考良久,去实现该点

      4.1 首先将定位的按钮放置在swiperSilde中,按钮固定底部使用fixed ,当页面渲染完后发现 ,为什么fixed的按钮在内容区域的下方,而不是定位屏幕的下方,浏览器端看了swiper的移动方式

     即 定位按钮的父元素包含了transform属性导致了fixed元素失去了元素的原有定位,因此按钮的定位效果就和absolute或无定位一样的 

     找到解决方式 : 按钮使用absolute定位,父元素的swiper进行relative定位,

                  页面初始化时候,按钮的距离顶部的高度(top 定位值)= 屏幕可视区域高度 -距离底部的高度   

                  当页面滚动的时候: 按钮距离顶步的高度(top定位值) = 屏幕可视区域高度 + 页面scrollTop(滑动上的高度)-距离底部的高度

         当到这里,其实就已经实现了 按钮可根据tab的左滑而进行左滑  还没有结束,你挖了这个坑的土填满另外一个坑,那肯定有一个坑的是少土的 (惊喜总是那么的意料之中)

         页面滚动是一个不可控制的变量,滚动的速度,滚动的高度,都是不可控制的,我们通过计算页面的滚动高度等进行定位,呵呵呵呵呵呵 ,那定位元素的按钮肯定也是一个不可控制的高度,按钮在不可控制、未知的动作下,必然会让人惊叹:“抖动” 

     “抖动”虽然是需求上未提到的点,但是真的让惹难以接受,因此改变了按钮交互方式,俗称“砍掉这部分需求,用其他的方式实现交互”

    ---终于  迎来了按钮的新交互 :就是当手滑tab内容区域的时候,按钮隐藏,手滑动结束后,按钮展示

    感谢swiper内的on方法,应用touchmove的方式进行控制按钮的隐藏和显示 progress的变量是当前滑动的距离距离

     touchMove:function(event){ 
                //避免上下移动时按钮消失
                if(this.progress !==1 && this.progress !==0){
                  that.showAddButton0 = false;
                  that.showAddButton1 = false;
                }
              } , 
              touchEnd:function(event){ 
                //this.progress 参数进度条按照宽度来进行的计算比例  
                if((this.activeIndex == 0 && this.progress < 0.50) || (this.activeIndex == 1 && this.progress > 0.50)){
                   that.showAddButton0 = (this.activeIndex ==0 ? true : false);
                   that.showAddButton1 = (this.activeIndex ==1 ? true : false);
                }
              } ,
    

      注意点:左滑右滑时候隐藏按钮,但是上滑下滑不隐藏按钮,而swiper上滑和下滑的时候 progress也是存在值的 0||1

    今天梳理了下遇到的问题以及解决的方式,突然脑子里思路清晰了许多

    end:最后总结下vue-awesome-swiper的注意点

    1. swiper的高度按照当前内容高度最高的进行赋值,低高度的内容下方存在空白问题   ,可进行js赋值height或者设置autoheight属性未true      
    2.  设置autoheight属性 当页面高度不足满屏幕时候,内容区域下方空白部分不可进行手滑动,可设置min-height
    3. swiper内部设置的fixed定位元素将失效 
    4. 切换tab进行高度赋值时候需要借助 that.$nextTick

    开发过程中需要考虑很多细节的点 ,不仅仅是完成需求功能,追求prefect ! 

  • 相关阅读:
    Asp.net Json 解析 与 直接用ip访问返回josn
    mysql 时间函数
    Android之TelephonyManager类的使用案例
    android:screenOrientation的说明 固定屏幕显示方向
    在android.app.Application中定义全局变量
    Android开发实例详解之IMF(Android SDK Sample—SoftKeyboard)
    Android InputMethodManager输入法简介
    android ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)
    VS编译常见错误枚举01
    Visual C++ Samples-------------Code Project
  • 原文地址:https://www.cnblogs.com/mfyngu/p/12539843.html
Copyright © 2020-2023  润新知