vue 展开收起的过渡效果
做的一个项目当中需要做一个组件,传入数组,用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 展开收起的过渡效果的更多相关文章
- Vue 实现点击展开收起
Vue 展开收起功能实现 之前写项目的时候提到了一个需求 展开/收起 所有内容的需求 .因之前一值是重构,自己写功能还是比较少的,于是网上搜了一下,发现很多东西其实是jq的功能 虽然可以拿过来用,但是 ...
- vue.js 实现点击展开收起动画
最近公司项目加了个页面,其中要求是这样的,点击对应列表,展开和收起, 其实就是显示和隐藏内容部分:说来惭愧,我花了半天时间才搞出来(自黑一下~), ,,接下来分享给大家,先上效果图: .vue页面: ...
- javasript简单实现文字的展开收起(无动画)
今天在工作遇到展开和收起的需求,在网上找了很多方法,今天来写一下我觉得比较简单的方法 在项目中需要达到如图这种效果 首先想的是使用overflow简单且粗暴,在需要展开的的文字定义样式 { overf ...
- vue展开过度动画
有一段时间没用vue动画了,就忘了,又仔细去看了vue官网 的过渡&动画,记录下来方便快速使用 (可以多看vue官网 过渡&动画 实现更多效果) 1.实际效果 展开收起效果.gif 2 ...
- el-upload上传列表实现 展开 收起
# el-upload上传列表实现 展开 收起 #### 无图言*,所以先上最终效果图(想参考代码的可以直接滑到最后) ### 具体实现思路 注意: 每个人的项目环境以及需求,都不尽相同,所以这里仅仅 ...
- HTML-003-模拟IDE代码展开收起功能简单示例
当先我们在日常的编程开发工作中使用编程工具(例如 Eclipse.Sublime 等等)都有相应的代码折叠展开功能,如下图所示,极大的方便了我们的编码工作.
- 跨平台移动开发 Xuijs超轻量级的框架 Dom与Event简洁代码实现文本展开收起
Dom与Event简洁代码实现文本展开收起 Xuijs超轻量级的框架 Dom与Event实现文本展开收起 效果图 示例代码 <!DOCTYPE html PUBLIC "-//W3C/ ...
- css实现侧边展开收起
前言:因为突然想研究研究侧边栏滑动展开收起怎么做的,就去baidu了一下transition. 详情 内容1 内容1 内容1 内容1 内容1 右侧有实现demo.就是那个绿色的详情 先来看一下我的代码 ...
- [TimLinux] CSS 纯CSS实现动画展开/收起功能
内容转自CSS世界,理解之后进行了简化,简化后代码: <!DOCTYPE html> <html> <head> <meta charset=utf-8 /& ...
- Vue多个元素展开收起
html: <div class="helpPages_main"> <div class="read" v-for="(item, ...
随机推荐
- 使用autoIt 上传文件(参数化)
1.编写autoit脚本:upload.au3 ControlFocus("打开", "", "Edit1") ;用于识别windwos窗口 ...
- pnn模型 待整理
https://blog.csdn.net/qq_18293213/article/details/90262378?spm=1001.2101.3001.6650.5&utm_medium= ...
- MyBatis面试题汇总
1.什么是Mybatis? Mybatis是对象关系映射一个框架,它内部封装了JDBC,开发的时候只要关注SQL语句本身,可以严格控制sql的执行性能,灵活,其二可以通过XML或者注解来配置映射信息 ...
- 20220720 第七组 陈美娜 Java String用法
关于String引用数据类型 1.字符串中,两个变量的==指的是虚地址 2.String一旦声明不可改变:赋值进去,原值不会被替代.原值也可能指向其他地址: 3.s.length():字符的个数 4. ...
- 创建sqlSession对象操作数据库
1.加载核心配置文件 //加载mybatis核心配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; I ...
- 12.15linux学习第十八天
今天老刘讲了如同天书一般的隐藏章节,第23章使用OpenLDAP部署目录服务,难度太高了.第16章使用Squid部署代理缓存服务 章节概述: 本章首先介绍代理服务的原理以及作用,然后介绍Squid服务 ...
- IT工具知识-11:一种安卓投屏到Win10失败的解决方法
软硬件平台 电脑:WIN10 LTSC 手机:红米K30Pro/MIUI 11.0.26 投屏软件:安卓端-自带投屏,WIN10-自带投屏(连接) 故障描述 之前还能用的,但是在换了个路由器之后就不能 ...
- Jquery ajax参数设置(转)
参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ("POST" 或 ...
- SQL的分类
DDL: 数据定义语言,用来定义数据库对象(数据表,表 ,字段) : DML:数据操作语言,用来对数据库表中的数据进行增删改 : DQL:数据库查询语言,用来查询数据库中的表的记录 DCL:数据控制语 ...
- C语言基础题 22年5月
(十六进制 %x 20.0f是%f long 是%ld unsigned int %#o ) 编程题: 整数浮点数的上溢下溢 strcpy函数代码 int search(char *s, ch ...