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 相关文章推荐
Javascript 学习笔记 错误处理
Jul 30 Javascript
js实现简单的购物车有图有代码
May 26 Javascript
DOM基础教程之使用DOM
Jan 19 Javascript
JavaScript使用slice函数获取数组部分元素的方法
Apr 06 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
Jun 05 Javascript
js如何打印object对象
Oct 16 Javascript
RequireJS多页面应用实例分析
Jun 29 Javascript
AngularJS学习第二篇 AngularJS依赖注入
Feb 13 Javascript
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 jQuery
vue实现页面滚动到底部刷新
Aug 16 Javascript
js对象简介与基本用法示例
Mar 13 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 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-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
javascript 表单规则集合对象
2009/07/21 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
Python基于twisted实现简单的web服务器
2014/09/29 Python
Python类的多重继承问题深入分析
2014/11/09 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
党员的自我评价范文
2014/01/02 职场文书
关于环保的演讲稿
2014/05/10 职场文书
2014年化验室工作总结
2014/11/21 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL