好用的组件收藏

播放器播放条 斗鱼、Youtobe等

https://web-streaming.github.io/ppbar/

使用
使用 ppbar,需要导入 ProgressBar 类和 ppbar 的样式。

import ProgressBar from 'ppbar';
import 'ppbar/dist/index.min.css';

const div = document.createElement('div');
const bar = new ProgressBar(div, {
  // 参数
})

document.body.appendChild(div)
ProgressBar 构造函数接收两个参数,第一个它的容器,第二个是 ppbar 的参数。如果设置第一个参数会自动将 ppbar 的 DOM 元素添加到传入容器中。

当然希望手动添加 ppbar 的 DOM 元素,可以不传入第一个参数。

import ProgressBar from 'ppbar';
import 'ppbar/dist/index.min.css';

const bar = new ProgressBar(undefined, {
  // 参数
})

document.body.appendChild(bar.el)
ppbar 有一个 updateConfig 方法,可以随时通过它来动态更新参数。

import ProgressBar from 'ppbar';
import 'ppbar/dist/index.min.css';

const bar = new ProgressBar(undefined, {
  // 参数
})

document.body.appendChild(bar.el)

bar.updateConfig({ /* 新参数 */ })

// 如果不需要 bar 对象了请销毁它
bar.destroy()
章节
章节可以设置进度条分段效果,每个章节必须有一个标题,鼠标 hover 进度条时会被展示出来。

章节应该有个 time 属性,表示该章节的结尾,最后一个章节可以省略 time 属性。

import ProgressBar from 'ppbar';
import 'ppbar/dist/index.min.css';

new ProgressBar(document.body, {
  chapters: [
    { time: 10, title: 'chapter1' },
    { time: 20, title: 'chapter2' },
    { title: 'chapter3' },
  ]
})
上面一共设置 3 个章节,分别是:

0s - 10s chapter1
10s - 20s chapter2
20s - duration chapter3
标记
该功能允许你在进度条上设置标记点,每个标记点可以放入自定义的 DOM 或一张图片。

import ProgressBar from 'ppbar';
import 'ppbar/dist/index.min.css';

new ProgressBar(document.body, {
  markers: [
    { time: 10, title: 'marker1', image: './img.jpg', size: [30, 30] },
  ]
})
上面代码在进度条 10 秒位置,设置了一个标记点,标记点中有一个图片,它的大小是 30x30。

除了图片还可以使用自定义的 dom 元素。

import ProgressBar from 'ppbar';
import 'ppbar/dist/index.min.css';

const div = document.createElement('div')

new ProgressBar(document.body, {
  markers: [
    { time: 10, title: 'marker1', el: div },
  ]
})
当标记点被点击时会触发 markerClick 事件。

import { EVENT, ProgressBar } from 'ppbar'

const bar = new ProgressBar(document.body, {
  markers: [
    { time: 10, title: 'marker1' },
  ]
})

bar.on(EVENT.MARKER_CLICK, (marker) => console.log(marker))
热力图
热力图用于标记整个视频不同时间段观看量的变化。比如 0 到 5 秒观看量是 100,5 到 10 秒观看量是 200 ... 然后将这些观看量绘制成曲线就是 ppbar 的热力图了。

const bar = new ProgressBar(document.body, {
  heatMap: {
    points: [1, 2, 3],
    defaultDuration: 5,
  }
})
上面代码配置表示,每个点表示的时长为 5 秒,也就是 0 - 5 的值是 1,5 - 10 为 2,10 - 15 为 3。

另外还支持给每个点单独设置时长。

const bar = new ProgressBar(document.body, {
  heatMap: {
    points: [{ duration: 10, score: 1 }, { score: 2 }, { duration: 2, score: 3 }],
    defaultDuration: 5,
  }
})
上面配置中,第一个和第三个有自己的时长,第二个则是使用 defaultDuration。

如果希望热力图和 Youtube 一样,只有 hover 的时候才显示,可以设置 hoverShow。

const bar = new ProgressBar(document.body, {
  heatMap: {
    points: [1, 2, 3],
    defaultDuration: 5,
    hoverShow: true
  }
})
缩略图
缩略图用于预览视频的不同时间点的画面。一张缩略图由多张小缩略图拼接而成。

const bar = new ProgressBar(document.body, {
  thumbnail: {
    start: 0, // 缩略图开始时间,单位秒
    gap: 10, // 单个小缩略图表示的时长
    row: 5, // 大缩略图是又几行小缩略图组成
    col: 5, // 大缩略图是又几列小缩略图组成
    width: 160, // 单个小缩略图宽度
    height: 90, // 单个小缩略图的高度
    images: [], // 缩略图地址数组
  }
})
以上参数的值都是默认参数。

另外如果你不希望展示缩略图可以将它设置为 false。

const bar = new ProgressBar(document.body, {
  thumbnail: false
})
直播
ppbar 还支持直播时移,在直播模式下进度条的时间展示将会是负数。

new ProgressBar(document.body, { live: true })
另外还可以使用 updateConfig 方法动态开启关闭直播模式。

const bar = new Progress(document.body) 

bar.updateConfig({ live: true })
旋转
ppbar 还支持被旋转,例如在移动端不使用全屏,但是希望视频横着播放,这是就会对播放器设置 transform: rotate(90deg)。这时候就需要手动更新 ppbar 的旋转来防止 ppbar 交互失效。

const div = document.createElement('div')
div.style.transform = 'rotate(90deg)'
new ProgressBar(div, { rotate: 90 })
你还可以通过 updateRotate 方法来动态更新参数。

const bar = new ProgressBar(document.body)

bar.updateRotate(90)
事件
ppbar 还会抛出事件,你可以使用 on 方法监听事件,once 方法监听一次事件,off 取消监听事件。

import { EVENT, ProgressBar } from 'ppbar'

const bar = new ProgressBar(document.body)

bar.once(EVENT.DRAGGING, console.log)
bar.on(EVENT.DRAGEND, console.log)
bar.off(EVENT.DRAGEND, console.log)
具体的事件描述请查看 API 事件章节

自定义样式
ppbar 支持自定义修改样式。

new ProgressBar(document.body, {
  dot: '<svg>...</svg>'
})
参数 dot 可以自定进度条原点,可以是自定义 DOM 元素、字符串,为字符串时将直接设置 innerHTML。

另外还可以通过 CSS 变量来设置 ppbar 的主题色。

const bar = new ProgressBar(document.body) 

bar.el.style.setProperty('--primary-color', 'rgba(35,173,229, 1)');
--primary-color 是 ppbar 的主题色,默认为 #f00。

最后你还可以通过 Sass 变量来自定义样式。

@use '~ppbar/lib/index.scss' with (
  $primaryColor: #0f0,
  $markerDotBg: #f00,
  $heatMapHeight: 30px
)
在 scss 文件中导入并覆盖样式。

import ProgressBar from 'ppbar'
import './index.scss'
导入上面自定义的样式。

目前一共支持 3 种自定义 sass 变量。

$primaryColor 进度条的主题色,默认 #f00
$markerDotBg 标记点的背景色,默认 #fff
$heatMapHeight 热力图高度,默认 40px
集成到播放器
你可以使用 ppbar 打造自己的播放器,或者将它集成到现成的播放器中,下面以 nplayer 为例。

import ProgressBar, { EVENT as BAR_EVENT } from 'ppbar';
import Player, { EVENT } from 'nplayer';
import 'ppbar/dist/index.min.css'

const div = document.createElement('div')
div.style.width = '100%'
const progress = new ProgressBar(div, {
  chapters: [
    { time: 10, title: 'chapter-a' },
    { time: 28, title: 'chapter-b' },
    { time: 51, title: 'chapter-c' },
    { title: 'chapter-d' },
  ],
  markers: [{
    time: 15,
    title: 'title1',
    image: 'https://github.com/web-streaming/ppbar/blob/main/demo/m1.png?raw=true',
    size: [32, 34],
  }, {
    time: 30,
    title: 'title2',
    image: 'https://github.com/web-streaming/ppbar/blob/main/demo/m2.png?raw=true',
    size: [32, 34],
  },
  {
    time: 55, 
    title: 'title3', 
    image: 'https://github.com/web-streaming/ppbar/blob/main/demo/m3.png?raw=true', 
    size: [32, 34],
  }],
  heatMap: {
    points: [9592,9692,10063,41138,30485,23905,10966.5,10316.5,8533.5,7249,7181,6813,5929,18046.5,8817,3684.5],
    defaultDuration: 3.75
  },
  thumbnail: {
    images: ['https://github.com/woopen/nplayer/blob/main/website/static/img/M1.jpg?raw=true']
  }
})

