luxian.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>观鸟路线推荐</title>
  7. <link rel="stylesheet" href="https://at.alicdn.com/t/c/font_4006896_9kq3p2p2z4q.css">
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. box-sizing: border-box;
  13. font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  14. }
  15. body {
  16. background-color: #f5f5f5;
  17. color: #333;
  18. max-width: 100vw;
  19. overflow-x: hidden;
  20. }
  21. .container {
  22. padding-bottom: 80px; /* 给底部按钮留空间 */
  23. min-height: 100vh;
  24. }
  25. /* 顶部导航栏 */
  26. .header {
  27. background-color: #67c23a;
  28. color: white;
  29. padding: 15px;
  30. display: flex;
  31. align-items: center;
  32. position: sticky;
  33. top: 0;
  34. z-index: 10;
  35. box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  36. }
  37. .back-btn {
  38. font-size: 20px;
  39. margin-right: 15px;
  40. display: flex;
  41. align-items: center;
  42. }
  43. .title {
  44. font-size: 18px;
  45. font-weight: bold;
  46. flex: 1;
  47. text-align: center;
  48. }
  49. /* 路线卡片容器 */
  50. .route-container {
  51. padding: 15px;
  52. overflow-x: auto;
  53. white-space: nowrap;
  54. -webkit-overflow-scrolling: touch;
  55. padding-bottom: 20px;
  56. }
  57. .route-container::-webkit-scrollbar {
  58. display: none;
  59. }
  60. /* 路线卡片 */
  61. .route-card {
  62. display: inline-block;
  63. width: 85%;
  64. background-color: white;
  65. border-radius: 15px;
  66. margin-right: 15px;
  67. box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
  68. vertical-align: top;
  69. white-space: normal;
  70. }
  71. .route-card:last-child {
  72. margin-right: 0;
  73. }
  74. .route-header {
  75. padding: 15px;
  76. border-bottom: 1px solid #f0f0f0;
  77. }
  78. .route-title {
  79. font-size: 16px;
  80. font-weight: bold;
  81. color: #333;
  82. margin-bottom: 5px;
  83. }
  84. .route-info {
  85. display: flex;
  86. font-size: 12px;
  87. color: #999;
  88. }
  89. .route-info span {
  90. margin-right: 10px;
  91. display: flex;
  92. align-items: center;
  93. }
  94. .route-info i {
  95. margin-right: 3px;
  96. font-size: 14px;
  97. }
  98. /* 路线地图区域 */
  99. .route-map {
  100. position: relative;
  101. height: 200px;
  102. background-color: #e8f5e9;
  103. background-image: linear-gradient(to right, #e8f5e9, #c8e6c9);
  104. overflow: hidden;
  105. }
  106. /* 路线路径 */
  107. .route-path {
  108. position: absolute;
  109. top: 50%;
  110. left: 20px;
  111. right: 20px;
  112. height: 4px;
  113. background-color: #67c23a;
  114. transform: translateY(-50%);
  115. }
  116. /* 鸟类观察点 */
  117. .bird-spot {
  118. position: absolute;
  119. width: 24px;
  120. height: 24px;
  121. border-radius: 50%;
  122. background-color: #ff9800;
  123. transform: translate(-50%, -50%);
  124. display: flex;
  125. justify-content: center;
  126. align-items: center;
  127. color: white;
  128. font-size: 12px;
  129. box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
  130. }
  131. /* 鸟类气泡提示 */
  132. .bird-tooltip {
  133. position: absolute;
  134. bottom: 30px;
  135. left: 50%;
  136. transform: translateX(-50%);
  137. background-color: white;
  138. padding: 8px 12px;
  139. border-radius: 12px;
  140. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  141. font-size: 12px;
  142. white-space: nowrap;
  143. display: none;
  144. }
  145. .bird-tooltip::after {
  146. content: '';
  147. position: absolute;
  148. bottom: -5px;
  149. left: 50%;
  150. transform: translateX(-50%);
  151. width: 0;
  152. height: 0;
  153. border-left: 5px solid transparent;
  154. border-right: 5px solid transparent;
  155. border-top: 5px solid white;
  156. }
  157. .bird-spot:hover .bird-tooltip {
  158. display: block;
  159. }
  160. /* 底部操作按钮 */
  161. .action-buttons {
  162. position: fixed;
  163. bottom: 0;
  164. left: 0;
  165. right: 0;
  166. display: flex;
  167. background-color: white;
  168. padding: 15px;
  169. box-shadow: 0 -1px 5px rgba(0, 0, 0, 0.1);
  170. z-index: 100;
  171. }
  172. .action-btn {
  173. flex: 1;
  174. padding: 12px;
  175. border-radius: 8px;
  176. text-align: center;
  177. font-size: 14px;
  178. font-weight: 500;
  179. }
  180. .select-btn {
  181. background-color: #f0f9eb;
  182. color: #67c23a;
  183. margin-right: 10px;
  184. }
  185. .upload-btn {
  186. background-color: #67c23a;
  187. color: white;
  188. }
  189. /* 美化优化 */
  190. .highlight {
  191. color: #67c23a;
  192. }
  193. </style>
  194. </head>
  195. <body>
  196. <div class="container">
  197. <!-- 顶部导航栏 -->
  198. <div class="header">
  199. <div class="back-btn">
  200. <i class="iconfont icon-arrow-left"></i>
  201. </div>
  202. <div class="title">路线推荐</div>
  203. <div style="width: 24px;"></div> <!-- 保持对称 -->
  204. </div>
  205. <!-- 路线推荐卡片 -->
  206. <div class="route-container">
  207. <!-- 路线1 -->
  208. <div class="route-card">
  209. <div class="route-header">
  210. <div class="route-title">鄱阳湖冬季候鸟观赏路线</div>
  211. <div class="route-info">
  212. <span><i class="iconfont icon-location"></i>江西九江</span>
  213. <span><i class="iconfont icon-clock"></i>3小时</span>
  214. <span><i class="iconfont icon-eye"></i>23种鸟类</span>
  215. </div>
  216. </div>
  217. <div class="route-map">
  218. <div class="route-path"></div>
  219. <div class="bird-spot" style="left: 20%;">
  220. <i class="iconfont icon-bird"></i>
  221. <div class="bird-tooltip">白鹤(国家一级)</div>
  222. </div>
  223. <div class="bird-spot" style="left: 40%;">
  224. <i class="iconfont icon-bird"></i>
  225. <div class="bird-tooltip">小天鹅</div>
  226. </div>
  227. <div class="bird-spot" style="left: 60%;">
  228. <i class="iconfont icon-bird"></i>
  229. <div class="bird-tooltip">东方白鹳</div>
  230. </div>
  231. <div class="bird-spot" style="left: 80%;">
  232. <i class="iconfont icon-bird"></i>
  233. <div class="bird-tooltip">鸿雁</div>
  234. </div>
  235. </div>
  236. </div>
  237. <!-- 路线2 -->
  238. <div class="route-card">
  239. <div class="route-header">
  240. <div class="route-title">庐山森林鸟类观察路线</div>
  241. <div class="route-info">
  242. <span><i class="iconfont icon-location"></i>江西九江</span>
  243. <span><i class="iconfont icon-clock"></i>5小时</span>
  244. <span><i class="iconfont icon-eye"></i>18种鸟类</span>
  245. </div>
  246. </div>
  247. <div class="route-map">
  248. <div class="route-path"></div>
  249. <div class="bird-spot" style="left: 15%;">
  250. <i class="iconfont icon-bird"></i>
  251. <div class="bird-tooltip">白鹇(国家二级)</div>
  252. </div>
  253. <div class="bird-spot" style="left: 35%;">
  254. <i class="iconfont icon-bird"></i>
  255. <div class="bird-tooltip">红嘴相思鸟</div>
  256. </div>
  257. <div class="bird-spot" style="left: 55%;">
  258. <i class="iconfont icon-bird"></i>
  259. <div class="bird-tooltip">画眉</div>
  260. </div>
  261. <div class="bird-spot" style="left: 75%;">
  262. <i class="iconfont icon-bird"></i>
  263. <div class="bird-tooltip">松鸦</div>
  264. </div>
  265. </div>
  266. </div>
  267. <!-- 路线3 -->
  268. <div class="route-card">
  269. <div class="route-header">
  270. <div class="route-title">南昌城市湿地观鸟路线</div>
  271. <div class="route-info">
  272. <span><i class="iconfont icon-location"></i>江西南昌</span>
  273. <span><i class="iconfont icon-clock"></i>2小时</span>
  274. <span><i class="iconfont icon-eye"></i>15种鸟类</span>
  275. </div>
  276. </div>
  277. <div class="route-map">
  278. <div class="route-path"></div>
  279. <div class="bird-spot" style="left: 25%;">
  280. <i class="iconfont icon-bird"></i>
  281. <div class="bird-tooltip">白鹭</div>
  282. </div>
  283. <div class="bird-spot" style="left: 50%;">
  284. <i class="iconfont icon-bird"></i>
  285. <div class="bird-tooltip">夜鹭</div>
  286. </div>
  287. <div class="bird-spot" style="left: 75%;">
  288. <i class="iconfont icon-bird"></i>
  289. <div class="bird-tooltip">黑水鸡</div>
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. <!-- 底部操作按钮 -->
  295. <div class="action-buttons">
  296. <div class="action-btn select-btn">
  297. <i class="iconfont icon-select"></i> 路线选择
  298. </div>
  299. <div class="action-btn upload-btn">
  300. <i class="iconfont icon-upload"></i> 路线上传
  301. </div>
  302. </div>
  303. </div>
  304. <script>
  305. // 简单的交互逻辑
  306. document.querySelector('.back-btn').addEventListener('click', function() {
  307. alert('返回上一页');
  308. // 实际项目中可以替换为 history.back() 或其他导航逻辑
  309. });
  310. document.querySelectorAll('.route-card').forEach(card => {
  311. card.addEventListener('click', function() {
  312. const routeTitle = this.querySelector('.route-title').textContent;
  313. alert(`查看${routeTitle}的详细信息`);
  314. // 实际项目中可以跳转到详情页
  315. });
  316. });
  317. document.querySelector('.select-btn').addEventListener('click', function() {
  318. alert('打开路线选择筛选器');
  319. // 实际项目中可以打开筛选弹窗
  320. });
  321. document.querySelector('.upload-btn').addEventListener('click', function() {
  322. alert('打开路线上传页面');
  323. // 实际项目中可以跳转到上传页面
  324. });
  325. // 模拟卡片滑动效果
  326. let isDown = false;
  327. let startX;
  328. let scrollLeft;
  329. const slider = document.querySelector('.route-container');
  330. slider.addEventListener('mousedown', (e) => {
  331. isDown = true;
  332. startX = e.pageX - slider.offsetLeft;
  333. scrollLeft = slider.scrollLeft;
  334. });
  335. slider.addEventListener('mouseleave', () => {
  336. isDown = false;
  337. });
  338. slider.addEventListener('mouseup', () => {
  339. isDown = false;
  340. });
  341. slider.addEventListener('mousemove', (e) => {
  342. if(!isDown) return;
  343. e.preventDefault();
  344. const x = e.pageX - slider.offsetLeft;
  345. const walk = (x - startX) * 2;
  346. slider.scrollLeft = scrollLeft - walk;
  347. });
  348. // 触摸设备支持
  349. slider.addEventListener('touchstart', (e) => {
  350. isDown = true;
  351. startX = e.touches[0].pageX - slider.offsetLeft;
  352. scrollLeft = slider.scrollLeft;
  353. });
  354. slider.addEventListener('touchend', () => {
  355. isDown = false;
  356. });
  357. slider.addEventListener('touchmove', (e) => {
  358. if(!isDown) return;
  359. const x = e.touches[0].pageX - slider.offsetLeft;
  360. const walk = (x - startX) * 2;
  361. slider.scrollLeft = scrollLeft - walk;
  362. });
  363. </script>
  364. </body>
  365. </html>