Vue+Swiper 滑动到最后一个卡片时继续滑动跳转页面

news/2024/7/10 0:50:14 标签: vue, swiper, 获取元素到视口的距离

最近PM提出了这样的一个需求,卡片可以横向滑动,当滑动到最后一个卡片,且还在滑动时,要跳转到另一个页面。这是就需要把握一个范围,当超过这个范围时,就进行跳转,否则不跳转。

1.首先通过swiper进行页面布局
布局成如下,可以进行左右滑动,最后一个之后显示"查看更多",在继续滑动且超过一定范围时跳转页面。
在这里插入图片描述
2.swiper监听事件,touchMove:触摸滑动时触发;touchEnd:触摸结束后触发。在事件触发时判断"查看更多"元素离视口左侧的距离,如果小于屏幕宽度,证明该元素已经全部显示,文案提示变成"我要跳转页面啦",此时松手应该跳转页面;反之显示"查看更多"。

on: {
  // touchmove事件,判断 查看更多的提示 的右边到视口左边的距离 进行文案修改
  touchMove: () => {
    const swiperTip = this.$refs.moreSlide;
    if (swiperTip.getBoundingClientRect().right < this.clientWid) {
      this.seeMore = "我要跳转页面啦";
    } else {
      this.seeMore = "查看更多";
    }
  },
    // touchend事件,判断 查看更多的提示 的右边到视口左边的距离 进行页面跳转
    touchEnd: () => {
      const swiperTip = this.$refs.moreSlide
      if (swiperTip.getBoundingClientRect().right < this.clientWid) {
        console.log("这是跳转页面的方法")
      }
    },
}

3.踩坑记录
记录一:touchMove事件中添加了if else的判断之后,整个swiper会左右晃动几次

swiper默认freeMode是false,即普通模式:slide滑动时只滑动一格,并自动贴合wrapper,设置为true则变为free模式,slide会根据惯性滑动可能不止一格且不会贴合。

记录二:freeMode设为true后,会根据惯性滑动,如果我触摸结束后,不满足页面跳转的条件,但是惯性滑动后满足了,此时页面并没有跳转

惯性滑动结束后会触发slideChangeTransitionEnd事件

记录三:设置resistanceRatio为0,无法脱离边缘,但是惯性滑动时还会脱离边缘

freeModeMomentumBounce: false,禁用free模式下的动量反弹,slides通过惯性滑动到边缘时,无法反弹

4.知识点记录

let domToTop = dom.getBoundingClientRect().top   // dom 的顶边到视口顶部的距离
let domToLeft = dom.getBoundingClientRect().left   // dom 的左边到视口左边的距离
let domToBottom = dom.getBoundingClientRect().bottom  // dom 的底边到视口顶部的距离
let domToRight = dom.getBoundingClientRect().right  // dom 的右边到视口左边的距离

http://www.niftyadmin.cn/n/1659426.html

相关文章

Jquery——Day2(基础DOM和css操作)

DOM(Document Object Model)&#xff0c;意思就是文档对象模型。一般而言&#xff0c;DOM操作分为3个方面&#xff0c;即DOM-CORE(核心)、HTML-DOM、CSS-DOM&#xff0c;在javascript中的DOM-CORE表示getElementById()、getElementByTagName()、getAttribute()、setAttribute()…

webp→png:图片格式的优雅降级

背景&#xff1a; 项目中一直使用的图片格式是png&#xff0c;因为其无损压缩&#xff0c;分辨率高的同时体积相对也会大一些&#xff0c;在H5中&#xff0c;如果使用了大量图片&#xff0c;而且每一张图片体积都很大&#xff0c;几百K甚至几兆&#xff0c;那页面的性能会很低。…

Jquery——Day2(包裹节点、节点操作)

1、包裹节点wrap <div>节点</div>&#xff08;1&#xff09;利用 wrap()方法对之前的代码包裹&#xff08;1&#xff09;wrap(html)&#xff1a;向指定元素包裹一层html代码 &#xff08;2&#xff09;wrap(element)&#xff1a;向指定元素包裹一层DOM对象节点 &…

Jquery——Day2(基础事件)

在jquery中&#xff0c;加载事件采用$(document).ready()方法&#xff0c;用它来代替JavaScript中的window.onload方法。 二者的区别在于&#xff08;1&#xff09;执行时机上&#xff0c;window.onload必须在网页所有元素加载到浏览器后才执行即访问网页中的元素&#xff1b;…

Jquery——Day3(事件对象+事件冒泡+默认行为阻止)

1、事件对象 即event对象&#xff0c;通过处理函数默认传递接受。 //通过处理函数传递事件对象&#xff1b; $(function(){$("input").bind(click,function(e){alert("欢迎光临&#xff01;");}); });凡是事件&#xff0c;都包含有 属性和方法A、event.ta…

Jquery——Day3(高级事件)

1、模拟事件 在jquery中&#xff0c;可以使用trigger()方法完成模拟操作 &#xff08;1&#xff09;常用模拟 $(#btn).trigger("click"); 近似于$(#btn).click(); &#xff08;2&#xff09;触发自定义事件 对于myClick表示自定义事件&#xff0c;若要触发&#…

Jquery——Day3(动画效果)

1、显示show()、隐藏hide() 显示与隐藏类似于HTML中对应的“display:none”和“display:block” <input type"button" class"show" value"显示" /> <input type"button" class"hide" value"隐藏" /&g…

Jquery——Day4(Ajax基本用法get/post/ajax/serialize等)

Ajax&#xff0c;全称为“Asynchronous Javascript and XML”&#xff08;异步的Javascript和XML&#xff09;&#xff0c;它不是一种Javascript的单一技术&#xff0c;而是利用了一系列交互式网页应用相关的技术所形成的结合体。 一般使用Ajax&#xff0c;实现无刷新状态更新页…