menu
29 文章
5 评论
78878 浏览
1 当前访客
ღゝ◡╹)ノ

开源一款音乐播放器

感觉花里胡哨的,但是还是不错.....
/**
 * 悬浮音乐播放器
 * 
 * @author 钦州的一个辣呆
 * @website https://www.napan.top
 * @description 精致悬浮音乐播放器,支持网易云音乐播放列表
 * @version 1.0
 * 
 * 功能特性:
 * - 迷你/完整模式切换
 * - 拖拽移动位置
 * - 响应式设计
 * - 动态视频背景
 * - 网易云音乐集成
 * 
 * 技术栈:
 * - APlayer 音乐播放器
 * - MetingJS 音乐API
 * - Font Awesome 图标
 * 
 * © 2025 钦州的一个辣呆 版权所有
 * 桂ICP备2024037071号 桂公网安备45070302000707号
 */

// Create floating music player element
const floatingPlayer = document.createElement('div');
floatingPlayer.id = 'floating-music-player';
floatingPlayer.className = 'player-mini';
floatingPlayer.innerHTML = `
    <!-- 播放器内部视频背景 -->
    <video class="player-video-bg" autoplay muted loop>
        <source src="https://www.xiaopozhan.top/APP%E4%B8%8B%E8%BD%BD2/download%20(17).mp4" type="video/mp4">
    </video>
  
    <div class="player-header">
        <div class="player-icon">
            <i class="fas fa-music"></i>
        </div>
        <div class="player-title">音乐播放器</div>
        <div class="player-toggle">展开</div>
    </div>
  
    <div class="player-body">
        <!-- APlayer will be initialized here -->
        <div id="aplayer"></div>
    </div>
`;

