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, ...
随机推荐
- vue-cli项目以script标签方式引入js的方法
在public/index.html中强行添加script标签(可引入本地js和远程js,本地js需放在public内,不能放assets内) 在要使用这个js的地方,将相关对象添加到eslint的全 ...
- yield基础知识
function* y(p1){ let r=p1; r=(yield r-5) //表达式A,在第1轮是普通return,在第2轮next(param)时会被param替换 r=(yield r*2 ...
- Floyd算法求最短路径
floyd算法用于求图中各个点到其它点的最短路径,无论其中经过多少个中间点.该算法的核心理念是基于动态规划, 不断更新最短距离,遍历所有的点. 知识基础:图的邻接矩阵表示: 如图是一个简单图,从A开始 ...
- java图形化界面编程(AWT)
1.AWT编程简介 在JDK发布时,sun公司提供了一套基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行,这套基本类库被称为"抽象窗口工具集",它为java应用程序提供 ...
- drf视图类
1 2个视图基类 # django 内置的View# drf 的APIView ,继承自View# GenericAPIView -两个重要的类属性: queryset = Book.objec ...
- Mac 系统下 xxx.py 在终端运行
1.在文件中添加注释首先在你所要运行的python文件里首行添加一个特殊的注释(我使用的是python 3.7.3) #!/usr/bin/env python3 注意:如果是python3的话,&q ...
- Vue 解决先渲染 暂无数据
// 组件 data(){ return { data:null // 设置默认值为null } } // template <div v-show="data != null&quo ...
- 算法学习01—Java底层的正整数与负整数
算法学习01 - Java 底层的正整数与负整数 本节课学到的知识 编写一个方法,打印出 int 类型数字的二进制长什么样 为什么 int 类型的最大值是 2^32 - 1,最小值是 -2^32 负整 ...
- WordPress标题分隔符”-“被转义为“–”怎么办?
按照百度搜索资源平台<百度搜索网页标题规范:让标题回归标题本身>百度官方文档参考,如果WordPress标题里出现不规范"– 2.停止wptexturize转义任何字符 add_ ...
- HGD1-LSP-函数集-网络整理
CAD LSP函数集 header