做的一个项目当中需要做一个组件,传入数组,用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. 微信支付宝app支付回调参数

    微信app支付回调通知参数: <xml><appid><![CDATA[wx9703cd*******]]></appid><attach> ...

  2. Vue 二维码生成插件

    1. 安装 qrcode.vue 仓库地址 // vue2 安装1.x版本.vue3 安装3.x版本 npm install --save qrcode.vue // 或 yarn add qrcod ...

  3. CentOS 8.x 编译安装LNMP(Linux + Nginx + MySQL + PHP)架构部署动态网站环境

    LNMP动态网站部署架构是一套由Linux + Nginx + MySQL + PHP组成的动态网站系统解决方案,具有免费.高效.扩展性强且资源消耗低等优良特性,目前正在被广泛使用. 前传: 1.Ce ...

  4. Android studio的使用2

    运行按钮First activity: package com.example.activity;import androidx.appcompat.app.AppCompatActivity;imp ...

  5. pytorch 简简单单求个值

    能用张量处理就用张量,不要使用for in 跑循环,一个是容易出错,一个是比较浪费时间,应用广播机制的话去做很容易的 1.5 使用mean处理平均值 2. 在处理梯度的时候无法更改自身,因此使用的办法 ...

  6. requests模块获取cookie -----class 'requests.cookies.RequestsCookieJar'

    #coding=utf-8 import requests url="http://www.baidu.com" response=requests.get(url) cookie ...

  7. RabbitMQ管理控制台的使用

    RabbitMQ管理控制台的使用 添加一个用户 添加一个Virtual Hosts 把虚拟机和用户绑定 点击创建的虚拟机 配置 rabbitmq.config cp rabbitmq.config.e ...

  8. openvas漏洞扫描:使用openvas时扫描漏洞时,报告中显示的数据与数据库数据不同

    使用openvas设备进行漏洞扫描时,报告中的漏洞数量与readis数据库中查找到的漏洞数量不同 原因是,openvas的代码中默认在报告中显示的最小质量检测为70%.如图: 上图详细链接为:http ...

  9. CentOS 7(Linux)安装Docker

    CentOS 7(Linux)安装Docker 一.分别执行下列命令添加并更新yum源 yum update yum install epel-release -y yum clean all yum ...

  10. Selenium常见方法

    1.打开和关闭浏览器  打开浏览器   driver=webdriver.Ie()   driver=webdriver.Chrome()   driver=webdriver.Firefox() ...