// Add styles
const style = document.createElement('style');
style.textContent = `
    :root {
        --primary-color: #6C5CE7;
        --secondary-color: #00CEFF;
        --text-color: #F8F9FA;
        --accent-color: #FFD700;
    }
  
    /* 基础样式 */
    #floating-music-player {
        position: fixed;
        left: 25px;
        bottom: 25px;
        z-index: 9999;
        width: 340px;
        max-width: 90%;
        transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
        border-radius: 18px;
        overflow: hidden;
        box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
        background: rgba(20, 20, 30, 0.4);
        backdrop-filter: blur(15px);
        border: 1px solid rgba(255, 255, 255, 0.1);
    }
  
    /* 圆形迷你模式 */
    #floating-music-player.player-mini {
        width: 65px;
        height: 65px;
        border-radius: 50%;
        overflow: hidden;
        cursor: pointer;
        box-shadow: 0 6px 25px rgba(0, 0, 0, 0.45);
    }
  
    /* 播放器内部视频背景 */
    .player-video-bg {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        object-fit: cover;
        z-index: -1;
        opacity: 0.2;
        filter: blur(3px);
    }
  
    /* 播放器头部 */
    .player-header {
        padding: 16px 22px;
        background: linear-gradient(135deg, 
            rgba(108, 92, 231, 0.2), 
            rgba(0, 206, 255, 0.2));
        display: flex;
        align-items: center;
        cursor: pointer;
        user-select: none;
        transition: all 0.4s ease;
        position: relative;
        z-index: 1;
    }
  
    /* 精致纤细的分割线 */
    .player-header::after {
        content: '';
        position: absolute;
        left: 22px;
        right: 22px;
        bottom: 0;
        height: 0.3px;
        background: linear-gradient(90deg, 
            transparent 0%, 
            rgba(255, 255, 255, 0.1) 20%, 
            rgba(255, 255, 255, 0.1) 80%, 
            transparent 100%);
        opacity: 0.5;
    }
  
    .player-mini .player-header {
        padding: 0;
        height: 100%;
        width: 100%;
        justify-content: center;
        background: linear-gradient(135deg, 
            rgba(108, 92, 231, 0.25), 
            rgba(0, 206, 255, 0.25));
    }
  
    .player-mini .player-header::after {
        display: none;
    }
  
    /* 图标设计 */
    .player-icon {
        width: 38px;
        height: 38px;
        background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
        border-radius: 12px;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-right: 14px;
        transition: all 0.4s ease;
        box-shadow: 0 3px 12px rgba(0, 0, 0, 0.25);
    }
  
    .player-mini .player-icon {
        margin: 0;
        width: 100%;
        height: 100%;
        border-radius: 50%;
        background: transparent;
        animation: float 3s ease-in-out infinite, rotate 10s linear infinite;
    }
  
    @keyframes float {
        0%, 100% { transform: translateY(0px); }
        50% { transform: translateY(-5px); }
    }
  
    @keyframes rotate {
        from { transform: rotate(0deg); }
        to { transform: rotate(360deg); }
    }
  
    .player-mini .player-icon i {
        color: white;
        font-size: 30px;
        text-shadow: 0 0 15px rgba(255, 215, 0, 0.6);
    }
  
    .player-icon i {
        color: white;
        font-size: 18px;
    }
  
    /* 文字样式 */
    .player-title {
        font-size: 17px;
        font-weight: 600;
        color: var(--text-color);
        flex-grow: 1;
        transition: all 0.4s ease;
        letter-spacing: 0.5px;
        text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
    }
  
    .player-mini .player-title,
    .player-mini .player-toggle {
        display: none;
    }
  
    .player-toggle {
        color: var(--accent-color);
        font-size: 14px;
        transition: all 0.4s ease;
        font-weight: 500;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
    }
  
    /* 播放器主体 */
    .player-body {
        padding: 22px;
        display: block;
        transition: all 0.4s ease;
        position: relative;
    }
  
    .player-mini .player-body {
        display: none;
    }
  
    /* APlayer自定义样式 */
    .aplayer {
        margin: 0 !important;
        background: transparent !important;
        color: var(--text-color) !important;
        font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif !important;
        position: relative;
        z-index: 1;
    }
  
    .aplayer .aplayer-info {
        padding: 0 0 18px 0 !important;
        border-top: none !important;
        margin-top: 0 !important;
        position: relative;
    }
  
    .aplayer .aplayer-info::after {
        content: '';
        position: absolute;
        left: 0;
        right: 0;
        bottom: 10px;
        height: 0.3px;
        background: linear-gradient(90deg, 
            transparent 0%, 
            rgba(255, 255, 255, 0.1) 20%, 
            rgba(255, 255, 255, 0.1) 80%, 
            transparent 100%);
        opacity: 0.5;
    }
  
    .aplayer .aplayer-info .aplayer-music {
        color: var(--text-color) !important;
        font-size: 15px !important;
        font-weight: 500;
    }
  
    .aplayer .aplayer-info .aplayer-controller .aplayer-time {
        color: rgba(248, 249, 250, 0.7) !important;
        font-size: 13px !important;
    }
  
    .aplayer .aplayer-button path {
        fill: var(--accent-color) !important;
    }
  
    .aplayer .aplayer-volume-wrap .aplayer-volume-button path {
        fill: var(--accent-color) !important;
    }
  
    .aplayer .aplayer-bar-wrap .aplayer-bar {
        background: rgba(255, 255, 255, 0.1) !important;
        height: 4px !important;
        border-radius: 3px !important;
    }
  
    .aplayer .aplayer-bar-wrap .aplayer-bar .aplayer-played {
        background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)) !important;
        height: 4px !important;
        border-radius: 3px !important;
    }
  
    .aplayer .aplayer-bar-wrap .aplayer-bar .aplayer-played .aplayer-thumb {
        background: white !important;
        border: 2px solid var(--accent-color) !important;
        width: 15px !important;
        height: 15px !important;
        margin-top: -5px !important;
        box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);
    }
  
    .aplayer .aplayer-lrc {
        display: none;
    }
  
    /* 播放列表美化 - 更高透明度 */
    .aplayer .aplayer-list {
        max-height: 260px !important;
        background: rgba(30, 30, 40, 0.4) !important;
        border-radius: 10px !important;
        margin-top: 12px !important;
        border: 1px solid rgba(255, 255, 255, 0.08);
        backdrop-filter: blur(8px);
    }
  
    .aplayer .aplayer-list ol li {
        border-top: 1px solid rgba(255, 255, 255, 0.05) !important;
        color: rgba(248, 249, 250, 0.9) !important;
        padding: 10px 18px !important;
        transition: all 0.2s ease !important;
    }
  
    .aplayer .aplayer-list ol li:hover {
        background: rgba(108, 92, 231, 0.1) !important;
        color: var(--text-color) !important;
    }
  
    .aplayer .aplayer-list ol li.aplayer-list-light {
        background: linear-gradient(90deg, 
            rgba(108, 92, 231, 0.15), 
            rgba(0, 206, 255, 0.15)) !important;
        color: var(--text-color) !important;
    }
  
    .aplayer .aplayer-list ol li .aplayer-list-index {
        color: var(--accent-color) !important;
    }
  
    .aplayer .aplayer-list ol li .aplayer-list-author {
        color: rgba(248, 249, 250, 0.7) !important;
    }
  
    /* 响应式调整 */
    @media (max-width: 768px) {
        #floating-music-player {
            width: 300px;
            left: 15px;
            bottom: 15px;
        }
  
        .player-header {
            padding: 14px 18px;
        }
  
        .player-header::after {
            left: 18px;
            right: 18px;
        }
  
        #floating-music-player.player-mini {
            width: 55px;
            height: 55px;
        }
  
        .player-mini .player-icon i {
            font-size: 26px;
        }
    }
  
    @media (max-width: 480px) {
        #floating-music-player {
            width: calc(100% - 30px);
            left: 15px;
            bottom: 15px;
        }
  
        #floating-music-player.player-mini {
            width: 50px;
            height: 50px;
        }
  
        .player-mini .player-icon i {
            font-size: 24px;
        }
    }
`;

// Add required CSS
const fontAwesomeLink = document.createElement('link');
fontAwesomeLink.rel = 'stylesheet';
fontAwesomeLink.href = 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.4/css/all.min.css';

