mirror of
https://github.com/ZiuChen/ZiuChen.github.io.git
synced 2025-08-18 15:39:35 +08:00
178 lines
68 KiB
JavaScript
178 lines
68 KiB
JavaScript
import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.9b71bc06.js";const d=JSON.parse('{"title":"从0实现一个年度报告","description":"","frontmatter":{},"headers":[],"relativePath":"article/从0实现一个年度报告.md","filePath":"article/从0实现一个年度报告.md","lastUpdated":1704524259000}'),p={name:"article/从0实现一个年度报告.md"},o=l(`<h1 id="从0实现一个年度报告" tabindex="-1">从0实现一个年度报告 <a class="header-anchor" href="#从0实现一个年度报告" aria-label="Permalink to "从0实现一个年度报告""></a></h1><p>每到年底各大应用都会推出自己的年终总结报告,统计出用户一年来在应用内的行为展示给用户,供用户记录、分享。</p><p>今年掘金社区推出了自己的<a href="https://zjsms.com/hbdA5jR" target="_blank" rel="noreferrer">2022掘友年度报告</a>,这次我们仿照这个报告,从0开始自己实现一个年终总结报告页面</p><h2 id="实现难点" tabindex="-1">实现难点 <a class="header-anchor" href="#实现难点" aria-label="Permalink to "实现难点""></a></h2><h3 id="_1-数据模拟" tabindex="-1">1. 数据模拟 <a class="header-anchor" href="#_1-数据模拟" aria-label="Permalink to "1. 数据模拟""></a></h3><p>一般情况下是根据用户UID,到后端去请求相关接口获得统计数据。</p><p>例如掘金的接口为<code>https://api.juejin.cn/event_api/v1/annual/annual_summary?aid=xxxxxx</code></p><p>本次后端使用<code>NodeJS</code>实现了一个爬虫,可以将用户数据统计完成后导出JSON格式的数据,将此数据粘贴到前端页面的输入框即可生成自己的报告</p><h3 id="_2-屏幕适配" tabindex="-1">2. 屏幕适配 <a class="header-anchor" href="#_2-屏幕适配" aria-label="Permalink to "2. 屏幕适配""></a></h3><p>可以观察到,在PC端和在手机端访问年度报告展示的效果是不一样的。</p><p>本次考虑使用媒体查询来实现这个功能:</p><ul><li>宽屏则展示背景,页面切换也使用背景中的上下切换按钮</li><li>小屏则隐藏背景,让内容填满屏幕,页面切换通过滑动事件监听</li></ul><h3 id="_3-动画效果" tabindex="-1">3. 动画效果 <a class="header-anchor" href="#_3-动画效果" aria-label="Permalink to "3. 动画效果""></a></h3><p>动画分为文本与背景元素的动画</p><ul><li>背景元素的动画使用了SVG动画 <ul><li>动画中不动的部分直接使用<code>.png</code>图片</li><li>运动的部分使用SVG动画绘制,如克里克的眼睛、尾巴</li></ul></li><li>文本的动画使用了<code>CSS Animation</code>渐显的效果 <ul><li>不同段落之间通过<code>animation-delay</code>属性,彼此相差<code>1000ms</code></li></ul></li></ul><p>背景动画容器的四个位置:<code>左上角</code> <code>右下角</code> <code>中间部分</code> <code>中间(悬浮气泡)</code>。不同位置的动画容器都采用绝对定位<code>position: absolute;</code>,辅以<code>z-index</code>实现层叠</p><p>囿于工期,本次的背景动画直接采用静态图片+<code>CSS Animation</code>实现上下浮动的效果</p><h3 id="_4-音乐播放" tabindex="-1">4. 音乐播放 <a class="header-anchor" href="#_4-音乐播放" aria-label="Permalink to "4. 音乐播放""></a></h3><p>通过<code>Audio</code>接口访问网络音乐链接,控制音乐相关功能</p><ul><li>进入页面开始播放</li><li>离开页面暂停播放</li><li>支持点击按钮切换播放状态</li></ul><h2 id="用户数据" tabindex="-1">用户数据 <a class="header-anchor" href="#用户数据" aria-label="Permalink to "用户数据""></a></h2><h3 id="用户数据内容" tabindex="-1">用户数据内容 <a class="header-anchor" href="#用户数据内容" aria-label="Permalink to "用户数据内容""></a></h3><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">- 用户名</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">- 注册时间 距今天数</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">- 创作相关</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 发布文章数</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 总阅读数 总赞数 总评论数</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 掘力值增长 超过人数百分比</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 最受欢迎的文章标题</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">- 社交相关</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 多少位掘友看过你的文章</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 点赞最多的掘友 评论最多的掘友</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">- 学习相关</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 阅读文章数 点赞数 评论数</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 总阅读字数</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 最关注的技术领域TOP3</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">- 沸点相关</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 发布沸点数 互动掘友数 点赞数 收赞数</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 互动最频繁的掘友</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">- 深夜阅读</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 最晚一次阅读时间</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 阅读的文章标题</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">- 早起阅读</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 最晚一次阅读时间</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 阅读的文章标题</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">- 最终总结</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 用户名</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> - 获得成就 饼图</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">- 用户名</span></span>
|
||
<span class="line"><span style="color:#24292e;">- 注册时间 距今天数</span></span>
|
||
<span class="line"><span style="color:#24292e;">- 创作相关</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 发布文章数</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 总阅读数 总赞数 总评论数</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 掘力值增长 超过人数百分比</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 最受欢迎的文章标题</span></span>
|
||
<span class="line"><span style="color:#24292e;">- 社交相关</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 多少位掘友看过你的文章</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 点赞最多的掘友 评论最多的掘友</span></span>
|
||
<span class="line"><span style="color:#24292e;">- 学习相关</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 阅读文章数 点赞数 评论数</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 总阅读字数</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 最关注的技术领域TOP3</span></span>
|
||
<span class="line"><span style="color:#24292e;">- 沸点相关</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 发布沸点数 互动掘友数 点赞数 收赞数</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 互动最频繁的掘友</span></span>
|
||
<span class="line"><span style="color:#24292e;">- 深夜阅读</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 最晚一次阅读时间</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 阅读的文章标题</span></span>
|
||
<span class="line"><span style="color:#24292e;">- 早起阅读</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 最晚一次阅读时间</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 阅读的文章标题</span></span>
|
||
<span class="line"><span style="color:#24292e;">- 最终总结</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 用户名</span></span>
|
||
<span class="line"><span style="color:#24292e;"> - 获得成就 饼图</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br></div></div><h3 id="数据模拟" tabindex="-1">数据模拟 <a class="header-anchor" href="#数据模拟" aria-label="Permalink to "数据模拟""></a></h3><p>根据不同页面分配不同的字段与数据,我根据自己的报告模拟了以下JSON数据</p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#E1E4E8;">{</span><span style="color:#79B8FF;">"pages"</span><span style="color:#E1E4E8;">:[{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">0</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"userName"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"Ziu"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"enterDay"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1647619200000</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"tillNow"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">291</span><span style="color:#E1E4E8;">}},{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"publishArticle"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">187</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"getReader"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">78959</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"getLike"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">393</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"getComment"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">13</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"increment"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">3693</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"rate"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">0.9773</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"mostPopularArticle"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"深入理解浏览器缓存原理"</span><span style="color:#E1E4E8;">}},{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">2</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"growFriends"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">2861</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"mostLike"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"老边"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"mostComment"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"重载新生"</span><span style="color:#E1E4E8;">}},{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">3</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"mostGoodAt"</span><span style="color:#E1E4E8;">:[</span><span style="color:#9ECBFF;">"JavaScript"</span><span style="color:#E1E4E8;">,</span><span style="color:#9ECBFF;">"Vue3"</span><span style="color:#E1E4E8;">,</span><span style="color:#9ECBFF;">"TypeScript"</span><span style="color:#E1E4E8;">]}},{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">4</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"readed"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1397</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"like"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1347</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"comment"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1345</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"words"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"244万"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"mostFocus"</span><span style="color:#E1E4E8;">:[</span><span style="color:#9ECBFF;">"前端"</span><span style="color:#E1E4E8;">,</span><span style="color:#9ECBFF;">"JavaScript"</span><span style="color:#E1E4E8;">,</span><span style="color:#9ECBFF;">"Vue.js"</span><span style="color:#E1E4E8;">]}},{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">5</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"oftenRead"</span><span style="color:#E1E4E8;">:[{</span><span style="color:#79B8FF;">"name"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"seloven"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"followed"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">0</span><span style="color:#E1E4E8;">},{</span><span style="color:#79B8FF;">"name"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"掘金酱"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"followed"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1</span><span style="color:#E1E4E8;">},{</span><span style="color:#79B8FF;">"name"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"CLICK克里克"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"followed"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1</span><span style="color:#E1E4E8;">},{</span><span style="color:#79B8FF;">"name"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"稀土君"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"followed"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1</span><span style="color:#E1E4E8;">},{</span><span style="color:#79B8FF;">"name"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"cc123nice"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"followed"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">0</span><span style="color:#E1E4E8;">}]}},{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">6</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"publishPin"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">395</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"interact"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1283</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"like"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">705</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"getLike"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">374</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"mostInteractWith"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"狗哥哥"</span><span style="color:#E1E4E8;">}},{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">7</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"mostLateTime"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1665768240000</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"publishArticle"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"深入理解浏览器缓存原理"</span><span style="color:#E1E4E8;">}},{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">8</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"mostEarlyTime"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">1661208660000</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"publishArticle"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"深入理解Proxy与Reflect"</span><span style="color:#E1E4E8;">}},{</span><span style="color:#79B8FF;">"id"</span><span style="color:#E1E4E8;">:</span><span style="color:#79B8FF;">9</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"data"</span><span style="color:#E1E4E8;">:{</span><span style="color:#79B8FF;">"nickName"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"Ziu"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"ability"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"学习力"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"analysis"</span><span style="color:#E1E4E8;">:</span><span style="color:#9ECBFF;">"滴水石穿,读百篇尽显敏而好学"</span><span style="color:#E1E4E8;">,</span><span style="color:#79B8FF;">"medal"</span><span style="color:#E1E4E8;">:[</span><span style="color:#9ECBFF;">"与你同行"</span><span style="color:#E1E4E8;">,</span><span style="color:#9ECBFF;">"笔耕不辍"</span><span style="color:#E1E4E8;">,</span><span style="color:#9ECBFF;">"博览群文"</span><span style="color:#E1E4E8;">,</span><span style="color:#9ECBFF;">"高才掘学"</span><span style="color:#E1E4E8;">,</span><span style="color:#9ECBFF;">"前排围观"</span><span style="color:#E1E4E8;">]}}]}</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292E;">{</span><span style="color:#005CC5;">"pages"</span><span style="color:#24292E;">:[{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">0</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"userName"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"Ziu"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"enterDay"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1647619200000</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"tillNow"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">291</span><span style="color:#24292E;">}},{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"publishArticle"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">187</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"getReader"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">78959</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"getLike"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">393</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"getComment"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">13</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"increment"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">3693</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"rate"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">0.9773</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"mostPopularArticle"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"深入理解浏览器缓存原理"</span><span style="color:#24292E;">}},{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">2</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"growFriends"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">2861</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"mostLike"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"老边"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"mostComment"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"重载新生"</span><span style="color:#24292E;">}},{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">3</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"mostGoodAt"</span><span style="color:#24292E;">:[</span><span style="color:#032F62;">"JavaScript"</span><span style="color:#24292E;">,</span><span style="color:#032F62;">"Vue3"</span><span style="color:#24292E;">,</span><span style="color:#032F62;">"TypeScript"</span><span style="color:#24292E;">]}},{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">4</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"readed"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1397</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"like"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1347</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"comment"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1345</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"words"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"244万"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"mostFocus"</span><span style="color:#24292E;">:[</span><span style="color:#032F62;">"前端"</span><span style="color:#24292E;">,</span><span style="color:#032F62;">"JavaScript"</span><span style="color:#24292E;">,</span><span style="color:#032F62;">"Vue.js"</span><span style="color:#24292E;">]}},{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">5</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"oftenRead"</span><span style="color:#24292E;">:[{</span><span style="color:#005CC5;">"name"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"seloven"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"followed"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">0</span><span style="color:#24292E;">},{</span><span style="color:#005CC5;">"name"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"掘金酱"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"followed"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1</span><span style="color:#24292E;">},{</span><span style="color:#005CC5;">"name"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"CLICK克里克"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"followed"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1</span><span style="color:#24292E;">},{</span><span style="color:#005CC5;">"name"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"稀土君"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"followed"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1</span><span style="color:#24292E;">},{</span><span style="color:#005CC5;">"name"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"cc123nice"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"followed"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">0</span><span style="color:#24292E;">}]}},{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">6</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"publishPin"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">395</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"interact"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1283</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"like"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">705</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"getLike"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">374</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"mostInteractWith"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"狗哥哥"</span><span style="color:#24292E;">}},{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">7</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"mostLateTime"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1665768240000</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"publishArticle"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"深入理解浏览器缓存原理"</span><span style="color:#24292E;">}},{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">8</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"mostEarlyTime"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">1661208660000</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"publishArticle"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"深入理解Proxy与Reflect"</span><span style="color:#24292E;">}},{</span><span style="color:#005CC5;">"id"</span><span style="color:#24292E;">:</span><span style="color:#005CC5;">9</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"data"</span><span style="color:#24292E;">:{</span><span style="color:#005CC5;">"nickName"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"Ziu"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"ability"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"学习力"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"analysis"</span><span style="color:#24292E;">:</span><span style="color:#032F62;">"滴水石穿,读百篇尽显敏而好学"</span><span style="color:#24292E;">,</span><span style="color:#005CC5;">"medal"</span><span style="color:#24292E;">:[</span><span style="color:#032F62;">"与你同行"</span><span style="color:#24292E;">,</span><span style="color:#032F62;">"笔耕不辍"</span><span style="color:#24292E;">,</span><span style="color:#032F62;">"博览群文"</span><span style="color:#24292E;">,</span><span style="color:#032F62;">"高才掘学"</span><span style="color:#24292E;">,</span><span style="color:#032F62;">"前排围观"</span><span style="color:#24292E;">]}}]}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><h2 id="编码中遇到的问题" tabindex="-1">编码中遇到的问题 <a class="header-anchor" href="#编码中遇到的问题" aria-label="Permalink to "编码中遇到的问题""></a></h2><h3 id="音乐自动播放的问题" tabindex="-1">音乐自动播放的问题 <a class="header-anchor" href="#音乐自动播放的问题" aria-label="Permalink to "音乐自动播放的问题""></a></h3><p>之前我希望不操作DOM,而是通过<code>new Audio()</code>更优雅的实现音频播放。实际情况是:浏览器禁用了无用户操作的音频自动播放,要想实现自动播放有两种解决方法:</p><ul><li>HTML标签<code><audio></code>添加<code>autoplay</code>属性 后续播放/暂停都需要操作DOM</li><li>为界面添加监听器,监听到用户操作后手动触发<code>audio.play()</code></li></ul><p>为了保证功能实现的稳定性,我选择了前者。</p><div class="language-js vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#6A737D;">// useAudio.js</span></span>
|
||
<span class="line"><span style="color:#F97583;">import</span><span style="color:#E1E4E8;"> { ref } </span><span style="color:#F97583;">from</span><span style="color:#E1E4E8;"> </span><span style="color:#9ECBFF;">'vue'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">defaultURL</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#9ECBFF;">'https://xxxxxxxxxxxxxxxxxxxxxxxx.mp3'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#F97583;">export</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">default</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">function</span><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">useAudio</span><span style="color:#E1E4E8;">(</span><span style="color:#FFAB70;">url</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> defaultURL) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">audio</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">new</span><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">Audio</span><span style="color:#E1E4E8;">(url)</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> audio.loop </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">true</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">playStatus</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">ref</span><span style="color:#E1E4E8;">(</span><span style="color:#79B8FF;">false</span><span style="color:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">play</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> () </span><span style="color:#F97583;">=></span><span style="color:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> audio.</span><span style="color:#B392F0;">play</span><span style="color:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> playStatus.value </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">true</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">pause</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> () </span><span style="color:#F97583;">=></span><span style="color:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> audio.</span><span style="color:#B392F0;">pause</span><span style="color:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> playStatus.value </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">false</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">return</span><span style="color:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> audio, play, pause, playStatus</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#6A737D;">// useAudio.js</span></span>
|
||
<span class="line"><span style="color:#D73A49;">import</span><span style="color:#24292E;"> { ref } </span><span style="color:#D73A49;">from</span><span style="color:#24292E;"> </span><span style="color:#032F62;">'vue'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">defaultURL</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#032F62;">'https://xxxxxxxxxxxxxxxxxxxxxxxx.mp3'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#D73A49;">export</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">default</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">function</span><span style="color:#24292E;"> </span><span style="color:#6F42C1;">useAudio</span><span style="color:#24292E;">(</span><span style="color:#E36209;">url</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> defaultURL) {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">audio</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">new</span><span style="color:#24292E;"> </span><span style="color:#6F42C1;">Audio</span><span style="color:#24292E;">(url)</span></span>
|
||
<span class="line"><span style="color:#24292E;"> audio.loop </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">true</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">playStatus</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#6F42C1;">ref</span><span style="color:#24292E;">(</span><span style="color:#005CC5;">false</span><span style="color:#24292E;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#6F42C1;">play</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> () </span><span style="color:#D73A49;">=></span><span style="color:#24292E;"> {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> audio.</span><span style="color:#6F42C1;">play</span><span style="color:#24292E;">()</span></span>
|
||
<span class="line"><span style="color:#24292E;"> playStatus.value </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">true</span></span>
|
||
<span class="line"><span style="color:#24292E;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#6F42C1;">pause</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> () </span><span style="color:#D73A49;">=></span><span style="color:#24292E;"> {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> audio.</span><span style="color:#6F42C1;">pause</span><span style="color:#24292E;">()</span></span>
|
||
<span class="line"><span style="color:#24292E;"> playStatus.value </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">false</span></span>
|
||
<span class="line"><span style="color:#24292E;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">return</span><span style="color:#24292E;"> {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> audio, play, pause, playStatus</span></span>
|
||
<span class="line"><span style="color:#24292E;"> }</span></span>
|
||
<span class="line"><span style="color:#24292E;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br></div></div><h3 id="vnode调整样式的问题" tabindex="-1">VNode调整样式的问题 <a class="header-anchor" href="#vnode调整样式的问题" aria-label="Permalink to "VNode调整样式的问题""></a></h3><p>项目使用的框架是Vue3,部分页面使用到了JSX语法,众所周知JSX语法定义的组件返回的是一个VNode树,要想统一为树上元素添加渐变的样式则需要遍历他们。</p><p>需要遍历树上所有元素,并分别为他们添加不同值的<code>animation-delay</code>属性:</p><div class="language-js vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">children</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">DOM</span><span style="color:#E1E4E8;">.children</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">for</span><span style="color:#E1E4E8;"> (</span><span style="color:#F97583;">let</span><span style="color:#E1E4E8;"> i </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">1</span><span style="color:#E1E4E8;">; i </span><span style="color:#F97583;"><</span><span style="color:#E1E4E8;"> children.</span><span style="color:#79B8FF;">length</span><span style="color:#E1E4E8;">; i</span><span style="color:#F97583;">++</span><span style="color:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">child</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> children[i]</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> child.props</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">?</span><span style="color:#E1E4E8;"> (child.props.style </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> { animationDelay: </span><span style="color:#9ECBFF;">\`\${</span><span style="color:#E1E4E8;">i</span><span style="color:#9ECBFF;"> </span><span style="color:#F97583;">*</span><span style="color:#9ECBFF;"> </span><span style="color:#79B8FF;">1000</span><span style="color:#9ECBFF;">}ms\`</span><span style="color:#E1E4E8;"> })</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">:</span><span style="color:#E1E4E8;"> Object.</span><span style="color:#B392F0;">assign</span><span style="color:#E1E4E8;">(child, {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> props: { style: { animationDelay: </span><span style="color:#9ECBFF;">\`\${</span><span style="color:#E1E4E8;">i</span><span style="color:#9ECBFF;"> </span><span style="color:#F97583;">*</span><span style="color:#9ECBFF;"> </span><span style="color:#79B8FF;">1000</span><span style="color:#9ECBFF;">}ms\`</span><span style="color:#E1E4E8;"> } }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> })</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> }</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">children</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">DOM</span><span style="color:#24292E;">.children</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">for</span><span style="color:#24292E;"> (</span><span style="color:#D73A49;">let</span><span style="color:#24292E;"> i </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">1</span><span style="color:#24292E;">; i </span><span style="color:#D73A49;"><</span><span style="color:#24292E;"> children.</span><span style="color:#005CC5;">length</span><span style="color:#24292E;">; i</span><span style="color:#D73A49;">++</span><span style="color:#24292E;">) {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">child</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> children[i]</span></span>
|
||
<span class="line"><span style="color:#24292E;"> child.props</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">?</span><span style="color:#24292E;"> (child.props.style </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> { animationDelay: </span><span style="color:#032F62;">\`\${</span><span style="color:#24292E;">i</span><span style="color:#032F62;"> </span><span style="color:#D73A49;">*</span><span style="color:#032F62;"> </span><span style="color:#005CC5;">1000</span><span style="color:#032F62;">}ms\`</span><span style="color:#24292E;"> })</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">:</span><span style="color:#24292E;"> Object.</span><span style="color:#6F42C1;">assign</span><span style="color:#24292E;">(child, {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> props: { style: { animationDelay: </span><span style="color:#032F62;">\`\${</span><span style="color:#24292E;">i</span><span style="color:#032F62;"> </span><span style="color:#D73A49;">*</span><span style="color:#032F62;"> </span><span style="color:#005CC5;">1000</span><span style="color:#032F62;">}ms\`</span><span style="color:#24292E;"> } }</span></span>
|
||
<span class="line"><span style="color:#24292E;"> })</span></span>
|
||
<span class="line"><span style="color:#24292E;"> }</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p><code>style</code>属性并不是VNode的直接属性,而放在<code>props</code>上的</p><h3 id="监听animation结束事件并更新响应式变量" tabindex="-1">监听<code>Animation</code>结束事件并更新响应式变量 <a class="header-anchor" href="#监听animation结束事件并更新响应式变量" aria-label="Permalink to "监听\`Animation\`结束事件并更新响应式变量""></a></h3><p>如果当前页所有的动画都播放完毕,则需要将播放完的事件通知给JavaScript并将状态更新到响应式的变量中</p><p>在前文遍历DOM树时,为树中最后一个动画节点添加<code>animationend</code>监听回调,回调函数中执行<code>document.dispatchEvent(e)</code>,其中<code>e</code>是通过<code>const e = new CustomEvent('custom-animationend')</code>创建的自定义事件</p><p>回调触发时,在别处的<code>onMounted</code>回调内监听该自定义事件的触发,并更新响应式变量</p><h3 id="切换页面支持触控滑动滚轮键盘" tabindex="-1">切换页面支持触控滑动滚轮键盘 <a class="header-anchor" href="#切换页面支持触控滑动滚轮键盘" aria-label="Permalink to "切换页面支持触控滑动滚轮键盘""></a></h3><p>由于年终总结报告需要考虑到多种终端用户的体验,所以需要对翻页操作进行更多的优化</p><p>监听页面的触控滑动事件、滚轮滚动事件,并且匹配上翻页操作</p><div class="language-js vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#6A737D;">// 监听移动端滑动事件</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">let</span><span style="color:#E1E4E8;"> startY </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">0</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">let</span><span style="color:#E1E4E8;"> endY </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">0</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> document.</span><span style="color:#B392F0;">addEventListener</span><span style="color:#E1E4E8;">(</span><span style="color:#9ECBFF;">'touchstart'</span><span style="color:#E1E4E8;">, (</span><span style="color:#FFAB70;">e</span><span style="color:#E1E4E8;">) </span><span style="color:#F97583;">=></span><span style="color:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> startY </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> e.touches[</span><span style="color:#79B8FF;">0</span><span style="color:#E1E4E8;">].clientY</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> })</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> document.</span><span style="color:#B392F0;">addEventListener</span><span style="color:#E1E4E8;">(</span><span style="color:#9ECBFF;">'touchend'</span><span style="color:#E1E4E8;">, (</span><span style="color:#FFAB70;">e</span><span style="color:#E1E4E8;">) </span><span style="color:#F97583;">=></span><span style="color:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> endY </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> e.changedTouches[</span><span style="color:#79B8FF;">0</span><span style="color:#E1E4E8;">].clientY</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">if</span><span style="color:#E1E4E8;"> (endY </span><span style="color:#F97583;">-</span><span style="color:#E1E4E8;"> startY </span><span style="color:#F97583;">></span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">50</span><span style="color:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">prevPage</span><span style="color:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> } </span><span style="color:#F97583;">else</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">if</span><span style="color:#E1E4E8;"> (endY </span><span style="color:#F97583;">-</span><span style="color:#E1E4E8;"> startY </span><span style="color:#F97583;"><</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">-</span><span style="color:#79B8FF;">50</span><span style="color:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">nextPage</span><span style="color:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> })</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#6A737D;">// 监听鼠标滚轮事件</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> document.</span><span style="color:#B392F0;">addEventListener</span><span style="color:#E1E4E8;">(</span><span style="color:#9ECBFF;">'wheel'</span><span style="color:#E1E4E8;">, (</span><span style="color:#FFAB70;">e</span><span style="color:#E1E4E8;">) </span><span style="color:#F97583;">=></span><span style="color:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">if</span><span style="color:#E1E4E8;"> (e.deltaY </span><span style="color:#F97583;">></span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">0</span><span style="color:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">nextPage</span><span style="color:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> } </span><span style="color:#F97583;">else</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">if</span><span style="color:#E1E4E8;"> (e.deltaY </span><span style="color:#F97583;"><</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">0</span><span style="color:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">prevPage</span><span style="color:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> })</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#6A737D;">// 监听键盘事件</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> document.</span><span style="color:#B392F0;">addEventListener</span><span style="color:#E1E4E8;">(</span><span style="color:#9ECBFF;">'keydown'</span><span style="color:#E1E4E8;">, (</span><span style="color:#FFAB70;">e</span><span style="color:#E1E4E8;">) </span><span style="color:#F97583;">=></span><span style="color:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">if</span><span style="color:#E1E4E8;"> (e.key </span><span style="color:#F97583;">===</span><span style="color:#E1E4E8;"> </span><span style="color:#9ECBFF;">'ArrowUp'</span><span style="color:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">prevPage</span><span style="color:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> } </span><span style="color:#F97583;">else</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">if</span><span style="color:#E1E4E8;"> (e.key </span><span style="color:#F97583;">===</span><span style="color:#E1E4E8;"> </span><span style="color:#9ECBFF;">'ArrowDown'</span><span style="color:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">nextPage</span><span style="color:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> })</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292E;"> </span><span style="color:#6A737D;">// 监听移动端滑动事件</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">let</span><span style="color:#24292E;"> startY </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">0</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">let</span><span style="color:#24292E;"> endY </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">0</span></span>
|
||
<span class="line"><span style="color:#24292E;"> document.</span><span style="color:#6F42C1;">addEventListener</span><span style="color:#24292E;">(</span><span style="color:#032F62;">'touchstart'</span><span style="color:#24292E;">, (</span><span style="color:#E36209;">e</span><span style="color:#24292E;">) </span><span style="color:#D73A49;">=></span><span style="color:#24292E;"> {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> startY </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> e.touches[</span><span style="color:#005CC5;">0</span><span style="color:#24292E;">].clientY</span></span>
|
||
<span class="line"><span style="color:#24292E;"> })</span></span>
|
||
<span class="line"><span style="color:#24292E;"> document.</span><span style="color:#6F42C1;">addEventListener</span><span style="color:#24292E;">(</span><span style="color:#032F62;">'touchend'</span><span style="color:#24292E;">, (</span><span style="color:#E36209;">e</span><span style="color:#24292E;">) </span><span style="color:#D73A49;">=></span><span style="color:#24292E;"> {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> endY </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> e.changedTouches[</span><span style="color:#005CC5;">0</span><span style="color:#24292E;">].clientY</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">if</span><span style="color:#24292E;"> (endY </span><span style="color:#D73A49;">-</span><span style="color:#24292E;"> startY </span><span style="color:#D73A49;">></span><span style="color:#24292E;"> </span><span style="color:#005CC5;">50</span><span style="color:#24292E;">) {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#6F42C1;">prevPage</span><span style="color:#24292E;">()</span></span>
|
||
<span class="line"><span style="color:#24292E;"> } </span><span style="color:#D73A49;">else</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">if</span><span style="color:#24292E;"> (endY </span><span style="color:#D73A49;">-</span><span style="color:#24292E;"> startY </span><span style="color:#D73A49;"><</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">-</span><span style="color:#005CC5;">50</span><span style="color:#24292E;">) {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#6F42C1;">nextPage</span><span style="color:#24292E;">()</span></span>
|
||
<span class="line"><span style="color:#24292E;"> }</span></span>
|
||
<span class="line"><span style="color:#24292E;"> })</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#6A737D;">// 监听鼠标滚轮事件</span></span>
|
||
<span class="line"><span style="color:#24292E;"> document.</span><span style="color:#6F42C1;">addEventListener</span><span style="color:#24292E;">(</span><span style="color:#032F62;">'wheel'</span><span style="color:#24292E;">, (</span><span style="color:#E36209;">e</span><span style="color:#24292E;">) </span><span style="color:#D73A49;">=></span><span style="color:#24292E;"> {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">if</span><span style="color:#24292E;"> (e.deltaY </span><span style="color:#D73A49;">></span><span style="color:#24292E;"> </span><span style="color:#005CC5;">0</span><span style="color:#24292E;">) {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#6F42C1;">nextPage</span><span style="color:#24292E;">()</span></span>
|
||
<span class="line"><span style="color:#24292E;"> } </span><span style="color:#D73A49;">else</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">if</span><span style="color:#24292E;"> (e.deltaY </span><span style="color:#D73A49;"><</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">0</span><span style="color:#24292E;">) {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#6F42C1;">prevPage</span><span style="color:#24292E;">()</span></span>
|
||
<span class="line"><span style="color:#24292E;"> }</span></span>
|
||
<span class="line"><span style="color:#24292E;"> })</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#6A737D;">// 监听键盘事件</span></span>
|
||
<span class="line"><span style="color:#24292E;"> document.</span><span style="color:#6F42C1;">addEventListener</span><span style="color:#24292E;">(</span><span style="color:#032F62;">'keydown'</span><span style="color:#24292E;">, (</span><span style="color:#E36209;">e</span><span style="color:#24292E;">) </span><span style="color:#D73A49;">=></span><span style="color:#24292E;"> {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">if</span><span style="color:#24292E;"> (e.key </span><span style="color:#D73A49;">===</span><span style="color:#24292E;"> </span><span style="color:#032F62;">'ArrowUp'</span><span style="color:#24292E;">) {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#6F42C1;">prevPage</span><span style="color:#24292E;">()</span></span>
|
||
<span class="line"><span style="color:#24292E;"> } </span><span style="color:#D73A49;">else</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">if</span><span style="color:#24292E;"> (e.key </span><span style="color:#D73A49;">===</span><span style="color:#24292E;"> </span><span style="color:#032F62;">'ArrowDown'</span><span style="color:#24292E;">) {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#6F42C1;">nextPage</span><span style="color:#24292E;">()</span></span>
|
||
<span class="line"><span style="color:#24292E;"> }</span></span>
|
||
<span class="line"><span style="color:#24292E;"> })</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br></div></div><h3 id="代码打包" tabindex="-1">代码打包 <a class="header-anchor" href="#代码打包" aria-label="Permalink to "代码打包""></a></h3><p>由于最后需要将项目放到码上掘金平台运行,所以需要考虑静态资源的加载问题</p><p>这里我使用到了Vite提供的类似<code>file-loader</code>的功能,可以将大小在指定阈值下的图片资源直接转为行内的DataURL,配置选项是<code>config.build.assetsInlineLimit</code>,这样所有的图片资源都不必考虑外部引入的问题,直接内嵌进代码。</p><h2 id="技术介绍" tabindex="-1">技术介绍 <a class="header-anchor" href="#技术介绍" aria-label="Permalink to "技术介绍""></a></h2><p>主界面使用的是Vue3的<code>SFC</code>,主要逻辑都在单文件组件中完成。通过<code>JSX</code>语法编写不同页面的内容,这样更方便我们为每个节点添加不同的动画。</p><p><code>JSX</code>编写的组件通过全局注册后,在<code>SFC</code>中通过<code><Component></code>动态加载。</p><p>图片资源方面,使用到了雪碧图,部署后可以降低客户端发起HTTP请求频次,提高性能</p><p>代码复用方面,样式代码都抽离为单个的<code>xxxx.less</code>文件,哪里用到了直接导入即可</p><p>使用到了<code>Pinia</code>状态管理库,将<code>switching</code> <code>pageId</code> <code>audioStatus</code>等全局状态放到其中管理非常方便,避免了<code>provide</code>和<code>inject</code>的繁琐</p><h2 id="功能介绍" tabindex="-1">功能介绍 <a class="header-anchor" href="#功能介绍" aria-label="Permalink to "功能介绍""></a></h2><ul><li>支持PC端/移动端展示不同样式 <ul><li>PC端左侧有控制栏 支持控制音乐播放 切换页面</li><li>移动端右上角控制音乐 滑动切换页面</li></ul></li><li>页面之间切换有动态效果 文字逐行展示</li><li>左上角、右下角会出现矢量动图</li></ul><h2 id="demo展示" tabindex="-1">Demo展示 <a class="header-anchor" href="#demo展示" aria-label="Permalink to "Demo展示""></a></h2><p><a href="https://juejin-annual-report.vercel.app/" target="_blank" rel="noreferrer">Demo(Vercel)</a></p><p><a href="https://code.juejin.cn/pen/7184691373911015459" target="_blank" rel="noreferrer">jcode</a></p>`,59),e=[o];function t(c,r,E,y,i,u){return n(),a("div",null,e)}const q=s(p,[["render",t]]);export{d as __pageData,q as default};
|