HTML 乘车模拟器
以下是一个简单的乘车模拟器HTML页面,包含车辆选择、路线选择和乘车体验模拟功能:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>乘车模拟器</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: 'Arial', sans-serif;
}
body {
background-color: #f0f5ff;
display: flex;
flex-direction: column;
align-items: center;
min-height: 100vh;
padding: 20px;
}
.container {
width: 100%;
max-width: 800px;
background-color: white;
border-radius: 10px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
overflow: hidden;
padding: 20px;
}
h1 {
text-align: center;
color: #2c3e50;
margin-bottom: 20px;
}
.simulator-section {
margin-bottom: 30px;
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
background-color: #f9f9f9;
}
h2 {
color: #3498db;
margin-bottom: 15px;
border-bottom: 2px solid #3498db;
padding-bottom: 5px;
}
.vehicle-options, .route-options {
display: flex;
flex-wrap: wrap;
gap: 15px;
margin-bottom: 20px;
}
.vehicle-option, .route-option {
flex: 1;
min-width: 150px;
padding: 15px;
border: 2px solid #ddd;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s;
text-align: center;
}
.vehicle-option:hover, .route-option:hover {
border-color: #3498db;
background-color: #eaf2f8;
}
.vehicle-option.selected, .route-option.selected {
border-color: #3498db;
background-color: #d4e6f1;
font-weight: bold;
}
.vehicle-option img, .route-option img {
width: 100%;
height: 100px;
object-fit: contain;
margin-bottom: 10px;
}
.simulation-controls {
display: flex;
justify-content: center;
gap: 15px;
margin-top: 20px;
}
button {
padding: 12px 25px;
background-color: #3498db;
color: white;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s;
}
button:hover {
background-color: #2980b9;
}
button:disabled {
background-color: #95a5a6;
cursor: not-allowed;
}
.simulation-display {
margin-top: 30px;
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
background-color: #f9f9f9;
min-height: 200px;
position: relative;
overflow: hidden;
}
.vehicle-animation {
position: absolute;
width: 100px;
height: 60px;
bottom: 20px;
left: -100px;
transition: left 10s linear;
}
.progress-container {
width: 100%;
height: 20px;
background-color: #ecf0f1;
border-radius: 10px;
margin-top: 20px;
overflow: hidden;
}
.progress-bar {
height: 100%;
width: 0%;
background-color: #2ecc71;
transition: width 0.5s;
}
.status-message {
margin-top: 20px;
padding: 10px;
border-radius: 5px;
text-align: center;
font-weight: bold;
}
.success {
background-color: #d5f5e3;
color: #27ae60;
}
.error {
background-color: #fadbd8;
color: #e74c3c;
}
.scenery {
position: absolute;
width: 100%;
height: 100px;
bottom: 0;
left: 0;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100" viewBox="0 0 800 100"><path d="M0,70 Q100,50 200,70 Q300,90 400,70 Q500,50 600,70 Q700,90 800,70 L800,100 L0,100 Z" fill="%232ecc71"/></svg>');
background-repeat: repeat-x;
z-index: 1;
}
.sky {
position: absolute;
width: 100%;
height: 100px;
top: 0;
left: 0;
background: linear-gradient(to bottom, #87CEEB, #E0F7FA);
z-index: 0;
}
.cloud {
position: absolute;
background-color: white;
border-radius: 50%;
opacity: 0.8;
}
</style>
</head>
<body>
<div class="container">
<h1>乘车模拟器</h1>
<div class="simulator-section">
<h2>选择交通工具</h2>
<div class="vehicle-options">
<div class="vehicle-option" onclick="selectVehicle('bus')" data-vehicle="bus">
<img src="https://cdn-icons-png.flaticon.com/512/3079/3079017.png" alt="公交车">
<p>公交车</p>
</div>
<div class="vehicle-option" onclick="selectVehicle('taxi')" data-vehicle="taxi">
<img src="https://cdn-icons-png.flaticon.com/512/3079/3079032.png" alt="出租车">
<p>出租车</p>
</div>
<div class="vehicle-option" onclick="selectVehicle('subway')" data-vehicle="subway">
<img src="https://cdn-icons-png.flaticon.com/5123079/3079026.png" alt="地铁">
<p>地铁</p>
</div>
<div class="vehicle-option" onclick="selectVehicle('bike')" data-vehicle="bike">
<img src="https://cdn-icons-png.flaticon.com/5123079/3079008.png" alt="自行车">
<p>自行车</p>
</div>
</div>
</div>
<div class="simulator-section">
<h2>选择路线</h2>
<div class="route-options">
<div class="route-option" onclick="selectRoute('downtown')" data-route="downtown">
<img src="https://cdn-icons-png.flaticon.com/512/2906/2906274.png" alt="市中心">
<p>市中心环线</p>
<p>距离: 10公里</p>
</div>
<div class="route-option" onclick="selectRoute('river')" data-route="river">
<img src="https://cdn-icons-png.flaticon.com/512/2906/2906286.png" alt="河滨">
<p>河滨路线</p>
<p>距离: 15公里</p>
</div>
<div class="route-option" onclick="selectRoute('mountain')" data-route="mountain">
<img src="https://cdn-icons-png.flaticon.com/512/2906/2906299.png" alt="山区">
<p>山区路线</p>
<p>距离: 25公里</p>
</div>
</div>
</div>
<div class="simulation-controls">
<button id="start-btn" onclick="startSimulation()" disabled>开始乘车</button>
<button id="stop-btn" onclick="stopSimulation()" disabled>停止</button>
<button id="reset-btn" onclick="resetSimulation()">重置</button>
</div>
<div class="progress-container">
<div class="progress-bar" id="progress-bar"></div>
</div>
<div class="status-message" id="status-message"></div>
<div class="simulation-display" id="simulation-display">
<div class="sky" id="sky"></div>
<div class="scenery"></div>
<div class="vehicle-animation" id="vehicle-animation"></div>
</div>
</div>
<script>
let selectedVehicle = null;
let selectedRoute = null;
let simulationInterval = null;
let progress = 0;
let isSimulating = false;
// 生成随机云朵
function generateClouds() {
const sky = document.getElementById('sky');
sky.innerHTML = '';
for (let i = 0; i < 5; i++) {
const cloud = document.createElement('div');
cloud.className = 'cloud';
const size = Math.random() * 30 + 20;
const left = Math.random() * 100;
const top = Math.random() * 50;
cloud.style.width = `${size}px`;
cloud.style.height = `${size}px`;
cloud.style.left = `${left}%`;
cloud.style.top = `${top}px`;
sky.appendChild(cloud);
}
}
// 选择交通工具
function selectVehicle(vehicle) {
selectedVehicle = vehicle;
document.querySelectorAll('.vehicle-option').forEach(opt => {
opt.classList.remove('selected');
});
document.querySelector(`.vehicle-option[data-vehicle="${vehicle}"]`).classList.add('selected');
updateStartButton();
updateVehicleImage();
}
// 选择路线
function selectRoute(route) {
selectedRoute = route;
document.querySelectorAll('.route-option').forEach(opt => {
opt.classList.remove('selected');
});
document.querySelector(`.route-option[data-route="${route}"]`).classList.add('selected');
updateStartButton();
}
// 更新开始按钮状态
function updateStartButton() {
const startBtn = document.getElementById('start-btn');
startBtn.disabled = !(selectedVehicle && selectedRoute);
}
// 更新车辆图像
function updateVehicleImage() {
const vehicleAnimation = document.getElementById('vehicle-animation');
let vehicleImg = '';
switch(selectedVehicle) {
case 'bus':
vehicleImg = 'https://cdn-icons-png.flaticon.com/512/3079/3079017.png';
break;
case 'taxi':
vehicleImg = 'https://cdn-icons-png.flaticon.com/512/3079/3079032.png';
break;
case 'subway':
vehicleImg = 'https://cdn-icons-png.flaticon.com/512/3079/3079026.png';
break;
case 'bike':
vehicleImg = 'https://cdn-icons-png.flaticon.com/512/3079/3079008.png';
break;
}
vehicleAnimation.style.backgroundImage = `url('${vehicleImg}')`;
vehicleAnimation.style.backgroundSize = 'contain';
vehicleAnimation.style.backgroundRepeat = 'no-repeat';
vehicleAnimation.style.backgroundPosition = 'center';
}
// 开始模拟
function startSimulation() {
if (isSimulating) return;
isSimulating = true;
progress = 0;
document.getElementById('start-btn').disabled = true;
document.getElementById('stop-btn').disabled = false;
document.getElementById('reset-btn').disabled = true;
const statusMessage = document.getElementById('status-message');
statusMessage.className = 'status-message';
statusMessage.textContent = `正在乘坐${getVehicleName()}行驶在${getRouteName()}...`;
// 设置车辆动画
const vehicleAnimation = document.getElementById('vehicle-animation');
vehicleAnimation.style.left = '-100px';
// 计算行驶时间(基于路线距离)
const duration = getRouteDuration() * 1000;
// 开始进度条动画
simulationInterval = setInterval(() => {
progress += 1;
document.getElementById('progress-bar').style.width = `${progress}%`;
if (progress >= 100) {
completeSimulation();
}
}, duration / 100);
// 开始车辆移动动画
setTimeout(() => {
vehicleAnimation.style.left = 'calc(100% + 100px)';
vehicleAnimation.style.transitionDuration = `${duration/1000}s`;
}, 100);
// 生成云朵
generateClouds();
}
// 停止模拟
function stopSimulation() {
if (!isSimulating) return;
clearInterval(simulationInterval);
isSimulating = false;
document.getElementById('start-btn').disabled = false;
document.getElementById('stop-btn').disabled = true;
document.getElementById('reset-btn').disabled = false;
const statusMessage = document.getElementById('status-message');
statusMessage.className = 'status-message error';
statusMessage.textContent = '乘车已中断!';
// 停止车辆动画
const vehicleAnimation = document.getElementById('vehicle-animation');
vehicleAnimation.style.transitionDuration = '0s';
}
// 完成模拟
function completeSimulation() {
clearInterval(simulationInterval);
isSimulating = false;
document.getElementById('start-btn').disabled = true;
document.getElementById('stop-btn').disabled = true;
document.getElementById('reset-btn').disabled = false;
const statusMessage = document.getElementById('status-message');
statusMessage.className = 'status-message success';
statusMessage.textContent = `乘车完成!您已乘坐${getVehicleName()}成功到达${getRouteName()}终点!`;
}
// 重置模拟
function resetSimulation() {
clearInterval(simulationInterval);
isSimulating = false;
progress = 0;
document.getElementById('progress-bar').style.width = '0%';
document.getElementById('start-btn').disabled = !(selectedVehicle && selectedRoute);
document.getElementById('stop-btn').disabled = true;
document.getElementById('reset-btn').disabled = false;
document.getElementById('status-message').className = 'status-message';
document.getElementById('status-message').textContent = '';
const vehicleAnimation = document.getElementById('vehicle-animation');
vehicleAnimation.style.transitionDuration = '0s';
vehicleAnimation.style.left = '-100px';
}
// 获取交通工具名称
function getVehicleName() {
switch(selectedVehicle) {
case 'bus': return '公交车';
case 'taxi': return '出租车';
case 'subway': return '地铁';
case 'bike': return '自行车';
default: return '';
}
}
// 获取路线名称
function getRouteName() {
switch(selectedRoute) {
case 'downtown': return '市中心环线';
case 'river': return '河滨路线';
case 'mountain': return '山区路线';
default: return '';
}
}
// 获取路线行驶时间(秒)
function getRouteDuration() {
switch(selectedRoute) {
case 'downtown': return 30;
case 'river': return 45;
case 'mountain': return 60;
default: return 30;
}
}
// 初始化
generateClouds();
</script>
</body>
</html>
功能说明
-
交通工具选择:
-
公交车、出租车、地铁、自行车四种选择
-
点击选择后会有视觉反馈
-
-
路线选择:
-
市中心环线(10公里)
-
河滨路线(15公里)
-
山区路线(25公里)
-
每条路线有不同的图标和距离显示
-
-
模拟控制:
-
开始乘车:开始模拟乘车过程
-
停止:中断乘车过程
-
重置:重置模拟器状态
-
-
模拟显示:
-
进度条显示乘车进度
-
状态消息显示当前状态和完成信息
-
动画区域显示车辆移动和简单场景
-
-
视觉效果:
-
车辆从左向右移动的动画
-
天空和云朵背景
-
绿色地面场景
-
不同交通工具的图标显示
-
使用说明
-
首先选择一种交通工具
-
然后选择一条路线
-
点击"开始乘车"按钮开始模拟
-
可以随时点击"停止"中断模拟
-
模拟完成后或中断后可以点击"重置"重新开始
扩展建议
-
可以添加更多交通工具和路线选项
-
可以增加更复杂的场景和天气效果
-
可以添加乘车费用计算功能
-
可以增加音效增强体验
-
可以添加乘客视角的模拟
366

被折叠的 条评论
为什么被折叠?



