* { box-sizing: border-box; }
body {
margin: 0;
font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
background: linear-gradient(180deg, #020617 0%, #0f172a 100%);
color: var(--text);
}
.wrap {
max-width: 1400px;
margin: 0 auto;
padding: 18px;
display: grid;
grid-template-columns: 360px 1fr;
gap: 18px;
}
.panel, .main {
background: rgba(17, 24, 39, 0.92);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 18px;
box-shadow: 0 12px 36px rgba(0,0,0,0.35);
overflow: hidden;
}
.panel {
padding: 18px;
position: sticky;
top: 18px;
height: fit-content;
}
h1 {
margin: 0 0 10px;
font-size: 24px;
line-height: 1.3;
}
h2 {
margin: 18px 0 10px;
font-size: 16px;
color: #cbd5e1;
}
.desc {
color: var(--muted);
line-height: 1.65;
font-size: 14px;
}
.group {
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.06);
border-radius: 14px;
padding: 12px;
margin-top: 12px;
}
.control {
margin: 10px 0 14px;
}
.row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
label {
font-size: 14px;
color: #e2e8f0;
display: block;
margin-bottom: 6px;
}
.value {
min-width: 110px;
text-align: right;
color: var(--accent);
font-variant-numeric: tabular-nums;
font-size: 13px;
}
input[type="range"] {
width: 100%;
accent-color: var(--accent);
}
.btns {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
margin-top: 12px;
}
button {
border: none;
border-radius: 12px;
padding: 11px 12px;
color: white;
background: linear-gradient(135deg, #0ea5e9, #6366f1);
cursor: pointer;
font-size: 14px;
font-weight: 600;
transition: transform 0.12s ease, opacity 0.12s ease;
}
button:hover { transform: translateY(-1px); }
button.secondary { background: linear-gradient(135deg, #334155, #475569); }
button.good { background: linear-gradient(135deg, #16a34a, #22c55e); }
button.warn { background: linear-gradient(135deg, #d97706, #f59e0b); }
.badge {
display: inline-flex;
align-items: center;
gap: 8px;
border-radius: 999px;
padding: 8px 12px;
margin-top: 12px;
font-size: 13px;
background: rgba(56,189,248,0.12);
color: #bae6fd;
border: 1px solid rgba(56,189,248,0.28);
}
.formula {
background: rgba(255,255,255,0.04);
border-left: 4px solid var(--accent2);
padding: 10px 12px;
margin-top: 10px;
border-radius: 10px;
font-family: "Times New Roman", serif;
line-height: 1.8;
font-size: 16px;
color: #ede9fe;
}
.stats {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
margin-top: 14px;
}
.stat {
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.06);
border-radius: 12px;
padding: 10px;
}
.stat .k {
font-size: 12px;
color: var(--muted);
margin-bottom: 6px;
}
.stat .v {
font-size: 16px;
font-variant-numeric: tabular-nums;
color: #f8fafc;
}
.main {
padding: 14px;
}
.canvasBox {
position: relative;
background: #020617;
border-radius: 16px;
overflow: hidden;
border: 1px solid rgba(255,255,255,0.08);
}
canvas {
display: block;
width: 100%;
height: 720px;
background:
linear-gradient(rgba(255,255,255,0.025) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.025) 1px, transparent 1px),
radial-gradient(circle at top, rgba(59,130,246,0.08), transparent 30%),
#020617;
background-size: 40px 40px, 40px 40px, auto, auto;
}
.legend {
display: flex;
flex-wrap: wrap;
gap: 10px;
color: var(--muted);
font-size: 13px;
padding: 10px 4px 0;
}
.dot {
width: 10px;
height: 10px;
border-radius: 999px;
display: inline-block;
margin-right: 6px;
}
.footerNote {
margin-top: 12px;
font-size: 13px;
color: #94a3b8;
line-height: 1.7;
}
.emph { color: #fef08a; }
@media (max-width: 1100px) {
.wrap { grid-template-columns: 1fr; }
.panel { position: static; }
canvas { height: 560px; }
}
本演示采用二维数值积分,模拟带电粒子在 匀强电场 与 匀强磁场(磁场垂直屏幕)组成的复合场中的运动。
电场方向固定为 竖直向上,磁场方向固定为 垂直屏幕向外。粒子从左侧水平射入。
<div class="badge">配速法核心:当 <b>v = E / B</b> 时,电场力与洛伦兹力大小相等、方向相反,粒子做匀速直线运动。</div>
<div class="formula">
洛伦兹力:F = q(E + v × B)<br/>
本模型中:F<sub>电</sub> = qE,F<sub>磁</sub> = qvB<br/>
配速条件:qE = qvB ⇒ <span class="emph">v = E / B</span>(B ≠ 0)
</div>
<h2>参数调节</h2>
<div class="group">
<div class="control">
<div class="row">
<label for="q">电荷量 q(C)</label>
<div class="value" id="qVal"></div>
</div>
<input id="q" type="range" min="-5" max="5" step="0.1" value="1.0" />
</div>
<div class="control">
<div class="row">
<label for="m">粒子质量 m(kg)</label>
<div class="value" id="mVal"></div>
</div>
<input id="m" type="range" min="0.5" max="10" step="0.1" value="2.0" />
</div>
<div class="control">
<div class="row">
<label for="E">电场强度 E(N/C)</label>
<div class="value" id="EVal"></div>
</div>
<input id="E" type="range" min="0" max="20" step="0.1" value="8.0" />
</div>
<div class="control">
<div class="row">
<label for="B">磁感应强度 B(T)</label>
<div class="value" id="BVal"></div>
</div>
<input id="B" type="range" min="0" max="5" step="0.05" value="1.6" />
</div>
<div class="control">
<div class="row">
<label for="v0">入射速度 v₀(m/s)</label>
<div class="value" id="v0Val"></div>
</div>
<input id="v0" type="range" min="0" max="20" step="0.1" value="5.0" />
</div>
<div class="control">
<div class="row">
<label for="speed">动画倍率</label>
<div class="value" id="speedVal"></div>
</div>
<input id="speed" type="range" min="0.2" max="3" step="0.1" value="1.0" />
</div>
<div class="btns">
<button id="toggleBtn">暂停</button>
<button class="secondary" id="resetBtn">重置轨迹</button>
<button class="good" id="matchBtn">一键配速</button>
<button class="warn" id="clearBtn">仅清空轨迹</button>
</div>
</div>
<h2>实时信息</h2>
<div class="stats">
<div class="stat">
<div class="k">理论配速 v = E/B</div>
<div class="v" id="vSelect">—</div>
</div>
<div class="stat">
<div class="k">当前速度大小</div>
<div class="v" id="vNow">—</div>
</div>
<div class="stat">
<div class="k">电场力大小 |q|E</div>
<div class="v" id="feNow">—</div>
</div>
<div class="stat">
<div class="k">磁场力大小 |q|vB</div>
<div class="v" id="fbNow">—</div>
</div>
<div class="stat">
<div class="k">合力竖直分量</div>
<div class="v" id="fyNow">—</div>
</div>
<div class="stat">
<div class="k">运动状态判断</div>
<div class="v" id="judge">—</div>
</div>
</div>
<div class="footerNote">
说明:<br/>
1. 本演示使用经典力学,忽略相对论效应。<br/>
2. 当 <b>B = 0</b> 时,仅受电场力作用;当 <b>E = 0</b> 时,仅受磁场力作用。<br/>
3. 在当前设定下,<b>正电荷</b>若速度偏小,电场力占优,轨迹上偏;速度偏大,磁场力占优,轨迹下偏。负电荷方向整体反转,但 <b>配速条件仍然是 v = E/B</b>。
</div>
</aside>
<main class="main">
<div class="canvasBox">
<canvas id="cv" width="1000" height="720"></canvas>
</div>
<div class="legend">
<span><span class="dot" style="background:#f43f5e"></span>带电粒子</span>
<span><span class="dot" style="background:#38bdf8"></span>轨迹</span>
<span><span class="dot" style="background:#22c55e"></span>速度矢量</span>
<span><span class="dot" style="background:#f59e0b"></span>合力矢量</span>
<span>紫色箭头:电场方向(向上)</span>
<span>圆点“·”:磁场方向(向外)</span>
</div>
</main>