<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>手机弹幕聊天(居中版)</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
        }
        body {
            background-color: #1a1a1a;
            color: #fff;
            min-height: 100vh;
            overflow-x: hidden;
        }
        /* 弹幕容器:占满屏幕主要区域,新增居中对齐 */
        .danmu-container {
            position: relative;
            width: 100%;
            height: calc(100vh - 120px);
            overflow: hidden;
            background-color: #0f0f0f;
            border-bottom: 1px solid #333;
            /* 关键:让弹幕在容器内垂直居中 */
            display: flex;
            align-items: center;
        }
        /* 单个弹幕样式:修改为居中显示 + 水平滚动 */
        .danmu-item {
            position: absolute;
            white-space: nowrap;
            font-size: 16px;
            padding: 8px 12px;
            border-radius: 20px;
            background-color: rgba(0,0,0,0.6);
            /* 关键:初始位置在容器右侧外部,水平居中 */
            left: 100%;
            transform: translateY(-50%);
            animation: danmuMove linear forwards;
            z-index: 1;
        }
        /* 弹幕用户名高亮 */
        .danmu-name {
            font-weight: 600;
            margin-right: 6px;
        }
        /* 弹幕滚动动画:从右到左穿过屏幕 */
        @keyframes danmuMove {
            to {
                left: -100%;
            }
        }
        /* 控制区:昵称+输入+发送 */
        .control-area {
            padding: 16px;
            background-color: #1a1a1a;
        }
        .nickname-box {
            margin-bottom: 12px;
            display: flex;
            align-items: center;
            gap: 10px;
        }
        .nickname-label {
            font-size: 14px;
            color: #ccc;
        }
        #nickname-input {
            flex: 1;
            padding: 10px 14px;
            border: 1px solid #333;
            border-radius: 20px;
            background-color: #2d2d2d;
            color: #fff;
            font-size: 15px;
            outline: none;
        }
        #nickname-input:focus {
            border-color: #4a90e2;
        }
        /* 弹幕输入+发送区域 */
        .input-send-box {
            display: flex;
            gap: 10px;
        }
        #danmu-input {
            flex: 1;
            padding: 12px 16px;
            border: 1px solid #333;
            border-radius: 24px;
            background-color: #2d2d2d;
            color: #fff;
            font-size: 16px;
            resize: none;
            min-height: 48px;
            max-height: 120px;
            outline: none;
        }
        #danmu-input:focus {
            border-color: #4a90e2;
        }
        #send-btn {
            width: 48px;
            height: 48px;
            border-radius: 50%;
            background-color: #4a90e2;
            color: #fff;
            border: none;
            font-size: 20px;
            cursor: pointer;
            display: flex;
            align-items: center;
            justify-content: center;
            transition: background-color 0.3s;
        }
        #send-btn:hover {
            background-color: #357abd;
        }
        /* 颜色选择器 */
        .color-selector {
            margin-top: 10px;
            display: flex;
            gap: 8px;
            padding-left: 4px;
        }
        .color-option {
            width: 24px;
            height: 24px;
            border-radius: 50%;
            cursor: pointer;
            border: 2px solid transparent;
        }
        .color-option.active {
            border-color: #fff;
            box-shadow: 0 0 0 1px #4a90e2;
        }
        .color-white { background-color: #fff; }
        .color-blue { background-color: #4a90e2; }
        .color-pink { background-color: #e91e63; }
        .color-yellow { background-color: #ffeb3b; }
        .color-green { background-color: #4caf50; }
    </style>
</head>
<body>
    <!-- 弹幕显示容器 -->
    <div class="danmu-container" id="danmu-container"></div>

    <!-- 控制区域:昵称、输入、发送、颜色选择 -->
    <div class="control-area">
        <div class="nickname-box">
            <span class="nickname-label">昵称:</span>
            <input type="text" id="nickname-input" placeholder="请输入你的昵称" value="游客">
        </div>

        <div class="input-send-box">
            <textarea id="danmu-input" placeholder="输入弹幕内容..."></textarea>
            <button id="send-btn">➤</button>
        </div>

        <div class="color-selector">
            <div class="color-option color-white active" data-color="#fff"></div>
            <div class="color-option color-blue" data-color="#4a90e2"></div>
            <div class="color-option color-pink" data-color="#e91e63"></div>
            <div class="color-option color-yellow" data-color="#ffeb3b"></div>
            <div class="color-option color-green" data-color="#4caf50"></div>
        </div>
    </div>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            // 1. 获取DOM元素
            const danmuContainer = document.getElementById('danmu-container');
            const nicknameInput = document.getElementById('nickname-input');
            const danmuInput = document.getElementById('danmu-input');
            const sendBtn = document.getElementById('send-btn');
            const colorOptions = document.querySelectorAll('.color-option');

            // 2. 初始化变量
            let selectedColor = '#fff'; // 默认弹幕颜色
            const containerHeight = danmuContainer.offsetHeight; // 弹幕容器高度
            const defaultNickname = '游客'; // 默认昵称

            // 3. 颜色选择功能
            colorOptions.forEach(option => {
                option.addEventListener('click', function() {
                    colorOptions.forEach(opt => opt.classList.remove('active'));
                    this.classList.add('active');
                    selectedColor = this.dataset.color;
                });
            });

            // 4. 发送弹幕功能
            sendBtn.addEventListener('click', sendDanmu);
            danmuInput.addEventListener('keydown', function(e) {
                if (e.key === 'Enter' && !e.shiftKey) {
                    e.preventDefault();
                    sendDanmu();
                }
            });

            // 5. 自动生成示例弹幕
            const demoDanmus = [
                {name: '小明', content: '居中弹幕看起来更整齐!'},
                {name: '小红', content: '手机上看居中弹幕好舒服~'},
                {name: '小李', content: '大家一起来发弹幕吧!'},
                {name: '小张', content: '这个颜色好好看!'},
                {name: '小王', content: '太有意思啦~'}
            ];
            setInterval(() => {
                const randomDanmu = demoDanmus[Math.floor(Math.random() * demoDanmus.length)];
                createDanmuElement(randomDanmu.name, randomDanmu.content,
                    ['#fff', '#4a90e2', '#e91e63', '#ffeb3b', '#4caf50'][Math.floor(Math.random() * 5)]);
            }, 3000);

            // ---------------------- 核心函数定义 ----------------------
            function sendDanmu() {
                const nickname = nicknameInput.value.trim() || defaultNickname;
                const content = danmuInput.value.trim();

                if (!content) {
                    alert('请输入弹幕内容~');
                    danmuInput.focus();
                    return;
                }

                createDanmuElement(nickname, content, selectedColor);
                danmuInput.value = '';
                danmuInput.focus();
            }

            // 关键:弹幕居中定位(垂直居中,水平滚动)
            function createDanmuElement(name, content, color) {
                const danmuItem = document.createElement('div');
                danmuItem.className = 'danmu-item';
                danmuItem.innerHTML = `<span class="danmu-name" style="color: ${color};">${name}</span>${content}`;
                danmuItem.style.color = color;

                // 核心:固定垂直居中(容器高度的50% - 自身高度的50%)
                danmuItem.style.top = '50%';
                // 初始位置在容器右侧外部,保证从屏幕外进入
                danmuItem.style.left = '100%';

                // 随机设置滚动速度(5-10秒走完屏幕)
                const randomDuration = 5 + Math.random() * 5;
                danmuItem.style.animationDuration = `${randomDuration}s`;

                danmuContainer.appendChild(danmuItem);

                // 动画结束后删除元素,优化性能
                setTimeout(() => {
                    danmuItem.remove();
                }, randomDuration * 1000);
            }
        });
    </script>
</body>
</html>