const aplayerCssLink = document.createElement('link');
aplayerCssLink.rel = 'stylesheet';
aplayerCssLink.href = 'https://cdn.bootcdn.net/ajax/libs/aplayer/1.10.1/APlayer.min.css';

// Add to head
document.head.appendChild(style);
document.head.appendChild(fontAwesomeLink);
document.head.appendChild(aplayerCssLink);

// Add to body
document.body.appendChild(floatingPlayer);

// Load APlayer and Meting JS scripts
function loadScript(src, callback) {
    const script = document.createElement('script');
    script.src = src;
    script.onload = callback;
    document.body.appendChild(script);
}

// Initialize after scripts are loaded
loadScript('https://cdn.bootcdn.net/ajax/libs/aplayer/1.10.1/APlayer.min.js', function() {
    loadScript('https://cdn.bootcdn.net/ajax/libs/meting/2.0.1/Meting.min.js', function() {
        // Initialize Meting player
        const meting = document.createElement('meting-js');
        meting.setAttribute('server', 'netease');
        meting.setAttribute('type', 'playlist');
        meting.setAttribute('id', '12442693622');
        meting.setAttribute('fixed', 'false');
        meting.setAttribute('mini', 'false');
        meting.setAttribute('theme', '#6C5CE7');
        meting.setAttribute('order', 'list');
        meting.setAttribute('autoplay', 'false');
        meting.setAttribute('loop', 'all');
        meting.setAttribute('preload', 'auto');
        meting.setAttribute('list-folded', 'true');
        meting.setAttribute('volume', '0.7');
  
        document.querySelector('.player-body').appendChild(meting);
  
        // 在控制台显示版权信息
        console.log(`
%c悬浮音乐播放器 v1.0
%c作者: 钦州的一个辣呆
%c官网: https://www.napan.top
%c© 2025 版权所有
        `.trim(), 
        'color: #6C5CE7; font-weight: bold; font-size: 14px;',
        'color: #00CEFF;',
        'color: #FFD700;',
        'color: #888; font-size: 12px;'
        );
    });
});

// Player functionality
function togglePlayer() {
    const player = document.getElementById('floating-music-player');
    player.classList.toggle('player-mini');
  
    const toggleText = player.querySelector('.player-toggle');
    if (player.classList.contains('player-mini')) {
        toggleText.textContent = '展开';
    } else {
        toggleText.textContent = '收起';
    }
}

// Add copyright notice to player
function addCopyrightNotice() {
    const copyright = document.createElement('div');
    copyright.style.cssText = `
        position: absolute;
        bottom: 5px;
        right: 10px;
        font-size: 10px;
        color: rgba(255,255,255,0.3);
        z-index: 10000;
        pointer-events: none;
        font-family: 'Microsoft YaHei', sans-serif;
    `;
    copyright.innerHTML = '© 钦州的一个辣呆';
  
    const player = document.getElementById('floating-music-player');
    if (player) {
        player.appendChild(copyright);
    }
}

// Add event listeners
document.addEventListener('DOMContentLoaded', function() {
    const player = document.getElementById('floating-music-player');
    const header = player.querySelector('.player-header');
  
    // Set default mini mode
    player.classList.add('player-mini');
  
    // Set video background
    const video = player.querySelector('.player-video-bg');
    video.playbackRate = 0.5;
  
    // Toggle player on header click
    header.addEventListener('click', togglePlayer);
  
    // Add copyright notice
    addCopyrightNotice();
  
    // Prevent touch conflicts
    document.addEventListener('APlayerLoaded', function() {
        document.querySelectorAll('.aplayer-bar-wrap').forEach(function(el) {
            el.addEventListener('touchstart', function(e) {
                e.stopPropagation();
            });
        });
    });
  
    // Drag functionality
    let isDragging = false;
    let offsetX, offsetY;
  
    header.addEventListener('mousedown', function(e) {
        if (e.target === header || e.target.closest('.player-header')) {
            isDragging = true;
            offsetX = e.clientX - player.getBoundingClientRect().left;
            offsetY = e.clientY - player.getBoundingClientRect().top;
            player.style.cursor = 'grabbing';
        }
    });
  
    document.addEventListener('mousemove', function(e) {
        if (!isDragging) return;
  
        const x = e.clientX - offsetX;
        const y = e.clientY - offsetY;
  
        player.style.left = `${Math.max(0, Math.min(x, window.innerWidth - player.offsetWidth))}px`;
        player.style.top = `${Math.max(0, Math.min(y, window.innerHeight - player.offsetHeight))}px`;
        player.style.bottom = 'auto';
    });
  
    document.addEventListener('mouseup', function() {
        isDragging = false;
        player.style.cursor = '';
    });
});

使用方法,复制代码保存为.js

比如:bfq.js

  • 调用方式:
    <script src="bfq.js"></script>
    


标题:开源一款音乐播放器
作者:钦州的一个辣呆
地址:https://www.napan.top/articles/2025/10/23/1761153741005.html

评论
取消