<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="600" height="450" src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430"></iframe> 添加动态宽度?以适应不同分辨率的屏幕。 给 iframe 添加动态宽度有多种方法,以下是完整的解决方案:
<style>
.responsive-iframe {
width: 100%;
height: 450px; /* 固定高度或使用aspect-ratio */
border: none;
}
</style>
<iframe
class="responsive-iframe"
frameborder="no"
border="0"
marginwidth="0"
marginheight="0"
src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430">
</iframe>
<style>
.music-player {
width: 90%; /* 相对宽度 */
max-width: 800px; /* 最大宽度限制 */
height: 450px;
margin: 0 auto; /* 居中 */
display: block;
}
/* 小屏幕调整 */
@media (max-width: 768px) {
.music-player {
width: 95%;
height: 400px;
}
}
@media (max-width: 480px) {
.music-player {
height: 350px;
}
}
</style>
<iframe
class="music-player"
frameborder="no"
src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430">
</iframe>
<style>
.aspect-iframe {
width: 100%;
aspect-ratio: 4 / 3; /* 宽高比 4:3 */
max-width: 800px;
border: none;
display: block;
margin: 0 auto;
}
</style>
<div style="width: 90%; max-width: 800px; margin: 0 auto;">
<iframe
class="aspect-iframe"
frameborder="no"
src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0">
</iframe>
</div>
<style>
.viewport-iframe {
width: 90vw; /* 视口宽度的90% */
max-width: 1000px;
min-width: 300px;
height: calc(90vw * 0.75); /* 高度为宽度的75% */
max-height: 750px;
min-height: 225px;
}
</style>
<iframe
class="viewport-iframe"
frameborder="no"
src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0">
</iframe>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网易云音乐播放器 - 响应式</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
line-height: 1.6;
padding: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
.player-wrapper {
background: rgba(255, 255, 255, 0.95);
border-radius: 15px;
padding: 30px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
margin-bottom: 30px;
}
.player-header {
text-align: center;
margin-bottom: 20px;
}
.player-header h1 {
color: #333;
font-size: 24px;
margin-bottom: 10px;
}
.player-header p {
color: #666;
font-size: 14px;
}
/* 响应式iframe容器 */
.iframe-container {
position: relative;
width: 100%;
padding-bottom: 75%; /* 4:3 宽高比 */
height: 0;
overflow: hidden;
border-radius: 10px;
background: #f8f9fa;
}
.iframe-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: none;
}
/* 不同屏幕尺寸调整 */
@media (max-width: 1200px) {
.container {
padding: 0 20px;
}
}
@media (max-width: 992px) {
.iframe-container {
padding-bottom: 80%; /* 调整宽高比 */
}
.player-wrapper {
padding: 20px;
}
}
@media (max-width: 768px) {
body {
padding: 10px;
}
.iframe-container {
padding-bottom: 90%; /* 更接近方形 */
}
.player-header h1 {
font-size: 20px;
}
}
@media (max-width: 480px) {
.iframe-container {
padding-bottom: 100%; /* 1:1 正方形 */
}
.player-wrapper {
padding: 15px;
}
.player-header h1 {
font-size: 18px;
}
}
/* 调试信息面板 */
.debug-panel {
background: rgba(0, 0, 0, 0.8);
color: white;
padding: 15px;
border-radius: 10px;
margin-top: 20px;
font-family: monospace;
font-size: 14px;
}
.size-indicator {
display: inline-block;
padding: 5px 10px;
background: #4CAF50;
color: white;
border-radius: 5px;
margin-left: 10px;
}
/* 控制按钮 */
.controls {
display: flex;
gap: 10px;
margin-top: 20px;
justify-content: center;
flex-wrap: wrap;
}
.control-btn {
padding: 10px 20px;
background: #667eea;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
transition: background 0.3s;
}
.control-btn:hover {
background: #5a67d8;
}
</style>
</head>
<body>
<div class="container">
<div class="player-wrapper">
<div class="player-header">
<h1>🎵 网易云音乐播放器</h1>
<p>自适应各种屏幕尺寸</p>
<div id="sizeInfo">
当前尺寸: <span class="size-indicator" id="currentSize">--px × --px</span>
</div>
</div>
<!-- 响应式iframe容器 -->
<div class="iframe-container">
<iframe
frameborder="no"
border="0"
marginwidth="0"
marginheight="0"
id="musicPlayer"
allow="autoplay"
title="网易云音乐播放器"
src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430">
</iframe>
</div>
<div class="controls">
<button class="control-btn" onclick="changeSize('small')">小尺寸</button>
<button class="control-btn" onclick="changeSize('medium')">中尺寸</button>
<button class="control-btn" onclick="changeSize('large')">大尺寸</button>
<button class="control-btn" onclick="changeSize('full')">全宽度</button>
<button class="control-btn" onclick="toggleRatio()">切换宽高比</button>
</div>
</div>
<div class="debug-panel">
<h3>📱 设备检测</h3>
<div id="deviceInfo">正在检测设备...</div>
<div>视口宽度: <span id="viewportWidth">--px</span></div>
<div>iframe实际尺寸: <span id="iframeSize">--px × --px</span></div>
<div>推荐尺寸: <span id="recommendedSize">--px × --px</span></div>
</div>
</div>
<script>
// 更新尺寸信息
function updateSizeInfo() {
const iframe = document.getElementById('musicPlayer');
const container = document.querySelector('.iframe-container');
// 获取iframe实际尺寸
const rect = iframe.getBoundingClientRect();
document.getElementById('iframeSize').textContent =
`${Math.round(rect.width)}px × ${Math.round(rect.height)}px`;
// 获取容器尺寸
const containerRect = container.getBoundingClientRect();
document.getElementById('currentSize').textContent =
`${Math.round(containerRect.width)}px × ${Math.round(containerRect.height)}px`;
// 获取视口宽度
document.getElementById('viewportWidth').textContent =
`${window.innerWidth}px`;
// 检测设备类型
detectDevice();
// 推荐尺寸
const recommended = getRecommendedSize();
document.getElementById('recommendedSize').textContent =
`${recommended.width}px × ${recommended.height}px`;
}
// 检测设备类型
function detectDevice() {
const width = window.innerWidth;
let deviceType = '未知设备';
if (width >= 1200) deviceType = '💻 桌面电脑 (Desktop)';
else if (width >= 992) deviceType = '💻 笔记本电脑 (Laptop)';
else if (width >= 768) deviceType = '📱 平板电脑 (Tablet)';
else deviceType = '📱 手机 (Mobile)';
document.getElementById('deviceInfo').textContent = deviceType;
}
// 获取推荐尺寸
function getRecommendedSize() {
const width = window.innerWidth;
let recWidth, recHeight;
if (width >= 1200) {
recWidth = 800;
recHeight = 600;
} else if (width >= 768) {
recWidth = width * 0.8;
recHeight = recWidth * 0.75;
} else {
recWidth = width * 0.95;
recHeight = recWidth * 0.9;
}
return {
width: Math.round(recWidth),
height: Math.round(recHeight)
};
}
// 动态改变尺寸
function changeSize(size) {
const container = document.querySelector('.iframe-container');
switch(size) {
case 'small':
container.style.maxWidth = '400px';
container.style.paddingBottom = '75%';
break;
case 'medium':
container.style.maxWidth = '600px';
container.style.paddingBottom = '75%';
break;
case 'large':
container.style.maxWidth = '800px';
container.style.paddingBottom = '75%';
break;
case 'full':
container.style.maxWidth = 'none';
container.style.paddingBottom = '75%';
break;
}
updateSizeInfo();
}
// 切换宽高比
function toggleRatio() {
const container = document.querySelector('.iframe-container');
const currentRatio = container.style.paddingBottom || '75%';
const ratios = {
'75%': '56.25%', // 16:9
'56.25%': '100%', // 1:1
'100%': '75%' // 4:3
};
container.style.paddingBottom = ratios[currentRatio] || '75%';
updateSizeInfo();
}
// 监听窗口大小变化
window.addEventListener('resize', updateSizeInfo);
window.addEventListener('load', updateSizeInfo);
// 初始化
updateSizeInfo();
// 添加iframe加载事件
document.getElementById('musicPlayer').addEventListener('load', function() {
console.log('音乐播放器加载完成');
// 尝试传递窗口大小信息给iframe(如果支持的话)
try {
this.contentWindow.postMessage({
type: 'resize',
width: this.offsetWidth,
height: this.offsetHeight
}, '*');
} catch (e) {
// 跨域限制,忽略错误
}
});
// 接收来自iframe的消息(如果网易云音乐支持)
window.addEventListener('message', function(event) {
if (event.data && event.data.type === 'ready') {
console.log('播放器已就绪');
}
});
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
.music-iframe {
border: none;
border-radius: 10px;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
}
</style>
</head>
<body>
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-12 col-md-10 col-lg-8">
<div class="ratio ratio-16x9"> <!-- Bootstrap 5 宽高比类 -->
<iframe
class="music-iframe"
frameborder="no"
src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430">
</iframe>
</div>
</div>
</div>
</div>
</body>
</html>
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
padding: 20px;
}
.grid-item {
position: relative;
padding-bottom: 75%; /* 4:3 比例 */
}
.grid-item iframe {
position: absolute;
width: 100%;
height: 100%;
}
</style>
<div class="grid-container">
<div class="grid-item">
<iframe ...></iframe>
</div>
</div>
// 动态调整iframe大小
function adjustIframeSize() {
const iframes = document.querySelectorAll('iframe[data-responsive="true"]');
iframes.forEach(iframe => {
const container = iframe.parentElement;
const containerWidth = container.clientWidth;
// 根据容器宽度计算高度
const aspectRatio = iframe.dataset.ratio || '0.75'; // 默认4:3
const height = containerWidth * parseFloat(aspectRatio);
iframe.style.width = '100%';
iframe.style.height = `${height}px`;
});
}
// 监听窗口变化
window.addEventListener('resize', adjustIframeSize);
window.addEventListener('load', adjustIframeSize);
最佳实践方案:
<style>
.responsive-container {
position: relative;
width: 100%;
padding-bottom: 75%; /* 4:3比例 */
height: 0;
}
.responsive-container iframe {
position: absolute;
width: 100%;
height: 100%;
border: none;
}
</style>
<div class="responsive-container">
<iframe src="..."></iframe>
</div>
<div class="ratio ratio-16x9">
<iframe src="..."></iframe>
</div>
<iframe style="width: 90vw; height: calc(90vw * 0.75); max-width: 800px;"></iframe>
关键点:
width: 100% 让宽度自适应padding-bottom 百分比技巧保持宽高比max-width 防止在大屏幕上过大这样就能确保播放器在各种屏幕尺寸上都能正常显示!
<div class="col-6 ratio ratio-16x9"><iframe src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430"></iframe></div>
<div class="col-6 ratio ratio-16x9"><iframe src="//music.163.com/outchain/player?type=0&id=12706712383&auto=0&height=430"></iframe></div>
这是一个很好的开始!您使用了Bootstrap的栅格系统和宽高比类。我来帮您优化这个布局:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网易云音乐双播放器</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.container-custom {
max-width: 1200px;
}
.player-card {
background: rgba(255, 255, 255, 0.95);
border-radius: 15px;
padding: 20px;
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
height: 100%;
transition: transform 0.3s ease;
}
.player-card:hover {
transform: translateY(-5px);
}
.player-title {
font-size: 1.2rem;
color: #333;
margin-bottom: 15px;
text-align: center;
font-weight: 600;
}
/* 自定义iframe样式 */
.music-iframe {
border: none;
border-radius: 10px;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
}
/* 响应式调整 */
@media (max-width: 768px) {
.col-6 {
width: 100% !important;
margin-bottom: 20px;
}
.player-card {
padding: 15px;
}
}
</style>
</head>
<body>
<div class="container container-custom">
<div class="text-center mb-4">
<h1 class="text-white">🎵 网易云音乐双播放器</h1>
<p class="text-white-50">自适应布局,支持多个播放器并列</p>
</div>
<div class="row g-4">
<!-- 播放器 1 -->
<div class="col-12 col-lg-6">
<div class="player-card">
<div class="player-title">播放器 #1</div>
<div class="ratio ratio-16x9">
<iframe
class="music-iframe"
src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430"
title="网易云音乐播放器 1"
allow="autoplay; encrypted-media">
</iframe>
</div>
</div>
</div>
<!-- 播放器 2 -->
<div class="col-12 col-lg-6">
<div class="player-card">
<div class="player-title">播放器 #2</div>
<div class="ratio ratio-16x9">
<iframe
class="music-iframe"
src="//music.163.com/outchain/player?type=0&id=12706712383&auto=0&height=430"
title="网易云音乐播放器 2"
allow="autoplay; encrypted-media">
</iframe>
</div>
</div>
</div>
</div>
<!-- 控制按钮 -->
<div class="row mt-4">
<div class="col-12">
<div class="player-card">
<h5 class="player-title">布局控制</h5>
<div class="d-flex justify-content-center flex-wrap gap-2">
<button class="btn btn-primary" onclick="changeLayout(1)">单列布局</button>
<button class="btn btn-primary" onclick="changeLayout(2)">双列布局</button>
<button class="btn btn-primary" onclick="changeRatio('ratio-16x9')">16:9 比例</button>
<button class="btn btn-primary" onclick="changeRatio('ratio-4x3')">4:3 比例</button>
<button class="btn btn-primary" onclick="toggleAutoPlay()">切换自动播放</button>
</div>
</div>
</div>
</div>
</div>
<script>
// 切换布局
function changeLayout(columns) {
const players = document.querySelectorAll('.col-12');
players.forEach(player => {
player.classList.remove('col-lg-6', 'col-lg-12');
if (columns === 1) {
player.classList.add('col-lg-12');
} else {
player.classList.add('col-lg-6');
}
});
// 更新按钮状态
document.querySelectorAll('.btn-primary').forEach(btn => {
btn.classList.remove('active');
});
event.target.classList.add('active');
}
// 切换宽高比
function changeRatio(ratioClass) {
const ratios = document.querySelectorAll('.ratio');
const oldClass = ratioClass === 'ratio-16x9' ? 'ratio-4x3' : 'ratio-16x9';
ratios.forEach(ratio => {
ratio.classList.remove('ratio-16x9', 'ratio-4x3');
ratio.classList.add(ratioClass);
});
event.target.classList.add('active');
}
// 切换自动播放
function toggleAutoPlay() {
const iframes = document.querySelectorAll('iframe');
const btn = event.target;
iframes.forEach(iframe => {
const src = iframe.src;
if (src.includes('auto=0')) {
iframe.src = src.replace('auto=0', 'auto=1');
btn.textContent = '关闭自动播放';
} else {
iframe.src = src.replace('auto=1', 'auto=0');
btn.textContent = '开启自动播放';
}
});
}
// 添加iframe加载状态指示
const iframes = document.querySelectorAll('iframe');
iframes.forEach((iframe, index) => {
iframe.addEventListener('load', function() {
console.log(`播放器 ${index + 1} 加载完成`);
const parentCard = this.closest('.player-card');
parentCard.style.borderLeft = '4px solid #28a745';
});
iframe.addEventListener('error', function() {
console.error(`播放器 ${index + 1} 加载失败`);
const parentCard = this.closest('.player-card');
parentCard.style.borderLeft = '4px solid #dc3545';
});
});
// 监听窗口大小变化,动态调整
window.addEventListener('resize', function() {
const width = window.innerWidth;
const players = document.querySelectorAll('.col-12');
if (width < 768) {
players.forEach(player => {
player.classList.remove('col-lg-6', 'col-lg-12');
});
}
});
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>同步音乐播放器</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
:root {
--primary-color: #e60026;
--secondary-color: #333;
}
body {
background: linear-gradient(135deg, #1a2a6c, #b21f1f, #fdbb2d);
min-height: 100vh;
padding: 20px;
font-family: 'Segoe UI', system-ui, sans-serif;
}
.header {
text-align: center;
margin-bottom: 30px;
color: white;
}
.header h1 {
font-size: 2.5rem;
margin-bottom: 10px;
text-shadow: 0 2px 4px rgba(0,0,0,0.3);
}
.header .badge {
font-size: 1rem;
padding: 8px 15px;
background: var(--primary-color);
}
.player-wrapper {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border-radius: 20px;
padding: 25px;
margin-bottom: 20px;
border: 1px solid rgba(255, 255, 255, 0.2);
transition: all 0.3s ease;
height: 100%;
}
.player-wrapper:hover {
background: rgba(255, 255, 255, 0.15);
transform: translateY(-3px);
box-shadow: 0 10px 25px rgba(0,0,0,0.2);
}
.player-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding-bottom: 10px;
border-bottom: 2px solid rgba(255,255,255,0.1);
}
.player-title {
color: white;
font-size: 1.3rem;
font-weight: 600;
margin: 0;
}
.player-status {
padding: 5px 10px;
background: rgba(255,255,255,0.2);
border-radius: 20px;
color: white;
font-size: 0.8rem;
}
.player-status.playing {
background: #28a745;
}
.player-status.paused {
background: #ffc107;
}
.ratio {
border-radius: 12px;
overflow: hidden;
box-shadow: 0 6px 20px rgba(0,0,0,0.2);
}
.music-iframe {
border: none;
width: 100%;
height: 100%;
}
.controls-bar {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border-radius: 15px;
padding: 20px;
margin-top: 30px;
border: 1px solid rgba(255, 255, 255, 0.2);
}
.control-btn {
background: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.3);
color: white;
padding: 10px 20px;
border-radius: 8px;
margin: 5px;
transition: all 0.3s;
}
.control-btn:hover {
background: rgba(255, 255, 255, 0.3);
transform: scale(1.05);
}
.control-btn.active {
background: var(--primary-color);
border-color: var(--primary-color);
}
.volume-slider {
width: 150px;
margin: 0 15px;
}
.player-info {
color: rgba(255, 255, 255, 0.8);
font-size: 0.9rem;
margin-top: 10px;
padding: 10px;
background: rgba(0,0,0,0.2);
border-radius: 8px;
}
@media (max-width: 768px) {
.player-header {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
.player-title {
font-size: 1.1rem;
}
.control-btn {
padding: 8px 15px;
font-size: 0.9rem;
}
}
</style>
</head>
<body>
<div class="container">
<!-- 头部 -->
<div class="header">
<h1>🎶 同步音乐播放器</h1>
<span class="badge">双播放器同步控制</span>
<p class="mt-3">两个播放器同步播放控制,支持音量调节和布局切换</p>
</div>
<!-- 播放器区域 -->
<div class="row g-4">
<!-- 播放器 1 -->
<div class="col-12 col-lg-6">
<div class="player-wrapper" id="player1">
<div class="player-header">
<h3 class="player-title">🎧 播放列表 #1</h3>
<span class="player-status" id="status1">准备中</span>
</div>
<div class="ratio ratio-16x9">
<iframe
class="music-iframe"
id="iframe1"
src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430"
title="网易云音乐播放器 1"
allow="autoplay; encrypted-media"
data-player="1">
</iframe>
</div>
<div class="player-info">
<div>ID: 12607812115 | 歌单: 精选推荐</div>
<div class="mt-1">状态: <span id="info1">等待加载...</span></div>
</div>
</div>
</div>
<!-- 播放器 2 -->
<div class="col-12 col-lg-6">
<div class="player-wrapper" id="player2">
<div class="player-header">
<h3 class="player-title">🎵 播放列表 #2</h3>
<span class="player-status" id="status2">准备中</span>
</div>
<div class="ratio ratio-16x9">
<iframe
class="music-iframe"
id="iframe2"
src="//music.163.com/outchain/player?type=0&id=12706712383&auto=0&height=430"
title="网易云音乐播放器 2"
allow="autoplay; encrypted-media"
data-player="2">
</iframe>
</div>
<div class="player-info">
<div>ID: 12706712383 | 歌单: 热门歌曲</div>
<div class="mt-1">状态: <span id="info2">等待加载...</span></div>
</div>
</div>
</div>
</div>
<!-- 控制面板 -->
<div class="controls-bar">
<div class="row align-items-center">
<div class="col-12 col-md-6 mb-3 mb-md-0">
<h5 class="text-white mb-3">🎛️ 播放控制</h5>
<div class="d-flex flex-wrap">
<button class="control-btn" onclick="controlAll('play')">▶ 全部播放</button>
<button class="control-btn" onclick="controlAll('pause')">⏸ 全部暂停</button>
<button class="control-btn" onclick="controlAll('next')">⏭ 下一首</button>
<button class="control-btn" onclick="toggleMuteAll()">🔇 静音切换</button>
</div>
</div>
<div class="col-12 col-md-6">
<h5 class="text-white mb-3">⚙️ 布局设置</h5>
<div class="d-flex flex-wrap align-items-center">
<button class="control-btn active" onclick="setLayout('grid')">网格布局</button>
<button class="control-btn" onclick="setLayout('stack')">堆叠布局</button>
<button class="control-btn" onclick="toggleFullscreen()">全屏模式</button>
<div class="d-flex align-items-center ms-3">
<span class="text-white me-2">音量:</span>
<input type="range" class="form-range volume-slider" min="0" max="100" value="80"
oninput="setVolumeAll(this.value)">
</div>
</div>
</div>
</div>
<!-- 同步状态 -->
<div class="row mt-3">
<div class="col-12">
<div class="player-info">
<div class="d-flex justify-content-between align-items-center">
<span>🎚️ 同步状态: <span id="syncStatus">已就绪</span></span>
<span>🔊 主音量: <span id="currentVolume">80%</span></span>
<span>📱 布局: <span id="layoutType">网格布局</span></span>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
// 播放器状态管理
const playerState = {
player1: { playing: false, muted: false, volume: 80 },
player2: { playing: false, muted: false, volume: 80 },
layout: 'grid',
fullscreen: false
};
// 更新播放器状态显示
function updatePlayerStatus(playerId, status) {
const statusElement = document.getElementById(`status${playerId}`);
const infoElement = document.getElementById(`info${playerId}`);
playerState[`player${playerId}`].playing = status === 'playing';
statusElement.textContent = status === 'playing' ? '播放中' :
status === 'paused' ? '已暂停' : '准备中';
statusElement.className = `player-status ${status}`;
infoElement.textContent = `${status === 'playing' ? '▶' : '⏸'} ${status}`;
}
// 控制所有播放器
function controlAll(action) {
const iframes = document.querySelectorAll('iframe');
// 由于跨域限制,无法直接控制网易云播放器
// 这里只是模拟状态更新
iframes.forEach((iframe, index) => {
const playerId = index + 1;
switch(action) {
case 'play':
updatePlayerStatus(playerId, 'playing');
break;
case 'pause':
updatePlayerStatus(playerId, 'paused');
break;
case 'next':
updatePlayerStatus(playerId, 'playing');
// 模拟切换歌曲
setTimeout(() => {
document.getElementById(`info${playerId}`).textContent =
'正在播放下一首...';
}, 500);
break;
}
});
updateSyncStatus(`${action} 命令已发送`);
}
// 切换静音
function toggleMuteAll() {
const iframes = document.querySelectorAll('iframe');
iframes.forEach((iframe, index) => {
const playerId = index + 1;
playerState[`player${playerId}`].muted = !playerState[`player${playerId}`].muted;
const infoElement = document.getElementById(`info${playerId}`);
infoElement.textContent = playerState[`player${playerId}`].muted ?
'🔇 已静音' : '🔊 播放中';
});
updateSyncStatus('静音状态已切换');
}
// 设置音量
function setVolumeAll(volume) {
document.getElementById('currentVolume').textContent = `${volume}%`;
// 更新所有播放器的音量状态
Object.keys(playerState).forEach(key => {
if (key.startsWith('player')) {
playerState[key].volume = volume;
}
});
updateSyncStatus(`音量已设置为 ${volume}%`);
}
// 设置布局
function setLayout(type) {
playerState.layout = type;
document.getElementById('layoutType').textContent =
type === 'grid' ? '网格布局' : '堆叠布局';
const players = document.querySelectorAll('.col-lg-6');
const controlButtons = document.querySelectorAll('.control-btn');
// 更新布局
if (type === 'grid') {
players.forEach(player => {
player.classList.remove('col-lg-12');
player.classList.add('col-lg-6');
});
} else {
players.forEach(player => {
player.classList.remove('col-lg-6');
player.classList.add('col-lg-12');
});
}
// 更新按钮状态
controlButtons.forEach(btn => {
btn.classList.remove('active');
});
event.target.classList.add('active');
updateSyncStatus(`已切换到${type === 'grid' ? '网格' : '堆叠'}布局`);
}
// 切换全屏
function toggleFullscreen() {
playerState.fullscreen = !playerState.fullscreen;
if (playerState.fullscreen) {
document.documentElement.requestFullscreen().catch(console.log);
updateSyncStatus('已进入全屏模式');
} else {
document.exitFullscreen();
updateSyncStatus('已退出全屏模式');
}
}
// 更新同步状态
function updateSyncStatus(message) {
document.getElementById('syncStatus').textContent = message;
// 3秒后恢复默认状态
setTimeout(() => {
document.getElementById('syncStatus').textContent = '已就绪';
}, 3000);
}
// iframe 加载事件
document.querySelectorAll('iframe').forEach((iframe, index) => {
const playerId = index + 1;
iframe.addEventListener('load', function() {
updatePlayerStatus(playerId, 'ready');
console.log(`播放器 ${playerId} 加载完成`);
});
iframe.addEventListener('error', function() {
updatePlayerStatus(playerId, 'error');
console.error(`播放器 ${playerId} 加载失败`);
});
});
// 监听全屏变化
document.addEventListener('fullscreenchange', function() {
playerState.fullscreen = !!document.fullscreenElement;
});
// 初始化
window.addEventListener('load', function() {
updateSyncStatus('系统初始化完成');
// 模拟播放器加载完成
setTimeout(() => {
updatePlayerStatus(1, 'ready');
updatePlayerStatus(2, 'ready');
}, 1000);
});
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>双播放器</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
padding: 20px;
background: #f8f9fa;
}
.ratio-16x9 {
border-radius: 8px;
overflow: hidden;
box-shadow: 0 3px 10px rgba(0,0,0,0.1);
}
iframe {
border: none;
}
/* 确保在小屏幕上单列显示 */
@media (max-width: 768px) {
.col-6 {
width: 100% !important;
margin-bottom: 20px;
}
}
</style>
</head>
<body>
<div class="container">
<div class="row g-3">
<div class="col-12 col-md-6">
<div class="ratio ratio-16x9">
<iframe src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430"></iframe>
</div>
</div>
<div class="col-12 col-md-6">
<div class="ratio ratio-16x9">
<iframe src="//music.163.com/outchain/player?type=0&id=12706712383&auto=0&height=430"></iframe>
</div>
</div>
</div>
</div>
</body>
</html>
col-6 在所有屏幕都是6列,应该用 col-md-6 或 col-lg-6.container 和 .row 中g-3 或 g-4 类来添加间距<div class="container">
<div class="row g-4">
<div class="col-12 col-md-6">
<div class="ratio ratio-16x9">
<iframe src="//music.163.com/outchain/player?type=0&id=12607812115&auto=0&height=430"></iframe>
</div>
</div>
<div class="col-12 col-md-6">
<div class="ratio ratio-16x9">
<iframe src="//music.163.com/outchain/player?type=0&id=12706712383&auto=0&height=430"></iframe>
</div>
</div>
</div>
</div>
这样就能保证:
class="row g-4" 是 Bootstrap 5 中栅格系统的核心组合,有两个作用:
.row 的作用 <div class="row">
<!-- 子元素必须是 .col-* 类 -->
<div class="col">列1</div>
<div class="col">列2</div>
</div>
.col-* 元素提供负外边距display: flex; flex-wrap: wrap;.g-4 的作用(Gutters - 沟槽/间距) /* Bootstrap 5 中的间距类 */
.g-0 { gap: 0; }
.g-1 { gap: 0.25rem; } /* 4px */
.g-2 { gap: 0.5rem; } /* 8px */
.g-3 { gap: 1rem; } /* 16px */
.g-4 { gap: 1.5rem; } /* 24px - 最常用! */
.g-5 { gap: 3rem; } /* 48px */
<!-- 没有间距(挤在一起) -->
<div class="row">
<div class="col-6 bg-light p-3">内容1</div>
<div class="col-6 bg-light p-3">内容2</div>
</div>
<!-- 有间距(有呼吸感) -->
<div class="row g-4">
<div class="col-6 bg-light p-3">内容1</div>
<div class="col-6 bg-light p-3">内容2</div>
</div>
<!DOCTYPE html>
<html>
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
.demo-box {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
border-radius: 8px;
text-align: center;
min-height: 100px;
}
.demo-container {
margin-bottom: 30px;
padding: 20px;
border: 2px dashed #dee2e6;
border-radius: 10px;
}
h4 {
margin-bottom: 15px;
color: #333;
}
</style>
</head>
<body>
<div class="container mt-5">
<h2 class="mb-4">Bootstrap 间距类演示</h2>
<!-- 1. 不同间距级别对比 -->
<div class="demo-container">
<h4>不同间距级别 (g-0 到 g-5)</h4>
<div class="row mb-4">
<div class="col">
<div class="demo-box">g-0 (无间距)</div>
</div>
<div class="col">
<div class="demo-box">g-1 (4px)</div>
</div>
<div class="col">
<div class="demo-box">g-2 (8px)</div>
</div>
<div class="col">
<div class="demo-box">g-3 (16px)</div>
</div>
<div class="col">
<div class="demo-box">g-4 (24px)</div>
</div>
<div class="col">
<div class="demo-box">g-5 (48px)</div>
</div>
</div>
<div class="row g-0 mb-2">
<div class="col"><div class="demo-box">g-0</div></div>
<div class="col"><div class="demo-box">g-0</div></div>
</div>
<div class="row g-1 mb-2">
<div class="col"><div class="demo-box">g-1</div></div>
<div class="col"><div class="demo-box">g-1</div></div>
</div>
<div class="row g-2 mb-2">
<div class="col"><div class="demo-box">g-2</div></div>
<div class="col"><div class="demo-box">g-2</div></div>
</div>
<div class="row g-3 mb-2">
<div class="col"><div class="demo-box">g-3</div></div>
<div class="col"><div class="demo-box">g-3</div></div>
</div>
<div class="row g-4 mb-2">
<div class="col"><div class="demo-box">g-4</div></div>
<div class="col"><div class="demo-box">g-4</div></div>
</div>
<div class="row g-5">
<div class="col"><div class="demo-box">g-5</div></div>
<div class="col"><div class="demo-box">g-5</div></div>
</div>
</div>
<!-- 2. 响应式间距 -->
<div class="demo-container">
<h4>响应式间距 (断点控制)</h4>
<div class="row g-2 g-md-4 g-xl-5">
<div class="col-6 col-md-4">
<div class="demo-box">小屏: g-2<br>中屏: g-4<br>大屏: g-5</div>
</div>
<div class="col-6 col-md-4">
<div class="demo-box">响应式间距</div>
</div>
<div class="col-12 col-md-4">
<div class="demo-box">根据屏幕变化</div>
</div>
</div>
</div>
<!-- 3. 实际应用场景 -->
<div class="demo-container">
<h4>卡片布局应用</h4>
<div class="row g-4">
<div class="col-md-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">卡片 1</h5>
<p class="card-text">使用 g-4 间距让卡片之间有舒适的呼吸空间。</p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">卡片 2</h5>
<p class="card-text">24px 的间距是最常用的设计间距。</p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">卡片 3</h5>
<p class="card-text">让内容既分离又保持联系。</p>
</div>
</div>
</div>
</div>
</div>
<!-- 4. 复杂布局示例 -->
<div class="demo-container">
<h4>复杂网格布局</h4>
<div class="row g-4">
<div class="col-12">
<div class="demo-box">全宽头部</div>
</div>
<div class="col-md-8">
<div class="demo-box">
主内容区 (8列)<br>
使用 g-4 保持与侧边栏的间距
</div>
</div>
<div class="col-md-4">
<div class="demo-box">
侧边栏 (4列)<br>
自动获得合适的间距
</div>
</div>
<div class="col-6 col-md-3">
<div class="demo-box">产品 1</div>
</div>
<div class="col-6 col-md-3">
<div class="demo-box">产品 2</div>
</div>
<div class="col-6 col-md-3">
<div class="demo-box">产品 3</div>
</div>
<div class="col-6 col-md-3">
<div class="demo-box">产品 4</div>
</div>
</div>
</div>
<!-- 5. 间距方向控制 -->
<div class="demo-container">
<h4>水平和垂直间距控制</h4>
<h6 class="mt-3">水平间距 (gx-*)</h6>
<div class="row gx-4">
<div class="col"><div class="demo-box">只有水平间距</div></div>
<div class="col"><div class="demo-box">列之间</div></div>
<div class="col"><div class="demo-box">没有垂直间距</div></div>
</div>
<h6 class="mt-3">垂直间距 (gy-*)</h6>
<div class="row gy-4">
<div class="col-12"><div class="demo-box">只有垂直间距</div></div>
<div class="col-12"><div class="demo-box">行之间</div></div>
<div class="col-12"><div class="demo-box">没有水平间距</div></div>
</div>
<h6 class="mt-3">独立控制 (gx-* 和 gy-*)</h6>
<div class="row gx-3 gy-5">
<div class="col-6"><div class="demo-box">水平: gx-3</div></div>
<div class="col-6"><div class="demo-box">垂直: gy-5</div></div>
<div class="col-6"><div class="demo-box">不同间距</div></div>
<div class="col-6"><div class="demo-box">更灵活</div></div>
</div>
</div>
</div>
</body>
</html>
<!-- 使用 padding 和 margin -->
<div class="row">
<div class="col-md-6 mb-4"> <!-- 需要手动添加 mb-* -->
<div class="content">内容</div>
</div>
<div class="col-md-6 mb-4">
<div class="content">内容</div>
</div>
</div>
<!-- 使用 gap 属性(CSS Grid 方式) -->
<div class="row g-4">
<div class="col-md-6"> <!-- 不需要 mb-* -->
<div class="content">内容</div>
</div>
<div class="col-md-6">
<div class="content">内容</div>
</div>
</div>
| 间距类 | 像素值 | 使用场景 |
|---|---|---|
| g-0 | 0px | 需要紧密排列,如图片墙 |
| g-1 | 4px | 紧凑布局,小元素 |
| g-2 | 8px | 默认紧凑间距 |
| g-3 | 16px | 中等间距,常用 |
| g-4 | 24px | 最常用,舒适距离 |
| g-5 | 48px | 大间距,需要明显分隔 |
<!-- 不同屏幕不同间距 -->
<div class="row g-2 g-md-4 g-lg-5">
<!-- 小屏: 8px, 中屏: 24px, 大屏: 48px -->
</div>
<div class="row g-4">
<div class="col">
<div class="row g-3"> <!-- 嵌套行用较小间距 -->
<div class="col">子内容</div>
</div>
</div>
</div>
<div class="row g-4 align-items-center">
<!-- 垂直居中 + 间距 -->
<div class="col">内容</div>
<div class="col">内容</div>
</div>
<!-- ❌ 错误 -->
<div class="row">
<div class="col me-3"> <!-- margin 会破坏布局 -->
<!-- ❌ 错误 -->
<div class="col-6">直接使用 col</div>
<div class="col-6">缺少 .row 包裹</div>
<!-- ✅ 正确 -->
<div class="row">
<div class="col-6">内容</div>
<div class="col-6">内容</div>
</div>
<!-- 标准模式 -->
<div class="container">
<div class="row g-4"> <!-- g-4 是最佳默认值 -->
<div class="col-md-6">
<!-- 内容 -->
</div>
<div class="col-md-6">
<!-- 内容 -->
</div>
</div>
</div>
记住:class="row g-4" = "创建一行,并给所有子元素之间添加24px的间距"