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 相关文章推荐
取得传值的函数
Oct 27 Javascript
javascript同步Import,同步调用外部js的方法
Jul 08 Javascript
Jquery ajaxsubmit上传图片实现代码
Nov 04 Javascript
JS判断表单输入是否为空(示例代码)
Dec 23 Javascript
利用javascript打开模态对话框(示例代码)
Jan 11 Javascript
jQuery实现手机号码输入提示功能实例
Apr 30 Javascript
Jquery 全选反选实例代码
Nov 19 Javascript
js插件Jcrop自定义截取图片功能
Oct 14 Javascript
Javascript中this关键字指向问题的测试与详解
Aug 11 Javascript
JavaScript Blob对象原理及用法详解
Oct 14 Javascript
微信小程序中wxs文件的一些妙用分享
Feb 18 Javascript
JS前端可视化canvas动画原理及其推导实现
Aug 05 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
PHP 采集心得技巧
2009/05/15 PHP
一个PHP分页类的代码
2011/05/18 PHP
php简单的会话类代码
2011/08/08 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
js单例模式的两种方案
2013/10/22 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
js实现文字垂直滚动和鼠标悬停效果
2015/12/31 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
常用python编程模板汇总
2016/02/12 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
自主实习接收函
2014/01/13 职场文书
出生医学证明样本
2014/01/17 职场文书
入股协议书范本
2014/04/14 职场文书
小学生运动会报道稿
2014/09/12 职场文书
会计求职自荐信范文
2015/03/04 职场文书
家长意见和建议怎么写
2015/06/04 职场文书