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调用Activex控件的事件的实现方法
Apr 11 Javascript
Javascript/Jquery——简单定时器的多种实现方法
Jul 03 Javascript
jquery $.each()使用探讨
Sep 23 Javascript
JS仿百度搜索自动提示框匹配查询功能
Nov 21 Javascript
再探JavaScript作用域
Sep 24 Javascript
jQuery中ajax的load()方法用法实例
Dec 26 Javascript
JS获取屏幕高度的简单实现代码
May 24 Javascript
easy ui datagrid 从编辑框中获取值的方法
Feb 22 Javascript
js轮播图无缝滚动效果
Jun 17 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
Mar 15 Javascript
vue裁切预览组件功能的实现步骤
May 04 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
May 07 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中MVC的开发经验分享
2012/05/17 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
PHP面向对象精要总结
2014/11/07 PHP
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
PyTorch实现AlexNet示例
2020/01/14 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
python搜索算法原理及实例讲解
2020/11/18 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
运动会通讯稿500字
2014/02/20 职场文书
公务员培的训心得体会
2014/09/01 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
高中家长意见怎么写
2015/06/03 职场文书
Vue和Flask通信的实现
2021/05/19 Vue.js
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
python实现双向链表原理
2022/05/25 Python