这里很感谢 http://www.jb51.net/article/110325.htm 这篇文章带来的启发
但是我和他不同,网上的方法都是 这样计算滚动条距离窗口顶部的距离,注意是窗口,用的是document对象
// Chrome
document.body.scrollTop
// Firefox
document.documentElement.scrollTop
// Safari
window.pageYOffset
我这项目就无法正常这样使用了,首先我们vue项目有个总页面layout组件,左侧分 menu组件,最上方fixed了两块div,最后加上content页面内容给用户看的主界面,所有的页面都是这样渲染进layout__content里的 这就导致无法使用document对象来获取滚动条高度
具体的效果如图:
我调试发现,页面在某一块 上有css,滚动条就在这上面,所以,我这里使用的@scroll方法,
注意是@scroll 而不是scroll.native,
handleScroll (el) {
this.scrollTop = this.$refs.content.scrollTop
},
this.$refs.content.scrollTop 打印出来就是滚动条距离页面的距离
scrollTop 这个data属性,我通过props将其传到了子组件zhong,通过页面共同的入口router-view导入
当然这就将这个属性,所有页面都能接收到了,感觉不是很好,暂且先这样实现
回到我本身的展示页面,子组件 监听scrollTop
props: ['scrollTop'],
watch: {
scrollTop (val) {
this.onScroll()
this.pageTop = val
}
},
这里的pageTop 我这里做了一下赋值,因为尽量别直接在子组件改变props的值
created () {
this.$nextTick(() => {
this.pageTop = this.scrollTop
})
},
onScroll () {
let _article = document.querySelectorAll('.step-jump')
_article.forEach((item, index) => {
if (this.scrollTop >= item.offsetTop) {
this.activeStep = index
}
})
},
监听鼠标滚动事件,这样就可以实现了,当然我的页面html是这样的情况,以各个小组件拼接起来,夹杂着用来定位的相同class的div元素
<div class="step-jump"></div>
<md-adminttance></md-adminttance>
<div class="step-jump"></div>
<md-supper-chain></md-supper-chain>
<div class="step-jump"></div>
<md-trade></md-trade>
<div class="step-jump"></div>
<md-applicant></md-applicant>
<div class="step-jump"></div>
<md-contract></md-contract>
<div class="step-jump"></div>
<md-blacklist></md-blacklist>
现在来看一下step元素,如果你需要用到自定义的icon,需要加上这个属性,源码通过是否传入这个来判断是 icon 还是 text
<el-steps
direction="vertical"
finish-status="wait"
:active="activeStep">
<el-step
v-for="(item, index) in steps"
:key="index"
icon=" "
:title="item.title"
@click.native="jump(index)">
<dl-icon slot="icon" :type="index === 0 ? 'yinzhang' : 'shixinyuan'"
:color="index === 0 ? '#383636' : '#BEC0C2'" size="0.5"></dl-icon>
</el-step>
</el-steps>
点击事件方法 jump
jump (index) {
let that = this
this.activeStep = index
// 用 class="step-jump" 添加锚点
let jump = document.querySelectorAll('.step-jump')
let total = jump[index].offsetTop
console.log('纵坐标', total)
// this.$emit('viewScroll', total)
let distance = this.pageTop
// 平滑滚动,时长500ms,每10ms一跳,共50跳
let step = total / 50 >> 0
console.log(step, '222')
if (total > distance) {
smoothDown()
} else {
let newTotal = distance - total
step = newTotal / 50 >> 0
smoothUp()
}
function smoothDown () {
if (distance < total) {
distance += step
that.$emit('viewScroll', distance)
setTimeout(smoothDown, 10)
} else {
that.$emit('viewScroll', total)
}
}
function smoothUp () {
if (distance > total) {
distance -= step
that.$emit('viewScroll', distance)
setTimeout(smoothUp, 10)
} else {
that.$emit('viewScroll', total)
}
}
},
这里就是借鉴了网友的想法,每一小段一小段的跳,这样会导致视觉上是一个平滑的效果,而不是我点击了就突然scrollTop就突然下去或者上来,避免了很突兀的感觉。
有什么问题或建议,请直接提出来,谢谢哟
完善一下上面的代码,将多次emit事件删除,直接写入到父组件中!!!来判断
!!!! 其实上面这种实现还是有很大水分的,如果滚动条是相对于浏览器窗口的,其实直接document对象 判断scrollTop即可,另写一篇文章来重新书写vue scroll平滑滚动!_最新的优化 _可以看这个 ==========>>>>>>
https://blog.csdn.net/shentibeitaokong/article/details/81349819
Original url: Access
Created at: 2018-11-21 15:55:35
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论