Swiper库实现轮播和图片镜头拉近JS效果
- 作者: 刘杰
- 来源: 技术那些事
- 阅读:192
- 发布: 2025-08-12 15:17
- 最后更新: 2025-08-12 15:17
最近在升级博客的界面,用到 swiper 做轮播图的各种切换效果。这里贴出一个实例。可以直接拿去用。轮播图的各种参数配置,可以参见 swiper 的配置文档。网上搜下到处都是。另外通过样式来实现图片的一个动画的缩放效果。这里用了两种方式来实现。
swiper version: 11.2 注意,不同版本的语法,稍微有些差异。
Swiper库实现轮播和图片尽头拉近JS效果最终示例代码

文字的蒙层效果,需要自己实现下,也很简单,通过position:absolute即可实现。
方法一,通过样式控制图片的的缩放效果
        
            
        
        
            
                html
            
            
            
                
            
        
    
<html>
<head>
    <!-- CSS 样式 -->
	<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css">
	<!-- JavaScript 核心库(包含所有模块) -->
	<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
    <style>
    html, body {
      position: relative;
      height: 100%;
    }
    body {
      background: #eee;
      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
      font-size: 14px;
      color:#000;
      margin: 0;
      padding: 0;
    }
    .swiper-container {
      position: relative;
      width: 500px;
      height: 500px;
      overflow: hidden;
    }
    .swiper-slide img{
  		width:100%;
  		height:auto;
  		min-height:100%;
  		transition:1s linear 2s;
  		transform:scale(1.1,1.1);
		}
    .swiper-slide-active img,.swiper-slide-duplicate-active img{
  		transition:6s linear;
  		transform:scale(1,1);
		}	
  </style>
</head>
<body>
    <div class="swiper-container">
        <div class="swiper-wrapper">
          <div class="swiper-slide"><img src="https://p8.itc.cn/q_70/images03/20230227/5c05fcbe3aff43a2a08019e1a37e59b3.jpeg" alt="这里是图片"/></div>
          <div class="swiper-slide"><img src="https://img95.699pic.com/xsj/2k/49/mh.jpg!/fw/700/watermark/url/L3hzai93YXRlcl9kZXRhaWwyLnBuZw/align/southeast"></div>
          <div class="swiper-slide"><img src="https://imgs.699pic.com/images/328/265/220.jpg!list1x.v2"></div>
        </div>
        <!-- Add Pagination -->
        <div class="swiper-pagination swiper-pagination-white"></div>
        <!-- Add Arrows -->
        <div class="swiper-button-next swiper-button-white"></div>
        <div class="swiper-button-prev swiper-button-white"></div>
    </div>
    <script>
    var swiper = new Swiper('.swiper-container', {
  	  autoplay: {
    		delay: 5000,
    		disableOnInteraction: false,
  	  },
      speed:500,
      spaceBetween: 30,
      effect: 'fade',
	    loop:true,//必须
      pagination: {
        el: '.swiper-pagination',
        clickable: true,
      },
      navigation: {
        nextEl: '.swiper-button-next',
        prevEl: '.swiper-button-prev',
      },
    });
  </script>
</body>
</html>
方法二,通过 js 来控制动画样式的重绘
html 结构,请参照方法一的代码即可。
        
            
        
        
            
                ts
            
            
            
                
            
        
    
// 样式根据需要来导入,用不到的不用导入
import 'swiper/css';
import 'swiper/css/effect-coverflow';
import 'swiper/css/effect-cube';
import 'swiper/css/effect-fade';
import 'swiper/css/navigation';
import 'swiper/css/pagination';
import Swiper from 'swiper';
import { EffectCoverflow, EffectCube, Navigation, Pagination, Autoplay, EffectFade } from 'swiper/modules';
// 获取实际的轮播的节点,注意不能用 swiper.slides 中的节点,因为里面可能有克隆的节点,会导致样式失效
const realSlides = Array.from(document.querySelectorAll('.swiper-container .swiper-slide')) ?? [];
var swiperBanner = new Swiper('.swiper-container', {
    modules: [Autoplay, Pagination, EffectFade],
    effect: 'fade',
    loop: true,
    initialSlide: 0,
    autoplay: {
        delay: 3000,
        disableOnInteraction: false,
        pauseOnMouseEnter: true,
    },
    pagination: {
        el: '.swiper-pagination',
        clickable :true,
    },
    fadeEffect: {
        crossFade: true
    },
    on: {
        snapIndexChange: (swiper: Swiper) => {
            if (realSlides.length <= 1) {
                return;
            }
            const activeImage = realSlides[swiper.realIndex].querySelector('img');
            if (!activeImage) {
                return;
            }
			// 每次清空样式
            activeImage.style.transition = 'none';
            activeImage.style.transform = `scale(1.3)`;
            // 重绘触发样式更新
            void activeImage.offsetWidth;
            activeImage.style.transform = 'scale(1)';
            activeImage.style.transition = 'transform 3.5s ease-out';
        }
    },
});
