最近在学习VUE。自己就在研究怎么用VUE实现一个组件的封装,今日就算留个笔记

前言
返回顶部这个功能用jq实现,好容易实现,一个animate配合scrollTo就搞定了
今天我们来试试vue封装一个原生js实现的返回顶部;
写起来够呛,借助github,看了别人的gist,稍微封装了下;
当然不是用scrollTo直接调位那种,没有过渡效果怎么说得过去!!还是捣鼓出来了.
废话不多说,看效果图…
效果图
实现思路
你能学到什么?
实现功能
代码
scrollIt.js –过渡滚动实现
export function scrollIt(
destination = 0,
duration = 200,
easing = "linear",
callback
) {
// define timing functions -- 过渡动效
let easings = {
// no easing, no acceleration
linear(t) {
return t;
},
// accelerating from zero velocity
easeInQuad(t) {
return t * t;
},
// decelerating to zero velocity
easeOutQuad(t) {
return t * (2 - t);
},
// acceleration until halfway, then deceleration
easeInOutQuad(t) {
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
},
// accelerating from zero velocity
easeInCubic(t) {
return t * t * t;
},
// decelerating to zero velocity
easeOutCubic(t) {
return --t * t * t + 1;
},
// acceleration until halfway, then deceleration
easeInOutCubic(t) {
return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
},
// accelerating from zero velocity
easeInQuart(t) {
return t * t * t * t;
},
// decelerating to zero velocity
easeOutQuart(t) {
return 1 - --t * t * t * t;
},
// acceleration until halfway, then deceleration
easeInOutQuart(t) {
return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;
},
// accelerating from zero velocity
easeInQuint(t) {
return t * t * t * t * t;
},
// decelerating to zero velocity
easeOutQuint(t) {
return 1 + --t * t * t * t * t;
},
// acceleration until halfway, then deceleration
easeInOutQuint(t) {
return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;
}
};
// requestAnimationFrame()的兼容性封装:先判断是否原生支持各种带前缀的
//不行的话就采用延时的方案
(function() {
var lastTime = 0;
var vendors = ["ms", "moz", "webkit", "o"];
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame =
window[vendors[x] + "RequestAnimationFrame"];
window.cancelAnimationFrame =
window[vendors[x] + "CancelAnimationFrame"] ||
window[vendors[x] + "CancelRequestAnimationFrame"];
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() {
callback(currTime + timeToCall);
}, timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
})();
function checkElement() {
// chrome,safari及一些浏览器对于documentElemnt的计算标准化,reset的作用
document.documentElement.scrollTop += 1;
let elm =
document.documentElement.scrollTop !== 0
? document.documentElement
: document.body;
document.documentElement.scrollTop -= 1;
return elm;
}
let element = checkElement();
let start = element.scrollTop; // 当前滚动距离
let startTime = Date.now(); // 当前时间
function scroll() { // 滚动的实现
let now = Date.now();
let time = Math.min(1, (now - startTime) / duration);
let timeFunction = easings[easing](time);
element.scrollTop = timeFunction * (destination - start) + start;
if (element.scrollTop === destination) {
callback; // 此次执行回调函数
return;
}
window.requestAnimationFrame(scroll);
}
scroll();
}
backToTop.vue
<template>
<div class="back-to-top" @click="backToTop" v-show="showReturnToTop" @mouseenter="show" @mouseleave="hide">
<i :class="[bttOption.iClass]" :style="{color:bttOption.iColor,'font-size':bttOption.iFontsize}"></i>
<span class="tips" :class="[bttOption.iPos]" :style="{color:bttOption.textColor}" v-show="showTooltips">{{bttOption.text}}</span>
</div>
</template>
<script>
import { scrollIt } from './scrollIt'; // 引入动画过渡的实现
export default {
name: 'back-to-top',
props: {
text: { // 文本提示
type: String,
default: '返回顶部'
},
textColor: { // 文本颜色
type: String,
default: '#f00'
},
iPos: { // 文本位置
type: String,
default: 'right'
},
iClass: { // 图标形状
type: String,
default: 'fzicon fz-ad-fanhuidingbu1'
},
iColor: { // 图标颜色
type: String,
default: '#f00'
},
iFontsize: { // 图标大小
type: String,
default: '32px'
},
pageY: { // 默认在哪个视图显示返回按钮
type: Number,
default: 400
},
transitionName: { // 过渡动画名称
type: String,
default: 'linear'
}
},
data: function () {
return {
showTooltips: false,
showReturnToTop: false
}
},
computed: {
bttOption () {
return {
text: this.text,
textColor: this.textColor,
iPos: this.iPos,
iClass: this.iClass,
iColor: this.iColor,
iFontsize: this.iFontsize
}
}
},
methods: {
show () { // 显示隐藏提示文字
return this.showTooltips = true;
},
hide () {
return this.showTooltips = false;
},
currentPageYOffset () {
// 判断滚动区域大于多少的时候显示返回顶部的按钮
window.pageYOffset > this.pageY ? this.showReturnToTop = true : this.showReturnToTop = false;
},
backToTop () {
scrollIt(0, 1500, this.transitionName, this.currentPageYOffset);
}
},
created () {
window.addEventListener('scroll', this.currentPageYOffset);
},
beforeDestroy () {
window.removeEventListener('scroll', this.currentPageYOffset)
}
}
</script>
<style scoped lang="scss">
.back-to-top {
position: fixed;
bottom: 5%;
right: 100px;
z-index: 9999;
cursor: pointer;
width: auto;
i {
font-size: 32px;
display: inline-block;
position: relative;
text-align: center;
padding: 5px;
background-color: rgba(234, 231, 231, 0.52);
border-radius: 5px;
transition: all 0.3s linear;
&:hover {
border-radius: 50%;
background: #222;
color: #fff !important;
}
}
.tips {
display: inline-block;
position: absolute;
word-break: normal;
white-space: nowrap;
width: auto;
font-size: 12px;
color: #fff;
z-index: -1;
}
.left {
right: 0;
top: 50%;
margin-right: 50px;
transform: translateY(-50%);
}
.right {
left: 0;
top: 50%;
margin-left: 50px;
transform: translateY(-50%);
}
.bottom {
bottom: 0;
margin-top: 50px;
}
.top {
top: 0;
margin-bottom: 50px;
}
}
</style>
总结
从心血来潮到折腾出来,为了兼顾兼容性和拓展性,好像几个小时了.
不过实现了.你再搬到其他语言,类似ng4,也就是十来分钟的事情,
思路会了,实现更多的是写法而已,至于性能优化,可以一边写一边考虑,也可以实现后有空再优化.
希望对大家的学习有所帮助,也希望大家多多支持。
# Vue
# 返回顶部
# vue实现返回顶部
# vue返回顶部组件
# Vue实现返回顶部按钮实例代码
# vue实现移动端返回顶部
# vue进入页面时不在顶部
# 检测滚动返回顶部按钮问题及解决方法
# vue项目tween方法实现返回顶部的示例代码
# vue开发公共组件之返回顶部
# 自定义
# 的是
# 相关知识
# 默认值
# 就在
# 看了
# 说得过去
# 开了
# 你能
# 上下左右
# 可以实现
# 你再
# 多说
# 更强
# 装了
# 搬到
# 心血来潮
# 十来
# 几个小时
# 回调
相关文章:
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
如何在宝塔面板创建新站点?
如何用免费手机建站系统零基础打造专业网站?
宝塔新建站点为何无法访问?如何排查?
建站之星云端配置指南:模板选择与SEO优化一键生成
如何做静态网页,sublimetext3.0制作静态网页?
广州美橙建站如何快速搭建多端合一网站?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
h5在线制作网站电脑版下载,h5网页制作软件?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
七夕网站制作视频,七夕大促活动怎么报名?
Swift中switch语句区间和元组模式匹配
怎么将XML数据可视化 D3.js加载XML
网站制作说明怎么写,简述网页设计的流程并说明原因?
测试制作网站有哪些,测试性取向的权威测试或者网站?
创业网站制作流程,创业网站可靠吗?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
制作公司内部网站有哪些,内网如何建网站?
如何在IIS服务器上快速部署高效网站?
如何确保FTP站点访问权限与数据传输安全?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何用PHP工具快速搭建高效网站?
专业网站建设制作报价,网页设计制作要考什么证?
c# 在高并发场景下,委托和接口调用的性能对比
高性价比服务器租赁——企业级配置与24小时运维服务
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星收费标准详解:套餐费用及年费价格表一览
哈尔滨网站建设策划,哈尔滨电工证查询网站?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
建站之星如何快速更换网站模板?
如何用PHP快速搭建CMS系统?
如何快速辨别茅台真假?关键步骤解析
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
建站主机如何选?性能与价格怎样平衡?
电商网站制作公司有哪些,1688网是什么意思?
如何通过多用户协作模板快速搭建高效企业网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
如何在建站之星绑定自定义域名?
如何在建站之星网店版论坛获取技术支持?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何快速搭建FTP站点实现文件共享?
广德云建站网站建设方案与建站流程优化指南
,网页ppt怎么弄成自己的ppt?
高端建站如何打造兼具美学与转化的品牌官网?
中山网站推广排名,中山信息港登录入口?
*请认真填写需求信息,我们会在24小时内与您取得联系。