Skip to content

Commit ccf64ff

Browse files
committed
feat(视频播放器;首页歌单卡片;进度条组件;): 优化窗口大小变化可能带来的UI错乱(ResizeObserver)
1 parent 4d7e388 commit ccf64ff

File tree

5 files changed

+77
-24
lines changed

5 files changed

+77
-24
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
## [1.2.2](https://github.com/xiaozhu188/electron-vue-cloud-music/compare/v1.2.1...v1.2.2) (2021-03-14)
2+
3+
范围|描述|commitId
4+
--|--|--
5+
- | 1.2.2 | [1139699](https://github.com/xiaozhu188/electron-vue-cloud-music/commit/1139699)
6+
7+
8+
### 🐛 Bug 修复
9+
范围|描述|commitId
10+
--|--|--
11+
- | 修复windows打包缺失图标导致失败并启用asar | [e322843](https://github.com/xiaozhu188/electron-vue-cloud-music/commit/e322843)
12+
113
## [1.2.1](https://github.com/xiaozhu188/electron-vue-cloud-music/compare/v1.1.22...v1.2.1) (2021-03-14)
214

315
范围|描述|commitId

src/renderer/components/Common/progressBar.vue

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<div
33
class="progress-bar"
44
ref="progressBar"
5+
v-resize:[debounceOptions].debounce="handleResize"
56
@click.prevent.stop="progressClick"
67
>
78
<div
@@ -36,6 +37,7 @@ import { debounce } from "@/utils/dom";
3637
export default {
3738
name: "progressBar",
3839
data() {
40+
this.debounceOptions = { wait: 50 };
3941
this.mouse = {}; // 记录鼠标位置,是否按下等信息
4042
return {
4143
bufferedOffsetWidth: 0,
@@ -64,29 +66,25 @@ export default {
6466
default: false,
6567
},
6668
},
67-
destroy() {
68-
window.removeEventListener("resize", debounce(this.handleResize, 50));
69-
},
7069
mounted() {
7170
this.changeProgressbarWidth(this.percent);
72-
let _this = this;
73-
window.addEventListener("resize", debounce(this.handleResize, 50));
71+
7472
const virtualBar = this.$refs.virtualBar;
7573
virtualBar.addEventListener(
7674
"mousemove",
77-
debounce(function (e) {
75+
debounce((e) => {
7876
e.stopPropagation();
79-
const progressBar = _this.$refs.progressBar;
77+
const progressBar = this.$refs.progressBar;
8078
let pageX = e.pageX;
8179
let diff = pageX - progressBar.getBoundingClientRect().left;
8280
let percent = (diff / progressBar.clientWidth).toFixed(2);
83-
_this.$emit("virtualBarMove", { pageX, percent });
81+
this.$emit("virtualBarMove", { pageX, percent });
8482
}, 200)
8583
);
8684
virtualBar.addEventListener(
8785
"mouseleave",
88-
debounce(function (e) {
89-
_this.$emit("virtualBarLeave");
86+
debounce(() => {
87+
this.$emit("virtualBarLeave");
9088
}, 200)
9189
);
9290
},

src/renderer/directives/index.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Vue from "vue";
2+
import { debounce, throttle } from "loadsh";
23

34
// 点击元素之外隐藏该元素
45
Vue.directive("clickOutside", {
@@ -18,3 +19,29 @@ Vue.directive("clickOutside", {
1819
delete el.__vueClickOutside__;
1920
},
2021
});
22+
23+
// 监听元素大小变化
24+
Vue.directive("resize", {
25+
bind(el, binding) {
26+
let { value, modifiers, arg } = binding;
27+
console.log(modifiers, arg);
28+
const callback = (entries) => {
29+
value(entries[0]);
30+
};
31+
const [method] = Object.keys(modifiers);
32+
const wait = (arg && arg.wait) || 300;
33+
if (method && method === "throttle") {
34+
el._observer = new ResizeObserver(throttle(callback, wait));
35+
} else {
36+
el._observer = new ResizeObserver(debounce(callback, wait));
37+
}
38+
},
39+
inserted(el) {
40+
Vue.nextTick(() => {
41+
el._observer && el._observer.observe(el);
42+
});
43+
},
44+
unbind(el) {
45+
el._observer && el._observer.unobserve(el);
46+
},
47+
});

src/renderer/views/Home/components/playlist.vue

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
<template>
22
<div class="playlist">
33
<ul class="list">
4-
<li class="list-item" @click="goLink" v-if="userId">
4+
<li
5+
class="list-item"
6+
@click="goLink"
7+
v-resize:[throttleOption].throttle="onResize"
8+
v-if="userId"
9+
>
510
<div class="date">
611
<div class="info">
712
<div class="week">{{ getWeek() }}</div>
813
<div class="day">{{ getDate() }}</div>
914
</div>
1015
</div>
11-
<div>每日歌曲推荐</div>
16+
<div class="name">每日歌曲推荐</div>
1217
</li>
1318
<list-item
1419
class="list-item"
@@ -41,6 +46,10 @@ export default {
4146
},
4247
},
4348
},
49+
data() {
50+
this.throttleOption = { wait: 100 };
51+
return {};
52+
},
4453
computed: {
4554
...mapGetters("User", ["userId"]),
4655
playlist() {
@@ -51,6 +60,9 @@ export default {
5160
listItem,
5261
},
5362
methods: {
63+
onResize({ target }) {
64+
target.style.fontSize = `${target.clientWidth}px`;
65+
},
5466
getWeek() {
5567
return "星期" + "日一二三四五六".charAt(new Date().getDay());
5668
},
@@ -91,17 +103,21 @@ export default {
91103
flex-direction: column;
92104
justify-content: center;
93105
align-items: center;
94-
line-height: 1.1;
106+
line-height: 1;
95107
background: #fff;
96108
.week {
97-
font-size: 22px;
109+
font-size: 0.15em;
98110
}
99111
.day {
100-
font-size: 90px;
112+
font-size: 0.56em;
101113
color: @primary-color;
102114
}
103115
}
104116
}
117+
.name {
118+
padding: 4px;
119+
font-size: 13px;
120+
}
105121
&:hover {
106122
.copywriter {
107123
transform: translateY(0);

src/renderer/views/Video/player.vue

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
<a-button size="small" @click="showMain"
1515
>打开主界面</a-button
1616
>
17-
<div class="title js-video-title" v-if="videoData.name">
17+
<div
18+
class="title js-video-title"
19+
v-resize="onResize"
20+
v-if="videoData.name"
21+
>
1822
<div class="inner js-video-title-inner"
1923
>{{ videoData.name }} {{ videoData.desc }}</div
2024
>
@@ -414,7 +418,7 @@ export default {
414418
volume(newVal) {
415419
const video = this.$refs.video;
416420
newVal = Number(newVal);
417-
if (newVal == 0) {
421+
if (newVal === 0) {
418422
this.$store.commit("play/SET_MUTED", true);
419423
}
420424
this.$nextTick(() => {
@@ -544,15 +548,11 @@ export default {
544548
this.isFullScreen = false;
545549
}
546550
});
547-
548-
this.$refs.videoIntro.addEventListener(
549-
"transitionend",
550-
debounce(this.handleResize, 300)
551-
);
552-
553-
win.on("resize", debounce(this.handleResize, 300));
554551
},
555552
methods: {
553+
onResize(data) {
554+
this.handleResize();
555+
},
556556
showMoreList(type) {
557557
if (type === "br") {
558558
this.isShowBrs = !this.isShowBrs;

0 commit comments

Comments
 (0)