Bootstrap

使用 Swiper4.5.3、Swiper11 的示例

目录

1. Vue3 中使用 Swiper 4.5.3

1.1 安装 Swiper

1.2 声明 Swiper(shims-vue.d.ts)

1.3 使用 Swiper

2. jsp 静态页面中使用 Swiper 4.5.3

2.1 下载并引入 Swiper

2.2 使用 Swiper

2.3.1 结构

2.3.2 功能

2.3.3 样式

2.3 jsp 中引入静态资源路径示例

3. Vue3 中使用 Swiper11

3.1 安装 Swiper

3.2 使用 Swiper 

3.2.1 结构

3.2.2 功能

3.2.3 如何从 public 中读取 vue 项目配置?


★★★★★★ 使用 Swiper,必须要注意 版本 ★★★★★★

1. Vue3 中使用 Swiper 4.5.3

1.1 安装 Swiper

npm install swiper

1.2 声明 Swiper(shims-vue.d.ts)

注意:必须添加该声明,否则会报错!!

declare module 'swiper/vue'

1.3 使用 Swiper

vue 页面中,引入 Swiper :

// Swiper
import { Swiper, SwiperSlide } from 'swiper/vue';
import 'swiper/swiper.scss';
import SwiperCore, { Pagination, Autoplay } from 'swiper';

SwiperCore.use([Pagination, Autoplay]);

 components: {
    Swiper,
    SwiperSlide,
  },

vue 页面中,使用 Swiper:

        <!-- 轮播图 -->
        <swiper :pagination="{ clickable: true }" :autoplay="true">
          <swiper-slide
             v-for="(item, index) in imageList"
             :key="index"
             @click="toggleViewer(index)"
          >
            <img :src="item.src"/>
          </swiper-slide>
        </swiper>

    // 图片列表
    const imageList = [
      {
        src: require('@/assets/images/imagelist/001.png').default,
      },
      {
        src: require('@/assets/images/imagelist/002.png').default,
      },
      {
        src: require('@/assets/images/imagelist/003.png').default,
      }]

自定义 Swiper 样式:

.swiper-container {
  margin-top: 5px;
  width: 397px;
  height: 258px;
  border-radius: 5px;
  overflow: hidden;
  .swiper-slide {
    img {
      width: 100%;
      height: 100%;
    }
  }

/deep/.swiper-pagination {
  display: flex;
  position: absolute;
  bottom: 10px;
  z-index: 2;
  width: 100%;
  height: 7px;
  justify-content: center;
    .swiper-pagination-bullet {
      display: block;
      margin: 0 3.5px;
      width: 7px;
      height: 7px;
      background: #FFFFFF;
      border-radius: 50%;
    }
    .swiper-pagination-bullet-active {
      background: #3C88E6;
    }
  }
}

效果展示: 

2. jsp 静态页面中使用 Swiper 4.5.3

2.1 下载并引入 Swiper

<link rel="stylesheet" href="${ctx}/portal/default/js/swiper.min.css" />
<script src="${ctx}/portal/default/js/swiper.min.js"></script>
<script src="${ctx}/portal/default/js/jquery.min.js"></script>

2.2 使用 Swiper

2.3.1 结构

<div class="fri-links">
  <div class="swiper-container" id="swiperLinksFri">
    <div class="swiper-wrapper">
      <!-- 一页轮播 -->
      <div class="swiper-slide">
        <!-- 一页中的一行图片 -->
        <div class="item">
          <a class="grid" href="http://11.11.11.111/aaaaa/aaaa/aa/a.vm?eeee=1e76" target="_blank">
            <img src="$!ctx/portal/default/main/images/glzdhb.jpg" />
          </a>
        </div>
        <div class="item">
          <a class="grid" href="$!ctx/portal/index.htl?tid=secondpage&catalogcode=4a6c3834-9814-453b-be16-620597b77b9b&showDataTime=3" target="_blank">
            <img src="$!ctx/portal/default/main/images/right_04.jpg" />
          </a>
        </div>
      </div>
    </div>
    <!-- 分页 -->
    <div class="pagination"></div>
    <!-- 左右按钮 -->
    <div class="ctrl-btn">
      <a href="javascript:;" class="prev" id="fri-prev"></a>
      <a href="javascript:;" class="next" id="fri-next"></a>
    </div>
  </div>
