Skip to content

Commit 774d563

Browse files
committed
perf: optimize the animation effects of the document content
1 parent 34077eb commit 774d563

File tree

11 files changed

+843
-8
lines changed

11 files changed

+843
-8
lines changed

packages/demo/posts/markdown-examples.md

+4
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,7 @@ This is a details block.
8989
## More
9090

9191
Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown).
92+
93+
ssss
94+
95+
dddddddddd

packages/theme/index.ts

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { MotionPlugin } from '@vueuse/motion';
66
import { NImage, NImageGroup } from 'naive-ui';
77
import VPTheme from 'vitepress/theme';
88
import BlogPage from './src/client/components/BlogPage.vue';
9+
import ContentWrapper from './src/client/components/ContentWrapper.vue';
910
import DocsHeaderInfo from './src/client/components/DocsHeaderInfo.vue';
1011
import Layout from './src/client/components/Layout.vue';
1112
import Tags from './src/client/components/Tags.vue';
@@ -37,6 +38,11 @@ const MildTheme: Theme = {
3738
}
3839

3940
if (!(import.meta as any).env.SSR) {
41+
if (!(import.meta as any).env.DEV) {
42+
setTimeout(() => {
43+
window.scrollTo(0, 0);
44+
}, 300);
45+
}
4046
if ((import.meta as any).hot) {
4147
let scrollPosition = 0;
4248
// 监听热模块替换之前的事件
@@ -73,6 +79,7 @@ const MildTheme: Theme = {
7379
app.component('DocsHeaderInfo', DocsHeaderInfo);
7480
app.component('Image', NImage);
7581
app.component('ImageGroup', NImageGroup);
82+
app.component('ContentWrapper', ContentWrapper);
7683
}
7784
};
7885
export { Layout };

packages/theme/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"simple-git": "^3.27.0",
5454
"tinyglobby": "^0.2.10",
5555
"typed.js": "^2.1.0",
56+
"unocss": "^65.4.2",
5657
"vitepress-plugin-group-icons": "^1.3.2",
5758
"vitepress-plugin-rss": "^0.3.0",
5859
"vue": "^3.4.21"

packages/theme/src/client/components/BlogPage.vue

+16-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,22 @@ router.onBeforeRouteChange = to => {
5252
<div class="VMArticlesListWrapper">
5353
<ArticlesList :list-data="posts" :title="articleTitle" />
5454
</div>
55-
<NPagination v-if="totalPages" v-model:page="currentPage" :page-count="totalPages" />
55+
<NPagination
56+
v-if="totalPages"
57+
v-model:page="currentPage"
58+
v-motion
59+
:initial="{
60+
opacity: 0,
61+
}"
62+
:enter="{
63+
opacity: 1,
64+
transition: {
65+
duration: 500,
66+
delay: pageSize * 200,
67+
},
68+
}"
69+
:page-count="totalPages"
70+
/>
5671
</div>
5772
</div>
5873
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script lang="ts" setup>
2+
const classes = { 'slide-enter-content': !((import.meta as any).env.DEV) };
3+
</script>
4+
5+
<template>
6+
<div class="vm-content-wrapper" :class="classes">
7+
<slot />
8+
</div>
9+
</template>

packages/theme/src/client/components/Layout.vue

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import LocalNav from './LocalNav.vue';
1212
import Sidebar from './Sidebar.vue';
1313
1414
import('virtual:group-icons.css');
15+
import('virtual:uno.css');
1516
1617
// Init data 不要在其他任何地方调用这个hook 否则会存在性能浪费问题
1718
const { np } = useInitData();

packages/theme/src/client/styles/index.scss

