lisenzhou 2 years ago
parent
commit
8e65adb601

BIN
public/infoimage/10台城.jpg View File


BIN
public/infoimage/11紫金山.jpg View File


BIN
public/infoimage/12石头城.jpg View File


BIN
public/infoimage/13莫愁湖公园.jpg View File


BIN
public/infoimage/14赏心亭.jpg View File


BIN
public/infoimage/15长干里(1).jpg View File


BIN
public/infoimage/16大报恩寺.jpg View File


BIN
public/infoimage/17凤凰台.jpg View File


BIN
public/infoimage/18桃叶渡.jpg View File


BIN
public/infoimage/19雨花台.jpg View File


BIN
public/infoimage/1长江大桥.jpg View File


BIN
public/infoimage/20牛首山.jpg View File


BIN
public/infoimage/21石臼湖.jpg View File


BIN
public/infoimage/21石臼湖.png View File


BIN
public/infoimage/22东山.jpg View File


BIN
public/infoimage/23瞻园.jpg View File


BIN
public/infoimage/24文德桥.jpg View File


BIN
public/infoimage/25随园.jpg View File


BIN
public/infoimage/26世界文学客厅.jpg View File


BIN
public/infoimage/2阅江楼.jpg View File


BIN
public/infoimage/3秦淮河.jpg View File


BIN
public/infoimage/4乌衣巷.jpg View File


BIN
public/infoimage/5燕子矶.jpg View File


BIN
public/infoimage/6栖霞山.jpg View File


BIN
public/infoimage/7朝天宫.jpg View File


BIN
public/infoimage/8梁洲.jpg View File


BIN
public/infoimage/9后湖映月.jpg View File


+ 125
- 75
src/components/Image.vue View File

@@ -1,91 +1,116 @@
1 1
 <template>
2 2
   <div class="img-wrapper">
3
-    <img :src="resource.img.src" @load="onLoad" alt="">
4
-    <div v-if="showGesture" class="gesture" :style="gestureStyle"><i class="iconfont icon-cc-pointer-right"></i></div>
5
-    <div v-if="resource.showMapBtn" class="showmapbtn" :style="mapBtnStyle" @click="onShowMapBtn"></div>
6
-    <div v-if="resource.showMapBtn">
7
-      <div
8
-      v-show="false"
9
-      ref="mapImageRef"
10
-      v-viewer="{
11
-        toolbar: false,
12
-        url: 'data-source',
13
-      }"
14
-      class="images clearfix"
3
+    <img :src="resource.img.src" @load="onLoad" alt="" />
4
+    <div v-if="showGesture" class="gesture" :style="gestureStyle">
5
+      <i class="iconfont icon-cc-pointer-right"></i>
6
+    </div>
7
+
8
+    <div
9
+      v-if="resource.showMapBtn"
10
+      class="showmapbtn"
11
+      :style="mapBtnStyle"
12
+      @click="onShowMapBtn"
13
+    ></div>
14
+    <div
15
+      v-if="resource.infoIcon"
16
+      class="info"
17
+      :style="infoStyle"
18
+      @click="onShowInfoBtn"
15 19
     >
16
-      <template v-for="img in resource.mapImage" :key="img">
17
-        <img
18
-          class="image"
19
-          :src="img"
20
-          :data-source="img"
21
-        >
22
-      </template>
20
+      <i class="iconfont icon-info"></i>
23 21
     </div>
22
+
23
+    <div v-if="resource.infoIcon">
24
+      <div
25
+        v-show="false"
26
+        ref="mapImageRef"
27
+        v-viewer="{
28
+          toolbar: false,
29
+          url: 'data-source',
30
+        }"
31
+        class="images clearfix"
32
+      >
33
+        <template v-for="img in resource.mapImage" :key="img">
34
+          <img class="image" :src="img" :data-source="img" />
35
+        </template>
36
+      </div>
24 37
     </div>
25
-   
26 38
 
27
-    <!-- <viewer v-if="mapImageRef" :images="mapImageRef">
28
-      <img v-for="src in mapImageRef" :key="src" :src="src">
29
-    </viewer> -->
30
-    <div v-if="resource.playBtn" class="paybtn" :style="btnStyle" @click="onPlayBtn">
31
-   
39
+    <div
40
+      v-if="resource.playBtn"
41
+      class="paybtn"
42
+      :style="btnStyle"
43
+      @click="onPlayBtn"
44
+    >
32 45
       <AudioPlayingVue :style="iconStyle" />
