vue如何实现展开收起时height变化所引起的动画?
如图
目前的效果太突兀了
代码如下:
这里使用transition没有效果
<template>
<div class="card-list-cell">
<h3 class="title">{{ title }}</h3>
<transition name="fade"><p ref="desc" :style="conStyle">{{ content }}</p></transition>
<!-- <transition name="fade"><p ref="desc" :class="showTotal ? '' : 'content-detailed'">{{ content }}</p></transition> -->
<span class="toggel" v-if="showExchangeButton" @click="showTotalIntro">
{{ exchangeButton ? '展开' : '收起' }}
<i class="iconfont icon-down"></i>
</span>
</div>
</template>
监听中改变长度
export default {
props: ['item'],
data() {
return {
title: this.item.title,
content: '', // 文本内容
showTotal: true, // 是否展示所有文本内容
exchangeButton: true, // 显示展开还是收起
showExchangeButton: false, // 是否显示展开收起按钮
rem: '',
conStyle: ''
}
},
watch: {
'content': function () {
this.$nextTick(function () {
// 判断介绍是否超过四行
let rem = parseFloat(this.getRem())
console.log('watch 中的rem', rem)
if (!this.$refs.desc) {
// 文本为空
return
}
let descHeight = window.getComputedStyle(this.$refs.desc).height.replace('px', '');
console.log('descHeight:' + descHeight);
console.log('如果 descHeight 超过' + (5.25 * rem) + '就要显示展开按钮');
if (descHeight > 5.25 * rem) {
console.log('超过了四行');
// 显示展开收起按钮
this.showExchangeButton = true;
this.exchangeButton = true;
// 不是显示所有
this.conStyle = {height: 5.25 * rem + 'px', overflow: 'hidden'}
this.showTotal = false;
} else {
// 不显示展开收起按钮
this.showExchangeButton = false;
console.log('showExchangeButton', this.showExchangeButton);
console.log('showTotal', this.showTotal);
}
}.bind(this))
},
// 监听按钮的状态来显示展开还是收起
'exchangeButton': function(val) {
this.$nextTick(() => {
let rem = parseFloat(this.getRem())
if (val) {
console.log('展开内容')
this.conStyle = {height: 5.25 * rem + 'px', overflow: 'hidden'}
} else {
this.conStyle = {height: 'auto', overflow: 'normal'}
}
})
}
},
methods: {
showTotalIntro () {
console.log(this.showTotal);
this.showTotal = !this.showTotal;
this.exchangeButton = !this.exchangeButton;
},
// 获取文本的文字大小(根据屏幕)
getRem () {
const defaultRem = 16;
let winWidth = window.innerWidth;
let rem = winWidth / 375 * defaultRem;
return rem;
},
},
mounted() {
this.content = this.item.content
},
}
css中设置没有效果
.card-list-cell {
position: relative;
border: 1px solid #dddddd;
margin-top: .5rem;
width: 90%;
height: auto;
margin: .5rem auto;
font-size: .26rem;
color: #333;
padding: .3rem .2rem;
box-sizing: border-box;
.title {
position: absolute;
display: block;
width: 1.2rem;
height: 0.4rem;
border-radius: .1rem;
box-sizing: border-box;
padding: .1rem;
background-color: #5aa4fc;
top: 0;
left: .3rem;
transform: translateY(-50%);
font-size: .2rem;
color: #fff;
text-align: center;
line-height: .24rem;
font-weight: 200;
}
p {
transition: height 2s;
}
.content-detailed {
overflow: hidden;
-webkit-line-clamp: 3;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
}
.toggel {
display: block;
width: 100%;
color: #666666;
font-size: .24rem;
text-align: center;
padding-top: 0rem;
}
}
// 设置图标样式
.icon-down {
font-size: .2rem;
}
要怎么才能得到流畅的过渡效果啊?
网上搜索只得到显示和隐藏的动画
不知道这种长度发生改变的动画在vue中如何实现
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
一开始必须要有固定值的高度的,height: auto无效的,可以通过mounted初始化一个高度
请问动画效果实现了吗
请问解决了吗