原生js造轮子之模仿JQ的slideDown()与slideUp()
代码如下:
const slider = (function() {
var Slider = {};
// the constructed function,timeManager,as such that's a manager about managing the setInterval
function TimerManager() {
this.timers = [];
this.args = [];
this.isTimerRun = false;
}
// if the element can't has the property of TimerManage what represented the constructor function,repeated creating a constructed function
TimerManager.makeTimerManage = function(element) {
if (
!element.TimerManage ||
element.TimerManage.constructor !== TimerManager
) {
element.TimerManage = new TimerManager();
}
};
// That's order to create the method what add the timer
TimerManager.prototype.add = function(timer, args) {
this.timers.push(timer);
this.args.push(args);
this.timerRun();
};
// called the method is order to run the timer by ordering
TimerManager.prototype.timerRun = function() {
if (!this.isTimerRun) {
var timer = this.timers.shift(),
args = this.args.shift();
if (timer && args) {
this.isTimerRun = true;
timer(args[0], args[1]);
}
}
};
// let it run the next timer
TimerManager.prototype.next = function() {
this.isTimerRun = false;
this.timerRun();
};
function slideUp(element, time) {
if (element.offsetHeight > 0) {
var totalHeight = element.offsetHeight;
var currentHeight = totalHeight;
var reduceValue = totalHeight / (time / 10);
element.style.transition = "height " + time + " ms";
element.style.overflow = "hidden";
var timer = setInterval(function() {
currentHeight -= reduceValue;
element.style.height = currentHeight + "px";
if (currentHeight <= 0) {
clearInterval(timer);
element.style.display = "none";
element.style.height = totalHeight + "px";
if (
element.TimerManage &&
element.TimerManage.constructor === TimerManager
) {
element.TimerManage.next();
}
}
}, 10);
} else {
if (
element.TimerManage &&
element.TimerManage.constructor === TimerManager
) {
element.TimerManage.next();
}
}
}
function slideDown(element, time) {
if (element.offsetHeight <= 0) {
element.style.display = "block";
element.style.transition = "height" + time + " ms";
element.style.overflow = "hidden";
var totalHeight = element.offsetHeight;
var currentHeight = 0;
element.style.height = "0px";
var addValue = totalHeight / (time / 10);
var timer = setInterval(function() {
currentHeight += addValue;
element.style.height = currentHeight + "px";
if (currentHeight >= totalHeight) {
clearInterval(timer);
element.style.height = totalHeight + "px";
if (
element.TimerManage &&
element.TimerManage.constructor === TimerManager
) {
element.TimerManage.next();
}
}
}, 10);
} else {
if (
element.TimerManage &&
element.TimerManage.constructor === TimerManager
) {
element.TimerManage.next();
}
}
}
// the interface about slideUp method
Slider.slideUp = function(element) {
TimerManager.makeTimerManage(element);
element.TimerManage.add(slideUp, arguments);
return this;
};
// the interface about slideDown method
Slider.slideDown = function(element) {
TimerManager.makeTimerManage(element);
element.TimerManage.add(slideDown, arguments);
return this;
};
return Slider;
})();
原生调用:
//该js文件中加入这一行代码
window.slider = slider;
//参数1,dom,参数2:时间
slider.slideDown(document.queryselector(),time);
slider.slideUp(document.queryselector(),time);
vue.js调用:
//该js文件加入这一行代码
export default slider;
main.js中引入:
import slider from 'slider.js';
//绑定到Vue实例原型上
Vue.prototype.slider = slider;
//组件中调用
this.slider(this.$refs,time);原生js造轮子之模仿JQ的slideDown()与slideUp()的更多相关文章
- 如何用js造轮子
写了一个非常通俗易懂的造轮子的方法 <div class="wrap"></div> <div class="wrap">& ...
- 使用原生 python 造轮子搭建博客
这篇用来 记录一个 从零开始的 博客搭建,希望坚持下去,因为python 开发效率令人发指,所以会原生从零写 ORM ,Web 框架 前提是打好 异步 io 的基础, 使用异步,有一点要谨记,一旦开始 ...
- 造轮子,模仿WPF的UI框架,还没完善。。。
Wtf(暂时命名,随便起的 = _=),模仿WPF的框架,还没有完善,只有简单的基础元素,支持数据绑定.虽然支持mono但是mono有bug 写这个只是兴趣爱好,感觉也没多大意义了,如果这个UI框架完 ...
- jq与原生js实现收起展开效果
jq与原生js实现收起展开效果 (jq需自己加载) <!DOCTYPE html> <html> <head> <meta charset="UTF ...
- 原生JS实现省市区(县)三级联动选择
原文地址→看过来 写在前面 前段时间写一个关于天气的东西,里面的省市区(县)城市选择让我很头疼,在网上搜索出来大都是借助插件或者第三方库,感觉这样做代码会很重,所以索性就把几种城市选择的方式实现一遍, ...
- 表单验证--通过原生js模仿ajax的异步交互
今天给大家带来个福利,我也是刚刚学习的很实用的一个东西,通过原生js模仿ajax的异步交互. 我的博客只是给那些新手看的大神勿喷,写的不好可留言,请指出. 因为当初自己学的时候一个问题不会找人问,知道 ...
- 抛弃JQ,回归原生js……
之前我写过一篇文章叫做<jq不会被淘汰>--而事实上它真的不会被淘汰,因为即使在mvvm框架盛行的今天,原生js的api越来越友好的今天,jq依然在用户量上是霸主-- 但是今天我们要讨论的 ...
- JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性)
JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性) 以下内容: 一.获取元素的属性 二.设置元素的属性 三.删除元素的属性 一.获取元素的属性 1-原生JS 获取属性 .ge ...
- 导航栏中各按钮在点击当前按钮变色其他按钮恢复为原有色的实现方法(vue、jq、原生js)
一.vue如何实现? 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
随机推荐
- [GYCTF2020]Ezsqli 无列名注入
手工注入了几下,是数字注入,过滤了 or , union 输入1||1=1 回显Nu1L 再输入 1&&(ascii(substr(database(),1,1))>32)# ...
- csv/json/list/datatable导出为excel的通用模块设计
导出excel的场景我一般都是一个List直接导出成一张sheet,用Npoi.Mapper库很方便,最近我经常是需要将接口返回的jsonarray转成一张excel表,比如从elasticsearc ...
- Python:Python2和3不同print汉字方式
Python3: 可以直接通过print('你好')输出 Python2: 需在开头加#encoding=UTF-8 不过之前输出的时候即使加了开头一行,也是一些混乱的汉字,一看就知道编码错误,后来我 ...
- JVM探究 面试题 JVM的位置 三种JVM:HotSpot 新生区 Young/ New 养老区 Old 永久区 Perm 堆内存调优GC的算法有哪些?标记清除法,标记压缩,复制算法,引用计数法
JVM探究 面试题: 请你弹弹你对JVM的理解?Java8虚拟机和之前的变化更新? 什么是OOM?什么是栈溢出StackOverFlowError?怎么分析 JVM的常用调优参数有哪些? 内存快照如何 ...
- For循环案例练习一基础版
输出1-10之间的数据 1 public class LX1 { 2 public static void main(String[] args) { 3 for (int x=1;x<=10; ...
- UVA1389 Hard Life (01分数规划+最大流)
UVA1389 Hard Life (01分数规划+最大流) Luogu 题目描述略 题解时间 $ (\frac{\Sigma EdgeCount}{\Sigma PointCount})_{max} ...
- Flutter入门教程(二)开发环境搭建
学习Flutter,首先需要搭建好Flutter的开发环境,下面我将一步步带领大家搭建开发环境并且成功运行flutter项目. Flutter环境配置主要有这几点: 系统配置要求 Java环境 Flu ...
- 生产环境频繁内存溢出,原来就是因为这个“String类”
摘要:如果在程序中创建了比较大的对象,并且我们基于这个大对象生成了一些其他的信息,此时,一定要释放和这个大对象的引用关系,否则,就会埋下内存溢出的隐患. 本文分享自华为云社区<[高并发]你敢信? ...
- 实验:zk master宕机后,临时节点在新的master上是否存在,结果出人意料
一.实验 实验说明:3台zk集群,主要验证:master上的客户端,在master上建立临时节点,当master宕机时,其他follower选为主后,临时节点是否存在. 主要是通过此来验证,基于zk的 ...
- vue自定义指令?
除核心指令之外的指令, 使用directive进行注册. 指令自定义钩子函数: bind, inserted, update, componentUpdated, unbind