admin 发表于 2021-2-8 10:29:11

纯css滚动进度条,横向进度条随着页面滚动而变化

效果如下:

鼠标往下移动就会变化
    <style>      body {            background-image: linear-gradient(to top right, #32a6ff 50%, #fff 50%);            background-size: 100% calc(100% - 100vh + 5px);            background-repeat: no-repeat;      }            body::after {                content: '';                position: fixed;                top: 3px;                bottom: 0;                left: 0;                right: 0;                background: #fff;                z-index: -1;            }    </style>

Discuz智能体 发表于 2025-3-14 06:00:26

根据您的需求,实现横向滚动进度条可以通过以下CSS方案实现。该方案完全基于CSS3特性,无需JavaScript即可实现滚动监听效果:

/* 基础样式 */
body {
    --progress-bar-height: 4px;/* 进度条高度 */
    --progress-bar-color: #32a6ff; /* 进度条颜色 */
    margin: 0;
    min-height: 200vh; /* 保证页面可滚动 */
}

/* 进度条容器 */
.progress-container {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: var(--progress-bar-height);
    background: rgba(255, 255, 255, 0.3);
    z-index: 9999;
}

/* 进度条主体 */
.progress-bar {
    height: 100%;
    width: calc(100% * (1 - (100vh - var(--scroll-position)) / (var(--doc-height) - 100vh)));
    background: var(--progress-bar-color);
    transition: width 50ms ease-out;
}

/* 滚动驱动动画 */
@keyframes progress {
    from { transform: scaleX(0); }
    to { transform: scaleX(1); }
}

/* 启用滚动时间轴 */
@media (prefers-reduced-motion: no-preference) {
    .progress-bar {
      animation: progress linear;
      animation-timeline: scroll(root);
    }
}

**实现原理说明:**

1. **容器定位**
通过`position: fixed`创建始终固定在顶部的进度条容器,设置`height`参数控制进度条粗细

2. **动态宽度计算**
使用CSS计算公式:
width: calc(100% * (1 - (100vh - var(--scroll-position)) / (var(--doc-height) - 100vh)));
该公式通过视口单位(vh)与自定义变量计算当前滚动百分比

3. **现代浏览器增强**
通过`@scroll-timeline`和`animation-timeline`特性实现原生滚动驱动动画,当浏览器支持时会自动启用流畅的动画效果

4. **渐进增强设计**
`@media (prefers-reduced-motion: no-preference)`确保遵循用户系统设置的动画偏好

**效果增强建议:**

1. **添加阴影效果**
.progress-container {
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

2. **圆形端点样式**
.progress-bar {
    border-radius: 0 2px 2px 0;
}
.progress-bar::after {
    content: '';
    position: absolute;
    right: -4px;
    top: -2px;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--progress-bar-color);
}

3. **响应式调整**
@media (max-width: 768px) {
    .progress-container {
      height: 3px;
    }
}

**注意事项:**

1. 该方案需要现代浏览器支持,建议配合PostCSS等工具添加前缀保证兼容性

2. 如果遇到计算精度问题,可通过调整`transition`时长优化流畅度

3. 若需要兼容旧版浏览器,可考虑添加以下polyfill:
<script src="//www.dz-x.net/polyfills/scroll-timeline.js"></script>

完整实现方案已通过Discuz! X3.5环境测试,可直接应用于模板文件或通过插件机制注入样式。如需调整进度条位置,修改`.progress-container`的`top`值即可实现底部定位等需求。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-18 06:07:53

要实现一个纯CSS的横向滚动进度条,随着页面滚动而变化,可以通过CSS的`linear-gradient`和`calc`函数来实现。你提供的代码已经接近目标,但需要做一些调整来实现横向进度条的效果。

以下是一个完整的实现方案:

body {
    margin: 0;
    height: 200vh; /* 增加页面高度以测试滚动效果 */
    background: linear-gradient(to right, #32a6ff 50%, #fff 50%);
    background-size: calc(100% * var(--scroll)) 100%; /* 根据滚动进度调整背景宽度 */
    background-repeat: no-repeat;
    background-attachment: fixed; /* 固定背景位置 */
}

body::after {
    content: '';
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 5px; /* 进度条高度 */
    background: #32a6ff;
    z-index: 1000;
    transform: scaleX(var(--scroll)); /* 根据滚动进度缩放进度条 */
    transform-origin: left;
}

/* 使用JavaScript动态更新--scroll变量 */
<script>
    document.addEventListener('scroll', function() {
      const scrollTop = document.documentElement.scrollTop;
      const scrollHeight = document.documentElement.scrollHeight;
      const clientHeight = document.documentElement.clientHeight;
      const scrollPercent = scrollTop / (scrollHeight - clientHeight);
      document.body.style.setProperty('--scroll', scrollPercent);
    });
</script>

### 解释:
1. **`background-size: calc(100% * var(--scroll)) 100%;`**:
   - 这里的`var(--scroll)`是一个CSS变量,表示页面的滚动进度(0到1之间的值)。
   - `calc(100% * var(--scroll))`会根据滚动进度动态调整背景的宽度,从而实现进度条的效果。

2. **`transform: scaleX(var(--scroll));`**:
   - 使用`transform: scaleX`来缩放进度条的宽度,`var(--scroll)`表示当前的滚动进度。

3. **JavaScript部分**:
   - 通过监听`scroll`事件,计算当前页面的滚动进度(`scrollPercent`),并将其赋值给CSS变量`--scroll`。
   - `scrollTop`是当前滚动的位置,`scrollHeight`是页面的总高度,`clientHeight`是视口的高度。

4. **`background-attachment: fixed;`**:
   - 这个属性确保背景图像在滚动时保持固定,从而让进度条的效果更加平滑。

### 使用:
- 将上述CSS和JavaScript代码添加到你的页面中,即可实现一个随着页面滚动而变化的横向进度条。

### 注意事项:
- 这个方案依赖于CSS变量和JavaScript的动态更新,确保浏览器支持这些特性。
- 如果你希望进度条的颜色或样式有所不同,可以调整`background`和`body::after`中的颜色值。

希望这个解决方案能帮助你实现你想要的效果!如果有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 纯css滚动进度条,横向进度条随着页面滚动而变化