Swiper实现导航栏滚动效果


Posted in Javascript onOctober 16, 2020

在一些移动app中,总能看到导航栏是可以滚动,下列例子是在vant的官方文档中看到的,这样的滚动效果利用Swiper也可以实现,效果实现的思路是,根据当前点击的“标签”为起点,当前标签”的位置大于视口的一半时,让容器的位置偏移一定的位置,让当前点击的“标签”始终在视口的中间位置。

Swiper实现导航栏滚动效果

1、引入相关插件

<link rel="stylesheet" href="../css/swiper.css" >
<script src="http://www.jq22.com/jquery/jquery-1.7.1.js"></script>
<script src="../js/swiper.js"></script>

2、编写view(界面)

<div class="box">
 <div class="swiper-container">
 <div class="swiper-wrapper">
 <div class="swiper-slide">综合</div>
 <div class="swiper-slide">单曲</div>
 <div class="swiper-slide">视频</div>
 <div class="swiper-slide">歌手</div>
 <div class="swiper-slide">专辑</div>
 <div class="swiper-slide">歌单</div>
 <div class="swiper-slide">主播电台</div>
 <span></span>
 </div>
 </div>
</div>

3、编写style

*{
 margin: 0;
 padding: 0;
 }
 .box{
 width: 500px;
 height: 50px;
 border: 1px solid #000;
 margin: 100px auto;
 }
 .swiper-container{
 width: auto!important;
 height: 100%;
 text-align: center;
 line-height: 50px;
 color: #000;
 font-size: 20px;
 }
 .swiper-wrapper{
 position: relative;
 width: auto!important;
 height: 100%;
 }
 .swiper-slide {
 list-style: none;
 display: flex;
 justify-content: flex-start;
 flex-wrap: nowrap;
 cursor: pointer;
 }
 .swiper-wrapper span{
 position: absolute;
 height: 3px;
 background: #000;
 left: 1%;
 top: 85%;
 }
 .swiper-slide{
 width: auto!important;
 margin-right: 15px!important;
 padding: 0 18px;
 }

为了让每个swiper-slide的宽度由内容撑起,右边显示一半是提示用户这个导航栏是可以滚动的,所以在初始化时要设置swiper的slidesPerView为auto,slidesPerView: “auto”, 同时要在css设置swiper-slide的样式为:

.swiper-slide{
 width: auto!important;
 margin-right: 15px!important;
 padding: 0 18px;
 }

Swiper实现导航栏滚动效果

这样swiper-slide的宽度就是由内容撑起了,而且可以自由的进行滚动了

Swiper实现导航栏滚动效果

4、编写js

$(function () {
 $(".swiper-wrapper span").css({width: $(".swiper-slide")[0].offsetWidth});
 let navScroll = new Swiper('.box .swiper-container', {
 freeMode:true,
 slidesPerView: "auto",
 freeModeMomentumRatio: 0.5,
 on:{
 //当前swiper-slide点击时触发事件
 click:function (e) {
  let thisWidth = this.clickedSlide.offsetWidth;
  let thisLeft = this.clickedSlide.offsetLeft;
  let offsetX = this.width / 2 - thisLeft - thisWidth / 2;
  //偏移量在1/2视口内时,容器不发生偏移
  if (offsetX > 0){
  offsetX = 0;
  }
  //offsetX小于容器最大偏移时,让偏移量等于容器最大的偏移量
  else if (offsetX < this.maxTranslate()){
  offsetX = this.maxTranslate();
  }
  //设置容器的过渡动画
  this.setTransition(300);
  this.setTranslate(offsetX);
  //滚动条位置和长度执行动画
  $(".swiper-wrapper span").animate({left: thisLeft, width: thisWidth},400);
 }
 }
 });
 })

最终效果

Swiper实现导航栏滚动效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript Onunload与Onbeforeunload使用小结
Dec 31 Javascript
简单时间提示DEMO从0开始一直进行计时
Nov 19 Javascript
jquery使用jxl插件导出excel示例
Apr 14 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
Jun 08 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
Sep 22 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
Feb 17 Javascript
d3.js入门教程之数据绑定详解
Apr 28 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
Aug 16 Javascript
three.js实现3D模型展示的示例代码
Dec 31 Javascript
使用socket.io实现简单聊天室案例
Jan 02 Javascript
浅谈Fetch 数据交互方式
Dec 20 Javascript
element-ui 弹窗组件封装的步骤
Jan 22 Javascript
node.js通过url读取文件
Oct 16 #Javascript
vue组件实现移动端九宫格转盘抽奖
Oct 16 #Javascript
Vue3.0的优化总结
Oct 16 #Javascript
JavaScript通如何过RGraph实现动态仪表盘
Oct 15 #Javascript
利用js实现简易红绿灯
Oct 15 #Javascript
关于Node.js中频繁修改代码重启服务器的问题
Oct 15 #Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 #Javascript
You might like
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
javascript 特殊字符串
2009/02/25 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
python3实现随机数
2018/06/25 Python
python实现字符串加密成纯数字
2019/03/19 Python
python变量的存储原理详解
2019/07/10 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
致百米运动员广播稿
2014/01/29 职场文书
文科生自我鉴定
2014/02/15 职场文书
社区春季防火方案
2014/06/02 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js