33
-      <audio :src="resource.audio" preload="auto" ref="audioRef" @ended="onEnded"></audio>
46
+      <audio
47
+        :src="resource.audio"
48
+        preload="auto"
49
+        ref="audioRef"
50
+        @ended="onEnded"
51
+      ></audio>
34 52
     </div>
53
+
54
+    <PopUpVue :show="showInfo" :info="resource.infoIcon" :onClose="onCloseInfoBtn" />
35 55
   </div>
36 56
 </template>
37 57
 
38 58
 <script setup>
39
-import { computed, ref, watch } from 'vue';
40
-import { useModel } from '@zjxpcyc/vue-tiny-store';
41
-import AudioPlayingVue from './AudioPlaying.vue';
42
-import 'viewerjs/dist/viewer.css'
43
-import { directive as viewer } from "v-viewer"
59
+import { computed, ref, watch } from "vue";
60
+import { useModel } from "@zjxpcyc/vue-tiny-store";
61
+import PopUpVue from "./PopUp.vue";
62
+import AudioPlayingVue from "./AudioPlaying.vue";
63
+import "viewerjs/dist/viewer.css";
64
+import { directive as viewer } from "v-viewer";
44 65
 
45
-const [current, updateCurrent] = useModel('audio');
66
+const [current, updateCurrent] = useModel("audio");
46 67
 
47 68
 const props = defineProps({
48 69
   resource: {
49 70
     type: Object,
50
-    default: () => ({})
71
+    default: () => ({
72
+      infoIcon:Object,
73
+    }),
51 74
   },
52 75
   showFog: Boolean,
53 76
   index: Number,
54 77
 });
55 78
 
56
-const mapImageRef = ref()
57
-const mapBtnStyle = ref({})
79
+const showInfo = ref(false)
80
+const mapImageRef = ref();
81
+const mapBtnStyle = ref({});
58 82
 const btnStyle = ref({});
59 83
 const gestureStyle = ref({});
84
+const infoStyle = ref({});
60 85
 const audioRef = ref();
61 86
 const playState = ref(0);
62 87
 const showGesture = ref(props.resource.showGesture);
63 88
 const iconStyle = computed(() => ({
64
-  opacity: playState.value
89
+  opacity: playState.value,
65 90
 }));
66 91
 
67 92
 const playAudio = () => {
68
-    audioRef.value.play();
69
-    playState.value = 1;
70
-    updateCurrent(props.resource.audio);
93
+  audioRef.value.play();
94
+  playState.value = 1;
95
+  updateCurrent(props.resource.audio);
71 96
 
72
-    // 播放一次, 立即消失
73
-    if (showGesture.value) {
74
-      showGesture.value = false;
75
-    }
76
-}
97
+  // 播放一次, 立即消失
98
+  if (showGesture.value) {
99
+    showGesture.value = false;
100
+  }
101
+};
77 102
 
78 103
 const stopAudio = () => {
79
-    audioRef.value.pause();
80
-    playState.value = 0;
81
-}
104
+  audioRef.value.pause();
105
+  playState.value = 0;
106
+};
82 107
 
83 108
 // 监控全局, 如果非当前播放器, 则停止播放
84 109
 watch(current, (nw) => {
85 110
   if (nw !== props.resource.audio && playState.value === 1) {
86 111
     stopAudio();
87 112
   }
88
-})
113
+});
89 114
 
90 115
 // 点击播放
91 116
 const onPlayBtn = () => {
@@ -94,24 +119,36 @@ const onPlayBtn = () => {
94 119
   } else {
95 120
     playAudio();
96 121
   }
97
-}
122
+};
98 123
 
99 124
 //显示地图
100 125
 const onShowMapBtn = () => {
101
-  window.console.log('---')
102
-  if(props.resource.showMapBtn){
103
-  
104
-    window.console.log(props.resource.mapImage,'---')
105
-    mapImageRef.value && mapImageRef.value.$viewer.show()
126
+  window.console.log("---");
127
+  if (props.resource.showMapBtn) {
128
+    window.console.log(props.resource.mapImage, "---");
129
+    mapImageRef.value && mapImageRef.value.$viewer.show();
106 130
   }
107
-}
131
+};
132
+
133
+// 显示详情介绍
134
+const onShowInfoBtn = () => {
135
+  window.console.log(showInfo,"---");
136
+  
137
+  showInfo.value=true
138
+};
139
+
140
+const onCloseInfoBtn = () => {
141
+  window.console.log("---");
142
+  
143
+  showInfo.value=false
144
+};
108 145
 
109 146
 
110 147
 
111 148
 // 播放完成
112 149
 const onEnded = () => {
113 150
   stopAudio();
114
-}
151
+};
115 152
 
116 153
 // 图片加载完成, 设置播放器
117 154
 const onLoad = (e) => {
@@ -119,30 +156,36 @@ const onLoad = (e) => {
119 156
     const { pos } = props.resource.playBtn;
120 157
     const { width, height, naturalHeight, naturalWidth } = e.target;
121 158
     const d = 32; // 宽度一半
122
-    const centerX = width * pos[0] / naturalWidth;
123
-    const centerY = height * pos[1] / naturalHeight;
159
+    const centerX = (width * pos[0]) / naturalWidth;
160
+    const centerY = (height * pos[1]) / naturalHeight;
124 161
     const x = centerX - d;
125 162
     const y = centerY - d;
126
-    btnStyle.value = { left: `${x}px`, top: `${y}px` }
127
-
163
+    btnStyle.value = { left: `${x}px`, top: `${y}px` };
164
+    const d2 = 12; // 字体大小一半
128 165
     // 如果显示引导手势, 那么计算坐标
129 166
     if (showGesture.value) {
130
-      const d2 = 12 // 字体大小一半
131
-      gestureStyle.value = { left: `${x - d2 * 2}px`, top: `${centerY - d2}px` }
167
+      gestureStyle.value = {
168
+        left: `${x + d2 * 1.5}px`,
169
+        top: `${centerY - d2 * 6}px`,
170
+      };
132 171
     }
172
+
173
+    // if (showGesture.value) {
174
+
175
+    infoStyle.value = { left: `${x - d2 * 2}px`, top: `${centerY - d2}px` };
176
+    // }
133 177
   }
134
-  if(props.resource.showMapBtn){
178
+  if (props.resource.showMapBtn) {
135 179
     const { pos } = props.resource.showMapBtn;
136 180
     const { width, height, naturalHeight, naturalWidth } = e.target;
137 181
     const d = 32; // 宽度一半
138
-    const centerX = width * pos[0] / naturalWidth;
139
-    const centerY = height * pos[1] / naturalHeight;
182
+    const centerX = (width * pos[0]) / naturalWidth;
183
+    const centerY = (height * pos[1]) / naturalHeight;
140 184
     const x = centerX - d;
141 185
     const y = centerY - d;
142
-    mapBtnStyle.value = { left: `${x}px`, top: `${y}px` }
186
+    mapBtnStyle.value = { left: `${x}px`, top: `${y}px` };
143 187
   }
144
-}
145
-
188
+};
146 189
 </script>
147 190
 
148 191
 <style lang="less" scoped>
