做的一个项目当中需要做一个组件,传入数组,用v-for生成表单,可以展开和收起,展开收起时需要有过渡的效果

在vue里面提供了<transtion></transtion><transition-group></transition-group>两个组件,<transtion>用于普通组件元素,不能用于v-for<transition-group>可用于v-for的场景,是对遍历出来的项做过渡,而我的展开收起需要对整个容器进行过渡,因此需要手动添加过渡效果

这里是对高度变化进行过渡,因此需要满足让高度发生变化这个条件,即对容器设置高度,由于表单是遍历出来的,表单项的布局使用的是栅格

由于容器高度不确定,并且收起按钮位置固定右下角,当剩余位置宽度不够时,另占一行,容器高度需要动态计算,收起时的高度也需要动态计算

思路:给容器设置高度,高度为计算所得,收起时添加一个css类去改变容器高度



<div class="searform-box">
<el-form>
<div :style="{'height': transtionHeight + 'px'}" :class="['transtion', {'expand': !isExpand }]">
<el-row :gutter="24">
<el-col
v-for="(item, index) in arrays"
:class="['search-form-item', {'show': !isExpand && index >= EXPAND_SHOW_COUNT }]"
:span="span">内容</el-col>
</el-row>
</div>
</el-form>
</div>

因为收起时的高度是用css去控制的,并且是可变的,因此在css里面用--声明一个变量expandHeight,在.expand{}当中使用var()使用变量

.searform-box{
--expandHeight: 50px;
.show{
opacity: 0;
} .expand{
height: var(--expandHeight) !important;
}
.transtion{
transition: all 0.3s ease;
overflow: hidden;
position: relative;
.search-form-item{
height: 50px;
transition: all 0.3s ease;
}
}
}

使用js计算高度

// 行高
public readonly ROW_HEIGHT = 50
// 操作按钮宽度
public readonly OPTION_WIDTH = 220
// 栅格
public readonly ROW_SPAN = 24
// 收起时显示个数
public readonly EXPAND_SHOW_COUNT = 3 // 计算容器高度
public setSearchBoxStyle() {
let height = 0
// 容器节点
const transitionBox = document.getElementsByClassName('transtion')[0] as HTMLElement
// 循环的项
const formItems = document.getElementsByClassName('search-form-item')
if (formItems && formItems.length > 0 && this.isExpand) {
// 展开
// 循环出来的所有项所占高度
height = this.ROW_HEIGHT * Math.ceil((this.span * this.queryItems.length) / this.ROW_SPAN)
// 最后一项
const lastFormItem = formItems[formItems.length - 1] as HTMLElement
// 最后一项右侧到容器右侧的宽度,即所剩宽度
const width = transitionBox.clientWidth - lastFormItem.offsetLeft - lastFormItem.clientWidth
// 如果剩余宽度不够,放不下按钮,就再加一行的高度
if (width < this.OPTION_WIDTH) {
height += this.ROW_HEIGHT
}
} else if (this.queryItems && !this.isExpand) {
// 收起
// 收起默认就一行
height = this.ROW_HEIGHT
// 收起时最后一项
const lastIndex = formItems.length > this.EXPAND_SHOW_COUNT ? this.EXPAND_SHOW_COUNT - 1 : formItems.length - 1
const lastFormItem = formItems[lastIndex] as HTMLElement
const width = transitionBox.clientWidth - lastFormItem.offsetLeft - lastFormItem.clientWidth
if (width < this.OPTION_WIDTH) {
height = this.ROW_HEIGHT * 2
}
// 设置css当中expandHeight变量的值
const searchFormBox = document.getElementsByClassName('searform-box')[0] as HTMLElement
searchFormBox.style.setProperty('--expandHeight', height + 'px')
}
return height
} /*
* 表单项栅格计算,根据屏幕宽度动态计算项的所占份额
*/
public setSpan(val: number) {
if (val > 1440) {
this.span = 6;
}
if (val < 1450 && val > 750) {
this.span = 8;
}
if (val > 550 && val < 750) {
this.span = 12;
}
if (val < 550) {
this.span = 24;
}
this.transtionHeight = this.setSearchBoxStyle()
}

由于是公司项目,完整代码不方便贴,请见谅

