Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件


Posted in Javascript onJune 19, 2018

需求分析:

如图,有很多高度不固定的模块(图中只显示两个,本人项目有十三个),点击模块标题展开相应的模块,再次点击此模块匿藏,如何实现此需求并实现复用? 

 点击红框前:

Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件 

 点击后:

Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件

难点分析:

模块高度不固定。比如,本人一开始想到的方法如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    .box{
      height:500px;
      background-color:black; 
       overflow: hidden;            
    }
    .mybox-leave-active,.mybox-enter-active{
      transition: all 1s ease; 
    }
    .mybox-leave-active,.mybox-enter{
      height:0px !important;
    }
    .mybox-leave,.mybox-enter-active{
      height: 500px;
    }
  </style>
</head>
<body>
<div id="box">
  <transition name="mybox">
    <div class="box" v-show="boxshow"></div>
  </transition>
  <button @click="togglebox">按钮</button>
</div>
</body>
<script src="../bower_components/vue/dist/vue.js"></script>
<script>
  new Vue({
    el:'#box',
    data:{
      boxshow:false
    },
    methods:{

      togglebox:function(){
        this.boxshow = !this.boxshow;
      }
    }   
  });
</script>
</html>

这种方法确实可以实现点击展开,再次点击收缩的需求,但是有一个明显的缺点:限定了容器的高度,也就是每个模块都需要固定高度,并不适用于需求场景。

解决方案:

1、实现一个函数式组件

本人命名为vertical-toggle.js
// Created by xiaoqiang on 17/04/2018.
const elTransition = '0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out'
const Transition = {
 'before-enter' (el) {
  el.style.transition = elTransition
  if (!el.dataset) el.dataset = {}
  el.dataset.oldPaddingTop = el.style.paddingTop
  el.dataset.oldPaddingBottom = el.style.paddingBottom
  el.style.height = 0
  el.style.paddingTop = 0
  el.style.paddingBottom = 0
 },
 'enter' (el) {
  el.dataset.oldOverflow = el.style.overflow
  if (el.scrollHeight !== 0) {
   el.style.height = el.scrollHeight + 'px'
   el.style.paddingTop = el.dataset.oldPaddingTop
   el.style.paddingBottom = el.dataset.oldPaddingBottom
  } else {
   el.style.height = ''
   el.style.paddingTop = el.dataset.oldPaddingTop
   el.style.paddingBottom = el.dataset.oldPaddingBottom
  }
  el.style.overflow = 'hidden'
 },
 'after-enter' (el) {
  el.style.transition = ''
  el.style.height = ''
  el.style.overflow = el.dataset.oldOverflow
 },
 'before-leave' (el) {
  if (!el.dataset) el.dataset = {}
  el.dataset.oldPaddingTop = el.style.paddingTop
  el.dataset.oldPaddingBottom = el.style.paddingBottom
  el.dataset.oldOverflow = el.style.overflow
  el.style.height = el.scrollHeight + 'px'
  el.style.overflow = 'hidden'
 },
 'leave' (el) {
  if (el.scrollHeight !== 0) {
   el.style.transition = elTransition
   el.style.height = 0
   el.style.paddingTop = 0
   el.style.paddingBottom = 0
  }
 },
 'after-leave' (el) {
  el.style.transition = ''
  el.style.height = ''
  el.style.overflow = el.dataset.oldOverflow
  el.style.paddingTop = el.dataset.oldPaddingTop
  el.style.paddingBottom = el.dataset.oldPaddingBottom
 }
}
export default {
 name: 'VerticalToggle',
 functional: true,
 render (h, { children }) {
  const data = {
   on: Transition
  }
  return h('transition', data, children)
 }
}

2、引用此组件

Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件 

 在components中注册了此组件:

Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件

即可在teamplate中引用,请留意红框文字说明部分。

Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件 

至此,Vue.js实现垂直展开、收缩不定高度模块组件实现完成及应用均已完成。 

 实现效果:

Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件

总结

以上所述是小编给大家介绍的Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery控制图片的hover效果(smartRollover.js)
Mar 18 Javascript
js取消单选按钮选中示例代码
Nov 14 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
Aug 14 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
Nov 20 Javascript
JS基于递归实现倒计时效果的方法
Nov 26 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
Windows安装Node.js报错:2503、2502的解决方法
Oct 25 Javascript
浅谈vue中.vue文件解析流程
Apr 24 Javascript
微信小程序解析富文本过程详解
Jul 13 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
Aug 16 Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 18 Javascript
vue实现简单加法计算器
Oct 22 Javascript
Vue兼容ie9的问题全面解决方案
Jun 19 #Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
Jun 19 #Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
Jun 19 #Javascript
vue异步加载高德地图的实现
Jun 19 #Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
Jun 19 #Javascript
JS正则表达式常见用法实例详解
Jun 19 #Javascript
JavaScript使用math.js进行精确计算操作示例
Jun 19 #Javascript
You might like
我的论坛源代码(五)
2006/10/09 PHP
php正则表达式(regar expression)
2011/09/10 PHP
smarty中js的调用方法示例
2014/10/27 PHP
php+ajax简单实现全选删除的方法
2016/12/06 PHP
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
[51:22]Fnatic vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
使用Python绘制图表大全总结
2017/02/11 Python
python下os模块强大的重命名方法renames详解
2017/03/07 Python
python安装numpy和pandas的方法步骤
2019/05/27 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
Python @property及getter setter原理详解
2020/03/31 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
汇智创新科技发展有限公司
2015/12/06 面试题
学校大课间活动方案
2014/01/30 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
学习礼仪心得体会
2014/09/01 职场文书
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
委托培训协议书
2014/11/17 职场文书
大专护理专业自荐信
2015/03/25 职场文书
2015年政府采购工作总结
2015/05/21 职场文书