代码如下:

  1. const slider = (function() {
  2. var Slider = {};
  3. // the constructed function,timeManager,as such that's a manager about managing the setInterval
  4. function TimerManager() {
  5. this.timers = [];
  6. this.args = [];
  7. this.isTimerRun = false;
  8. }
  9. // if the element can't has the property of TimerManage what represented the constructor function,repeated creating a constructed function
  10. TimerManager.makeTimerManage = function(element) {
  11. if (
  12. !element.TimerManage ||
  13. element.TimerManage.constructor !== TimerManager
  14. ) {
  15. element.TimerManage = new TimerManager();
  16. }
  17. };
  18. // That's order to create the method what add the timer
  19. TimerManager.prototype.add = function(timer, args) {
  20. this.timers.push(timer);
  21. this.args.push(args);
  22. this.timerRun();
  23. };
  24. // called the method is order to run the timer by ordering
  25. TimerManager.prototype.timerRun = function() {
  26. if (!this.isTimerRun) {
  27. var timer = this.timers.shift(),
  28. args = this.args.shift();
  29. if (timer && args) {
  30. this.isTimerRun = true;
  31. timer(args[0], args[1]);
  32. }
  33. }
  34. };
  35. // let it run the next timer
  36. TimerManager.prototype.next = function() {
  37. this.isTimerRun = false;
  38. this.timerRun();
  39. };
  40. function slideUp(element, time) {
  41. if (element.offsetHeight > 0) {
  42. var totalHeight = element.offsetHeight;
  43. var currentHeight = totalHeight;
  44. var reduceValue = totalHeight / (time / 10);
  45. element.style.transition = "height " + time + " ms";
  46. element.style.overflow = "hidden";
  47. var timer = setInterval(function() {
  48. currentHeight -= reduceValue;
  49. element.style.height = currentHeight + "px";
  50. if (currentHeight <= 0) {
  51. clearInterval(timer);
  52. element.style.display = "none";
  53. element.style.height = totalHeight + "px";
  54. if (
  55. element.TimerManage &&
  56. element.TimerManage.constructor === TimerManager
  57. ) {
  58. element.TimerManage.next();
  59. }
  60. }
  61. }, 10);
  62. } else {
  63. if (
  64. element.TimerManage &&
  65. element.TimerManage.constructor === TimerManager
  66. ) {
  67. element.TimerManage.next();
  68. }
  69. }
  70. }
  71. function slideDown(element, time) {
  72. if (element.offsetHeight <= 0) {
  73. element.style.display = "block";
  74. element.style.transition = "height" + time + " ms";
  75. element.style.overflow = "hidden";
  76. var totalHeight = element.offsetHeight;
  77. var currentHeight = 0;
  78. element.style.height = "0px";
  79. var addValue = totalHeight / (time / 10);
  80. var timer = setInterval(function() {
  81. currentHeight += addValue;
  82. element.style.height = currentHeight + "px";
  83. if (currentHeight >= totalHeight) {
  84. clearInterval(timer);
  85. element.style.height = totalHeight + "px";
  86. if (
  87. element.TimerManage &&
  88. element.TimerManage.constructor === TimerManager
  89. ) {
  90. element.TimerManage.next();
  91. }
  92. }
  93. }, 10);
  94. } else {
  95. if (
  96. element.TimerManage &&
  97. element.TimerManage.constructor === TimerManager
  98. ) {
  99. element.TimerManage.next();
  100. }
  101. }
  102. }
  103. // the interface about slideUp method
  104. Slider.slideUp = function(element) {
  105. TimerManager.makeTimerManage(element);
  106. element.TimerManage.add(slideUp, arguments);
  107. return this;
  108. };
  109. // the interface about slideDown method
  110. Slider.slideDown = function(element) {
  111. TimerManager.makeTimerManage(element);
  112. element.TimerManage.add(slideDown, arguments);
  113. return this;
  114. };
  115. return Slider;
  116. })();

原生调用:

  1. //该js文件中加入这一行代码
  2. window.slider = slider;
  3. //参数1,dom,参数2:时间
  4. slider.slideDown(document.queryselector(),time);
  5. slider.slideUp(document.queryselector(),time);

vue.js调用:

  1. //该js文件加入这一行代码
  2. export default slider;
  3. main.js中引入:
  4. import slider from 'slider.js';
  5. //绑定到Vue实例原型上
  6. Vue.prototype.slider = slider;
  7. //组件中调用
  8. this.slider(this.$refs,time);

