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入门学习书籍推荐
Jun 12 Javascript
JS学习之一个简易的日历控件
Mar 24 Javascript
jquery.AutoComplete.js中文修正版(支持firefox)
Apr 09 Javascript
js循环改变div颜色具体方法
Jun 25 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
JS实现图片翻书效果示例代码
Sep 09 Javascript
js图片处理示例代码
May 12 Javascript
纯js模拟div层弹性运动的方法
Jul 27 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
Sep 16 Javascript
SublimeText自带格式化代码功能之reindent
Dec 27 Javascript
Javascript中字符串和数字的操作方法整理
Jan 22 Javascript
Angular+Node生成随机数的方法
Jun 16 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 set_time_limit(0)长连接的实现分析
2010/03/02 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
jquery文字上下滚动的实现方法
2013/03/22 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
浅谈Python中copy()方法的使用
2015/05/21 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
护理专业应届毕业生推荐信
2013/11/15 职场文书
教师自荐信范文
2013/12/09 职场文书
股权转让意向书
2014/04/01 职场文书
生产文员岗位职责
2014/04/05 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技