@@ -154,7 +197,15 @@ const onLoad = (e) => {
154 197
     position: absolute;
155 198
     z-index: 9;
156 199
     animation: gestureAnimation 1.6s ease-in-out infinite;
157
-    
200
+
201
+    .iconfont {
202
+      font-size: 24px;
203
+    }
204
+  }
205
+
206
+  .info {
207
+    position: absolute;
208
+    z-index: 9;
158 209
     .iconfont {
159 210
       font-size: 24px;
160 211
     }
@@ -163,19 +214,19 @@ const onLoad = (e) => {
163 214
   @keyframes gestureAnimation {
164 215
     from {
165 216
       opacity: 0;
166
-      transform: translateX(0);
217
+      transform: translateY(0) rotate(90deg);
167 218
     }
168 219
     to {
169 220
       opacity: 1;
170
-      transform: translateX(12px);
221
+      transform: translateY(12px) rotate(90deg);
171 222
     }
172 223
   }
173 224
 
174
-  .showmapbtn{
225
+  .showmapbtn {
175 226
     position: absolute;
176 227
     width: 170px;
177 228
     height: 70px;
178
-    background: rgba(255, 0, 0, .5);
229
+    background: rgba(255, 0, 0, 0.5);
179 230
     z-index: 10;
180 231
   }
181 232
 
@@ -183,7 +234,7 @@ const onLoad = (e) => {
183 234
     position: absolute;
184 235
     width: 64px;
185 236
     height: 64px;
186
-    background: rgba(255, 0, 0, .5);
237
+    background: rgba(255, 0, 0, 0.5);
187 238
     z-index: 10;
188 239
 
189 240
     & > audio {
@@ -203,4 +254,3 @@ const onLoad = (e) => {
203 254
   }
204 255
 }
205 256
 </style>
206
-

+ 83
- 0
src/components/PopUp.vue View File

@@ -0,0 +1,83 @@
1
+<template>
2
+  <div
3
+    v-if="show"
4
+    class="overlay"
5
+    @touchmove.prevent
6
+    @mousewheel.prevent
7
+    @click="onClose"
8
+  >
9
+    <div class="warp">
10
+      <img :src="info.image" @click.stop class="image" alt="" />
11
+      <div class="text" @click.stop>
12
+        {{ info.content }}
13
+      </div>
14
+    </div>
15
+
16
+    <!-- <div class="loader-section section-top"></div>
17
+    <div class="loader-section section-bottom"></div>     -->
18
+  </div>
19
+</template>
20
+
21
+<script setup>
22
+const props = defineProps({
23
+  show: Boolean,
24
+  info: Object,
25
+  onClose: {
26
+    type: Function,
27
+    default: () => {},
28
+  },
29
+  // onClose:()=>{}
30
+});
31
+
32
+// const elRef = ref();
33
+// const maskRef = ref();
34
+// const progressStyle = computed(() => ({ width: `${props.percent}%` }));
35
+// const visibleStyle = ref({  })
36
+// const onEnd = () => {
37
+//   visibleStyle.value = { display: 'none' }
38
+// }
39
+
40
+const onTouchMove = (e) => {
41
+  // 禁止滚动
42
+  e.preventDefault();
43
+};
44
+
45
+// watch(() => props.loading, (newVal, oldVal) => {
46
+//   window.console.log(show,'showshow')
47
+// })
48
+</script>
49
+
50
+<style lang="less" scoped>
51
+// @bg-color: #D7DDD3;
52
+// @tip-color: #933D33;
53
+// @text-color: #fff;
54
+
55
+.overlay {
56
+  position: fixed;
57
+  top: 0;
58
+  left: 0;
59
+  width: 100vw;
60
+  height: 100vh;
61
+  z-index: 100;
62
+  overflow: hidden;
63
+  background: rgba(0, 0, 0, 0.5);
64
+  .warp {
65
+    margin: 0 auto;
66
+    width: 80%;
67
+    height: 100%;
68
+    // background: fff;
69
+    .image {
70
+      width: 100%;
71
+      margin-top: 100px;
72
+    }
73
+    .text {
74
+      line-height: 1.6em;
75
+      padding: 0 20px;
76
+      font-size: 20px;
77
+      text-indent: 32.4px;
78
+      margin-top: 50px;
79
+      color: #fff;
80
+    }
81
+  }
82
+}
83
+</style>

+ 111
- 100
src/utils/resources.js View File

@@ -1,11 +1,9 @@
1
-
2
-
3 1
 // import index from '@/assets/index.jpg';
4 2
 // import mask from '@/assets/mask.png';
5 3
 
6
-export const index = './index.jpg';
7
-export const mask = './mask.png';
8
-export const map = './map.png';
4
+export const index = "./index.jpg";
5
+export const mask = "./mask.png";
6
+export const map = "./map.png";
9 7
 
10 8
 // import img1 from '@/assets/images/1.jpg';
11 9
 // import img2 from '@/assets/images/2.jpg';
@@ -41,41 +39,43 @@ export const map = './map.png';
41 39
 // import img22 from '@/assets/images/22.jpg';
42 40
 // import img23 from '@/assets/images/23.jpg';
43 41
 
42
+const infoImage = ["./infoimage/1长江大桥.jpg"];
43
+
44 44
 const images = [
45
-  './images/1.jpg',
46
-  './images/2.jpg',
47
-  './images/3.jpg',
48
-  './images/4.jpg',
49
-  './images/5-1.jpg',
50
-  './images/5-2.jpg',
45
+  "./images/1.jpg",
46
+  "./images/2.jpg",
47
+  "./images/3.jpg",
48
+  "./images/4.jpg",
49
+  "./images/5-1.jpg",
50
+  "./images/5-2.jpg",
51 51
   // './images/5.jpg',
52
-  './images/6.jpg',
53
-  './images/7.jpg',
54
-  './images/8-1.jpg',
55
-  './images/8-2.jpg',
52
+  "./images/6.jpg",
53
+  "./images/7.jpg",
54
+  "./images/8-1.jpg",
55
+  "./images/8-2.jpg",
56 56
   // './images/8.jpg',
57
-  './images/9.jpg',
58
-  './images/10-1.jpg',
59
-  './images/10-2.jpg',
57
+  "./images/9.jpg",
58
+  "./images/10-1.jpg",
59
+  "./images/10-2.jpg",
60 60
   // './images/10.jpg',
61
-  './images/11.jpg',
62
-  './images/12.jpg',
63
-  './images/13.jpg',
64
-  './images/14.jpg',
65
-  './images/15-1.jpg',
66
-  './images/15-2.jpg',
61
+  "./images/11.jpg",
62
+  "./images/12.jpg",
63
+  "./images/13.jpg",
64
+  "./images/14.jpg",
65
+  "./images/15-1.jpg",
66
+  "./images/15-2.jpg",
67 67
   // './images/15.jpg',
68
-  './images/16.jpg',
69
-  './images/17.jpg',
70
-  './images/18.jpg',
71
-  './images/19-1.jpg',
72
-  './images/19-2.jpg',
68
+  "./images/16.jpg",
69
+  "./images/17.jpg",
70
+  "./images/18.jpg",
71
+  "./images/19-1.jpg",
72
+  "./images/19-2.jpg",
73 73
   // './images/19.jpg',
74
-  './images/20.jpg',
75
-  './images/21.jpg',
76
-  './images/22.jpg',
77
-  './images/23.jpg',
78
-]
74
+  "./images/20.jpg",
75
+  "./images/21.jpg",
76
+  "./images/22.jpg",
77
+  "./images/23.jpg",
78
+];
79 79
 
80 80
 // import audio1 from '@/assets/audios/1南京长江大桥.mp3';
81 81
 // import audio2 from '@/assets/audios/2阅江楼.mp3';
@@ -105,255 +105,266 @@ const images = [
105 105
 // import audio26 from '@/assets/audios/26世界文学客厅.mp3';
106 106
 
107 107
 const audios = [
108
-  './audios/1南京长江大桥.mp3',
109
-  './audios/2阅江楼.mp3',
110
-  './audios/3秦淮河.mp3',
111
-  './audios/4乌衣巷.mp3',
112
-  './audios/5燕子矶.mp3',
113
-  './audios/6栖霞山.mp3',
114
-  './audios/7朝天宫.mp3',
115
-  './audios/8梁洲.mp3',
116
-  './audios/9后湖映月.mp3',
117
-  './audios/10台城.mp3',
118
-  './audios/11十里堤.mp3',
119
-  './audios/12石头城.mp3',
120
-  './audios/13莫愁湖公园.mp3',
121
-  './audios/14赏心亭.mp3',
122
-  './audios/15长干里.mp3',
123
-  './audios/16大报恩寺.mp3',
124
-  './audios/17凤凰台.mp3',
125
-  './audios/18桃叶渡.mp3',
126
-  './audios/19雨花台.mp3',
127
-  './audios/20牛首山.mp3',
128
-  './audios/21石臼湖.mp3',
129
-  './audios/22东山.mp3',
130
-  './audios/23瞻园.mp3',
131
-  './audios/24白鹭洲.mp3',
132
-  './audios/25随园.mp3',
133
-  './audios/26世界文学客厅.mp3',
108
+  "./audios/1南京长江大桥.mp3",
109
+  "./audios/2阅江楼.mp3",
110
+  "./audios/3秦淮河.mp3",
111
+  "./audios/4乌衣巷.mp3",
112
+  "./audios/5燕子矶.mp3",
113
+  "./audios/6栖霞山.mp3",
114
+  "./audios/7朝天宫.mp3",
115
+  "./audios/8梁洲.mp3",
116
+  "./audios/9后湖映月.mp3",
117
+  "./audios/10台城.mp3",
118
+  "./audios/11十里堤.mp3",
119
+  "./audios/12石头城.mp3",
120
+  "./audios/13莫愁湖公园.mp3",
121
+  "./audios/14赏心亭.mp3",
122
+  "./audios/15长干里.mp3",
123
+  "./audios/16大报恩寺.mp3",
124
+  "./audios/17凤凰台.mp3",
125
+  "./audios/18桃叶渡.mp3",
126
+  "./audios/19雨花台.mp3",
127
+  "./audios/20牛首山.mp3",
128
+  "./audios/21石臼湖.mp3",
129
+  "./audios/22东山.mp3",
130
+  "./audios/23瞻园.mp3",
131
+  "./audios/24白鹭洲.mp3",
132
+  "./audios/25随园.mp3",
133
+  "./audios/26世界文学客厅.mp3",
134 134
 ];
135 135
 
136 136
 // 预加载资源
137 137
 export const resources = [
138
-  { 
138
+  {
139 139
     image: index,
140 140
     hidden: true,
141 141
   },
142
-  { 
142
+  {
143 143
     image: mask,
144 144
     hidden: true,
145 145
   },
146 146
   {
147
-    image:map,
147
+    image: map,
148 148
     hidden: true,
149 149
   },
150
-  { 
150
+  {
151 151
     image: images[0],
152 152
   },
153
-  { 
153
+
154
+  {
154 155
     image: images[1],
155
-    showMapBtn:{
156
+    showMapBtn: {
156 157
       pos: [280, 1250],
157 158
     },
158
-    mapImage:[map]
159
-    // mapkey:'map',
159
+    mapImage: [map],
160 160
   },
161
-  { 
161
+  {
162
+    image: infoImage[0],
163
+    hidden: true,
164
+  },
165
+  {
162 166
     image: images[2],
163 167
     playBtn: {
164 168
       pos: [616, 932],
165 169
     },
166 170
     showGesture: true,
171
+    infoIcon: {
172
+      image: infoImage[0],
173
+      content:
174
+        "南京长江大桥位于南京市鼓楼区下关和浦口区桥北之间,是长江上第一座由中国自行设计和建造的双层式铁路、公路两用桥梁,具有极大的经济意义、政治意义和战略意义,有“争气桥”之称。大桥由正桥、南北桥头堡和南北引桥组成,正桥分上下两层,上层为公路桥,正桥长1577米,4车道的宽度,车行道宽15米,可容4辆大型汽车并行,两侧人行道各宽2.25米。下层为铁路桥,全长6772米,宽14米,铺设双轨,两列火车可同时对开。正桥长1576米,其余为引桥,公路引桥长3012米,宽19.5米。",
175
+      position: "left",
176
+    },
167 177
     audio: audios[0],
168 178
   },
169
-  { 
179
+  {
170 180
     image: images[3],
171 181
     playBtn: {
172 182
       pos: [100, 406],
173 183
     },
174 184
     audio: audios[1],
175 185
   },
176
-  { 
186
+  {
177 187
     image: images[4],
178 188
     playBtn: {
179 189
       pos: [650, 172],
180 190
     },
191
+
181 192
     audio: audios[2],
182 193
   },
183
-  { 
194
+  {
184 195
     image: images[5],
185 196
     playBtn: {
186 197
       pos: [652, 773],
187 198
     },
188 199
     audio: audios[3],
189 200
   },
190
-  // { 
201
+  // {
191 202
   //   image: img5,
192 203
   // },
193
-  { 
204
+  {
194 205
     image: images[6],
195 206
     playBtn: {
196 207
       pos: [624, 890],
197 208
     },
198 209
     audio: audios[4],
199 210
   },
200
-  { 
211
+  {
201 212
     image: images[7],
202 213
     playBtn: {
203 214
       pos: [612, 486],
204 215
     },
205 216
     audio: audios[5],
206 217
   },
207
-  { 
218
+  {
208 219
     image: images[8],
209 220
     playBtn: {
210 221
       pos: [93, 557],
211 222
     },
212 223
     audio: audios[6],
213 224
   },
214
-  { 
225
+  {
215 226
     image: images[9],
216 227
     playBtn: {
217 228
       pos: [163, 224],
218 229
     },
219 230
     audio: audios[7],
220 231
   },
221
-  // { 
232
+  // {
222 233
   //   image: img8,
223 234
   // },
224
-  { 
235
+  {
225 236
     image: images[10],
226 237
     playBtn: {
227 238
       pos: [152, 782],
228 239
     },
229 240
     audio: audios[8],
230 241
   },
231
-  { 
242
+  {
232 243
     image: images[11],
233 244
     playBtn: {
234 245
       pos: [662, 380],
235 246
     },
236 247
     audio: audios[9],
237 248
   },
238
-  { 
249
+  {
239 250
     image: images[12],
240 251
     playBtn: {
241 252
       pos: [646, 225],
242 253
     },
243 254
     audio: audios[10],
244 255
   },
245
-  // { 
256
+  // {
246 257
   //   image: img10,
247 258
   // },
248
-  { 
259
+  {
249 260
     image: images[13],
250 261
     playBtn: {
251 262
       pos: [574, 1074],
252 263
     },
253 264
     audio: audios[11],
254 265
   },
255
-  { 
266
+  {
256 267
     image: images[14],
257 268
     playBtn: {
258 269
       pos: [132, 550],
259 270
     },
260 271
     audio: audios[12],
261 272
   },
262
-  { 
273
+  {
263 274
     image: images[15],
264 275
     playBtn: {
265 276
       pos: [642, 310],
266 277
     },
267 278
     audio: audios[13],
268 279
   },
269
-  { 
280
+  {
270 281
     image: images[16],
271 282
     playBtn: {
272 283
       pos: [92, 80],
273 284
     },
274 285
     audio: audios[14],
275 286
   },
276
-  { 
287
+  {
277 288
     image: images[17],
278 289
     playBtn: {
279 290
       pos: [652, 31],
280 291
     },
281 292
     audio: audios[15],
282 293
   },
283
-  { 
294
+  {
284 295
     image: images[18],
285 296
     playBtn: {
286 297
       pos: [652, 353],
287 298
     },
288 299
     audio: audios[16],
289 300
   },
290
-  // { 
301
+  // {
291 302
   //   image: img15,
292 303
   // },
293
-  { 
304
+  {
294 305
     image: images[19],
295 306
     playBtn: {
296 307
       pos: [166, 600],
297 308
     },
298 309
     audio: audios[17],
299 310
   },
300
-  { 
311
+  {
301 312
     image: images[20],
302 313
     playBtn: {
303 314
       pos: [364, 606],
304 315
     },
305 316
     audio: audios[18],
306 317
   },
307
-  { 
318
+  {
308 319
     image: images[21],
309 320
     playBtn: {
310 321
       pos: [386, 472],
311 322
     },
312 323
     audio: audios[19],
313 324
   },
314
-  { 
325
+  {
315 326
     image: images[22],
316 327
     playBtn: {
317 328
       pos: [132, 367],
318 329
     },
319 330
     audio: audios[20],
320 331
   },
321
-  { 
332
+  {
322 333
     image: images[23],
323 334
     playBtn: {
324 335
       pos: [250, 699],
325 336
     },
326 337
     audio: audios[21],
327 338
   },
328
-  // { 
339
+  // {
329 340
   //   image: img19,
330 341
   // },
331
-  { 
342
+  {
332 343
     image: images[24],
333 344
     playBtn: {
334 345
       pos: [152, 1040],
335 346
     },
336 347
     audio: audios[22],
337 348
   },
338
-  { 
349
+  {
339 350
     image: images[25],
340 351
     playBtn: {
341 352
       pos: [172, 835],
342 353
     },
343 354
     audio: audios[23],
344 355
   },
345
-  { 
356
+  {
346 357
     image: images[26],
347 358
     playBtn: {
348 359
       pos: [98, 196],
349 360
     },
350 361
     audio: audios[24],
351 362
   },
352
-  { 
363
+  {
353 364
     image: images[27],
354 365
     playBtn: {
355 366
       pos: [160, 64],
356 367
     },
357 368
     audio: audios[25],
358 369
   },
359
-]
370
+];