Swiper横向循环焦点图实现与解析

news2024/11/18 6:24:00

一、实现效果

请添加图片描述

二、样式与结构代码

html:

 <div class="item center">
    <div id="certify" class="col-md-12">
      <div class="swiper-container">
        <div class="swiper-wrapper">
          <div class="swiper-slide">
            <div class="com_wrap">
              <!-- 内部结构省略 -->
            </div>
          </div>
        </div>
        <div class="swiper-pagination"></div>
      </div>
    </div>
  </div>

css:

#certify {
    position: relative;
    width: 100%;
    margin: 72px auto 0;
    padding-bottom: 117px;
}

#certify .swiper-slide {
    width: 945px;
    height: 304px;
    background: #fff;
    position: relative;
    border-radius: 8px;
}

#certify .swiper-slide img {
    display: block;
    height: 150px;
    margin-bottom: 20px;
}

#certify .swiper-pagination {
    position: relative !important;
    margin-top: 30px;
    height: 10px;
}

#certify .swiper-pagination-bullets .swiper-pagination-bullet-active {
    border: 3px solid #00aadc;
    background-color: #fff;
}

#certify .swiper-button-prev {
    left: 0;
    width: 80px;
    font-size: 30px;
    text-align: center;
    line-height: 80px;
    height: 80px;
    background: inherit;
    background-color: rgba(242, 242, 242, 1);
    border: none;
}

#certify .swiper-button-next {
    right: 0;
    font-size: 30px;
    text-align: center;
    line-height: 80px;
    width: 80px;
    height: 80px;
    background: inherit;
    background-color: rgba(242, 242, 242, 1);
    border: none;
}

/* 轮播项样式 */
#certify .swiper-container .swiper-wrapper {
    display: flex;
    align-items: center;
}

三、预备知识

  1. swiper和slide都有其自身的progress(进度)值

swiper的progress不用特别设置去开启,而slide的progress则需要设置watchSlidesProgress为true来计算每个slide的进度值。
这个概念或许很抽象,但从文档中的阐述我们可以很直观地理解这个进度值究竟为何物。
对于swiper而言,活动的slide在最左边时progress为0,活动的slide在最右边时为1,其他情况平分。假如有6个slide,当活动的是第三个时swiper的progress属性是0.4,当活动的是第五个时swiper的progress属性是0.8。
而对于每个slide而言,活动块slide的progress为0,其他的依次减1。例:如果一共有6个slide,活动块slide是第三个,那么从第一个到第六个的progress属性分别是:2、1、0、-1、-2、-3。

  1. 开启 loop 选项时,Swiper 会对原始的 slide 进行复制来实现循环滚动效果
    具体来说,Swiper 会在每次滚动时在轮播列表的开头和结尾分别复制一个 slide,以创建一个无限循环的效果。
  2. 设置loopedSlides参数,它会影响 Swiper.js 在实际的循环滚动过程中生成的虚拟 slide 数据的个数
    这个参数指定了在循环滚动中每个原始 slide 周围额外生成的虚拟 slide 数量。

例如当我设置loopedSlides为2时:

(为了方便查看效果,我在监听progress变化的函数中让它遍历slide时输出了当前的slide序列号及其对应的progress值,且我实际上插入dom结构的slide数量只有三个)

在这里插入图片描述在这里插入图片描述
由图我们知道目前遍历到的slide数量变成了7个,可见它在原始的slide列表前后都复制了两个虚拟slide。

四、swiper3和swiper4-8的版本实现

