Yansen 2 лет назад
Родитель
Сommit
fa876fbeb5
9 измененных файлов: 124 добавлений и 7 удалений
  1. Двоичные данные
      public/images/dove.gif
  2. Двоичные данные
      public/images/dove.png
  3. Двоичные данные
      public/images/pg1/map.png
  4. 5
    3
      src/components/Bell.vue
  5. 2
    1
      src/pages/Loading.vue
  6. 107
    0
      src/pages/pg1/InMap.vue
  7. 4
    1
      src/pages/pg1/Md1.vue
  8. 4
    2
      src/pages/pg2-2/Bell.vue
  9. 2
    0
      src/utils/resources.js

Двоичные данные
public/images/dove.gif Просмотреть файл


Двоичные данные
public/images/dove.png Просмотреть файл


Двоичные данные
public/images/pg1/map.png Просмотреть файл


+ 5
- 3
src/components/Bell.vue Просмотреть файл

@@ -1,7 +1,7 @@
1 1
 <template>
2 2
   <div class="bell-box" @click="toggle">
3 3
     <div>
4
-      <div class="center circle abs">
4
+      <!-- <div class="center circle abs">
5 5
         <div class="inner" :class="{'circle-ani': animate}" />
6 6
       </div>
7 7
       <div class="center circle abs">
@@ -9,7 +9,9 @@
9 9
       </div>
10 10
       <div class="center bell-img">
11 11
         <img :class="{'bell-ani': animate}" src="/images/pg1/bell.png" alt="">
12
-      </div>
12
+      </div> -->
13
+      <img src="/images/dove.gif" v-if="animate" alt="">
14
+      <img src="/images/dove.png" v-else alt="">
13 15
     </div>
14 16
   </div>
15 17
 </template>
@@ -25,7 +27,7 @@ const animate = computed(() => state.value === 1);
25 27
 
26 28
 <style lang="less" scoped>
