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 相关文章推荐
ajax 文件上传应用简单实现
Mar 03 Javascript
JavaScript 计算当天是本年本月的第几周
Mar 22 Javascript
jquery 简单导航实现代码
Sep 11 Javascript
JavaScript面向对象程序设计教程
Mar 29 Javascript
JavaScript中利用for循环遍历数组
Jan 15 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
Feb 10 Javascript
JS实现图片切换效果
Nov 17 Javascript
浅谈Angular单元测试总结
Mar 22 Javascript
JS实现动态添加外部js、css到head标签的方法
Jun 05 Javascript
新手入门js闭包学习过程解析
Oct 08 Javascript
jQuery zTree如何改变指定节点文本样式
Oct 16 jQuery
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程序?
2006/12/08 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
JS 文件大小判断的实现代码
2010/04/07 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
JS实现复制内容到剪贴板功能
2017/02/05 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
python实现图片批量剪切示例
2014/03/25 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
python2.7安装图文教程
2018/03/13 Python
pytorch标签转onehot形式实例
2020/01/02 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
python切割图片的示例
2020/11/12 Python
十八大报告观后感
2014/01/28 职场文书
党员创先争优心得体会
2014/09/11 职场文书
师德师风培训感言
2015/08/03 职场文书
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL