mirror of
https://github.com/ZiuChen/ZiuChen.github.io.git
synced 2025-08-17 23:19:55 +08:00
95 lines
56 KiB
JavaScript
95 lines
56 KiB
JavaScript
import{_ as s,o as n,c as a,a as l}from"./app.6cf9e426.js";const u=JSON.parse('{"title":"从0实现一个年度报告","description":"","frontmatter":{},"headers":[{"level":2,"title":"实现难点","slug":"实现难点","link":"#实现难点","children":[{"level":3,"title":"1. 数据模拟","slug":"_1-数据模拟","link":"#_1-数据模拟","children":[]},{"level":3,"title":"2. 屏幕适配","slug":"_2-屏幕适配","link":"#_2-屏幕适配","children":[]},{"level":3,"title":"3. 动画效果","slug":"_3-动画效果","link":"#_3-动画效果","children":[]},{"level":3,"title":"4. 音乐播放","slug":"_4-音乐播放","link":"#_4-音乐播放","children":[]}]},{"level":2,"title":"用户数据","slug":"用户数据","link":"#用户数据","children":[{"level":3,"title":"用户数据内容","slug":"用户数据内容","link":"#用户数据内容","children":[]},{"level":3,"title":"数据模拟","slug":"数据模拟","link":"#数据模拟","children":[]}]},{"level":2,"title":"编码中遇到的问题","slug":"编码中遇到的问题","link":"#编码中遇到的问题","children":[{"level":3,"title":"音乐自动播放的问题","slug":"音乐自动播放的问题","link":"#音乐自动播放的问题","children":[]},{"level":3,"title":"VNode调整样式的问题","slug":"vnode调整样式的问题","link":"#vnode调整样式的问题","children":[]},{"level":3,"title":"监听Animation结束事件并更新响应式变量","slug":"监听animation结束事件并更新响应式变量","link":"#监听animation结束事件并更新响应式变量","children":[]},{"level":3,"title":"切换页面支持触控滑动滚轮键盘","slug":"切换页面支持触控滑动滚轮键盘","link":"#切换页面支持触控滑动滚轮键盘","children":[]},{"level":3,"title":"代码打包","slug":"代码打包","link":"#代码打包","children":[]}]},{"level":2,"title":"技术介绍","slug":"技术介绍","link":"#技术介绍","children":[]},{"level":2,"title":"功能介绍","slug":"功能介绍","link":"#功能介绍","children":[]},{"level":2,"title":"Demo展示","slug":"demo展示","link":"#demo展示","children":[]}],"relativePath":"article/从0实现一个年度报告.md","lastUpdated":1676469217000}'),p={name:"article/从0实现一个年度报告.md"},o=l(`<h1 id="从0实现一个年度报告" tabindex="-1">从0实现一个年度报告 <a class="header-anchor" href="#从0实现一个年度报告" aria-hidden="true">#</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-hidden="true">#</a></h2><h3 id="_1-数据模拟" tabindex="-1">1. 数据模拟 <a class="header-anchor" href="#_1-数据模拟" aria-hidden="true">#</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-hidden="true">#</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-hidden="true">#</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-hidden="true">#</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-hidden="true">#</a></h2><h3 id="用户数据内容" tabindex="-1">用户数据内容 <a class="header-anchor" href="#用户数据内容" aria-hidden="true">#</a></h3><div class="language- line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">- 用户名</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">- 注册时间 距今天数</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">- 创作相关</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 发布文章数</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 总阅读数 总赞数 总评论数</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 掘力值增长 超过人数百分比</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 最受欢迎的文章标题</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">- 社交相关</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 多少位掘友看过你的文章</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 点赞最多的掘友 评论最多的掘友</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">- 学习相关</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 阅读文章数 点赞数 评论数</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 总阅读字数</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 最关注的技术领域TOP3</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">- 沸点相关</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 发布沸点数 互动掘友数 点赞数 收赞数</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 互动最频繁的掘友</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">- 深夜阅读</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 最晚一次阅读时间</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 阅读的文章标题</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">- 早起阅读</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 最晚一次阅读时间</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 阅读的文章标题</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">- 最终总结</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 用户名</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> - 获得成就 饼图</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"></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-hidden="true">#</a></h3><p>根据不同页面分配不同的字段与数据,我根据自己的报告模拟了以下JSON数据</p><div class="language-json line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">{</span><span style="color:#89DDFF;">"</span><span style="color:#C792EA;">pages</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:[{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">userName</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">Ziu</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">enterDay</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1647619200000</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">tillNow</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">291</span><span style="color:#89DDFF;">}},{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">publishArticle</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">187</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">getReader</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">78959</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">getLike</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">393</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">getComment</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">13</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">increment</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">3693</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">rate</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">0.9773</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">mostPopularArticle</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">深入理解浏览器缓存原理</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">}},{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">2</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">growFriends</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">2861</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">mostLike</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">老边</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">mostComment</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">重载新生</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">}},{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">3</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">mostGoodAt</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:[</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">JavaScript</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">Vue3</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">TypeScript</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">]}},{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">4</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">readed</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1397</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">like</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1347</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">comment</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1345</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">words</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">244万</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">mostFocus</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:[</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">前端</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">JavaScript</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">Vue.js</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">]}},{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">5</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">oftenRead</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:[{</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">name</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">seloven</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">followed</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">},{</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">name</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">掘金酱</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">followed</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">},{</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">name</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">CLICK克里克</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">followed</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">},{</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">name</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">稀土君</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">followed</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">},{</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">name</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">cc123nice</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F07178;">followed</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">}]}},{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">6</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">publishPin</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">395</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">interact</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1283</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">like</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">705</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">getLike</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">374</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">mostInteractWith</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">狗哥哥</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">}},{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">7</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">mostLateTime</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1665768240000</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">publishArticle</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">深入理解浏览器缓存原理</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">}},{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">8</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">mostEarlyTime</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">1661208660000</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">publishArticle</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">深入理解Proxy与Reflect</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">}},{</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">id</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#F78C6C;">9</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#FFCB6B;">data</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:{</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">nickName</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">Ziu</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">ability</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">学习力</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">analysis</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">滴水石穿,读百篇尽显敏而好学</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#F78C6C;">medal</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">:[</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">与你同行</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">笔耕不辍</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">博览群文</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">高才掘学</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">前排围观</span><span style="color:#89DDFF;">"</span><span style="color:#89DDFF;">]}}]}</span></span>
|
||
<span class="line"></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-hidden="true">#</a></h2><h3 id="音乐自动播放的问题" tabindex="-1">音乐自动播放的问题 <a class="header-anchor" href="#音乐自动播放的问题" aria-hidden="true">#</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 line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;">// useAudio.js</span></span>
|
||
<span class="line"><span style="color:#89DDFF;font-style:italic;">import</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">ref</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">from</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">'</span><span style="color:#C3E88D;">vue</span><span style="color:#89DDFF;">'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#C792EA;">const</span><span style="color:#A6ACCD;"> defaultURL </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">'</span><span style="color:#C3E88D;">https://xxxxxxxxxxxxxxxxxxxxxxxx.mp3</span><span style="color:#89DDFF;">'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#89DDFF;font-style:italic;">export</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">default</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">function</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">useAudio</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;font-style:italic;">url</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> defaultURL</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#C792EA;">const</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">audio</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">new</span><span style="color:#F07178;"> </span><span style="color:#82AAFF;">Audio</span><span style="color:#F07178;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#F07178;">)</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">audio</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">loop</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#FF9CAC;">true</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#C792EA;">const</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">playStatus</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#82AAFF;">ref</span><span style="color:#F07178;">(</span><span style="color:#FF9CAC;">false</span><span style="color:#F07178;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#C792EA;">const</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">play</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">()</span><span style="color:#F07178;"> </span><span style="color:#C792EA;">=></span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">audio</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">play</span><span style="color:#F07178;">()</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">playStatus</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">value</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#FF9CAC;">true</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#C792EA;">const</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">pause</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">()</span><span style="color:#F07178;"> </span><span style="color:#C792EA;">=></span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">audio</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">pause</span><span style="color:#F07178;">()</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">playStatus</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">value</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#FF9CAC;">false</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">return</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">audio</span><span style="color:#89DDFF;">,</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">play</span><span style="color:#89DDFF;">,</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">pause</span><span style="color:#89DDFF;">,</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">playStatus</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">}</span></span>
|
||
<span class="line"></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-hidden="true">#</a></h3><p>项目使用的框架是Vue3,部分页面使用到了JSX语法,众所周知JSX语法定义的组件返回的是一个VNode树,要想统一为树上元素添加渐变的样式则需要遍历他们。</p><p>需要遍历树上所有元素,并分别为他们添加不同值的<code>animation-delay</code>属性:</p><div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">const</span><span style="color:#A6ACCD;"> children </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> DOM</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">children</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">for</span><span style="color:#A6ACCD;"> (</span><span style="color:#C792EA;">let</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;"><</span><span style="color:#A6ACCD;"> children</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">length</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i</span><span style="color:#89DDFF;">++</span><span style="color:#A6ACCD;">) </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#C792EA;">const</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">child</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">children</span><span style="color:#F07178;">[</span><span style="color:#A6ACCD;">i</span><span style="color:#F07178;">]</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">child</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">props</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">?</span><span style="color:#F07178;"> (</span><span style="color:#A6ACCD;">child</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">props</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">style</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">{</span><span style="color:#F07178;"> animationDelay</span><span style="color:#89DDFF;">:</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">\`\${</span><span style="color:#A6ACCD;">i </span><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1000</span><span style="color:#89DDFF;">}</span><span style="color:#C3E88D;">ms</span><span style="color:#89DDFF;">\`</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#F07178;">)</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">:</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">Object</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">assign</span><span style="color:#F07178;">(</span><span style="color:#A6ACCD;">child</span><span style="color:#89DDFF;">,</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> props</span><span style="color:#89DDFF;">:</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">{</span><span style="color:#F07178;"> style</span><span style="color:#89DDFF;">:</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">{</span><span style="color:#F07178;"> animationDelay</span><span style="color:#89DDFF;">:</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">\`\${</span><span style="color:#A6ACCD;">i </span><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1000</span><span style="color:#89DDFF;">}</span><span style="color:#C3E88D;">ms</span><span style="color:#89DDFF;">\`</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#F07178;">)</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span></span>
|
||
<span class="line"></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-hidden="true">#</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-hidden="true">#</a></h3><p>由于年终总结报告需要考虑到多种终端用户的体验,所以需要对翻页操作进行更多的优化</p><p>监听页面的触控滑动事件、滚轮滚动事件,并且匹配上翻页操作</p><div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;"> </span><span style="color:#676E95;font-style:italic;">// 监听移动端滑动事件</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">let</span><span style="color:#A6ACCD;"> startY </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">let</span><span style="color:#A6ACCD;"> endY </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> document</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">addEventListener</span><span style="color:#A6ACCD;">(</span><span style="color:#89DDFF;">'</span><span style="color:#C3E88D;">touchstart</span><span style="color:#89DDFF;">'</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;font-style:italic;">e</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">=></span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">startY</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">touches</span><span style="color:#F07178;">[</span><span style="color:#F78C6C;">0</span><span style="color:#F07178;">]</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">clientY</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;">)</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> document</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">addEventListener</span><span style="color:#A6ACCD;">(</span><span style="color:#89DDFF;">'</span><span style="color:#C3E88D;">touchend</span><span style="color:#89DDFF;">'</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;font-style:italic;">e</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">=></span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">endY</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">=</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">changedTouches</span><span style="color:#F07178;">[</span><span style="color:#F78C6C;">0</span><span style="color:#F07178;">]</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">clientY</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#F07178;"> (</span><span style="color:#A6ACCD;">endY</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">-</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">startY</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">></span><span style="color:#F07178;"> </span><span style="color:#F78C6C;">50</span><span style="color:#F07178;">) </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#82AAFF;">prevPage</span><span style="color:#F07178;">()</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">else</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#F07178;"> (</span><span style="color:#A6ACCD;">endY</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">-</span><span style="color:#F07178;"> </span><span style="color:#A6ACCD;">startY</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;"><</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">-</span><span style="color:#F78C6C;">50</span><span style="color:#F07178;">) </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#82AAFF;">nextPage</span><span style="color:#F07178;">()</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;">)</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span></span>
|
||
<span class="line"><span style="color:#89DDFF;"> </span><span style="color:#676E95;font-style:italic;">// 监听鼠标滚轮事件</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> document</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">addEventListener</span><span style="color:#A6ACCD;">(</span><span style="color:#89DDFF;">'</span><span style="color:#C3E88D;">wheel</span><span style="color:#89DDFF;">'</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;font-style:italic;">e</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">=></span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#F07178;"> (</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">deltaY</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">></span><span style="color:#F07178;"> </span><span style="color:#F78C6C;">0</span><span style="color:#F07178;">) </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#82AAFF;">nextPage</span><span style="color:#F07178;">()</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">else</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#F07178;"> (</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">deltaY</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;"><</span><span style="color:#F07178;"> </span><span style="color:#F78C6C;">0</span><span style="color:#F07178;">) </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#82AAFF;">prevPage</span><span style="color:#F07178;">()</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#89DDFF;"> </span><span style="color:#676E95;font-style:italic;">// 监听键盘事件</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> document</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">addEventListener</span><span style="color:#A6ACCD;">(</span><span style="color:#89DDFF;">'</span><span style="color:#C3E88D;">keydown</span><span style="color:#89DDFF;">'</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;font-style:italic;">e</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">=></span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#F07178;"> (</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">key</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">===</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">'</span><span style="color:#C3E88D;">ArrowUp</span><span style="color:#89DDFF;">'</span><span style="color:#F07178;">) </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#82AAFF;">prevPage</span><span style="color:#F07178;">()</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">else</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#F07178;"> (</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">key</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">===</span><span style="color:#F07178;"> </span><span style="color:#89DDFF;">'</span><span style="color:#C3E88D;">ArrowDown</span><span style="color:#89DDFF;">'</span><span style="color:#F07178;">) </span><span style="color:#89DDFF;">{</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#82AAFF;">nextPage</span><span style="color:#F07178;">()</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span></span>
|
||
<span class="line"><span style="color:#F07178;"> </span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;">)</span></span>
|
||
<span class="line"></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-hidden="true">#</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-hidden="true">#</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-hidden="true">#</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-hidden="true">#</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,F,D,y,i){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{u as __pageData,d as default};
|