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折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
Jan 22 Javascript
QUnit jQuery的TDD框架
Nov 04 Javascript
ie9 提示'console' 未定义问题的解决方法
Mar 20 Javascript
3个可以改善用户体验的AngularJS指令介绍
Jun 18 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
May 17 Javascript
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
Jul 10 Javascript
vue iview多张图片大图预览、缩放翻转
Jul 13 Javascript
Vue3 中的数据侦测的实现
Oct 09 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
Sep 24 Javascript
js实现自动锁屏功能
Jun 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 应用程序安全防范技术研究
2009/09/25 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
PHP中如何调用webservice的实例参考
2013/04/25 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
smarty模板数学运算示例
2016/12/11 PHP
Javascript 函数对象的多重身份
2009/06/28 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
2016/07/07 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
详解babel升级到7.X采坑总结
2019/05/12 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
JS实现拼图游戏
2021/01/29 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
python实现简单登陆流程的方法
2018/04/22 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
就业表自我评价分享
2014/02/06 职场文书
志愿者活动总结
2014/04/28 职场文书
中班幼儿评语大全
2014/04/30 职场文书
公司开除员工通知
2015/04/22 职场文书
孔繁森观后感
2015/06/10 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js