/* 基础样式 */ page { background-color: #f8f9fa; } .container { padding: 0 20rpx 140rpx; color: #333; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; } /* 顶部导航 */ .header { display: flex; justify-content: space-between; align-items: center; padding: 30rpx 0; position: sticky; top: 0; background-color: #f8f9fa; z-index: 100; } .back-btn { display: flex; align-items: center; font-size: 28rpx; color: #666; } .back-icon { width: 36rpx; height: 36rpx; margin-right: 10rpx; } .title { font-size: 36rpx; font-weight: 600; color: #333; } .header-right { width: 80rpx; /* 保持对称 */ } /* 行程基本信息卡片 */ .plan-info-card { background: linear-gradient(135deg, #ffffff 0%, #f9f9f9 100%); border-radius: 20rpx; padding: 30rpx; margin-bottom: 40rpx; box-shadow: 0 6rpx 18rpx rgba(0, 0, 0, 0.03); border: 1rpx solid #eee; } .plan-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20rpx; } .plan-title { font-size: 38rpx; font-weight: 600; color: #333; flex: 1; } .plan-days-badge { background-color: #e54d42; color: white; padding: 8rpx 20rpx; border-radius: 30rpx; font-size: 24rpx; font-weight: 500; } .meta-item { display: flex; align-items: center; color: #666; font-size: 26rpx; margin-bottom: 15rpx; } .meta-icon { width: 28rpx; height: 28rpx; margin-right: 10rpx; opacity: 0.8; } .plan-desc-box { position: relative; margin: 30rpx 0; padding-left: 40rpx; } .quote-icon { position: absolute; left: 0; top: 0; width: 30rpx; height: 30rpx; opacity: 0.3; } .plan-desc { font-size: 28rpx; line-height: 1.6; color: #555; } /* 城市标签 */ .city-tags { display: flex; flex-wrap: wrap; margin-top: 20rpx; } .city-tag { display: flex; align-items: center; background-color: #f0f7ff; color: #0081ff; padding: 8rpx 20rpx 8rpx 15rpx; border-radius: 30rpx; margin-right: 15rpx; margin-bottom: 15rpx; font-size: 24rpx; border: 1rpx solid #d0e4ff; } .tag-icon { width: 24rpx; height: 24rpx; margin-right: 8rpx; } /* 时间轴布局 */ .timeline { position: relative; padding-left: 80rpx; } .timeline:before { content: ''; position: absolute; left: 35rpx; top: 0; bottom: 0; width: 2rpx; background-color: #e0e0e0; } .timeline-item { position: relative; margin-bottom: 50rpx; } .timeline-marker { position: absolute; left: -70rpx; top: 0; width: 80rpx; height: 80rpx; border-radius: 50%; color: white; font-size: 28rpx; font-weight: 600; display: flex; align-items: center; justify-content: center; text-align: center; box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.15); z-index: 2; transition: all 0.3s ease; transform: translateY(-10rpx); border: 4rpx solid white; } .timeline-marker::before { content: ''; position: absolute; width: 100%; height: 100%; border-radius: 50%; background: rgba(255, 255, 255, 0.2); transform: scale(0); transition: all 0.3s ease; } .timeline-marker:active::before { transform: scale(1); } .timeline-item:hover .timeline-marker { transform: translateY(-10rpx) scale(1.1); box-shadow: 0 12rpx 30rpx rgba(0, 0, 0, 0.2); } .timeline-content { background-color: white; border-radius: 16rpx; padding: 30rpx; box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05); border: 1rpx solid #f0f0f0; } .day-theme-box { display: flex; align-items: center; margin-bottom: 30rpx; padding-bottom: 20rpx; border-bottom: 1rpx dashed #eee; } .theme-icon { width: 32rpx; height: 32rpx; margin-right: 15rpx; } .day-theme { font-size: 32rpx; font-weight: 600; color: #333; } /* 景点卡片 */ .attraction-card { margin-bottom: 40rpx; background: white; border-radius: 16rpx; overflow: hidden; box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06); transition: all 0.3s ease; position: relative; } .attraction-card:active { transform: translateY(4rpx); box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); } .attraction-header { display: flex; align-items: center; padding: 25rpx 30rpx; background-color: #f9f9f9; border-bottom: 1rpx solid #eee; } .attraction-index { width: 40rpx; height: 40rpx; border-radius: 50%; background-color: #e54d42; color: white; display: flex; align-items: center; justify-content: center; font-size: 24rpx; font-weight: bold; margin-right: 20rpx; flex-shrink: 0; } .attraction-name { flex: 1; font-size: 30rpx; font-weight: 600; color: #333; margin-right: 15rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .attraction-status { font-size: 24rpx; padding: 6rpx 16rpx; border-radius: 30rpx; background-color: #f0f0f0; color: #999; flex-shrink: 0; } .attraction-status.checked { background-color: #4CAF50; color: white; } .attraction-body { position: relative; } .attraction-image-box { height: 300rpx; position: relative; } .attraction-image { width: 100%; height: 100%; } .image-overlay { position: absolute; bottom: 0; left: 0; right: 0; height: 100rpx; background: linear-gradient(to top, rgba(0,0,0,0.4), transparent); } /* 景点操作按钮 */ .attraction-actions { display: flex; justify-content: flex-end; padding: 20rpx 30rpx 0; margin-top: -10rpx; position: relative; z-index: 2; } .checkin-btn { display: flex; align-items: center; font-size: 30rpx; padding: 10rpx 180rpx; background-color: #ffffff; color: #050505; border-radius: 20rpx; border: 1rpx solid #e4e7eb; transition: all 0.2s ease; margin-bottom: 25rpx; } .checkin-btn:active { background-color: #e0efff; transform: scale(0.98); } .action-icon { width: 28rpx; height: 28rpx; margin-right: 8rpx; } .attraction-details { padding: 25rpx 30rpx 30rpx; } .detail-row { display: flex; align-items: center; margin-bottom: 18rpx; font-size: 26rpx; color: #666; } .detail-icon { width: 28rpx; height: 28rpx; margin-right: 12rpx; opacity: 0.7; } .section { margin-top: 25rpx; padding-top: 25rpx; border-top: 1rpx solid #f5f5f5; } .section-title { display: flex; align-items: center; margin-bottom: 15rpx; font-size: 28rpx; font-weight: 600; color: #333; } .section-icon { width: 28rpx; height: 28rpx; margin-right: 12rpx; } .section-content { font-size: 26rpx; line-height: 1.6; color: #666; } /* 当日总结 */ .day-summary { margin-top: 40rpx; padding-top: 30rpx; border-top: 1rpx dashed #eee; } .summary-header { display: flex; align-items: center; margin-bottom: 20rpx; } .summary-icon { width: 32rpx; height: 32rpx; margin-right: 15rpx; } .summary-content { font-size: 26rpx; line-height: 1.6; color: #666; } /* 悬浮操作按钮 */ .floating-actions { position: fixed; bottom: 30rpx; left: 30rpx; right: 30rpx; display: flex; justify-content: space-between; z-index: 99; } .share-btn, .map-btn { height: 80rpx; border-radius: 40rpx; font-size: 28rpx; font-weight: 500; display: flex; align-items: center; justify-content: center; box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.15); transition: all 0.2s ease; } .share-btn { flex: 0.48; background: linear-gradient(135deg, #0081ff 0%, #0066cc 100%); color: white; } .map-btn { flex: 0.48; background: linear-gradient(135deg, #e54d42 0%, #c62a2a 100%); color: white; } .share-btn:active, .map-btn:active { transform: translateY(4rpx); box-shadow: 0 3rpx 10rpx rgba(0, 0, 0, 0.15); } .btn-icon { width: 32rpx; height: 32rpx; margin-right: 10rpx; } /* 打卡记录弹窗 */ .checkin-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 999; display: none; align-items: center; justify-content: center; } .checkin-modal.show { display: flex; } .modal-mask { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.6); animation: fadeIn 0.3s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .modal-content { position: relative; width: 80%; max-width: 600rpx; background-color: #fff; border-radius: 20rpx; overflow: hidden; z-index: 1000; animation: slideUp 0.3s ease; } @keyframes slideUp { from { opacity: 0; transform: translateY(50rpx) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 30rpx; border-bottom: 1rpx solid #f5f5f5; background-color: #fafafa; } .modal-title { font-size: 32rpx; font-weight: bold; color: #333; } .modal-close { padding: 10rpx; border-radius: 50%; transition: background-color 0.2s ease; } .modal-close:active { background-color: #f0f0f0; } .close-icon { width: 36rpx; height: 36rpx; } .checkin-swiper { height: 600rpx; } .checkin-item { display: flex; flex-direction: column; height: 100%; } .checkin-image-box { flex: 1; display: flex; align-items: center; justify-content: center; padding: 30rpx; background-color: #f8f9fa; } .checkin-image { width: 100%; height: 400rpx; border-radius: 12rpx; box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1); } .checkin-info { padding: 25rpx 30rpx 30rpx; text-align: center; background-color: white; } .checkin-time { display: block; font-size: 24rpx; color: #999; margin-bottom: 15rpx; } .checkin-note { font-size: 28rpx; line-height: 1.5; color: #333; word-break: break-word; } .checkin-pagination { padding: 20rpx; text-align: center; font-size: 28rpx; color: #666; border-top: 1rpx solid #f5f5f5; background-color: #fafafa; } /* 地图弹窗样式 */ .map-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 1000; display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: opacity 0.3s ease, visibility 0.3s ease; } .map-modal.show { opacity: 1; visibility: visible; } .modal-mask { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(3px); } .map-content { position: relative; width: 90%; max-width: 800px; height: 80%; background: #fff; border-radius: 16px; display: flex; flex-direction: column; overflow: hidden; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25); transform: translateY(20px); transition: transform 0.3s ease; } .map-modal.show .map-content { transform: translateY(0); } .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 18px 20px; border-bottom: 1px solid #eee; background: #f9f9f9; } .modal-title { font-size: 18px; font-weight: 600; color: #333; } .modal-close { width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background 0.2s; } .modal-close:hover { background: #f0f0f0; } .close-icon { width: 22px; height: 22px; } /* 地图容器 */ .map-container { flex: 1; position: relative; display: flex; align-items: center; justify-content: center; padding: 15px; } #planMap { width: 100%; height: 100%; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } /* 地图控制按钮 */ .map-controls { position: absolute; right: 25px; bottom: 25px; display: flex; flex-direction: column; background: rgba(255, 255, 255, 0.95); border-radius: 10px; overflow: hidden; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15); z-index: 10; } .control-btn { width: 46px; height: 46px; padding: 0; display: flex; align-items: center; justify-content: center; background: transparent; border: none; border-bottom: 1px solid #f0f0f0; cursor: pointer; transition: background 0.2s; } .control-btn:hover { background: #f8f8f8; } .control-btn:last-child { border-bottom: none; } .control-icon { width: 24px; height: 24px; } /* 地图图例 - 顶部 */ .map-legend { position: absolute; left: 25px; top: 25px; background: rgba(255, 255, 255, 0.95); border-radius: 10px; padding: 12px 15px; display: flex; flex-direction: column; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15); z-index: 10; max-width: 140px; } .legend-item { display: flex; align-items: center; margin-bottom: 10px; font-size: 12px; color: #333; } .legend-item:last-child { margin-bottom: 0; } .legend-color { width: 14px; height: 14px; border-radius: 50%; margin-right: 8px; flex-shrink: 0; } /* 地图图例 - 底部 */ .map-legend-bottom { padding: 15px 20px; display: flex; justify-content: center; border-top: 1px solid #eee; background: #f9f9f9; } .map-legend-bottom .legend-item { margin: 0 15px; display: flex; align-items: center; } .legend-icon { width: 18px; height: 18px; margin-right: 6px; } /* 自定义地图标记点样式 */ .custom-marker { position: relative; } .marker-label { position: absolute; left: 0; transform: translateX(-50%); display: flex; flex-direction: column; align-items: center; z-index: 999; } .label-bubble { background: rgba(255, 255, 255, 0.95); padding: 8rpx 16rpx; border-radius: 12rpx; box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.15); margin-bottom: 4rpx; } .label-text { font-size: 24rpx; color: #333; font-weight: bold; white-space: nowrap; } .label-arrow { width: 0; height: 0; border-left: 8rpx solid transparent; border-right: 8rpx solid transparent; border-top: 8rpx solid rgba(255, 255, 255, 0.95); } /* 地点列表样式 */ .location-list { margin-top: 20rpx; border-top: 1rpx solid #eee; padding-top: 20rpx; } .list-scroll { max-height: 300rpx; } .list-title { font-size: 32rpx; font-weight: bold; margin-bottom: 20rpx; color: #333; } .location-item { display: flex; align-items: center; padding: 20rpx; border-radius: 12rpx; background: #f9f9f9; margin-bottom: 16rpx; } .location-item:active { background: #f0f0f0; } .location-icon { width: 40rpx; height: 40rpx; margin-right: 20rpx; } .location-info { flex: 1; } .location-name { display: block; font-size: 28rpx; color: #333; margin-bottom: 6rpx; } .location-day { font-size: 24rpx; color: #888; } .arrow-icon { width: 24rpx; height: 24rpx; }