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

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

相关文章:

  • 算法——结合实例了解Minimax算法(极小化极大算法)
  • 【C++】stack 和 queue 的适配器模式与实现
  • mysql 使用 CONCAT、GROUP_CONCAT 嵌套查询出 json 格式数据
  • javacv将mp4视频切分为m3u8视频并播放
  • 前端【技术方案】重构项目
  • Vue 3 中,Pinia 和 Vuex 的主要区别
  • blender骨骼分层问题:某一层的骨骼怎么移动到第一层
  • SQL高级语法
  • 【六】Golang 运算符
  • Git备忘录(三)
  • 【Spring Cloud Alibaba】Sentinel 服务熔断与流量控制
  • 【股票数据API接口24】如何获取最近10天资金流入趋势数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • huggingface+下载deepseek8b lamda+本地部署 笔记
  • python中使用日期和时间差:datetime模块
  • 2011年下半年软件设计师考试上午题真题的详细知识点分类整理(附真题及答案解析)
  • Python 植物大战僵尸
  • 地面沉降监测,为地质安全保驾护航
  • 使用SHOW PROCESSLIST和SHOW ENGINE INNODB STATUS排查mysql锁等待问题
  • mysql 存储空间增大解决方案
  • 什么是KL散度:概率分布的差异(筛子1/6情况下KL为:0)
  • “走进书适圈”:一周城市生活
  • 阿联酋与美国达成超过2000亿美元协议
  • 媒体评欧阳娜娜遭民进党当局威胁:艺人表达国家认同是民族大义
  • 商务部:长和集团出售港口交易各方不得规避审查
  • 著名词作家陈哲逝世,代表作《让世界充满爱》《同一首歌》等
  • 当番茄霸总遇上晋江古言,短剧IP小变局