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 同时在IE和FireFox获取KeyCode的代码
Feb 07 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
Feb 22 Javascript
javascript中style.left和offsetLeft的用法说明
Mar 07 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
Apr 12 Javascript
jquery图片轮播特效代码分享
Apr 20 Javascript
Angularjs---项目搭建图文教程
Jul 08 Javascript
Angularjs 实现分页功能及示例代码
Sep 14 Javascript
Vue 2中ref属性的使用方法及注意事项
Jun 12 Javascript
VeeValidate在vue项目里表单校验应用案例
May 09 Javascript
微信小程序实现点击空白隐藏的方法示例
Aug 13 Javascript
laydate只显示时分 不显示秒的功能实现方法
Sep 28 Javascript
vue基于better-scroll实现左右联动滑动页面
Jun 30 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/11/16 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
php实现可运算的验证码
2015/11/10 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
Vue组件化开发思考
2018/02/02 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
详解python并发获取snmp信息及性能测试
2017/03/27 Python
Python分析学校四六级过关情况
2017/11/22 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
使用Python实现分别输出每个数组
2019/12/06 Python
python读取mysql数据绘制条形图
2020/03/25 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
学校七一活动方案
2014/01/19 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
新品发布会策划方案
2014/06/08 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
班主任经验交流材料
2014/12/16 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书