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 相关文章推荐
浅析jQuery中常用的元素查找方法总结
Jul 04 Javascript
jquery二级导航内容均分的原理及实现
Aug 13 Javascript
判断浏览器的内核及版本号方法汇总
Jan 05 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
Sep 06 Javascript
JavaScript 基础函数_深入剖析变量和作用域
May 18 Javascript
JavaScript必知必会(五) eval 的使用
Jun 08 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
Mar 20 Javascript
js实现三级联动效果(简单易懂)
Mar 27 Javascript
vue ssr 指南详读
Jun 29 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
Sep 20 Javascript
JavaScript学习笔记之图片库案例分析
Jan 08 Javascript
webpack3.0升级4.0的方法步骤
Apr 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
PHP array_multisort()函数的使用札记
2011/07/03 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
js禁止表单重复提交
2017/08/29 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
Python实现简单截取中文字符串的方法
2015/06/15 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
python pandas时序处理相关功能详解
2019/07/03 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
中学生团员自我评价分享
2013/12/07 职场文书
本科毕业生自荐信
2014/05/26 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
社区母亲节活动总结
2015/02/10 职场文书
医德医风个人总结
2015/02/28 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书