原生js造轮子之模仿JQ的slideDown()与slideUp()的更多相关文章

  1. 如何用js造轮子

    写了一个非常通俗易懂的造轮子的方法 <div class="wrap"></div> <div class="wrap">& ...

  2. 使用原生 python 造轮子搭建博客

    这篇用来 记录一个 从零开始的 博客搭建,希望坚持下去,因为python 开发效率令人发指,所以会原生从零写 ORM ,Web 框架 前提是打好 异步 io 的基础, 使用异步,有一点要谨记,一旦开始 ...

  3. 造轮子,模仿WPF的UI框架,还没完善。。。

    Wtf(暂时命名,随便起的 = _=),模仿WPF的框架,还没有完善,只有简单的基础元素,支持数据绑定.虽然支持mono但是mono有bug 写这个只是兴趣爱好,感觉也没多大意义了,如果这个UI框架完 ...

  4. jq与原生js实现收起展开效果

    jq与原生js实现收起展开效果 (jq需自己加载) <!DOCTYPE html> <html> <head> <meta charset="UTF ...

  5. 原生JS实现省市区(县)三级联动选择

    原文地址→看过来 写在前面 前段时间写一个关于天气的东西,里面的省市区(县)城市选择让我很头疼,在网上搜索出来大都是借助插件或者第三方库,感觉这样做代码会很重,所以索性就把几种城市选择的方式实现一遍, ...

  6. 表单验证--通过原生js模仿ajax的异步交互

    今天给大家带来个福利,我也是刚刚学习的很实用的一个东西,通过原生js模仿ajax的异步交互. 我的博客只是给那些新手看的大神勿喷,写的不好可留言,请指出. 因为当初自己学的时候一个问题不会找人问,知道 ...

  7. 抛弃JQ,回归原生js……

    之前我写过一篇文章叫做<jq不会被淘汰>--而事实上它真的不会被淘汰,因为即使在mvvm框架盛行的今天,原生js的api越来越友好的今天,jq依然在用户量上是霸主-- 但是今天我们要讨论的 ...

  8. JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性)

    JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性) 以下内容: 一.获取元素的属性 二.设置元素的属性 三.删除元素的属性 一.获取元素的属性 1-原生JS 获取属性 .ge ...

  9. 导航栏中各按钮在点击当前按钮变色其他按钮恢复为原有色的实现方法(vue、jq、原生js)

    一.vue如何实现? 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

随机推荐

  1. CAS单点登录(一)——初识SSO

    转载:https://blog.csdn.net/Anumbrella/article/details/80821486 一.初识CAS 首先我们来说一下CAS,CAS全称为Central Authe ...

  2. LeetCode-022-括号生成

    括号生成 题目描述:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:https ...

  3. C# Event (1) —— 我想搞个事件

    本文地址:https://www.cnblogs.com/oberon-zjt0806/p/15975299.html 本文最初来自于博客园 本文遵循CC BY-NC-SA 4.0协议,转载请注明出处 ...

  4. git flow 工作流程以及常用命令

    一.分支介绍 master 也是产品分支,只有一个,一般情况下不会在这个分支上进行代码操作 develop 只有一个,新特性的开发是基于 develop 开发的,但是不能直接在 develop 上进行 ...

  5. laravel 怎么获取public路径

    app_path()   app_path函数返回app目录的绝对路径: $path = app_path();   你还可以使用app_path函数为相对于app目录的给定文件生成绝对路径: $pa ...

  6. 移动端开发为什么使用@2x@3x图片

    物理.逻辑与位图像素的概念 关于设备物理像素和逻辑像素,这两个像素一个是实体的,一个是抽象的单位.除此之外还有一个不可忽视的像素,就是位图像素. 物理像素(设备像素):指的是设备屏幕实际拥有的像素点. ...

  7. map, reduce和filter(函数式编程)

    # map可以用于对可遍历结构的每个元素执行同样的操作,批量操作: map(lambda x: x**2, [1, 2, 3, 4]) # [1, 4, 9, 16] map(lambda x, y: ...

  8. 测试杂谈——一条SQL引发的思考

    此篇只是个人记录,相信各位大神早已轻车熟路,不喜勿喷:有错之处,欢迎指正. 有一天收到新人的咨询,是关于sql的问题. 问题1:为什么sql查询的数据与界面展示的不准确: 问题2:为什么sql查询时间 ...

  9. wordcloud库 词云

    •wordcloud使用方法 常规使用方法 import wordcloud #创建一个词云对象 w = wordcloud.WordCloud(background_color="whit ...

  10. 基于WebSocket的简易聊天室

    用的是Flash + WebSocket 哦~ Flask 之 WebSocket 一.项目结构: 二.导入模块 pip3 install gevent-websocket 三.先来看一个一对一聊天的 ...