js+css实现本地音乐音频声音变速变调调节音量预览试听导出代码
代码语言:html
所属分类:多媒体
代码描述:js+css实现本地音乐音频声音变速变调调节音量预览试听导出代码
代码标签: js css 本地 音乐 音频 声音 变速 变调 调节 音量 预览 试听 导出 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TEMPO LAB — 本地音频变速变调工具</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,300..800&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<script src="https://cdn.tailwindcss.com"></script>
<style>
:root {
--bg: #0a0a0f;
--bg-card: #13131c;
--bg-elevated: #1c1c28;
--border: #2a2a3a;
--fg: #f5f5f7;
--muted: #8b8b9c;
--accent: #fb923c;
--accent-glow: rgba(251, 146, 60, 0.4);
--secondary: #22d3ee;
--secondary-glow: rgba(34, 211, 238, 0.4);
--danger: #ef4444;
--success: #10b981;
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--bg);
color: var(--fg);
font-family: 'Bricolage Grotesque', sans-serif;
min-height: 100vh;
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
}
body::before {
content: '';
position: fixed; inset: 0;
background:
radial-gradient(ellipse 80% 50% at 15% 0%, rgba(251, 146, 60, 0.18), transparent 60%),
radial-gradient(ellipse 60% 50% at 90% 100%, rgba(34, 211, 238, 0.12), transparent 60%),
radial-gradient(ellipse 40% 40% at 50% 50%, rgba(251, 146, 60, 0.04), transparent 70%);
pointer-events: none; z-index: 0;
}
body::after {
content: '';
position: fixed; inset: 0;
background-image:
linear-gradient(rgba(255,255,255,0.015) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.015) 1px, transparent 1px);
background-size: 48px 48px;
pointer-events: none; z-index: 0;
mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black 30%, transparent 80%);
}
.mono { font-family: 'JetBrains Mono', monospace; }
.display-title {
font-family: 'Bricolage Grotesque', sans-serif;
font-weight: 800;
letter-spacing: -0.04em;
line-height: 0.95;
}
input[type="range"] {
-webkit-appearance: none;
width: 100%; height: 6px;
background: var(--bg-elevated);
border-radius: 3px;
outline: none;
border: 1px solid var(--border);
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
width: 22px; height: 22px;
background: var(--accent);
border-radius: 50%;
cursor: pointer;
box-shadow: 0 0 0 4px rgba(251, 146, 60, 0.15), 0 0 24px var(--accent-glow);
transition: transform 0.15s;
border: 2px solid #1a1a24;
}
input[type="range"]::-webkit-slider-thumb:hover { transform: scale(1.15); }
input[type="range"]::-moz-range-thumb {
width: 18px; height: 18px;
background: var(--accent);
border-radius: 50%;
cursor: pointer;
border: 2px solid #1a1a24;
box-shadow: 0 0 24px var(--accent-glow);
}
.pitch-slider::-webkit-slider-thumb { background: var(--secondary); box-shadow: 0 0 0 4px rgba(34,211,238,0.15), 0 0 24px var(--secondary-glow); }
.pitch-slider::-moz-range-thumb { background: var(--secondary); box-shadow: 0 0 24px var(--secondary-glow); }
.volume-slider::-webkit-slider-thumb { background: var(--fg); box-shadow: 0 0 0 4px rgba(255,255,255,0.08); }
.volume-slider::-moz-range-thumb { background: var(--fg); }
.drop-zone { border: 2px dashed var(--border); transition: all 0.3s; }
.drop-zone.dragging {
border-color: var(--accent);
background: rgba(251, 146, 60, 0.06);
transform: scale(1.01);
}
.btn { transition: all 0.18s; position: relative; }
.btn:active { transform: scale(0.95); }
.preset-btn { transition: all 0.18s; background: transparent; color: var(--muted); }
.preset-btn:hover { color: var(--fg); border-color: var(--accent); background: rgba(251, 146, 60, 0.08); }
.preset-btn.active { background: var(--accent); color: var(--bg); border-color: var(--accent); font-weight: 600; }
.preset-btn.pitch-preset.active { background: var(--secondary); border-color: var(--secondary); }
@keyframes pulse-dot { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.5; transform: scale(1.4); } }
.live-dot { animation: pulse-dot 1.2s ease-in-out infinite; }
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: var(--bg-card); }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: var(--muted); }
.toast {
position: fixed; bottom: 28px; left: 50%;
transform: translateX(-50%) translateY(120px);
background: var(--bg-elevated);
border: 1px solid var(--border);
padding: 12px 22px;
border-radius: 12px;
opacity: 0;
transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
z-index: 100;
backdrop-filter: blur(12px);
box-shadow: 0 8px 32px rgba(0,0,0,0.4);
max-width: 90vw;
}
.toast.show { transform: translateX(-50%) translateY(0); opacity: 1; }
.digit { font-variant-numeric: tabular-nums; }
.level-bar {
background: linear-gradient(90deg, var(--success) 0%, var(--success) 50%, var(--accent) 75%, var(--danger) 100%);
}
@keyframes spin { to { transform: rotate(360deg); } }
.spin { animation: spin 1s linear infinite; }
.progress-bar { position: relative; }
.progress-bar:hover #progressHandle { opacity: 1; }
@keyframes wave-float { 0%, 100% { transform: translateY(0) scaleY(1); } 50% { transform: translateY(-8px) scaleY(1.05); } }
.hero-bar { animation: wave-float 2.5s ease-in-out infinite; transform-origin: center; }
.key-hint {
display: inline-flex; align-items: center;
padding: 2px 7px;
border: 1px solid var(--border);
border-radius: 4px;
background: var(--bg-elevated);
font-size: 10px; color: var(--muted);
}
</style>
</head>
<body>
<div class="rel.........完整代码请登录后点击上方下载按钮下载查看















网友评论0