// swiper3
  var mySwiper = new Swiper('.swiper-container', {
    // 开启这个参数来计算每个slide的progress(进度、进程),Swiper的progress无需设置即开启
    watchSlidesProgress: true,
    /* 
    设置slider容器能够同时显示的slides数量(carousel模式)。
    可以设置为数字(可为小数,小数不可loop),或者 'auto'则自动根据slides的宽度来设定数量。
    loop模式下如果设置为'auto'还需要设置另外一个参数loopedSlides。
    这里不要设置成你想显示的slide个数,因为他会给每个slide平分宽度
    */
    slidesPerView: 'auto',
    // 设定为true时,活动块会居中,而不是默认状态下的居左。
    centeredSlides: true,
    //在loop模式下使用slidesPerview:'auto',还需使用该参数设置所要用到的loop个数
    loopedSlides: 3,
    autoplay: 3000,
    loop: true,
    /* 
    用户操作swiper之后,是否禁止autoplay。默认为true:停止。
    如果设置为false,用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay。
    操作包括触碰,拖动,点击pagination等。
    */
    autoplayDisableOnInteraction: true,
    pagination: ".swiper-pagination",
    paginationClickable: true,
    // 回调函数,当Swiper的progress被改变时执行。接受Swiper实例和progress作为参数(可选)。
    onProgress: function (swiper, progress) {
      for (i = 0; i < swiper.slides.length; i++) {
        var slide = swiper.slides.eq(i);
        // 获取当前slide的进度值
        var slideProgress = swiper.slides[i].progress;
        // 用于调整滑动时slide过渡效果的基准值
        modify = 1;
        if (Math.abs(slideProgress) > 1) {
          modify = (Math.abs(slideProgress) - 1) * 0.3 + 1;
        }
        /*这里的699设置成你实际需要的活动slide的宽度
        由此来调整其他slide的水平偏移量,
        而活动slide由于progress为0,它不会有水平偏移*/
        translate = slideProgress * modify * 699 + 'px';
        /*缩放比例根据你自己的需要调整 
        我这里设置活动slide的相邻两个slide缩放比例为成0.75*/
        scale = 1 - Math.abs(slideProgress) / 4;
        //堆叠顺序
        zIndex = 999 - Math.abs(Math.round(10 * slideProgress));
        slide.transform('translateX(' + translate + ') scale(' + scale + ')');

        slide.css('zIndex', zIndex);
        slide.css('opacity', 1);
        if (Math.abs(slideProgress) > 0.5) {
          slide.css('opacity', 0.8);
        }
        /* 根据活动的slide的progress为0,其他依次减1的特性来设置透明度/父元素overflow
            从而控制slider容器实际显示的slide个数【直接用slidesPerView会让每个slide均分容器大小
        */
        if (Math.abs(slideProgress) > 1.5) {
          slide.css('opacity', 0);
        }
      }
    },
    /*这个回调函数会在每次轮播项切换时触发,
    用于为每个轮播项设置过渡效果
    在使用 setTransition 回调函数时,Swiper 会自动计算并传递合适的过渡时间,
    以确保轮播项的切换具有平滑的过渡效果。因此可以在回调函数中直接使用传递的 transition 参数,
    也可以自己定义过渡效果*/
    onSetTransition: function (swiper, transition) {
      for (var i = 0; i < swiper.slides.length; i++) {
      	//获取当前slide
        var slide = swiper.slides.eq(i)
        /*通过jquery设置该slide的transition属性,
        这是一个css属性,用于控制过渡效果,
        这里控制的是过渡时间 体现过渡效果的延迟*/
        slide.transition(transition);
      }
    },
  })

另外,之所以要给每个轮播项slide自定义过渡效果,这是因为默认情况下,Swiper 的轮播项切换是通过 CSS 过渡属性实现的,它们没有指定过渡时间,因此切换是即时的。如果不用他计算好的transition值,那么看起来的效果就相当于slide.transition(0);

//swiper4-8
const mySwiper = new Swiper('.swiper', {
   watchSlidesProgress: true,
   slidesPerView: 'auto',
   centeredSlides: true,
   loopedSlides: 3,
   autoplay: { delay: 3000 },
   loop: true,
   autoplayDisableOnInteraction: true,
   on: {
     progress: function(swiper, progress) {
       for (let i = 0; i < swiper.slides.length; i++) {
         const slide = swiper.slides[i];
         const slideProgress = swiper.slides[i].progress;
         let modify = 1;
         if (Math.abs(slideProgress) > 1) {
           modify = (Math.abs(slideProgress) - 1) * 0.3 + 1;
         }
         const translate = slideProgress * modify * 699 + 'px';
         const scale = 1 - Math.abs(slideProgress) / 4;
         const zIndex = 999 - Math.abs(Math.round(10 * slideProgress));

         slide.style.transform = `translateX(${translate}) scale(${scale})`;
         slide.style.zIndex = zIndex;
         slide.style.opacity = 1;
         if (Math.abs(slideProgress) > 0.5) {
           slide.style.opacity = 0.8;
         }
         if (Math.abs(slideProgress) > 1.5) {
           slide.style.opacity = 0;
         }
       }
     },
     setTransition: function (transition) {
   		for (var i = 0; i < this.slides.length; i++) {
   			var slide = this.slides.eq(i)
   			slide.transition(transition);
   		}
   	}
   },
 });

