You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CSS linear-gradient实现video.js进度条指定小点透明效果?

实现Video.js章节标记进度条(指定位置透明)方案

方案可行性

完全可以用CSS linear-gradient实现进度条指定位置透明的效果,通过动态生成渐变段,在章节标记位置预留透明区域,透出白色标记点,完美匹配预期效果。

具体实现步骤

1. 修正DOM结构

先把标记点嵌套到对应章节标记容器内,保证位置精准对应:

<div class="vjs-slider">
  <div class="vjs-marker" style="left: 55.3719%;">
    <div class="vjs-marker-dot"></div>
  </div>
  <div class="vjs-marker" style="left: 6.61157%;">
    <div class="vjs-marker-dot"></div>
  </div>
</div>

2. 基础样式设置

给进度条和标记点设置基础样式:

/* 进度条容器 */
.vjs-slider {
  position: relative;
  width: 100%;
  height: 6px; /* 进度条高度可按需调整 */
  overflow: hidden;
}

/* 章节标记定位容器 */
.vjs-marker {
  position: absolute;
  top: 0;
  left: var(--marker-left);
  height: 100%;
  width: 0;
}

/* 白色标记点 */
.vjs-marker-dot {
  position: absolute;
  top: 50%;
  left: 0;
  transform: translate(-50%, -50%);
  width: 8px; /* 标记点直径,需和JS计算值一致 */
  height: 8px;
  border-radius: 50%;
  background-color: #ffffff;
  z-index: 1;
}

3. 动态生成渐变透明效果

因为章节标记位置是动态的,需要用JS计算并生成linear-gradient样式:

// 获取进度条和所有标记
const slider = document.querySelector('.vjs-slider');
const markers = document.querySelectorAll('.vjs-marker');
const dotWidth = 8; // 和CSS中标记点直径一致
const sliderWidth = slider.offsetWidth;
const dotPercent = (dotWidth / sliderWidth) * 100;
const halfDotPercent = dotPercent / 2;

// 构建渐变片段数组
const gradientSegments = ['#cccccc 0%'];

markers.forEach((marker, index) => {
  const markerLeft = parseFloat(marker.style.left);
  const transparentStart = markerLeft - halfDotPercent;
  const transparentEnd = markerLeft + halfDotPercent;

  // 添加灰色段到透明区域起点
  gradientSegments.push(`#cccccc ${transparentStart}%`);
  // 添加透明段
  gradientSegments.push(`transparent ${transparentStart}%`);
  gradientSegments.push(`transparent ${transparentEnd}%`);
  
  // 处理后续灰色段
  if (index === markers.length - 1) {
    gradientSegments.push(`#cccccc ${transparentEnd}%`);
    gradientSegments.push(`#cccccc 100%`);
  } else {
    const nextMarkerLeft = parseFloat(markers[index + 1].style.left);
    gradientSegments.push(`#cccccc ${transparentEnd}%`);
    gradientSegments.push(`#cccccc ${nextMarkerLeft - halfDotPercent}%`);
  }
});

// 拼接并设置渐变背景
const gradient = `linear-gradient(90deg, ${gradientSegments.join(', ')})`;
slider.style.background = gradient;

4. 适配动态场景

如果窗口 resize 或章节标记动态增减,重新调用上述JS逻辑即可更新渐变样式。

效果说明

通过这种方式,进度条会在每个章节标记位置出现透明小圆洞,透出白色标记点,实现“标记点嵌在进度条内”的视觉效果,替代当前标记点浮在进度条上的样式。

内容的提问来源于stack exchange,提问作者kdizzle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:39:53