+100
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,103 @@
117117
background: var(--vp-c-brand); /* 修改进度条的颜色 */
118118
}
119119
}
120+
121+
@keyframes slide-enter {
122+
0% {
123+
transform: translateY(10px);
124+
opacity: 0;
125+
}
126+
127+
to {
128+
transform: translateY(0);
129+
opacity: 100;
130+
}
131+
}
132+
133+
@media (prefers-reduced-motion: no-preference) {
134+
[slide-enter],
135+
.slide-enter,
136+
.slide-enter-content > * {
137+
--enter-stage: 0;
138+
--enter-step: 150ms;
139+
--enter-initial: 0ms;
140+
animation: slide-enter 1s both 1;
141+
animation-delay: calc(var(--enter-initial) + var(--enter-stage) * var(--enter-step));
142+
}
143+
144+
.slide-enter-content > *:nth-child(1) {
145+
--enter-stage: 1;
146+
}
147+
.slide-enter-content > *:nth-child(2) {
148+
--enter-stage: 2;
149+
}
150+
.slide-enter-content > *:nth-child(3) {
151+
--enter-stage: 3;
152+
}
153+
.slide-enter-content > *:nth-child(4) {
154+
--enter-stage: 4;
155+
}
156+
.slide-enter-content > *:nth-child(5) {
157+
--enter-stage: 5;
158+
}
159+
.slide-enter-content > *:nth-child(6) {
160+
--enter-stage: 6;
161+
}
162+
.slide-enter-content > *:nth-child(7) {
163+
--enter-stage: 7;
164+
}
165+
.slide-enter-content > *:nth-child(8) {
166+
--enter-stage: 8;
167+
}
168+
.slide-enter-content > *:nth-child(9) {
169+
--enter-stage: 9;
170+
}
171+
.slide-enter-content > *:nth-child(10) {
172+
--enter-stage: 10;
173+
}
174+
.slide-enter-content > *:nth-child(11) {
175+
--enter-stage: 11;
176+
}
177+
.slide-enter-content > *:nth-child(12) {
178+
--enter-stage: 12;
179+
}
180+
.slide-enter-content > *:nth-child(13) {
181+
--enter-stage: 13;
182+
}
183+
.slide-enter-content > *:nth-child(14) {
184+
--enter-stage: 14;
185+
}
186+
.slide-enter-content > *:nth-child(15) {
187+
--enter-stage: 15;
188+
}
189+
.slide-enter-content > *:nth-child(16) {
190+
--enter-stage: 16;
191+
}
192+
.slide-enter-content > *:nth-child(17) {
193+
--enter-stage: 17;
194+
}
195+
.slide-enter-content > *:nth-child(18) {
196+
--enter-stage: 18;
197+
}
198+
.slide-enter-content > *:nth-child(19) {
199+
--enter-stage: 19;
200+
}
201+
.slide-enter-content > *:nth-child(20) {
202+
--enter-stage: 20;
203+
}
204+
.slide-enter-content > *:nth-child(21) {
205+
--enter-stage: 21;
206+
}
207+
.slide-enter-content > *:nth-child(22) {
208+
--enter-stage: 22;
209+
}
210+
.slide-enter-content > *:nth-child(23) {
211+
--enter-stage: 23;
212+
}
213+
.slide-enter-content > *:nth-child(24) {
214+
--enter-stage: 24;
215+
}
216+
.slide-enter-content > *:nth-child(25) {
217+
--enter-stage: 25;
218+
}
219+
}

packages/theme/src/client/vite-env.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ declare module '*.vue' {
88

99
declare module '*.svg';
1010
declare module 'virtual:group-icons.css'
11+
declare module 'virtual:uno.css'

packages/theme/src/node/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { DefaultTheme, Plugin, RawConfigExports, SiteConfig } from 'vitepress';
22
import { fileURLToPath } from 'node:url';
33
import { transformerTwoslash } from '@shikijs/vitepress-twoslash';
4+
import UnoCSS from 'unocss/vite';
45
import { groupIconMdPlugin, groupIconVitePlugin } from 'vitepress-plugin-group-icons';
56
import { RssPlugin } from 'vitepress-plugin-rss';
67
import { NOT_ARTICLE_LAYOUTS } from '../shared/constants';
@@ -55,7 +56,8 @@ const baseConfig: RawConfigExports<DefaultTheme.Config> = {
5556
},
5657
plugins: [
5758
groupIconVitePlugin(),
58-
rss()
59+
rss(),
60+
UnoCSS()
5961
],
6062
build: {
6163
chunkSizeWarningLimit: 2048

packages/theme/src/node/plugins/markdown.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const imgToImage: PluginSimple = md => {
3131
};
3232
md.renderer.render = (...args) => {
3333
const content = defaultRender.apply(md.renderer, args);
34-
return `<ImageGroup>${content}</ImageGroup>`;
34+
return `<ImageGroup><ContentWrapper>${content}</ContentWrapper></ImageGroup>`;
3535
};
3636
};
3737

0 commit comments

Comments
 (0)