27 29
 .bell-box {
28
-  @size: 10vw;
30
+  @size: 12vw;
29 31
 
30 32
   width: @size;
31 33
   height: @size;

+ 2
- 1
src/pages/Loading.vue Просмотреть файл

@@ -37,8 +37,9 @@
37 37
   const percent = ref('0%');
38 38
 
39 39
   const onClick = () => {
40
-    finished.value = true;
40
+    if (percent.value != '100%') return;
41 41
 
42
+    finished.value = true;
42 43
     const t = setTimeout(() => {
43 44
       emit('ready');
44 45
       clearTimeout(t)

+ 107
- 0
src/pages/pg1/InMap.vue Просмотреть файл

@@ -0,0 +1,107 @@
1
+<template>
2
+  <div class="in-map-wrapper">
3
+    <img src="/images/pg1/map.png" alt="" @load="onLoad">
4
+    
5
+    <template v-for="(item, inx) in flowers" :key="item.name">
6
+      <div
7
+        class="flower"
8
+        :style="{left: item.left, top: item.top }"
9
+      >
10
+        <div>
11
+          <img
12
+            class="flower animate__animated animate__fadeIn animate__infinite"
13
+            :style="{animationDelay: `${(inx+1) * 200}ms`}"
14
+            src="/images/logo.png" alt="">
15
+          <div class="country" :style="getTxtStyle(item)">{{item.name}}</div>
16
+        </div>
17
+      </div>
18
+    </template>
19
+  </div>
20
+</template>
21
+
22
+<script setup>
23
+  import { onMounted, ref } from 'vue';
24
+
25
+  const flowers = ref([]);
26
+
27
+  const getTxtStyle = (item) => {
28
+    const space = 16;
29
+    switch (item.direct) {
30
+      case 'top-left':
31
+        return { top: `-${space}px`, left: `-45px` };
32
+      case 'top-right':
33
+        return { top: `-${space}px`, right: `-45px` };
34
+      case 'right':
35
+        return { top: `-${space / 3}px`, right: `-85px`, textAlign: 'left' };
36
+      case 'left':
37
+        return { top: `0px`, left: `-85px`, textAlign: 'right' };
38
+      case 'top':
39
+        return { top: `-${space}px`, left: `-35px` };
40
+      default:
41
+        return { bottom: `-${space}px`, left: `-35px` };
42
+    }
43
+  };
44
+
45
+  const onLoad = (e) => {
46
+
47
+    const { width, height, naturalWidth, naturalHeight } = e.target;
48
+    const ratio = width / naturalWidth;
49
+
50
+    const countries = [
51
+      { name: '中国', pos: [316,184], direct: 'top-left' },
52
+      { name: '芬兰', pos: [190,79], direct: 'top' },
53
+      { name: '英国', pos: [112,91], direct: 'top' },
54
+      { name: '德国', pos: [135,110], direct: 'right' },
55
+      { name: '瑞士', pos: [113,123], direct: 'left' },
56
+      { name: '土耳其', pos: [156,153], direct: 'bottom' },
57
+      { name: '韩国', pos: [348,181], direct: 'bottom' },
58
+      { name: '日本', pos: [377,178], direct: 'top-right' },
59
+      { name: '马来西亚', pos: [280,264], direct: 'right' },
60
+      { name: '新加坡', pos: [295,280], direct: 'bottom' },
61
+      { name: '澳大利亚', pos: [364,351], direct: 'bottom' },
62
+      { name: '新西兰', pos: [448,401], direct: 'bottom' },
63
+      { name: '加拿大', pos: [609,124], direct: 'top' },
64
+      { name: '美国', pos: [663,146], direct: 'bottom' },
65
+    ];
66
+
67
+    const list = countries.map(country => {
68
+      return {
69
+        ...country,
70
+        left: `${country.pos[0] * ratio}px`,
71
+        top: `${country.pos[1] * ratio}px`,
72
+      }
73
+    });
74
+    
75
+console.log('------onLoad-----', list);
76
+
77
+    flowers.value = list;
78
+  }
79
+
80
+
81
+</script>
82
+
83
+<style lang="less" scoped>
84
+.in-map-wrapper {
85
+  position: relative;
86
+
87
+  .flower {
88
+    position: absolute;
89
+    width: 8px;
90
+    height: 8px;
91
+    z-index: 2;
92
+
93
+    & > div {
94
+      position: relative;
95
+    }
96
+
97
+    .country {
98
+      position: absolute;
99
+      width: 80px;
100
+      height: 16px;
101
+      line-height: 16px;
102
+      text-align: center;
103
+      color: #C18FC8;
104
+    }
105
+  }
106
+}
107
+</style>

+ 4
- 1
src/pages/pg1/Md1.vue Просмотреть файл

@@ -15,7 +15,9 @@
15 15
           近20万枚紫金草徽章佩戴在了人们的心口。
16 16
         </p>
17 17
         <!-- <div class="map-img" ref="mapRef" /> -->
18
-        <img class="map-img" src="/images/pg2/map.gif" alt="">
18
+        <!-- <img class="map-img" src="/images/pg2/map.gif" alt=""> -->
19
+
20
+        <InMap />
19 21
       </div>
20 22
     </div>
21 23
   </Modal>
@@ -24,6 +26,7 @@
24 26
 <script setup>
25 27
   import { onMounted, ref, watch } from 'vue';
26 28
   import Modal from '@/components/Modal.vue';
29
+  import InMap from './InMap.vue';
27 30
 
28 31
   const mapRef = ref()
29 32
   const loaded = ref(false);

+ 4
- 2
src/pages/pg2-2/Bell.vue Просмотреть файл

@@ -1,7 +1,7 @@
1 1
 <template>
2 2
   <div class="bell-box" @click="toggle">
3 3
     <div>
4
-      <div class="center circle abs">
4
+      <!-- <div class="center circle abs">
5 5
         <div class="inner" :class="{'circle-ani': animate}" />
6 6
       </div>
7 7
       <div class="center circle abs">
@@ -9,7 +9,9 @@
9 9
       </div>
10 10
       <div class="center bell-img">
11 11
         <img :class="{'bell-ani': animate}" src="/images/pg1/bell.png" alt="">
12
-      </div>
12
+      </div> -->
13
+      <img src="/images/dove.gif" v-if="animate" alt="">
14
+      <img src="/images/dove.png" v-else alt="">
13 15
     </div>
14 16
     <audio ref="el" src="/audio/audio2.mp3" style="max-width: 0" loop preload="auto" ></audio>
15 17
   </div>

+ 2
- 0
src/utils/resources.js Просмотреть файл

@@ -16,6 +16,8 @@ export const resources = [
16 16
   { image: './images/loading/飞机3.png' },
17 17
 
18 18
   // { image: './images/BG.jpg', },
19
+  { image: './images/dove.gif' },
20
+  { image: './images/dove.png' },
19 21
   { image: './images/close.png' },
20 22
   { image: './images/cloud-texture.png' },
21 23
   { image: './images/down.png' },