</div>

2.3.2 功能

新建一个 swiper 对象,该方法接受两个参数 —— 挂载 swiper 的 dom元素、配置信息

给页面中指定的 dom元素 绑定切换事件

  $(function () {
  		function initLinkSwiper() {
				var linkSwiper = new Swiper(".swiper-container", {
					pagination: {
						el: ".swiper-container .pagination",
					},
					navigation: {
						nextEl: 'swiper-container .next',
      					prevEl: 'swiper-container .prev',
					},
					loop: true,
					autoplay: true,
				});
				
				$("#fri-prev").on("click", function (e) {
					e.preventDefault();
					linkSwiper.slidePrev();
				});
				$("#fri-next").on("click", function (e) {
					e.preventDefault();
					linkSwiper.slideNext();
				});
		}
		
		initLinkSwiper();
  });

2.3.3 样式

建议用开发者工具调试,别直接复制其他人的样式代码,版本不同,类名也会发生变化

<style>
  /* 友情链接 */
  .fri-links {
  position: relative;
  width: 100%;
  height: 253px;
  margin: 12px auto 0;
  padding: 30px 0;
  background: #ffffff;
  box-shadow: 0px 11px 27px 0px rgba(0, 0, 0, 0.06);
  }
  /* 轮播图外层容器 */
  .fri-links .swiper-container {
  height: 190px;
  width: 95%;
  }
  /* 图片容器区域 */
  .fri-links .swiper-wrapper {
  height: 100%;
  }
  /* 每页图片的容器 */
  .fri-links .swiper-slide {
  float: left;
  }
  /* 每页图片的 一行 容器 */
  .fri-links .swiper-slide .item {
  display: flex;
  padding: 0 70px;
  }
  .fri-links .swiper-slide .item:first-child {
  margin-bottom: 33px;
  }
  /* 单个图片容器(a链接包裹) */
  .fri-links .swiper-slide .item .grid {
  flex-wrap: nowrap;
  width: 226px;
  height: 61px;
  text-align: center;
  }
  .fri-links .swiper-slide .item .grid:not(:last-child) {
  margin-right: 70px;
  }
  /* 单个图片本身 */
  .fri-links .swiper-slide .item .gridimg {
  width: auto;
  height: 100%;
  }
  
  /* 分页容器 */
  .fri-links .pagination {
  display: block;
  position: absolute;
  bottom: 0 !important;
  z-index: 2;
  width: 65px;
  height: 10px;
  left: 765px;
  line-height: 10px;
  text-align: center;
  }
  /* 未选中的分页 */
  .fri-links .pagination .swiper-pagination-bullet {
  display: inline-block !important;
  width: 9px !important;
  height: 9px !important;
  margin-left: 18px !important;
  background: rgba(0, 0, 0, 0.2) !important;
  border-radius: 50% !important;
  transition: width 0.2s !important;
  cursor: pointer !important;
  }
  /* 被选中的分页 */
  .fri-links .pagination .swiper-pagination-bullet-active{
  width: 16px !important;
  height: 8px !important;
  background: linear-gradient(to right, #00c2ec, #11a3ff) !important;
  border-radius: 4px !important;
  }

  /* 左右切换按钮容器 */
  .fri-links .ctrl-btn {
  display: flex;
  justify-content: space-between;
  position: absolute;
  top: 87px;
  left: 42px;
  right: 42px;
  top: 60px;
  left: 0px;
  right: 0;
  z-index: 1;
  }
  /* 左右切换按钮 */
  .fri-links .ctrl-btn .prev,
  .fri-links .ctrl-btn .next {
  width: 14px;
  height: 32px;
  }
  .fri-links .ctrl-btn .prev {
  background: url($!ctx/portal/default/img/lf.png) no-repeat left center / 100%;
  }
  .fri-links .ctrl-btn .next {
  background: url($!ctx/portal/default/img/rt.png) no-repeat left center / 100%;
  }
  /* 当前激活的左右按钮 */
  .fri-links .ctrl-btn .prev:hover {
  background-image: url($!ctx/portal/default/img/lf-active.png);
  }
  .fri-links .ctrl-btn .next:hover {
  background-image: url($!ctx/portal/default/img/rt-active.png);
  }
</style>

2.3 jsp 中引入静态资源路径示例

url($!ctx/portal/default/img/lf.png)

$!ctx/portal/default/main/images/right_04.jpg

3. Vue3 中使用 Swiper11

3.1 安装 Swiper

// swiper
import { Swiper, SwiperSlide } from 'swiper/vue';
import { Navigation, Pagination, Scrollbar, A11y, Autoplay } from 'swiper/modules';
import 'swiper/css';
import 'swiper/css/navigation';
import 'swiper/css/pagination';
import 'swiper/css/scrollbar';
import 'swiper/css/autoplay';

3.2 使用 Swiper 

3.2.1 结构

      <!-- disableOnInteraction: false 手动干预后,仍然自动轮播,默认为 true,停止自动轮播 -->
      <swiper
        v-if="dataResourceClass.length"
        class="my-swiper"
        :modules="modules"
        :slides-per-view="7"
        :space-between="28"
        :pagination="{ enabled: true, type: 'bullets', clickable: true }"
        :autoplay="{ delay: 1000, disableOnInteraction: false, pauseOnMouseEnter: true }"
        @swiper="onSwiper"
        @slideChange="onSlideChange"
      >
        <swiper-slide v-for="(card, cIndex) of dataResourceClass" :key="cIndex">
          <div class="item-container" @click="addHomeJump(card)">
            <img class="item-img" :src="card?.imgUrl" :alt="card?.rname" />
            <h4 class="item-label">
              {{ card?.rname }}
            </h4>
          </div>
        </swiper-slide>
      </swiper>

3.2.2 功能

    const onSwiper = (swiper: any) => {
      // console.log(swiper);
    };

    const onSlideChange = () => {
      // console.log('slide change');
    };

    return {
      ...toRefs(state),
      onSwiper,
      onSlideChange,
      modules: [Navigation, Pagination, Scrollbar, A11y, Autoplay],
    };

3.2.3 如何从 public 中读取 vue 项目配置?

一般来讲,src 目录下的代码会被打包,public 目录下的代码不会被打包,那么把一些配置放在 public 下,就可以不用重新打包,直接修改配置实现新需求了

比如下面,我把图片配置抽出去了,在 src 里通过 axios 请求 public 下面的 json 文件,匹配 public 下面的图片信息 

    /**
     * 获取图片配置
     */
    const getImgConfig = async () => {
      const res = await axios.get(`${process.env.BASE_URL}global/config/data-resource-img.json`);
      // console.log('获取图片配置 ---', res.data.data);
      return res.data?.data || [];
    };

    /**
     * 匹配图片
     * @param name 数据资源分裂名称
     */
    const formatImg = (rname: any) => {
      // console.log(process.env);

      // 寻找配置中是否存在对应信息
      const config = state.imgConfig.filter((item: any) => item.name === rname)?.[0];
      // 若存在,则读取 public 下面的图片,拼接地址
      if (config) {
        const { name, img } = config;
        return `${process.env.BASE_URL}global/data-resource-classification/${img}`;
      }
      // 否则返回 assets 下的默认图片
      return QthjxxImg;
    };

    onMounted(async () => {
      // 获取图片列表
      state.imgConfig = await getImgConfig();
    });

;