const MyProgress = {
  el: div,
  init(player) {
    player.on(EVENT.DURATION_CHANGE, () => progress.updateDuration(player.duration))
    player.on(EVENT.TIME_UPDATE, () => progress.updatePlayed(player.currentTime))
    player.on(EVENT.PROGRESS, () => progress.updateBuffer(player.buffered.end(player.buffered.length - 1)))
    // 监听播放器事件,关联到 ppbar
  }
}

const player = new Player({
  src: 'http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4',
  controls: [
    ['play', 'volume', 'time', 'spacer', 'settings', 'web-fullscreen', 'fullscreen'],
    [MyProgress]
  ]
})

progress.on(BAR_EVENT.DRAGEND, (time) => {
  player.currentTime = time
})
progress.on(BAR_EVENT.MARKER_CLICK, (marker) => {
  player.currentTime = marker.time
})
// 将 ppbar 事件关联到 player

player.mount(document.body)
效果如下。



API
配置
参数名    类型    描述
live    boolean    是否是直播模式
duration    number    进度条的时长
rotate    0 | 90 | -90    进度条要被旋转的度数
dot    HTMLElement | string | true    进度条标记点,true 表示使用默认
chapters    {time?:number,title:string}[]    章节,time 是一个章节的结束时间,最后一个章节可以不设置
heatMap    Object    热力图
heatMap.points    (number|{duration?:number;score:number})[]    热力图分数点
heatMap.defaultDuration    Object    默认单点时长
heatMap.hoverShow    Object    是否要 hover 的时候才展示
markers    Object[]    标记数组
markers[].time    number    必填,标记对应的时间点
markers[].title    string    标记点标题
markers[].el    HTMLElement    标记点自定义 DOM 元素
markers[].image    string    标记点图片
markers[].size    number[]    标记点图片大小
thumbnail    Object | false    缩略图,false 为不展示
thumbnail.start    number    缩略图开始时间,默认 0
thumbnail.gap    number    每个缩略图的时长,默认 10
thumbnail.row    number    雪碧图由几行图片组成,默认 5
thumbnail.col    number    雪碧图由几列图片组成,默认 5
thumbnail.width    number    缩略图宽度,默认 160
thumbnail.height    number    缩略图高度,默认 90
thumbnail.images    string[]    缩略图地址数组
属性
属性    类型    描述
el    HTMLElement    进度条的 DOM 元素
config    ProgressConfig    进度条参数
rect    Rect    进度条盒子大小,类似 DOMRect
duration    number    时长,默认 0
rotate    number    被旋转的角度,默认 0
live    boolean    是否是直播模式
方法
updateSize()
更新进度条大小,一般在修改容器大小位置时调用,防止进度条中元素对不齐。

updateSize(): void;
updateRotate()
更新进度条旋转角度。

updateRotate(r: 0 | 90 | -90): void
updateDuration()
更新时长

updateDuration(duration?: number): void
updateConfig()
更新进度条参数,参数可以部分更新,一般在切换视频时使用。

updateConfig(config?: Partial<ProgressConfig>): void
updateMarkerPosition()
更新标记点的位置,在直播中随着时间推移可以标记点位置会发生变化,可以使用该函数。参数是相对时间,表示所有标记点都移动多少时间距离。

updateMarkerPosition(relativeTime: number): void
updatePlayed()
更新播放进度。

updatePlayed(time: number): void
updateBuffer()
更新缓存进度。

updateBuffer(time: number): void
updateHover()
更新 hover 进度。

updateHover(time: number): void
destroy()
销毁进度条。

destroy(): void
事件
事件名    描述
markerClick    标记点被点击,参数是标记点对象
dragging    正在拖动进度条,频繁触发
dragend    拖动结束
mousemove    鼠标在进度条上移动,频繁触发
mouseleave    鼠标离开

 

posted @ 2022-10-11 21:01  创业男生  阅读(38)  评论(0编辑  收藏  举报