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 相关文章推荐
鼠标移入移出事件改变图片的分辨率的两种方法
Dec 17 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
May 06 Javascript
js实现顶部可折叠的菜单工具栏效果实例
May 09 Javascript
JS实现窗口加载时模拟鼠标移动的方法
Jun 03 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
May 25 Javascript
基于jQuery实现淡入淡出效果轮播图
Jul 31 Javascript
Angular.JS学习之依赖注入$injector详析
Oct 20 Javascript
JS实现头条新闻的经典轮播图效果示例
Jan 30 Javascript
3分钟了解vue数据劫持的原理实现
May 01 Javascript
layui对工具条进行选择性的显示方法
Sep 19 Javascript
Vue分页插件的前后端配置与使用
Oct 09 Javascript
Vue.js 无限滚动列表性能优化方案
Dec 02 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
phpMyAdmin 安装及问题总结
2009/05/28 PHP
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
php数组键名技巧小结
2015/02/17 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
看了就知道什么是JSON
2007/12/09 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
Django的session中对于用户验证的支持
2015/07/23 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
python3实现表白神器
2019/04/09 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
如何用Python徒手写线性回归
2021/01/25 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
大一学生的职业生涯规划书范文
2014/01/19 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
上班迟到检讨书
2014/09/15 职场文书
校车安全管理责任书
2015/05/11 职场文书
2015年除四害工作总结
2015/07/23 职场文书
记者节感言
2015/08/03 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
JavaScript实现栈结构详细过程
2021/12/06 Javascript
Java的Object类的九种方法
2022/04/13 Java/Android