很久之前做小程序时有个类似每日优鲜里储值卡充值界面里的 卡轮播和价格tab栏联动效果,当时觉得新鲜做出来之后也没当回事。直到今天又遇到了一个类似的功能,所以想着总结经验。

实现效果如下图:

图解:点击tab菜单 三个选项时,下面的轮播会随之滑动,下面的商品列表也会根据上面的tab选项变化。反之,当左右滑动切换swiper时,tab选择会随之选中高亮,下面的商品列表也会跟着变化。

实现思路:tab选项的个数跟swiper 滑块数量一致。可以根据当前选中/滑块获取索引值,展现相应的选中项/滑块。下面要展示的商品列表,因为有下拉加载更多的需求,需要另一个接口完成实现。根据当前选中项的状态值作为参数,去请求相对应得列表。

实现代码如下:

1、首先在项目里 npm install swiper vue-awesome-swiper --save

2、在main.js全局引入

import Vue from 'vue'
import VueAwesomeSwiper from 'vue-awesome-swiper' // import style
import 'swiper/css/swiper.css' Vue.use(VueAwesomeSwiper, /* { default options with global component } */)

3、或者在当前页面局部引入

import { Swiper, SwiperSlide } from 'vue-awesome-swiper'
import 'swiper/css/swiper.css' export default {
components: {
Swiper,
SwiperSlide
}
}

4、页面上使用如下:

<div class="coupon_bot">
<ul class="coupon_b_name">
<li v-for="(item,index) in cardList"
:key="index"
:class="{'actived':index == isActiveIndex}"
@click="handlerClick('cardChange',index)">
{{item.cardTypeName}}
</li>
</ul>
<swiper class="coupon_swiper swiper-container" :options="swiperOption" ref="mySwiper">
<swiperSlide v-for="(item,index) in cardList" :key="index" class="coupon_s_slider">
<div class="conpon_swiper_bg">
<ul class="con_swiper_content">
<li>
<span class="conpon_s_t">{{item.cardType == 1?'本月余额':'本月剩余'}}</span>
<span class="conpon_s_c" :class="{'conpon_price':item.cardType == 1}">{{item.notGet}}</span>
<i class="conpon_unit conpon_unit_ft" v-show="item.cardType != 1">张</i>
</li>
<li>
<span class="conpon_s_t">{{item.cardType == 1?'已用额度':'本月已用'}}</span>
<span :class="{'conpon_s_rprice':item.cardType == 1}" >{{item.isGet}}</span>
<i class="conpon_unit" v-show="item.cardType != 1">张</i>
</li>
<li>
<span class="conpon_s_t">{{item.cardType == 1?'本月限额':'本月总数'}}</span>
<span :class="{'conpon_s_rprice':item.cardType == 1}">{{item.ttlGet}}</span>
<i class="conpon_unit" v-show="item.cardType != 1">张</i>
</li>
</ul>
</div>
</swiperSlide>
</swiper>
</div>

5、data里初始化swiper

 swiperOption: {
autoplay: false,
loop: false,
spaceBetween : 10,
observer: true,
observeParents: true,
on: {
slideChangeTransitionEnd: function(){
_this.isActiveIndex = this.realIndex;//切换结束时,告诉我现在是第几个slide
_this.type = _this.cardList[_this.isActiveIndex].cardType;
_this.cardInfoList = [];
_this.pageNo = 1;
_this.isScroll = true;
_this.loading = true;
_this.getListData();
},
}
},

6、计算属性获取swiperDOM

 computed:{
swiper(){
return this.$refs.mySwiper.swiper
}
},

7、tab点击事件实现

handlerClick(action,data){
if(action == 'cardChange'){
//tab切换
this.loading = true;
this.isActiveIndex = data;
this.swiper.slideTo(this.isActiveIndex); //swiper滑动到相对应的滑块
document.documentElement.scrollTop = document.body.scrollTop = 0;
}
}

8、相对应的swiper scss样式如下

<style lang="scss" scoped>
@function rem($px) {
@return $px / 75 * 1rem;
}
$bg-color: #fff;
$text-color: #587BF3;
$money-color: #FD8040;
$title-color: #999;
.coupon_bot{
padding-top: rem(20);
.coupon_b_name{
display: flex;
color: $bg-color;
font-size: rem(32);
li{
flex: 1;
justify-content: space-between;
text-align: center;
padding: rem(10) 0;
}
.actived{
position: relative;
}
.actived::before{
content:'';
display: inline-block;
width: rem(64);
height: rem(4);
background: $bg-color;
border-radius: 2px;
position: absolute;
bottom: 0;
left: 50%;
margin-left: -13%;
}
}
.coupon_swiper{
padding: rem(30);
.coupon_s_slider{
width: rem(690) !important;
height: rem(200);
box-shadow: 0px rem(20) rem(30) 0px rgba(0, 0, 0, 0.06);
background: $bg-color;
border-radius: 16px;
.conpon_swiper_bg{
width: 100%;
height: 100%;
background: url('../../../static/images/coupon/swiperBg.png') no-repeat top right;
background-size: rem(485) rem(220);
.con_swiper_content{
padding: rem(50) rem(30);
display: flex;
justify-content: space-between;
li {
width: 33%;
text-align: center;
span{
color:#666;
font-weight: 500;
font-size: rem(40);
line-height: rem(48);
}
.conpon_s_t {
display: block;
color: $title-color;
font-size: rem(28);
line-height: rem(42);
margin-bottom: rem(30);
}
.conpon_s_c{
text-align: left;
display: inline-block;
color: #333;
font-size: rem(54);
}
.conpon_price{
font-size: rem(36);
}
.conpon_s_rprice{
font-size: rem(32);
}
.conpon_unit{
font-style: normal;
font-size: rem(28);
}
.conpon_unit_ft{
font-size: rem(36);
}
}
}
}
}
>>>.swiper-slide-active{
height: rem(220);
}
}
}
</style>

以上就实现了联动效果了(代码仅供参考)。

vue-awesome-swiper ---移动端h5 swiper 和 tab 栏选项联动效果实现的更多相关文章

  1. 16.vue-cli跨域,swiper,移动端项目

    ==解决跨域:== 1.后台 cors cnpm i -S cors 2.前端 jsonp 3.代理 webpack: myvue\config\index.js 找 proxyTable proxy ...

  2. vue移动端h5页面根据屏幕适配的四种方案

    最近做了两个关于h5页面对接公众号的项目,不得不提打开微信浏览器内置地图导航的功能确实有点恶心.下次想起来了的话,进行总结分享一下如何处理.在vue移动端h5页面当中,其中适配是经常会遇到的问题,这块 ...

  3. Swiper --移动端触摸滑动插件

    Swiper使用方法 1.首先加载插件,需要用到的文件有swiper.min.js和swiper.min.css文件. <!DOCTYPE html> <html> <h ...

  4. 使用swiper简单的h5下滑翻页效果,

    <!DOCTYPE html><html lang="en"><head>  <meta charset="utf-8" ...

  5. vue 的组件开发,以及swiper,axios的使用

    父组件<template> <div> <home-header :city="city"></home-header> //给子组 ...

  6. swiper移动端下不能正常轮播的解决方案-----此坑没躺过估计很难找到正确姿势

    <script> var mySwiper = new Swiper('.swiper-container', { direction: 'vertical', //horizontal横 ...

  7. Swiper 移动端全屏轮播图效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. 移动端 H5 页面注意事项

    1. 单个页面内容不能过多 设计常用尺寸:750 x 1334 / 640 x 1134,包含了手机顶部信号栏的高度. 移动端H5活动页面常常需要能够分享到各种社交App中,常用的有 微信.QQ 等. ...

  9. 移动端H5混合开发设置复盘与总结

    此篇接上一篇: 移动端H5混合开发,Touch触控,拖拽,长按, 滑屏 实现方案 https://www.cnblogs.com/buoge/p/9346699.html app 场布设置已经上线了, ...

随机推荐

  1. [Leetcode]585. 2016年的投资(MySQL)

    题目 写一个查询语句,将 2016 年 (TIV_2016) 所有成功投资的金额加起来,保留 2 位小数. 对于一个投保人,他在 2016 年成功投资的条件是: 他在 2015 年的投保额 (TIV_ ...

  2. [LeetCode]560. 和为K的子数组(前缀和)

    题目 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为 ...

  3. Windows10 安装 CUDA + cuDNN + pyTorch

    2020/5/29 在 windows10 上面安装 CUDA 和 cuDNN 0.简单了解一下 CUDA 和 cuDNN 1)什么是 CUDA CUDA(ComputeUnified Device ...

  4. 并发编程中死锁、递归锁、进程/线程池、协程TCP服务器并发等知识点

    1.死锁 定义; 类似两个人分别被囚禁在两间房子里,A手上拿着的是B囚禁房间的钥匙,而B拿着A的钥匙,两个人都没法出去,没法给对方开锁,进而造成死锁现象.具体例子代码如下: # -*-coding:u ...

  5. Guava Cache详解

    适用性 缓存在很多场景下都是相当有用的.例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存 Guava Cache与ConcurrentMap很相似,但也不 ...

  6. 解决npm被墙的问题

    npm存储包文件的服务器在国外,有时候会被墙,速度很慢,所以我们需要解决这个问题. http://npm.taobao.org/  淘宝的开发团队把npm在国内做了一个备份. 安装淘宝的cnpm np ...

  7. Docker:四、Docker进阶 Windows Docker IIS 部署

    前面的三篇docker 文档大家看的肯定不过瘾,自己可能也已经上手一试了...不知道有没有发现问题... 哈哈... 我来说说我遇到的问题哦 一.windows docker 镜像越来越大 默认的do ...

  8. 逻辑漏洞介绍 & 越权访问攻击 & 修复建议

    介绍逻辑漏洞 逻辑漏洞就是指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性.一般出现在密码修改.越权访问.密码找回.交易支付金额等功能处.其中越权访问又有水平越权和垂直越权两种,如下所示. ...

  9. gateway(二、过滤器)

    过滤器其实是路由转发+过滤器 自定义过滤器 首先创建一个类继承下边两个类,实现过滤器 然后在启动项中通过创建bean的方式创建路由器 @Componentpublic class TimeFilter ...

  10. @DependsOn注解的使用

    如果Bean A 在创建前需要先创建BeanB此时就可以使用DependsOn注解 @Configuration public class MyConfig { @Bean @DependsOn(&q ...