前端那些花里胡哨的动画效果—移动端文章详情页跳转

效果


不说废话了,直接先来看实现的效果:



分析


首页页面的大体结构如下:

动画分解:

1.article-list内容动态设置样式整体上移移出屏幕,透明度改变

2.article-detail通过路由跳转借助transition实现上移动画,透明度改变

3.article-detail页面的骨架屏和文章内容fade切换,为了方便transition配合animate.css,也可以自己手撸


实现


首页template,关键在于通过路由切换来动态改变样式,detail借助transition实现:

<template>
<div class="home-container">
<div :class="['home-content', $route.path.includes('article') ? 'home-hidden' : '']">
<search-header />
<div class="content-tab">
<van-tabs v-model:active="active" animated>
<van-tab title="标签 1"><content-list /></van-tab>
<van-tab title="标签 2"></van-tab>
<van-tab title="标签 3"></van-tab>
<van-tab title="标签 4"></van-tab>
</van-tabs>
</div>
</div>
<div class="content-detail">
<transition name="article">
<router-view></router-view>
</transition>
</div>
</div>
</template>


首页scss:

.home-container {
width: 100vw;
height: 100%;
background-color: var(--box-color);
overflow: hidden;
.home-content {
transition: all 0.6s ease;
}
.home-hidden {
transform: translateY(-100%);
opacity: 0;
}
}

.article-enter-active {
animation: articleChange 0.6s;
}

.article-leave-active {
animation: articleChange 0.3s reverse;
}

@keyframes articleChange {
0% {
opacity: 0;
transform: translateY(100%);
}

100% {
opacity: 1;
transform: translateY(0);
}
}


详情页template,主要在于transition配合animate.css十分方便,通过leave-active-class和enter-active-class设置animate样式,延迟时间看个人情况进行选择:

<template>
<div class="content-article">
<transition
leave-active-class="animate__animated animate__fadeOut"
enter-active-class="animate__animated animate__fadeIn animate__delay-1s"
>
<div class="content-skeleton" v-if="flag">
<div class="bg-cover"></div>
<div class="sk">
<van-skeleton title :row="6" />
</div>
<div class="sk">
<van-skeleton title :row="4" />
</div>
</div>

<div class="content-detail" v-else>
<div class="bg-cover">
<img src="@/assets/images/bg.png" class="detail-img" alt="" />
</div>
<div class="content">
<p>测试内容测试测试</p>
<p>测试内容测试测试1231313</p>
<p>测试内容测试测试测试内容测试测试</p>
<p>测试内容测试测试</p>
<p>测试内容测试测试测试内容测试测试</p>
</div>
</div>
</transition>
</div>
</template>


详情页scss,需要注意的一点依然是content-detail需要设置定位,不然动画切换会出问题:

.content-article {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: var(--box-color);
box-sizing: border-box;
z-index: 1000;
overflow-y: auto;
padding: 20px;
opacity: 1;
.bg-cover {
width: 100%;
height: 230px;
background-color: #deeeff;
border-top-right-radius: 10px;
border-top-left-radius: 10px;
overflow: hidden;
}
.content-skeleton {
.sk {
margin: 20px 0;
:deep() {
.van-skeleton {
padding: 0;
}
}
}
}
.content-detail {
position: absolute;
top: 0;
left: 0;
padding: 20px;
.detail-img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
}


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
_Async__
作者分享
前端项目分享:Q Maker——仿问卷星低代码项目
25
2023年度总结:我们的生活没有“如果”
69
一个真实二本学院的秋招:停止内耗,接受自己的平庸
94
求职经验分享——两周的求职历程
22
#蓝桥杯# web 今年的蓝桥杯属实是上压力了,作为一名稀有的web组选手(今年我们软院名单上好像就我一个web组,去年两个[捂脸]),按照去年省赛的难度的话压根要不了4个小时,但刚拿到试卷扫了一眼,瞅到了最后两题的名字就感觉难度上来了。 不过前几道题难度确实不是很大,但很明显给人的感觉就是web组的出题更加成熟了,比如没有像去年那种写两行css就a一道题,纯css的题目像还原设计稿就没有了,不过第一道题的grid布局,确实还挺不错的,如果不是后面有个响应式的题用grid布局的代码我就g了,最后比葫芦画瓢也能写的出来。 其次就是个人感觉削弱了JQuery的比重,jQuery虽然也有使用但没有像去年题目那样带来极大的便利,这次我依旧是原生写JS,感觉使不使用差别不是特别大。 只能说有点水平的就是最后两题:markdown解析、树形结构拖拽 markdown的还好,一是看正则基础,二是对于blockquote和ul需要费点功夫,看得出来web组对于正则的要求一直都是有的。 最后一道就有点东西了,个人在上面那道题费了太多时间,最后一道时间明显不太够了只写了送分的那一问。大概看了看应该是原生手写递归组件,之前只用vue写过类似多级评论,递归菜单这样的。虽然原理都一样但是原生还是有点虚,第三问应该就是类似树形结构查找,扁平化删改这样,当时也没仔细看,一会儿扒扒原题再研究研究。 整体来讲还是比较考验基础的,像使用框架的题目分值就那么多,压轴的题永远是看你的原生JS能力。难度确实比去年省赛的题目大,但个人感觉这才是正常的比赛,去年省赛和国赛的难度差别过大反而不太适应,今年听天由命得了,也是最后一次了,可能要捐款了。。
19
下载 APP