目录

  • 最终效果
  • 一、无过渡动画的手风琴
  • 二、有过渡动画的手风琴
    • 1. 不能再用v-if或v-show
    • 2. 用:class动态绑定样式
    • 3. 子元素也要设置transition

最终效果

UI同学让做一个带过渡动画的手风琴折叠效果,点击一个元素展开,其他已展开元素自动收缩,每次最多只有一个元素展开,这是最终效果:

接下来讲我用css实现的思路

一、无过渡动画的手风琴

首先,uniapp做无过渡动画的最容易做了,因为Vue里只要用v-ifv-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/


果然transitioninherited: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实现带过渡动画的手风琴折叠样式相关推荐

  1. Fabric.js 删除元素(带过渡动画)

    本文简介 Fabric.js 提供了2个方法删除对象. 一个是 直接删除,另一个方法是 带过渡动画 删除元素(淡出动画). 本文重点讲 带过渡动画 删除元素的方法,还会讲到设置 过渡时长 .删除后的 ...

  2. html5手机手风琴相册,纯js带弹性动画的手风琴图片相册特效

    这是一款使用纯javascript来制作的带弹性动画的手风琴图片相册特效.该手风琴图片相册在鼠标滑过时,相应的图片会水平展开,而图片的说明文字则会垂直滑动上来,形成一些视觉差的感觉. 使用方法 在页面 ...

  3. CSS3展开带弹性动画的手风琴菜单

    在线演示 本地下载 转载于:https://www.cnblogs.com/qixidi/p/10065072.html

  4. android 布局收缩动画,自定义View-带过渡动画的折叠收缩布局

    简介: 由于界面View.VISIBLE和View.GONE的动画太生硬,所以写了ExpandLayout类来平滑过渡. 基本思路,动态的设置布局的高度. 先上效果图: expand.gif 核心动画 ...

  5. android过渡动画旋转,炫酷的Android过渡动画

    [桃花潭水深千尺,不及汪伦送我情] 不知道大家有没有发现,Android版的掘金有下面这个小小动画:点击作者头像跳转到作者的详情页,而作者头像会从当前界面通过动画过渡详情页界面. image 知识贫乏 ...

  6. 【LVGL 学习】样式(style)过渡动画学习

    transition:过渡动画 当一个控件的状态发生改变时,可以让样式也发生变化以提醒用户.通过过渡动画(transition)可以让样式的改变更自然.例如,按钮在点击时,以及开关在切换时,都具有一小 ...

  7. 动漫轮播html,带17种内置过渡动画的jquery轮播图插件

    bsc-slider是一款带17种内置过渡动画的jquery轮播图插件.该jquery轮播图插件可以制作最基本的轮播图效果,并内置17种过渡动画效果,还可以自定义动画的easing效果. 使用方法 在 ...

  8. [iOS]过渡动画之高级模仿 airbnb

    注意:我为过渡动画写了两篇文章: 第一篇:[iOS]过渡动画之简单模仿系统,主要分析系统简单的动画实现原理,以及讲解坐标系.绝对坐标系.相对坐标系,坐标系转换等知识,为第二篇储备理论基础.最后实现 M ...

  9. android动画延迟执行,Android 过渡动画框架

    为了帮助视图层次内部和视图之间的过渡更加容易实现动画效果,Android 提供了 Transition 框架.这一套框架能够在视图之间提供一种或者多种动画过渡效果.过渡动画要解决的另一个主要问题就是对 ...

最新文章

  1. 阿里云飞天论文获国际架构顶会 ATC 2021最佳论文:全球仅三篇
  2. Linux下的Vsftpd配置篇
  3. Eclipse中Build Path的使用介绍---学习笔记
  4. 【转】Android AlertDialog自定义布局
  5. flutter上拉抽屉效果 flutter拖动抽屉效果
  6. 解压出来的文件md5会改变吗_监控Linux文件变化,防止系统被黑
  7. Fort.js – 时尚、现代的进度提示效果
  8. 树莓派3连接ps4无线手柄
  9. “数据类型不一致: 应为 NUMBER, 但却获得 BINARY”解决方法
  10. 无需软件,笔记本自带wifi功能,几条命令轻松搞定
  11. Python 四舍六入五成双
  12. python3爬取网页AJAX数据
  13. C termios.h 简单用法
  14. 每日分享html之1个卡片选择、2个加载、1个背景、1个开关
  15. 医疗数字化的数据灾难:医院像渔网一样洒落着患者隐私
  16. 快速开平方根倒数算法(Fast inverse square root)的一点探究
  17. 集成SpringSecurity和Oauth2的授权码认证
  18. Unity接入罗技G29方向盘,通过SDK获取按键信息
  19. IDEA project encoding 设置项目编码
  20. 本地服务器收银系统,开酒吧用什么收银系统?

热门文章

  1. 三种创建线程方式之Callable接口
  2. 无人机巡检场景小目标检测与量化加速部署方案详解
  3. linux下重启php服务
  4. for,while,until语句
  5. [2018.04.17][水][日志][6][#171~#181][贪心算法][已经丧心病狂][背景-amp;amp;amp;amp;gt;][最虚伪的算法]
  6. 全国各省高考分数线(2016-2021年)
  7. SpringBoot访问静态资源html和jsp
  8. udf iso9660 java_UDF和ISO9660格式介绍
  9. c语言 模拟 泊松过程,多泊松过程的模拟
  10. C++之阻塞和非阻塞区别