本文参考了
swiper横向轮播——阶梯式滚动轮播
slide ——首尾相接の平滑切换效果,
并在此基础上得出了自己的理解与总结。
如有错误,请指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/799588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2:SpringIOC

文章目录 一&#xff1a;Spring_IOC概念引入_重要1&#xff1a;Spring解耦合的原理2&#xff1a;创建一个spring项目并实现IOC基本功能 二&#xff1a;Spring_IOC原理分析 ***1&#xff1a;XML解析技术读取配置文件**2**&#xff1a;反射技术实例化对象,放到容器中3&#xff1a…

【C语言】—— 可变参数列表

C语言中的可变参数是一种特殊的函数参数&#xff0c;允许在函数定义中传递可变数量的参数。使用可变参数机制可以使函数更加灵活&#xff0c;可以根据不同的需求接受不同数量或类型的参数。 目录 &#xff08;一&#xff09;概念理解 &#xff08;二&#xff09;代码展示 1…

Games虚拟现实人本计算研究

晚上八点(北京时间)的 GAMES Webinar 《VR/AR专题》第二期即将开始&#xff01;&#x1f525;&#x1f525;&#x1f525; &#x1f4dc;本期主题&#xff1a;VR人本计算及交互 &#x1f468;&#x1f3fb;‍&#x1f3eb;嘉宾1&#xff1a;北京大学的李胜老师 &#x1f468;…

纪录片《打铁文艺社》:从全美高中生电影节到多项国际赞誉,聚焦城市公共艺术的蜕变之路

7月21日&#xff0c;在全美高中生电影节&#xff08;All American High School Film Festival&#xff0c;AAHSFF&#xff09;公布的入围名单中&#xff0c;一部取材于中国深圳的纪录片《打铁文艺社Datie: The Art Tribe of Tiegang》以其深刻的主题和精良的制作&#xff0c;引…

git 合并非关联分支

面对的场景&#xff1a;现在有三个仓库&#xff0c;一个是本地的仓库1&#xff0c;第二个是和仓库1关联的在github上的仓库2&#xff0c;第三个是把仓库1拷贝到一个无网络环境中持续开发一段时间的仓库3. 分析 基本想法是把仓库3作为仓库1的远程仓库&#xff0c;然后在仓库1上…

Clion配置与使用记录

Clion与ROS2、docker 为了能够在Docker中使用ROS2环境&#xff0c;同时Clion能够在编辑代码时可以有代码提示以及函数、变量跳转等功能 Docker配置 参考&#xff1a;Docker SSH配置 启动Docker&#xff0c;需要将端口映射&#xff0c;添加如下参数&#xff1a; -p 8024:22&…

Redis-基于内存的key-value结构数据库

读写性高&#xff0c;适合存储热点性高的数据 也称为结构化的NoSql数据库 redis依赖环境&#xff1a;gcc NoSql 非关系型数据库&#xff0c;是关系型数据库的补充 关系型(RDBMS)非关系型(NoSql)MySqlRedisOracleMongo dbDB2MemCachedSQLServer 常用命令 Redis 教程_redi…

手机中有三个特别耗电的功能,半天就耗掉一半电量,记得关掉

在现代社会&#xff0c;手机已经成为我们生活中不可或缺的伙伴。然而&#xff0c;随着手机功能的日益强大和应用的多样化&#xff0c;电池续航成为了许多人的困扰。您是否曾经经历过使用手机一半时间&#xff0c;电量却已经耗掉一半的情况&#xff1f;若是如此&#xff0c;可能…

Pytorch图像处理注意力机制SENet CBAM ECA模块解读

