lisenzhou 2 年前
父节点
当前提交
8e65adb601

二进制
public/infoimage/10台城.jpg 查看文件


二进制
public/infoimage/11紫金山.jpg 查看文件


二进制
public/infoimage/12石头城.jpg 查看文件


二进制
public/infoimage/13莫愁湖公园.jpg 查看文件


二进制
public/infoimage/14赏心亭.jpg 查看文件


二进制
public/infoimage/15长干里(1).jpg 查看文件


二进制
public/infoimage/16大报恩寺.jpg 查看文件


二进制
public/infoimage/17凤凰台.jpg 查看文件


二进制
public/infoimage/18桃叶渡.jpg 查看文件


二进制
public/infoimage/19雨花台.jpg 查看文件


二进制
public/infoimage/1长江大桥.jpg 查看文件


二进制
public/infoimage/20牛首山.jpg 查看文件


二进制
public/infoimage/21石臼湖.jpg 查看文件


二进制
public/infoimage/21石臼湖.png 查看文件


二进制
public/infoimage/22东山.jpg 查看文件


二进制
public/infoimage/23瞻园.jpg 查看文件


二进制
public/infoimage/24文德桥.jpg 查看文件


二进制
public/infoimage/25随园.jpg 查看文件


二进制
public/infoimage/26世界文学客厅.jpg 查看文件


二进制
public/infoimage/2阅江楼.jpg 查看文件


二进制
public/infoimage/3秦淮河.jpg 查看文件


二进制
public/infoimage/4乌衣巷.jpg 查看文件


二进制
public/infoimage/5燕子矶.jpg 查看文件


二进制
public/infoimage/6栖霞山.jpg 查看文件


二进制
public/infoimage/7朝天宫.jpg 查看文件


二进制
public/infoimage/8梁洲.jpg 查看文件


二进制
public/infoimage/9后湖映月.jpg 查看文件


+ 125
- 75
src/components/Image.vue 查看文件

1
 <template>
1
 <template>
2
   <div class="img-wrapper">
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
     </div>
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
     </div>
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
       <AudioPlayingVue :style="iconStyle" />
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
     </div>
52
     </div>
53
+
54
+    <PopUpVue :show="showInfo" :info="resource.infoIcon" :onClose="onCloseInfoBtn" />
35
   </div>
55
   </div>
36
 </template>
56
 </template>
37
 
57
 