vue 展开收起的过渡效果的更多相关文章

  1. Vue 实现点击展开收起

    Vue 展开收起功能实现 之前写项目的时候提到了一个需求 展开/收起 所有内容的需求 .因之前一值是重构,自己写功能还是比较少的,于是网上搜了一下,发现很多东西其实是jq的功能 虽然可以拿过来用,但是 ...

  2. vue.js 实现点击展开收起动画

    最近公司项目加了个页面,其中要求是这样的,点击对应列表,展开和收起, 其实就是显示和隐藏内容部分:说来惭愧,我花了半天时间才搞出来(自黑一下~), ,,接下来分享给大家,先上效果图: .vue页面: ...

  3. javasript简单实现文字的展开收起(无动画)

    今天在工作遇到展开和收起的需求,在网上找了很多方法,今天来写一下我觉得比较简单的方法 在项目中需要达到如图这种效果 首先想的是使用overflow简单且粗暴,在需要展开的的文字定义样式 { overf ...

  4. vue展开过度动画

    有一段时间没用vue动画了,就忘了,又仔细去看了vue官网 的过渡&动画,记录下来方便快速使用 (可以多看vue官网 过渡&动画 实现更多效果) 1.实际效果 展开收起效果.gif 2 ...

  5. el-upload上传列表实现 展开 收起

    # el-upload上传列表实现 展开 收起 #### 无图言*,所以先上最终效果图(想参考代码的可以直接滑到最后) ### 具体实现思路 注意: 每个人的项目环境以及需求,都不尽相同,所以这里仅仅 ...

  6. HTML-003-模拟IDE代码展开收起功能简单示例

    当先我们在日常的编程开发工作中使用编程工具(例如 Eclipse.Sublime 等等)都有相应的代码折叠展开功能,如下图所示,极大的方便了我们的编码工作.

  7. 跨平台移动开发 Xuijs超轻量级的框架 Dom与Event简洁代码实现文本展开收起

    Dom与Event简洁代码实现文本展开收起 Xuijs超轻量级的框架 Dom与Event实现文本展开收起 效果图 示例代码 <!DOCTYPE html PUBLIC "-//W3C/ ...

  8. css实现侧边展开收起

    前言:因为突然想研究研究侧边栏滑动展开收起怎么做的,就去baidu了一下transition. 详情 内容1 内容1 内容1 内容1 内容1 右侧有实现demo.就是那个绿色的详情 先来看一下我的代码 ...

  9. [TimLinux] CSS 纯CSS实现动画展开/收起功能

    内容转自CSS世界,理解之后进行了简化,简化后代码: <!DOCTYPE html> <html> <head> <meta charset=utf-8 /& ...

  10. Vue多个元素展开收起

    html: <div class="helpPages_main"> <div class="read" v-for="(item, ...

随机推荐

  1. https://计算机四级

    计算机四级内容: 一,网络工程师 基本要求 1.了解大型网络系统规划.管理方法: 2.具备中小型网络系统规划.设计的基本能力: 3.掌握中小型网络系统组建.设备配置调试的基本技术: 4.掌握企事业单位 ...

  2. SpringCloud框架开发

    1.是什么微服务 是一种架构模式,他提倡将单一应用程序划分一组小的服务,服务之间的相互配合.互相协调. 2.Spring Cloud简介 SpringClound等于分布式微服务架构的一站式解决方案, ...

  3. function | fastica

    fastica - Fast Independent Component Analysis FastICA for Matlab 7.x and 6.x Version 2.5, October 19 ...

  4. api接口基础Day1

    精华笔记: String: String的常用方法: length():获取字符串的长度(字符个数) trim():去除当前字符串两边的空白字符 toUpperCase()/toLowerCase() ...

  5. C数列或者C向量以及C矩阵

    #include <stdlib.h> #include <stdio.h> #define TP double #define UI unsigned short int # ...

  6. MySQL分库分表原理

    转自https://www.jianshu.com/p/7aec260ca1a2 前言 在互联网还未崛起的时代,我们的传统应用都有这样一个特点:访问量.数据量都比较小,单库单表都完全可以支撑整个业务. ...

  7. hdu: 改革春风吹满地(叉乘求面积)

    Problem Description" 改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如此简 ...

  8. VUE项目中检测网页滑动注意事项

    一.this.$nextTick(function () {             window.addEventListener('scroll', this.onScroll, true)   ...

  9. C语言程序设计基础 实验3 函数

    C语言程序设计基础 实验3 函数   一.实验目的 1. 理解函数的本质:模块化,实现代码复用 2. 掌握函数定义.声明.调用的语法 3. 理解并掌握函数的形参.实参,以及函数调用和返回的过程 4. ...

  10. Python使用socks代理

    Python使用socks代理 参考:How to make python Requests work via socks proxy - Stack Overflow 使用pysocks库 - Ji ...