目录 1. 注意力机制 1.1 SENet&#xff08;Squeeze-and-Excitation Network&#xff09; 1.1.1 SENet原理 1.1.2 SENet代码示例 1.2 CBAM&#xff08;Convolutional Block Attention Module&#xff09; 1.2.1 CBAM原理 1.2.2 CBAM代码示例 1.3 ECA&#xff08;Efficien…

Vue中TodoLists案例_底部统计

与上一篇Vue中TodoList案例_删除有俩个文件变化了 App.vue&#xff1a;向儿子组件MyFooter传递参数todos <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"add…

每天一道C语言编程(递归:斐波那契数,母牛的故事)

递归的条件 递归函数必须有一个可直接退出的条件&#xff0c;否则会进入无限递归&#xff0c;例如 #include<stdio.h> void f(int n) {if(n<0)return;f(n-1);printf("%d ",n); }int main() {int n5;f(n);return 0;}//递归的出口 if(n<0) retur…

【docker】docker部署nginx

目录 一、步骤二、示例 一、步骤 1.搜索nginx镜像 2.拉取nginx镜像 3.创建容器 4.测试nginx 二、示例 1.搜索nginx镜像 docker search nginx2.拉取nginx镜像 docker pull nginx3.创建容器&#xff0c;设置端口映射、目录映射 # 在root目录下创建nginx目录用于存储nginx数据…

花色更潮的夜光飞盘,手感也很出色

飞盘运动因为易于入门&#xff0c;方便操作&#xff0c;一直以来都备受大家的喜爱&#xff0c;而近几年更是成为了一项非常流行的户外运动。每天玩上一局飞盘&#xff0c;不仅可以锻炼身体&#xff0c;还能够增强团队合作意识&#xff0c;让大家在运动中尽情享受乐趣。 这两天我…

【树上点对问题】Tree Problem

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 一个很裸的树形DP 对于树上的一对点&#xff0c;我们往往考虑更换枚举对象 如果关注的是路径经过边&#xff0c;那么就考虑一条边两端的连通分量 如果关注的是路径经过点&#xff0c;那么分成两部分考虑 一部…

郑州如何为SSL证书续期

SSL数字证书的主要作用就是保护网站传输数据安全&#xff0c;而我们要知道SSL证书是有时间限制&#xff0c;到期之后就会失效&#xff0c;对网站传输数据的加密保护也会失效&#xff0c;这就需要我们在失效前为SSL证书续期。那么我们该如何为SSL证书续期呢&#xff1f;今天随SS…

uniapp实现带参数二维码

view <view class"canvas"><!-- 二维码插件 width height设置宽高 --><canvas canvas-id"qrcode" :style"{width: ${qrcodeSize}px, height: ${qrcodeSize}px}" /></view> script import uQRCode from /utils/uqrcod…

断路器分合闸速断试验

试验目的 高压断路器的分、 合闸速度是断路器的重要特性参数, 反映出断路器的操动机构 与传动机构在分、 合闸过程中的运动特征。 断路器分、 合闸速度超出或者低于规定值 均会影响断路器的运行状态和使用寿命。 断路器合闸速度不足, 将会引起触头合闸振 颤, 预击穿时间过长。…

互联网医院小程序源码|互联网+智慧医院解决方案

随着互联网技术的迅猛发展&#xff0c;互联网医院系统开发逐渐受到人们的关注和需求。互联网医院系统是将传统医院服务与互联网技术相结合的创新模式&#xff0c;通过互联网平台为患者提供在线诊疗、预约挂号、药品配送等医疗服务。下面就来介绍一下互联网医院系统开发的优势。…

【宝藏系列】20个常用的Python技巧

【宝藏系列】20个常用的Python技巧 文章目录 【宝藏系列】20个常用的Python技巧&#x1f349;文末推荐【Python之光】 Python的可读性和简单性是其广受欢迎的两大原因&#xff0c;本文介绍20个常用的Python技巧来提高代码的可读性&#xff0c;并能帮助你节省大量时间&#xff0…

Python实现指定区域桌面变化监控并报警

在这篇博客中&#xff0c;我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统。我们将使用Tkinter库创建一个图形界面&#xff0c;允许用户选择监控区域&#xff0c;并使用OpenCV库进行图像处理和相似性比较&#xff0c;以检测区域内的变化&#x…