38
 <script setup>
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
 const props = defineProps({
68
 const props = defineProps({
48
   resource: {
69
   resource: {
49
     type: Object,
70
     type: Object,
50
-    default: () => ({})
71
+    default: () => ({
72
+      infoIcon:Object,
73
+    }),
51
   },
74
   },
52
   showFog: Boolean,
75
   showFog: Boolean,
53
   index: Number,
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
 const btnStyle = ref({});
82
 const btnStyle = ref({});
59
 const gestureStyle = ref({});
83
 const gestureStyle = ref({});
84
+const infoStyle = ref({});
60
 const audioRef = ref();
85
 const audioRef = ref();
61
 const playState = ref(0);
86
 const playState = ref(0);
62
 const showGesture = ref(props.resource.showGesture);
87
 const showGesture = ref(props.resource.showGesture);
63
 const iconStyle = computed(() => ({
88
 const iconStyle = computed(() => ({
64
-  opacity: playState.value
89
+  opacity: playState.value,
65
 }));
90
 }));
66
 
91
 
67
 const playAudio = () => {
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
 const stopAudio = () => {
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
 watch(current, (nw) => {
109
 watch(current, (nw) => {
85
   if (nw !== props.resource.audio && playState.value === 1) {
110
   if (nw !== props.resource.audio && playState.value === 1) {
86
     stopAudio();
111
     stopAudio();
87
   }
112
   }
88
-})
113
+});
89
 
114
 
90
 // 点击播放
115
 // 点击播放
91
 const onPlayBtn = () => {
116
 const onPlayBtn = () => {
94
   } else {
119
   } else {
95
     playAudio();
120
     playAudio();
96
   }
121
   }
97
-}
122
+};
98
 
123
 
99
 //显示地图
124
 //显示地图
100
 const onShowMapBtn = () => {
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
 const onEnded = () => {
149
 const onEnded = () => {
113
   stopAudio();
150
   stopAudio();
114
-}
151
+};
115
 
152
 
116
 // 图片加载完成, 设置播放器
153
 // 图片加载完成, 设置播放器
117
 const onLoad = (e) => {
154
 const onLoad = (e) => {
119
     const { pos } = props.resource.playBtn;
156
     const { pos } = props.resource.playBtn;
120
     const { width, height, naturalHeight, naturalWidth } = e.target;
157
     const { width, height, naturalHeight, naturalWidth } = e.target;
121
     const d = 32; // 宽度一半
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
     const x = centerX - d;
161
     const x = centerX - d;
125
     const y = centerY - d;
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
     if (showGesture.value) {
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
     const { pos } = props.resource.showMapBtn;
179
     const { pos } = props.resource.showMapBtn;
136
     const { width, height, naturalHeight, naturalWidth } = e.target;
180
     const { width, height, naturalHeight, naturalWidth } = e.target;
137
     const d = 32; // 宽度一半
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
     const x = centerX - d;
184
     const x = centerX - d;
141
     const y = centerY - d;
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
 </script>
189
 </script>
147
 
190
 
148
 <style lang="less" scoped>
191
 <style lang="less" scoped>
154
     position: absolute;
197
     position: absolute;
155
     z-index: 9;
198
     z-index: 9;
156
     animation: gestureAnimation 1.6s ease-in-out infinite;
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
     .iconfont {
209
     .iconfont {
159
       font-size: 24px;
210
       font-size: 24px;
160
     }
211
     }
163
   @keyframes gestureAnimation {
214
   @keyframes gestureAnimation {
164
     from {
215
     from {
165
       opacity: 0;
216
       opacity: 0;
166
-      transform: translateX(0);
217
+      transform: translateY(0) rotate(90deg);
167
     }
218
     }
168
     to {
219
     to {
169
       opacity: 1;
220
       opacity: 1;
170
-      transform: translateX(12px);
221
+      transform: translateY(12px) rotate(90deg);
171
     }
222
     }
172
   }
223
   }
173
 
224
 
174
-  .showmapbtn{
225
+  .showmapbtn {
175
     position: absolute;
226
     position: absolute;
176
     width: 170px;
227
     width: 170px;
177
     height: 70px;
228
     height: 70px;
178
-    background: rgba(255, 0, 0, .5);
229
+    background: rgba(255, 0, 0, 0.5);
179
     z-index: 10;
230
     z-index: 10;
180
   }
231
   }
181
 
232
 
183
     position: absolute;
234
     position: absolute;
184
     width: 64px;
235
     width: 64px;
185
     height: 64px;
236
     height: 64px;
186
-    background: rgba(255, 0, 0, .5);
237
+    background: rgba(255, 0, 0, 0.5);
187
     z-index: 10;
238
     z-index: 10;
188
 
239
 
189
     & > audio {
240
     & > audio {
203
   }
254
   }
204
 }
255
 }
205
 </style>
256
 </style>
206
-

+ 83
- 0
src/components/PopUp.vue 查看文件

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 查看文件

1
-
2
-
3
 // import index from '@/assets/index.jpg';
1
 // import index from '@/assets/index.jpg';
4
 // import mask from '@/assets/mask.png';
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
 // import img1 from '@/assets/images/1.jpg';
8
 // import img1 from '@/assets/images/1.jpg';
11
 // import img2 from '@/assets/images/2.jpg';
9
 // import img2 from '@/assets/images/2.jpg';
41
 // import img22 from '@/assets/images/22.jpg';
39
 // import img22 from '@/assets/images/22.jpg';
42
 // import img23 from '@/assets/images/23.jpg';
40
 // import img23 from '@/assets/images/23.jpg';
43
 
41
 
42
+const infoImage = ["./infoimage/1长江大桥.jpg"];
43
+
44
 const images = [
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
   // './images/5.jpg',
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
   // './images/8.jpg',
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
   // './images/10.jpg',
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
   // './images/15.jpg',
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
   // './images/19.jpg',
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
 // import audio1 from '@/assets/audios/1南京长江大桥.mp3';
80
 // import audio1 from '@/assets/audios/1南京长江大桥.mp3';
81
 // import audio2 from '@/assets/audios/2阅江楼.mp3';
81
 // import audio2 from '@/assets/audios/2阅江楼.mp3';
105
 // import audio26 from '@/assets/audios/26世界文学客厅.mp3';
105
 // import audio26 from '@/assets/audios/26世界文学客厅.mp3';
106
 
106
 
107
 const audios = [
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
 export const resources = [
137
 export const resources = [
138
-  { 
138
+  {
139
     image: index,
139
     image: index,
140
     hidden: true,
140
     hidden: true,
141
   },
141
   },
142
-  { 
142
+  {
143
     image: mask,
143
     image: mask,
144
     hidden: true,
144
     hidden: true,
145
   },
145
   },
146
   {
146
   {
147
-    image:map,
147
+    image: map,
148
     hidden: true,
148
     hidden: true,
149
   },
149
   },
150
-  { 
150
+  {
151
     image: images[0],
151
     image: images[0],
152
   },
152
   },
153
-  { 
153
+
154
+  {
154
     image: images[1],
155
     image: images[1],
155
-    showMapBtn:{
156
+    showMapBtn: {
156
       pos: [280, 1250],
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
     image: images[2],
166
     image: images[2],
163
     playBtn: {
167
     playBtn: {
164
       pos: [616, 932],
168
       pos: [616, 932],
165
     },
169
     },
166
     showGesture: true,
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
     audio: audios[0],
177
     audio: audios[0],
168
   },
178
   },
169
-  { 
179
+  {
170
     image: images[3],
180
     image: images[3],
171
     playBtn: {
181
     playBtn: {
172
       pos: [100, 406],
182
       pos: [100, 406],
173
     },
183
     },
174
     audio: audios[1],
184
     audio: audios[1],
175
   },
185
   },
176
-  { 
186
+  {
177
     image: images[4],
187
     image: images[4],
178
     playBtn: {
188
     playBtn: {
179
       pos: [650, 172],
189
       pos: [650, 172],
180
     },
190
     },
191
+
181
     audio: audios[2],
192
     audio: audios[2],
182
   },
193
   },
183
-  { 
194
+  {
184
     image: images[5],
195
     image: images[5],
185
     playBtn: {
196
     playBtn: {
186
       pos: [652, 773],
197
       pos: [652, 773],
187
     },
198
     },
188
     audio: audios[3],
199
     audio: audios[3],
189
   },
200
   },
190
-  // { 
201
+  // {
191
   //   image: img5,
202
   //   image: img5,
192
   // },
203
   // },
193
-  { 
204
+  {
194
     image: images[6],
205
     image: images[6],
195
     playBtn: {
206
     playBtn: {
196
       pos: [624, 890],
207
       pos: [624, 890],
197
     },
208
     },
198
     audio: audios[4],
209
     audio: audios[4],
199
   },
210
   },
200
-  { 
211
+  {
201
     image: images[7],
212
     image: images[7],
202
     playBtn: {
213
     playBtn: {
203
       pos: [612, 486],
214
       pos: [612, 486],
204
     },
215
     },
205
     audio: audios[5],
216
     audio: audios[5],
206
   },
217
   },
207
-  { 
218
+  {
208
     image: images[8],
219
     image: images[8],
209
     playBtn: {
220
     playBtn: {
210
       pos: [93, 557],
221
       pos: [93, 557],
211
     },
222
     },
212
     audio: audios[6],
223
     audio: audios[6],
213
   },
224
   },
214
-  { 
225
+  {
215
     image: images[9],
226
     image: images[9],
216
     playBtn: {
227
     playBtn: {
217
       pos: [163, 224],
228
       pos: [163, 224],
218
     },
229
     },
219
     audio: audios[7],
230
     audio: audios[7],
220
   },
231
   },
221
-  // { 
232
+  // {
222
   //   image: img8,
233
   //   image: img8,
223
   // },
234
   // },
224
-  { 
235
+  {
225
     image: images[10],
236
     image: images[10],
226
     playBtn: {
237
     playBtn: {
227
       pos: [152, 782],
238
       pos: [152, 782],
228
     },
239
     },
229
     audio: audios[8],
240
     audio: audios[8],
230
   },
241
   },
231
-  { 
242
+  {
232
     image: images[11],
243
     image: images[11],
233
     playBtn: {
244
     playBtn: {
234
       pos: [662, 380],
245
       pos: [662, 380],
235
     },
246
     },
236
     audio: audios[9],
247
     audio: audios[9],
237
   },
248
   },
238
-  { 
249
+  {
239
     image: images[12],
250
     image: images[12],
240
     playBtn: {
251
     playBtn: {
241
       pos: [646, 225],
252
       pos: [646, 225],
242
     },
253
     },
243
     audio: audios[10],
254
     audio: audios[10],
244
   },
255
   },
245
-  // { 
256
+  // {
246
   //   image: img10,
257
   //   image: img10,
247
   // },
258
   // },
248
-  { 
259
+  {
249
     image: images[13],
260
     image: images[13],
250
     playBtn: {
261
     playBtn: {
251
       pos: [574, 1074],
262
       pos: [574, 1074],
252
     },
263
     },
253
     audio: audios[11],
264
     audio: audios[11],
254
   },
265
   },
255
-  { 
266
+  {
256
     image: images[14],
267
     image: images[14],
257
     playBtn: {
268
     playBtn: {
258
       pos: [132, 550],
269
       pos: [132, 550],
259
     },
270
     },
260
     audio: audios[12],
271
     audio: audios[12],
261
   },
272
   },
262
-  { 
273
+  {
263
     image: images[15],
274
     image: images[15],
264
     playBtn: {
275
     playBtn: {
265
       pos: [642, 310],
276
       pos: [642, 310],
266
     },
277
     },
267
     audio: audios[13],
278
     audio: audios[13],
268
   },
279
   },
269
-  { 
280
+  {
270
     image: images[16],
281
     image: images[16],
271
     playBtn: {
282
     playBtn: {
272
       pos: [92, 80],
283
       pos: [92, 80],
273
     },
284
     },
274
     audio: audios[14],
285
     audio: audios[14],
275
   },
286
   },
276
-  { 
287
+  {
277
     image: images[17],
288
     image: images[17],
278
     playBtn: {
289
     playBtn: {
279
       pos: [652, 31],
290
       pos: [652, 31],
280
     },
291
     },
281
     audio: audios[15],
292
     audio: audios[15],
282
   },
293
   },
283
-  { 
294
+  {
284
     image: images[18],
295
     image: images[18],
285
     playBtn: {
296
     playBtn: {
286
       pos: [652, 353],
297
       pos: [652, 353],
287
     },
298
     },
288
     audio: audios[16],
299
     audio: audios[16],
289
   },
300
   },
290
-  // { 
301
+  // {
291
   //   image: img15,
302
   //   image: img15,
292
   // },
303
   // },
293
-  { 
304
+  {
294
     image: images[19],
305
     image: images[19],
295
     playBtn: {
306
     playBtn: {
296
       pos: [166, 600],
307
       pos: [166, 600],
297
     },
308
     },
298
     audio: audios[17],
309
     audio: audios[17],
299
   },
310
   },
300
-  { 
311
+  {
301
     image: images[20],
312
     image: images[20],
302
     playBtn: {
313
     playBtn: {
303
       pos: [364, 606],
314
       pos: [364, 606],
304
     },
315
     },
305
     audio: audios[18],
316
     audio: audios[18],
306
   },
317
   },
307
-  { 
318
+  {
308
     image: images[21],
319
     image: images[21],
309
     playBtn: {
320
     playBtn: {
310
       pos: [386, 472],
321
       pos: [386, 472],
311
     },
322
     },
312
     audio: audios[19],
323
     audio: audios[19],
313
   },
324
   },
314
-  { 
325
+  {
315
     image: images[22],
326
     image: images[22],
316
     playBtn: {
327
     playBtn: {
317
       pos: [132, 367],
328
       pos: [132, 367],
318
     },
329
     },
319
     audio: audios[20],
330
     audio: audios[20],
320
   },
331
   },
321
-  { 
332
+  {
322
     image: images[23],
333
     image: images[23],
323
     playBtn: {
334
     playBtn: {
324
       pos: [250, 699],
335
       pos: [250, 699],
325
     },
336
     },
326
     audio: audios[21],
337
     audio: audios[21],
327
   },
338
   },
328
-  // { 
339
+  // {
329
   //   image: img19,
340
   //   image: img19,
330
   // },
341
   // },
331
-  { 
342
+  {
332
     image: images[24],
343
     image: images[24],
333
     playBtn: {
344
     playBtn: {
334
       pos: [152, 1040],
345
       pos: [152, 1040],
335
     },
346
     },
336
     audio: audios[22],
347
     audio: audios[22],
337
   },
348
   },
338
-  { 
349
+  {
339
     image: images[25],
350
     image: images[25],
340
     playBtn: {
351
     playBtn: {
341
       pos: [172, 835],
352
       pos: [172, 835],
342
     },
353
     },
343
     audio: audios[23],
354
     audio: audios[23],
344
   },
355
   },
345
-  { 
356
+  {
346
     image: images[26],
357
     image: images[26],
347
     playBtn: {
358
     playBtn: {
348
       pos: [98, 196],
359
       pos: [98, 196],
349
     },
360
     },
350
     audio: audios[24],
361
     audio: audios[24],
351
   },
362
   },
352
-  { 
363
+  {
353
     image: images[27],
364
     image: images[27],
354
     playBtn: {
365
     playBtn: {
355
       pos: [160, 64],
366
       pos: [160, 64],
356
     },
367
     },
357
     audio: audios[25],
368
     audio: audios[25],
358
   },
369
   },
359
-]
370
+];