当前位置: 首页 > article >正文

js第八题

题八:滚动弹幕

要求:

1.页面上漂浮字体大小不一、颜色不一,从左向右滚动的弹幕;

2.底部中间有一个发送功能,可以发送新的弹幕;

3.底部的发送部分可以向下收起和弹出。

html

  <div id="danmu-container"></div>
    
    <div id="control-panel">
        <button id="toggle-btn">▲</button>
        <div id="input-box">
            <input type="text" id="danmu-input" placeholder="输入弹幕内容">
            <button id="send-btn">发送</button>
        </div>
    </div>

css

  body {
            margin: 0;
            overflow: hidden;
            background: white;
            font-family: '微软雅黑', sans-serif;
        }

        #danmu-container {
            height: calc(100vh - 60px);
            position: relative;
        }

        .danmu {
            position: absolute;
            white-space: nowrap;
            animation: move linear;
            pointer-events: none;
        }

        @keyframes move {
            from { transform: translateX(100vw); }
            to { transform: translateX(-100%); }
        }

        #control-panel {
            position: fixed;
            bottom: 0;
            left: 50%;
            transform: translateX(-50%);
            transition: all 0.3s ease;
        }

        #control-panel.hidden {
            transform: translate(-50%, 100%);
        }

        #input-box {
            background: rgba(255,255,255,0.9);
            padding: 15px;
            border-radius: 10px 10px 0 0;
            box-shadow: 0 -2px 10px rgba(0,0,0,0.2);
            display: flex;
            gap: 10px;
        }

        #toggle-btn {
            position: absolute;
            top: -30px;
            left: 50%;
            transform: translateX(-50%);
            background: #fff;
            border: none;
            padding: 5px 20px;
            border-radius: 15px 15px 0 0;
            cursor: pointer;
            box-shadow: 0 -2px 5px rgba(0,0,0,0.1);
        }

        #danmu-input {
            flex: 1;
            padding: 8px;
            border: 1px solid #ddd;
            border-radius: 4px;
            min-width: 300px;
        }

        #send-btn {
            background: #2196F3;
            color: white;
            border: none;
            padding: 8px 20px;
            border-radius: 4px;
            cursor: pointer;
            transition: background 0.3s;
        }

        #send-btn:hover {
            background: #1976D2;
        }

js

  const danmuContainer = document.querySelector('danmu-container');
        const danmuInput = document.querySelector('danmu-input');
        const sendBtn = document.querySelector('send-btn');
        const toggleBtn = document.querySelector('toggle-btn');
        const controlPanel = document.querySelector('control-panel');

        // 生成随机颜色
        function getRandomColor() {
            return '#' + Math.floor(Math.random()*16777215).toString(16);
        }

        // 创建弹幕元素
        function createDanmu(text) {
            const danmu = document.createElement('div');
            danmu.className = 'danmu';
            danmu.textContent = text;
            
            // 随机样式
            danmu.style.color = getRandomColor();
            danmu.style.fontSize = `${Math.floor(12 + Math.random() * 12)}px`;
            danmu.style.top = `${Math.random() * (danmuContainer.offsetHeight - 30)}px`;
            
            // 动画配置
            const duration = 8 + Math.random() * 4; // 8-12秒
            danmu.style.animation = `move ${duration}s linear`;
            
            // 动画结束后移除元素
            danmu.addEventListener('animationend', () => {
                danmu.remove();
            });

            return danmu;
        }

        // 发送弹幕
        function sendDanmu() {
            const text = danmuInput.value.trim();
            if (!text) return;

            const danmu = createDanmu(text);
            danmuContainer.appendChild(danmu);
            danmuInput.value = '';
        }

        // 事件监听
        sendBtn.addEventListener('click', sendDanmu);
        danmuInput.addEventListener('keypress', (e) => {
            if (e.key === 'Enter') sendDanmu();
        });

        // 控制面板切换
        let isPanelVisible = true;
        toggleBtn.addEventListener('click', () => {
            isPanelVisible = !isPanelVisible;
            controlPanel.classList.toggle('hidden', !isPanelVisible);
            toggleBtn.textContent = isPanelVisible ? '▲' : '▼';
        });

        // 初始示例弹幕
        setTimeout(() => {
            ['Hello World!', '这是一个弹幕示例', '可以输入文字试试', '点击箭头收起面板'].forEach(text => {
                danmuContainer.appendChild(createDanmu(text));
            });
        }, 500);

视频

8


http://www.kler.cn/a/552100.html

相关文章:

  • C++中的线程同步方式
  • Vue 中 MVVM、MVC 和 MVP 模式的区别
  • Docker 在微服务架构中的应用(二)
  • NLP 八股 DAY1:BERT
  • Redis慢查询日志详解
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 14
  • 从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用
  • TensorFlow 概念
  • EG3013 控制电流的方法与实现
  • 数据分析-56-深入理解假设检验的步骤和T检验的应用案例
  • Transformer 模型
  • Word中接入大模型教程
  • Layui 列表中switch按钮的使用
  • 首都国际会展中心启用,首展聚焦汽车后市场全产业链
  • 小程序类毕业设计选题题目推荐 (29)
  • ✨2.快速了解HTML5的标签类型
  • 【开源免费】基于SpringBoot+Vue.JS智能家居系统(JAVA毕业设计)
  • 记录一点关于前端安装依赖的东西
  • 解析浏览器中JavaScript与Native交互原理:以WebGPU为例
  • 【分布式理论13】分布式存储:数据存储难题与解决之道