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 学习第五课 Ajax 使用说明
May 17 Javascript
Ajax 数据请求的简单分析
Apr 05 Javascript
文本框文本自动补全效果示例分享
Jan 19 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
Mar 12 Javascript
js实现网页自动刷新可制作节日倒计时效果
May 27 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
js绘制购物车抛物线动画
Nov 18 Javascript
微信小程序 首页制作简单实例
Apr 07 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
Dec 08 Javascript
详解解决使用axios发送json后台接收不到的问题
Jun 27 Javascript
React生命周期原理与用法踩坑笔记
Apr 28 Javascript
Vue深入理解插槽slot的使用
Aug 05 Vue.js
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
星际实力自我测试
2020/03/04 星际争霸
php db类库进行数据库操作
2009/03/19 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
python实现的各种排序算法代码
2013/03/04 Python
python实现将元祖转换成数组的方法
2015/05/04 Python
用pandas中的DataFrame时选取行或列的方法
2018/07/11 Python
pandas 将索引值相加的方法
2018/11/15 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
大学生个人总结的自我评价
2013/10/05 职场文书
销售文员的岗位职责
2013/11/20 职场文书
大型会议接待方案
2014/03/01 职场文书
给老师的一封建议书
2014/03/13 职场文书
协议书范本
2014/04/23 职场文书
电教室标语
2014/06/20 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers