/* Comic Overlay Styles */
#comic-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #000;
z-index: 10000; /* Above everything */
display: flex;
flex-direction: column;
transition: opacity 0.5s ease, visibility 0.5s ease;
}
#comic-overlay.hidden-overlay {
opacity: 0;
visibility: hidden;
pointer-events: none;
}
.comic-slider {
flex: 1;
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
-webkit-overflow-scrolling: touch;
scrollbar-width: none; /* Firefox */
}
.comic-slider::-webkit-scrollbar {
display: none; /* Chrome/Safari */
}
.comic-slide {
flex: 0 0 100%;
width: 100%;
height: 100%;
scroll-snap-align: center;
display: flex;
align-items: center;
justify-content: center;
position: relative;
background: #1a1a2e;
}
.comic-slide img {
max-width: 100%;
max-height: 100%;
object-fit: contain;
box-shadow: 0 4px 20px rgba(0,0,0,0.5);
}
.comic-controls {
position: absolute;
bottom: 30px;
left: 0;
width: 100%;
display: flex;
justify-content: center;
z-index: 10;
pointer-events: none; /* Let clicks pass through to slider if needed, but button needs events */
}
.comic-start-btn {
pointer-events: auto;
background: #ff4757;
color: white;
font-weight: bold;
padding: 12px 32px;
border-radius: 50px;
font-size: 18px;
border: 2px solid rgba(255,255,255,0.2);
box-shadow: 0 4px 15px rgba(255, 71, 87, 0.4);
transition: transform 0.2s, box-shadow 0.2s;
cursor: pointer;
animation: pulse 2s infinite;
}
.comic-start-btn:active {
transform: scale(0.95);
}
@keyframes pulse {
0% { box-shadow: 0 0 0 0 rgba(255, 71, 87, 0.4); }
70% { box-shadow: 0 0 0 15px rgba(255, 71, 87, 0); }
100% { box-shadow: 0 0 0 0 rgba(255, 71, 87, 0); }
}
.comic-pagination {
position: absolute;
bottom: 90px;
left: 0;
width: 100%;
display: flex;
justify-content: center;
gap: 8px;
z-index: 10;
}
.comic-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: rgba(255,255,255,0.3);
transition: background 0.3s;
}
.comic-dot.active {
background: #fff;
transform: scale(1.2);
}
完整代码
<div id="app" class="physics-container">
<!-- 物理画布容器 -->
<div ref="canvasContainer" class="canvas-wrapper"></div>
<!-- 控制面板 -->
<div class="control-panel" ref="panel">
<h2 class="title">
物理实验室 <span class="badge">Matter.js</span>
</h2>
<div class="formula-box">
<!-- 严格遵守 KaTeX 三段式规则:$公式$ + HTML + $公式$ -->
重力公式:$F = $ <span class="highlight">$m$</span> $g$
</div>
<div class="controls">
<div class="control-item">
<label>重力 (Gravity): {{ gravity.toFixed(1) }}</label>
<input type="range" v-model.number="gravity" min="0" max="2" step="0.1" @input="updateGravity">
</div>
<div class="control-item">
<label>弹性 (Bounciness): {{ restitution.toFixed(1) }}</label>
<input type="range" v-model.number="restitution" min="0" max="1.2" step="0.1" @input="updateRestitution">
</div>
<div class="btn-group">
<button @click="addBall" class="btn btn-primary">生成小球</button>
<button @click="clearWorld" class="btn btn-danger">清空画布</button>
</div>
</div>
<p class="tip">💡 提示:用鼠标拖拽物体试试!</p>
</div>
</div>
💡 这段代码完全由 AI 生成。
登录后可复制完整代码