기본 JavaScript에서 사격 구성 요소를 구현하는 방법
오늘
JavaScript 칼럼에서는 기본 JavaScript를 사용하여 Barrage 구성 요소를 구현하는 방법을 소개합니다.
Preface
요즘에는 거의 모든 비디오 웹사이트에 사격 기능이 있으므로 오늘은 네이티브 JavaScript
를 사용하여 사격 클래스를 캡슐화하겠습니다. 이 클래스는 다음과 같은 속성과 인스턴스 메소드를 갖고 싶어합니다: JavaScript
封装一个弹幕类。这个类希望有如下属性和实例方法:
属性
-
el
容器节点的选择器,容器节点应为绝对定位,设置好宽高 -
height
每条弹幕的高度 -
mode
弹幕模式,half则为一半容器高度,top为三分之一,full为占满 -
speed
弹幕划过屏幕的时间 -
gapWidth
后一条弹幕与前一条弹幕的距离
方法
-
pushData
添加弹幕元数据 -
addData
持续加入弹幕 -
start
开始调度弹幕 -
stop
停止弹幕 -
restart
重新开始弹幕 -
clearData
清空弹幕 -
close
关闭 -
open
重新显示弹幕
PS:有一些自封装的工具函数就不贴出来了,大概知道意思就好
初始化
引入JavaScript文件之后,我们希望如下使用,先采取默认配置。
let barrage = new Barrage({ el: '#container'})复制代码
参数初始化:
function Barrage(options) { let { el, height, mode, speed, gapWidth, } = options this.container = document.querySelector(el) this.height = height || 30 this.speed = speed || 15000 //2000ms this.gapWidth = gapWidth || 20 this.list = [] this.mode = mode || 'half' this.boxSize = getBoxSize(this.container) this.perSpeed = Math.round(this.boxSize.width / this.speed) this.rows = initRows(this.boxSize, this.mode, this.height) this.timeoutFuncs = [] this.indexs = [] this.idMap = [] }复制代码
先接受好参数然后初始化,下面看看getBoxSize
和initRows
function getBoxSize(box) { let { height, width } = window.getComputedStyle(box) return { height: px2num(height), width: px2num(width) } function px2num(str) { return Number(str.substring(0, str.indexOf('p'))) } }复制代码
通过getComputedStyle
속성 el
컨테이너 노드에 대한 선택기, 컨테이너 노드는 다음과 같아야 합니다. 절대 위치 및 너비와 높이 설정height
각 포격의 높이mode
포격 모드에서는 절반이 절반입니다 컨테이너 높이, 상단은 1/3, 가득 참속도
탄격이 화면을 가로지르는 데 걸리는 시간 gapWidth</code >다음 글머리 기호와 이전 글머리 기호 사이의 거리</li></ul><h2 data-id="heading-2">방법 <p><ul><li><code>pushData</code > 글머리 기호 화면 메타데이터 추가</li><li><code>addData
연속 사격 추가start
공격 예약 시작- < code >stop포격 중지
restart
포격 다시 시작clearData
포격 취소 닫기
닫기열기
포격 다시 표시
PS: 자체 캡슐화된 도구 기능이 있습니다. 여기에 올리지는 않겠지만 무슨 뜻인지는 아마 아실 겁니다
el
컨테이너 노드에 대한 선택기, 컨테이너 노드는 다음과 같아야 합니다. 절대 위치 및 너비와 높이 설정height
각 포격의 높이mode
포격 모드에서는 절반이 절반입니다 컨테이너 높이, 상단은 1/3, 가득 참속도
탄격이 화면을 가로지르는 데 걸리는 시간 gapWidth</code >다음 글머리 기호와 이전 글머리 기호 사이의 거리</li></ul><h2 data-id="heading-2">방법 <p><ul><li><code>pushData</code > 글머리 기호 화면 메타데이터 추가</li><li><code>addData
연속 사격 추가start
공격 예약 시작restart
포격 다시 시작clearData
포격 취소닫기
닫기열기
포격 다시 표시초기화
자바스크립트 파일을 소개한 후 아래와 같이 사용하려고 합니다. 먼저 기본값을 채택합니다. 구성.
function initRows(box, mode, height) { let pisor = getpisor(mode) rows = Math.ceil(box.height * pisor / height) return rows }function getpisor(mode) { let pisor = .5 switch (mode) { case 'half': pisor = .5 break case 'top': pisor = 1 / 3 break; case 'full': pisor = 1; break default: break; } return pisor }复制代码
매개변수 초기화:
this.pushData = function (data) { this.initDom() if (getType(data) == '[object Object]') { //插入单条 this.pushOne(data) } if (getType(data) == '[object Array]') { //插入多条 this.pushArr(data) } }this.initDom = function () { if (!document.querySelector(`${el} .barrage-list`)) { //注册dom节点 for (let i = 0; i < this.rows; i++) { let p = document.createElement('p') p.classList = `barrage-list barrage-list-${i}` p.style.height = `${this.boxSize.height*getpisor(this.mode)/this.rows}px` this.container.appendChild(p) } } }复制代码
매개변수를 먼저 승인한 후 초기화하세요. getCompulatedStyle을 통해 계산된 <code>getBoxSize
및 initRows
this.pushOne = function (data) { for (let i = 0; i < this.rows; i++) { if (!this.list[i]) this.list[i] = [] } let leastRow = getLeastRow(this.list) //获取弹幕列表中最少的那一列,弹幕列表是一个二维数组 this.list[leastRow].push(data) }this.pushArr = function (data) { let list = sliceRowList(this.rows, data) list.forEach((item, index) => { if (this.list[index]) { this.list[index] = this.list[index].concat(...item) } else { this.list[index] = item } }) }//根据行数把一维的弹幕list切分成rows行的二维数组function sliceRowList(rows, list) { let sliceList = [], perNum = Math.round(list.length / rows) for (let i = 0; i < rows; i++) { let arr = [] if (i == rows - 1) { arr = list.slice(i * perNum) } else { i == 0 ? arr = list.slice(0, perNum) : arr = list.slice(i * perNum, (i + 1) * perNum) } sliceList.push(arr) } return sliceList }复制代码
를 살펴보겠습니다. api 상자의 너비와 높이는 나중에 사용되는 컨테이너의 너비와 높이를 계산하는 데 사용됩니다.
this.addData = function (data) { this.pushData(data) this.start() }复制代码
높이를 기준으로 탄막의 줄 수를 계산하면 아래 줄 수를 사용하는 곳이 있습니다.
데이터 삽입
데이터를 삽입하는 방법에는 원본 데이터를 추가하는 방법과 연속적으로 추가하는 방법이 있습니다. 먼저 소스 데이터를 추가하는 방법을 살펴보겠습니다.
this.start = function () { //开始调度list this.dispatchList(this.list) }this.dispatchList = function (list) { for (let i = 0; i < list.length; i++) { this.dispatchRow(list[i], i) } }this.dispatchRow = function (row, i) { if (!this.indexs[i] && this.indexs[i] !== 0) { this.indexs[i] = 0 } //真正的调度从这里开始,用一个实例变量存储好当前调度的下标。 if (row[this.indexs[i]]) { this.dispatchItem(row[this.indexs[i]], i, this.indexs[i]) } }复制代码
this.dispatchItem = function (item, i) { //调度过一次的某条弹幕下一次在调度就不需要了 if (!item || this.idMap[item.id]) { return } let index = this.indexs[i] this.idMap[item.id] = item.id let p = document.createElement('p'), parent = document.querySelector(`${el} .barrage-list-${i}`), width, pastTime p.innerHTML = item.content p.className = 'barrage-item' parent.appendChild(p) width = getBoxSize(p).width p.style = `width:${width}px;display:none` pastTime = this.computeTime(width) //计算出下一条弹幕应该出现的时间 //弹幕飞一会~ this.run(p) if (index > this.list[i].length - 1) { return } let len = this.timeoutFuncs.length //记录好定时器,后面清空 this.timeoutFuncs[len] = setTimeout(() => { this.indexs[i] = index + 1 //递归调用下一条 this.dispatchItem(this.list[i][index + 1], i, index + 1) }, pastTime); }复制代码
연속적으로 데이터를 추가하는 방법은 소스 데이터를 추가하는 메소드를 호출하고 스케줄링을 시작하는 것뿐입니다.
//用css动画,整体还是比较流畅的this.run = function (item) { item.classList += ' running' item.style.left = "left:100%" item.style.display = '' item.style.animation = `run ${this.speed/1000}s linear` //已完成的打一个标记 setTimeout(() => { item.classList+=' done' }, this.speed); }复制代码
탄막 발사
탄막 발사 논리를 살펴보겠습니다.
//根据弹幕的宽度和gapWth,算出下一条弹幕应该出现的时间this.computeTime = function (width) { let length = width + this.gapWidth let time = Math.round(length / this.boxSize.width * this.speed/2) return time }复制代码
@keyframes run { 0% { left: 100%; } 50% { left: 0 } 100% { left: -100%; } }.run { animation-name: run; }复制代码
this.stop = function () { let items = document.querySelectorAll(`${el} .barrage-item`); [...items].forEach(item => { item.className += ' pause' }) }复制代码
.pause { animation-play-state: paused !important; }复制代码
애니메이션 CSS는 다음과 같습니다
this.restart = function () { let items = document.querySelectorAll(`${el} .barrage-item`); [...items].forEach(item => { removeClassName(item, 'pause') }) }复制代码
나머지 방법
Stop
멈추려면 애니메이션의 Paused 속성을 사용하세요
this.close = function () { this.container.style.display = 'none'}this.open = function () { this.container.style.display = ''}复制代码
this.clearData = function () { //清除list this.list = [] //清除dom document.querySelector(`${el}`).innerHTML = '' //清除timeout this.timeoutFuncs.forEach(fun => clearTimeout(fun)) }复制代码
다시 시작
pause 클래스만 삭제하세요열고 닫으세요 보이지 않는 논리를 만드세요 rrreee막대를 정리하세요rrreee마지막으로 타이머를 사용하여 만료된 막사를 정기적으로 정리하세요.rrreee마지막으로🎜이 구현이 여전히 결함이 있다고 생각합니다. 이런 수업, 어떻게 디자인하시겠습니까? 🎜🎜🎜🎜관련 무료 학습 권장사항: 🎜🎜🎜javascript🎜🎜🎜(동영상)🎜🎜🎜setInterval(() => { let items = document.querySelectorAll(`${el} .done`); [...items].forEach(item=>{ item.parentNode.removeChild(item) }) }, this.speed*5);复制代码로그인 후 복사위 내용은 기본 JavaScript에서 사격 구성 요소를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 소개: 인터넷의 대중화와 기술의 발전으로 점점 더 많은 레스토랑에서 온라인 주문 서비스를 제공하기 시작했습니다. 실시간 온라인 주문 시스템을 구현하기 위해 JavaScript 및 WebSocket 기술을 사용할 수 있습니다. WebSocket은 TCP 프로토콜을 기반으로 하는 전이중 통신 프로토콜로 클라이언트와 서버 간의 실시간 양방향 통신을 실현할 수 있습니다. 실시간 온라인 주문 시스템에서는 사용자가 요리를 선택하고 주문을 하면

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 오늘날의 디지털 시대에는 점점 더 많은 기업과 서비스에서 온라인 예약 기능을 제공해야 합니다. 효율적인 실시간 온라인 예약 시스템을 구현하는 것이 중요합니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까? WebSocket은 단일 TCP 연결의 전이중 방식입니다.

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

사용법: JavaScript에서 insertBefore() 메서드는 DOM 트리에 새 노드를 삽입하는 데 사용됩니다. 이 방법에는 삽입할 새 노드와 참조 노드(즉, 새 노드가 삽입될 노드)라는 두 가지 매개 변수가 필요합니다.

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

1. 먼저 Kugou 음악 재생 인터페이스를 엽니다. 2. 그런 다음 재생 인터페이스에서 댓글을 클릭합니다. 3. 댓글을 입력하시면 위와 같은 댓글 옵션이 보입니다. 4. 마지막으로 검토를 닫고 재생 인터페이스로 돌아가도록 선택합니다.
