# 交互式旅游地图
**Repository Path**: lutaining/interactive-travel-map
## Basic Information
- **Project Name**: 交互式旅游地图
- **Description**: 交互式旅游地图/svg
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2018-04-18
- **Last Updated**: 2022-06-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# interactive-travel-map
【项目介绍】
展示丽江旅程的网站,通过HTML5/CSS3实现响应式布局。使用svg和原生Javascript实现页面交互。
链接:http://1.muliping.applinzi.com/map_2/
效果图:
【文件结构】
Map_2
|__ index .html(主页)
|__ map.html(地图)
|__ route.html(路线)
|__ note.html(记录)
|__ css
|__ font.css(latin字体)
|__ main.css(主页样式)
|__ map.css
|__ route.css
|__note.css
|__ img
|__map
|__ route
|__ 1.svg(东巴文小图)
|__3.svg(东巴文大图)
|__close.png(map中关闭背景图的图标)
|__yunhe.png(网页logo)
|__ js
|__jquery-3.0.0.min.js
|__ fastclick.js(提高手机端点击响应速度)
|__ lunar.js(操作svg元素的class)
|__index.js
|__map.js
|__route.js
【功能模块】
1.主页
--自适应手机屏幕的宽度
\
viewport:虚拟窗口;
width=device-width :虚拟窗口宽度=设备宽度;
initial-scale=1:初始缩放比例为 1 倍,虚拟窗口相对设备窗口大小进行缩放。
为什么使用viewport?
->不使用viewport时,手机会自动缩放页面。如980px的CSS元素,放入320px的设备中,则虚拟窗口相对设备窗口的缩放比例为980/320。
->但这样页面整体缩小,并不好看。相当于我有一只大象,而盒子太小只能放老鼠,所以需要把大象缩小到老鼠大小放进去,这时我可能看不清大象的样子。
->所以,我们可以针对不同的设备放置不同的元素,在大盒子里放大象,在小盒子里放老鼠。这时就需要使用viewport设置缩放比例为1,避免在小盒子里放老鼠时,仍然按980/320的比例缩放。
以上只是个人的浅陋之见。
viewport的知识,推荐参考https://www.zybuluo.com/gongzhen/note/170557
-- IE识别H5标签
引入html5shiv.js
--导航栏svg图标
预定义svg(由于是预定义的元素,所以将其css设置为不可见,禁用鼠标事件)
|__defs(预定义可重用元素)
|__symbol(定义可重用符号)
|__id(后面使用时,需要用id引用符号)
|__viewbox(符号大小,参数:x,y,w,h)
|__path(路径)
使用svg
\
--响应式布局
@media screen and (max-width:768px) 判断屏幕宽度,当屏幕宽度<=768px时,将页面宽由80vw改为为100vw,同时改变logo和导航的大小。
2.Map
--背景地图
采用H5的响应式图片\\元素,针对不同的屏幕宽度,加载不同图片
--地标点
svg将多个地标点合并成一个整体,好处是容易定位,不需要再使用css对每个点进行定位。svg的每个地标点又是独立的,可以单独进行交互操作,优于png图片。另外svg还有缩放不失真,加载快,文件小等优点。
在小屏幕下,使用JS改变svg图形整体的viewbox,既可进行缩放。
使用svg也有缺点:因为不是DOM节点,只能用原生js进行操作。因此引入lunar.js,方便操作svg元素的class。
--交互
->mouseover:动态生成提示框内容(获取对应地标点的data-title),再显示提示框(改变其透明度),改变对应的背景图片透明度(+class)。提示框和背景图片在css中都设置了过渡效果,让交互效果更自然。
显示提示框时,需要先确定地标点的位置,使用getBBox()获取svg地标点左上角位置(x,y),用getBoundingClientRect()获取地标点高度。另外,svg的viewbox宽度是913,放在页面80vw宽的容器中会产生缩放,如果缩放比例1.2则地标点位置实际应该是(1.2*x,1.2*y),所以计算提示框位置时还要考虑缩放比例。
->Click:显示背景图(+class,改变透明度和z-index),显示简介内容(+class)。对简介的标题、副标题、内容在css中设置不同的过渡延迟时间,实现更好的视觉效果。
3.route
运用jQuery实现景点简介的滑动,利用定时器避免鼠标快速移动时页面混乱。
4.note
--东巴文图片
采用H5的响应式图片\\元素,针对不同的屏幕宽度,加载不同图片
--svg动画
->旋转
\
begin:可设置延迟时间
dur:动画执行时间
type:动画类型
from/to:角度,x,y
repeatCount:动画重复次数
->透明度
\
from/to:透明度
->路径运动
\
Path:运动路径,起始位置(-5,-5),直线移动到(17,5),再直线移动到(-7,-5),这里的坐标是以当前位置为参考点相对坐标,所以最后是移动到起始位置。
Svg动画知识,推荐参考 http://www.zhangxinxu.com/wordpress/2014/08/so-powerful-svg-smil-animation/