uniapp实现带过渡动画的手风琴折叠样式
目录
- 最终效果
- 一、无过渡动画的手风琴
- 二、有过渡动画的手风琴
- 1. 不能再用v-if或v-show
- 2. 用:class动态绑定样式
- 3. 子元素也要设置transition
最终效果
UI同学让做一个带过渡动画的手风琴折叠效果,点击一个元素展开,其他已展开元素自动收缩,每次最多只有一个元素展开,这是最终效果:
接下来讲我用css实现的思路
一、无过渡动画的手风琴
首先,uniapp做无过渡动画的最容易做了,因为Vue里只要用v-if
或v-show
来控制,判断index是否是当前的子组件就好了。因为我用了组件,我想父组件的事件openDetail
触发能更新子组件的数据,所以我用:ref
来更新子组件的boolean变量isOpen
来触发v-show="isOpen"
,记录lastIndex
来关闭上个展开的子组件,确保每次点击最多只有一个展开。
父组件
<view><collapse-item v-for="(item, index) in list" :key="index" @tap="openDetail(index)" :ref="'collapse'+index"</collapse-item>
</view>
...
<script>
export default {data() {return {lastIndex: -1;}},methods: {// 手风琴式收缩展示offer列表if (index != this.lastIndex && this.lastIndex >= 0) {this.$refs['collapse'+this.lastIndex][0].isOpen = false;this.$refs['collapse'+index][0].isOpen = !this.$refs['collapse'+index][0].isOpen;} else {this.$refs['collapse'+index][0].isOpen = !this.$refs['collapse'+index][0].isOpen;}this.lastIndex = index;}
}
</script>
子组件collapse-item
<view v-show="isOpen"><view>专业</view><view>均分</view><view>入学</view>
</view>
...
export default {data() {return {isOpen: false,}},
}
二、有过渡动画的手风琴
现在来做过渡动画,我在做的时候,发现有以下几点需要注意:
1. 不能再用v-if或v-show
过渡动画的css实现大家肯定能想到是transition
,而transition
的动画是基于两个状态的来回变化的,不管是v-if
的增删DOM节点还是v-show的display: none
都是只有一个状态,无法满足前后两个状态,transition
会失效。
2. 用:class动态绑定样式
可以用 :class
的对象语法:class="isOpen ? 'content-open' : 'content-close'"
来动态绑定展开和收起两种状态的样式。
展开状态设置高度height
值,而收起状态设height
为0,两个状态都设置transition
,就能实现过渡动画。
我们来更新一下子组件collapse-item的代码:
<view :class="isOpen ? 'content-open' : 'content-close'"><view :style="{height: isOpen ? '40rpx' : '0'}">专业</view><view :style="{height: isOpen ? '40rpx' : '0'}">均分</view><view :style="{height: isOpen ? '40rpx' : '0'}">入学</view>
</view>
...
export default {data() {return {isOpen: false,}},
}
...
<style>
.content-open {height: 180 rpx;transition: all 0.4s cubic-bezier(0.25, 1.0, 0.25, 1.0);
}
.content-close {height: 0;transition: all 0.4s cubic-bezier(0.25, 1.0, 0.25, 1.0);
}
</style>
3. 子元素也要设置transition
写完上面的代码以后,我发现了一个问题,文字出现的比背景颜色快,在背景颜色还没有过渡动画展开完时,文字就已经全出现了,而且文字并没有像我预想一样的也有展开动画效果。
问题虽然不大,但是视觉上给人的体验非常不好,所以我一定要解决。
正当我无比困惑时,我突然想到,是不是transition
属性无法继承?
我就查了一下W3C文档:https://drafts.csswg.org/css-transitions/
果然transition
是inherited:no
,无法继承的。
所以我们子元素也都要设置transition
,才能达到背景颜色和文字同时有过渡动画的展开和收起的效果。
再更新一下子组件的代码:
<view :class="isOpen ? 'content-open' : 'content-close'"><view :class="isOpen ? 'item-open' : 'item-close'">专业</view><view :class="isOpen ? 'item-open' : 'item-close'">均分</view><view :class="isOpen ? 'item-open' : 'item-close'">入学</view>
</view>
...
export default {data() {return {isOpen: false,}},
}
...
<style>
.content-open {height: 180 rpx;overflow: hidden;transition: all 0.4s cubic-bezier(0.25, 1.0, 0.25, 1.0);
}
.content-close {height: 0;transition: all 0.4s cubic-bezier(0.25, 1.0, 0.25, 1.0);
}
.item-open {height: 40rpx;transition: all 0.4s cubic-bezier(0.25, 1.0, 0.25, 1.0);
}
.item-close {opacity: 0;height: 0;
}
</style>
content-open
里设置overflow: hidden
,展开时文字就不会浮在下一个元素上。
至于我为什么子元素的item-close
不设置transition
呢,因为三行文字先会缩成一行重叠的字再消失,太丑了,大家试试就知道了,所以干脆文字在close时直接消失好了~
我们的带过渡动画的手风琴折叠效果就做好啦,效果和文章开头的图一样~
觉得有用的请点个赞,谢谢大家的观看~转载请带本文链接
uniapp实现带过渡动画的手风琴折叠样式相关推荐
- Fabric.js 删除元素(带过渡动画)
本文简介 Fabric.js 提供了2个方法删除对象. 一个是 直接删除,另一个方法是 带过渡动画 删除元素(淡出动画). 本文重点讲 带过渡动画 删除元素的方法,还会讲到设置 过渡时长 .删除后的 ...
- html5手机手风琴相册,纯js带弹性动画的手风琴图片相册特效
这是一款使用纯javascript来制作的带弹性动画的手风琴图片相册特效.该手风琴图片相册在鼠标滑过时,相应的图片会水平展开,而图片的说明文字则会垂直滑动上来,形成一些视觉差的感觉. 使用方法 在页面 ...
- CSS3展开带弹性动画的手风琴菜单
在线演示 本地下载 转载于:https://www.cnblogs.com/qixidi/p/10065072.html
- android 布局收缩动画,自定义View-带过渡动画的折叠收缩布局
简介: 由于界面View.VISIBLE和View.GONE的动画太生硬,所以写了ExpandLayout类来平滑过渡. 基本思路,动态的设置布局的高度. 先上效果图: expand.gif 核心动画 ...
- android过渡动画旋转,炫酷的Android过渡动画
[桃花潭水深千尺,不及汪伦送我情] 不知道大家有没有发现,Android版的掘金有下面这个小小动画:点击作者头像跳转到作者的详情页,而作者头像会从当前界面通过动画过渡详情页界面. image 知识贫乏 ...
- 【LVGL 学习】样式(style)过渡动画学习
transition:过渡动画 当一个控件的状态发生改变时,可以让样式也发生变化以提醒用户.通过过渡动画(transition)可以让样式的改变更自然.例如,按钮在点击时,以及开关在切换时,都具有一小 ...
- 动漫轮播html,带17种内置过渡动画的jquery轮播图插件
bsc-slider是一款带17种内置过渡动画的jquery轮播图插件.该jquery轮播图插件可以制作最基本的轮播图效果,并内置17种过渡动画效果,还可以自定义动画的easing效果. 使用方法 在 ...
- [iOS]过渡动画之高级模仿 airbnb
注意:我为过渡动画写了两篇文章: 第一篇:[iOS]过渡动画之简单模仿系统,主要分析系统简单的动画实现原理,以及讲解坐标系.绝对坐标系.相对坐标系,坐标系转换等知识,为第二篇储备理论基础.最后实现 M ...
- android动画延迟执行,Android 过渡动画框架
为了帮助视图层次内部和视图之间的过渡更加容易实现动画效果,Android 提供了 Transition 框架.这一套框架能够在视图之间提供一种或者多种动画过渡效果.过渡动画要解决的另一个主要问题就是对 ...
最新文章
- 阿里云飞天论文获国际架构顶会 ATC 2021最佳论文:全球仅三篇
- Linux下的Vsftpd配置篇
- Eclipse中Build Path的使用介绍---学习笔记
- 【转】Android AlertDialog自定义布局
- flutter上拉抽屉效果 flutter拖动抽屉效果
- 解压出来的文件md5会改变吗_监控Linux文件变化,防止系统被黑
- Fort.js – 时尚、现代的进度提示效果
- 树莓派3连接ps4无线手柄
- “数据类型不一致: 应为 NUMBER, 但却获得 BINARY”解决方法
- 无需软件,笔记本自带wifi功能,几条命令轻松搞定
- Python 四舍六入五成双
- python3爬取网页AJAX数据
- C termios.h 简单用法
- 每日分享html之1个卡片选择、2个加载、1个背景、1个开关
- 医疗数字化的数据灾难:医院像渔网一样洒落着患者隐私
- 快速开平方根倒数算法(Fast inverse square root)的一点探究
- 集成SpringSecurity和Oauth2的授权码认证
- Unity接入罗技G29方向盘,通过SDK获取按键信息
- IDEA project encoding 设置项目编码
- 本地服务器收银系统,开酒吧用什么收银系统?
热门文章
- 三种创建线程方式之Callable接口
- 无人机巡检场景小目标检测与量化加速部署方案详解
- linux下重启php服务
- for,while,until语句
- [2018.04.17][水][日志][6][#171~#181][贪心算法][已经丧心病狂][背景-amp;amp;amp;amp;gt;][最虚伪的算法]
- 全国各省高考分数线(2016-2021年)
- SpringBoot访问静态资源html和jsp
- udf iso9660 java_UDF和ISO9660格式介绍
- c语言 模拟 泊松过程,多泊松过程的模拟
- C++之阻塞和非阻塞区别