效果演示
一个具有光晕效果的自定义滑动条,可以根据滑动条的位置和数值的变化来改变滑块的样式和颜色。
Code
<input type="range" class="glow" style="--val: 50" value="50" min="0" max="100"oninput="this.style='--val:'+this.value" />
```css
body {display: flex; /* 使用flex布局 */align-items: center; /* 垂直居中 */justify-content: center; /* 水平居中 */flex-direction: column; /* 垂直方向排列 */gap: 3rem; /* 元素之间的间距 */overflow: hidden; /* 隐藏溢出内容 */margin: 0; /* 边距为0 */min-height: 100vh; /* 最小高度为视口高度 */box-sizing: border-box; /* 盒模型为border-box */background-image: linear-gradient(45deg, #223, #112); /* 背景线性渐变 */background:radial-gradient(at 100% 0, #fff2, #fff0 50%), /* 背景径向渐变 */radial-gradient(at 0% 100%, #0002, #0000 50%), /* 背景径向渐变 */#545153; /* 背景颜色 */
}/* 定义CSS变量 */
@property --c {syntax: '<color>';inherits: true;initial-value: #0000;
}/* 滑动条样式 */
.glow {--c: rgb(0, 255, 255, calc(0.25 + var(--val) / 125)); /* 设置颜色透明度 */--c: hsl(160deg 80% 50% / calc(0.25 + var(--val) / 125)); /* 设置颜色透明度 */-webkit-appearance: none; /* 移除默认样式 */-moz-appearance: none; /* 移除默认样式 */appearance: none; /* 移除默认样式 */background: transparent; /* 背景透明 */cursor: pointer; /* 鼠标指针为手型 */width: 15rem; /* 宽度 */position: relative; /* 相对定位 */
}/* 滑动条前景样式 */
.glow::before {content: ""; /* 伪元素内容为空 */position: absolute; /* 绝对定位 */top: 0; /* 顶部对齐 */left: 0; /* 左侧对齐 */width: calc((var(--val) - 1) * 1%); /* 宽度根据变量值计算 */min-width: 0.5em; /* 最小宽度 */height: 100%; /* 高度100% */background: var(--c); /* 背景颜色 *//* 阴影效果 */box-shadow:0 0 0.2em 0 hsl(0 0% 0%) inset,-0.1em 0.1em 0.1em -0.1em hsl(0 0% 100% / 0.5),0 0 calc(1em + 0.001em * var(--val)) calc(0.1em + 0.00025em * var(--val)) var(--c);border-radius: 1em 0 0 1em; /* 边框圆角 */aopacity: calc(20% + var(--val) * 1%); /* 透明度根据变量值计算 */
}/* Track Styles *//* Chrome, Safari, Opera, and Edge Chromium */
.glow::-webkit-slider-runnable-track {/* 设置轨道样式 */box-shadow:0 0 0.2em 0 hsl(0 0% 0%) inset,-0.1em 0.1em 0.1em -0.1em hsl(0 0% 100% / 0.5);background:linear-gradient(to bottom right, #0001, #0000),#343133;border-radius: 1em; /* 边框圆角 */height: 1em; /* 高度 */
}/* Firefox */
.glow::-moz-range-track {/* 设置轨道样式 */box-shadow: 0 0 2px 0 hsl(0 0% 0%) inset, -1px 1px 1px -1px hsl(0 0% 100% / 0.5);background:linear-gradient(var(--c) 0 0) 0 0 / calc(var(--val) * 1%) 100% no-repeat,linear-gradient(to bottom right, #0001, #0000),#343133;border-radius: 1em; /* 边框圆角 */height: 1em; /* 高度 */
}/* Thumb Styles *//* Chrome, Safari, Opera, and Edge Chromium */
.glow::-webkit-slider-thumb {/* 设置滑块样式 */--d: var(--c);--d: rgb(from var(--c) r g b / calc(0.35 * var(--val) * 1%));-webkit-appearance: none; /* 移除默认样式 */appearance: none; /* 移除默认样式 */background-color: #5cd5eb; /* 背景颜色 */transform: translateY(calc(-50% + 0.5em)); /* 垂直居中 */width: 4em; /* 宽度 */aspect-ratio: 1; /* 宽高比为1:1 */background: red; /* 背景颜色 */border-radius: 50%; /* 边框圆角 *//* 复合背景 */background:radial-gradient(farthest-side, #0000 22.5%, var(--d) 0, #0000 calc(var(--val) * 0.75%)) 50% 50% / 100% 100% no-repeat,radial-gradient(#0000 15%, #343133 16%, #545153 20%),repeating-linear-gradient(#0000 0 10%, #0002 0 20%) 50% 50% / 25% 25% no-repeat,repeating-linear-gradient(90deg, #0000 0 10%, #0002 0 20%) 50% 50% / 25% 25% no-repeat,radial-gradient(var(--c) 17%, #0000 0),#545153;/* 阴影效果 */box-shadow:inset -0.15em -0.15em 0.2em #0008,inset 0.15em 0.15em 0.2em #ffffff22,inset calc(var(--val) * 1em / 500) 0em calc(var(--val) * 1em / 500) calc(var(--val) * -1em / 700) var(--c),0.25em 0.25em 0.5em #0006,calc(0.0125em * var(--val)) calc(0.005em * var(--val)) calc(0.02em * var(--val)) calc(-0.01em * var(--val)) #000a;border-radius: 50%; /* 边框圆角 */
}/* Firefox */
.glow::-moz-range-thumb {/* 设置滑块样式 */border: none; /* 移除边框 */-webkit-appearance: none; /* 移除默认样式 */appearance: none; /* 移除默认样式 */background-color: #5cd5eb; /* 背景颜色 */width: 4em; /* 宽度 */height: 4em; /* 高度 */aspect-ratio: 1; /* 宽高比为1:1 */background: red; /* 背景颜色 */border-radius: 50%; /* 边框圆角 *//* 复合背景 */background:radial-gradient(#0000 15%, #343133 16%, #545153 20%),repeating-linear-gradient(#0000 0 10%, #0002 0 20%) 50% 50% / 25% 25% no-repeat,repeating-linear-gradient(90deg, #0000 0 10%, #0002 0 20%) 50% 50% / 25% 25% no-repeat,radial-gradient(var(--c) 17%, #0000 0),#545153;/* 阴影效果 */box-shadow:inset -0.15em -0.15em 0.2em #0008,inset 0.15em 0.15em 0.2em #ffffff22,inset calc(var(--val) * 1em / 500) 0em calc(var(--val) * 1em / 500) calc(var(--val) * -1em / 700) var(--c),0.25em 0.25em 0.5em #0006,calc(0.015em * var(--val)) calc(0.005em * var(--val)) calc(0.02em * var(--val)) calc(-0.01em * var(--val)) #0008;border-radius: 50%; /* 边框圆角 */
}
实现思路拆分
- 整体布局样式设置为flex布局,垂直居中显示,背景为线性渐变和径向渐变组成的背景色。
- 滑动条样式设置了光晕效果,滑块样式也进行了定制化设计。
- 滑动条的轨道样式在不同浏览器中有不同的设置,包括阴影、背景色和边框半径等。
- 滑块样式也在不同浏览器中有不同设置,包括背景色、阴影、边框半径等。
- 代码中使用了CSS变量(–val)来动态改变滑块的样式,根据数值的变化而改变样式。