Javascript 属性上的悬停效果

Javascript 属性上的悬停效果,javascript,html,css,reactjs,Javascript,Html,Css,Reactjs,我正在尝试找出如何在我的范围输入滑块的-sliderthumb属性上制作10px光环。我正在使用React、CSS和HTML,发现这很难做到,因为overflow:hidden属性。这个属性必须保留,因为基本上没有它的代码都不能工作(这是编辑滑块基css的解决方案的一部分)。我尝试过使用::after和::before,但没有效果。所以我想知道我做错了什么,或者这是否可能,因为我还没有找到任何关于它的文档。下面提供了代码和代码笔。谢谢你的帮助/建议 HTML: JS(巴别塔) class Vol

我正在尝试找出如何在我的范围输入滑块的
-sliderthumb
属性上制作10px光环。我正在使用React、CSS和HTML,发现这很难做到,因为
overflow:hidden
属性。这个属性必须保留,因为基本上没有它的代码都不能工作(这是编辑滑块基css的解决方案的一部分)。我尝试过使用::after和::before,但没有效果。所以我想知道我做错了什么,或者这是否可能,因为我还没有找到任何关于它的文档。下面提供了代码和代码笔。谢谢你的帮助/建议

HTML:

JS(巴别塔)

class VolumeSlider扩展React.Component{
构造函数(){
超级();
此.state={
价值:120.5
};
}
更新日期(e){
这是我的国家({
价值:即目标价值
});
}  
render(){
返回(
这个。更新(e)}
步骤={0.1}
type=“范围”
value={this.state.value}
/>
{this.state.value}c
);
}
}
ReactDOM.render(
,
document.getElementById(“根”)
);

看看这支钢笔,希望这就是你要找的,解释: 我添加了after和position绝对,输入相对位置,after 1px X 1px,inset,然后将X轴从0平移到我想要的任何值

    input[type='range']::after{
    content: "";
  position: absolute;
  top: 0px;
  left: 0px;
  border-radius: 50%;
  visibility: hidden;
   width: 1px;
    height: 1px;
  box-shadow: 0 0 10px 5px #fff, inset 0 0 10px 5px #fff;
}
input[type='range']:hover::after{
    visibility: visible;
  animation: wave 2s forwards;
}@keyframes wave {
  0% {
   
    transform:translateX(0);
  }
  100% {
    transform:translateX(500px);
  }
}

使用CSS滑块不适用于跨平台,它在不同的浏览器中是不同的显示。你可以试试这个插件:这是你想要的吗
input[type='range'] {
  -webkit-appearance: none;
  background-color: #ddd;
  height: 10px;
  overflow: hidden;
  width: 300px;
  border-radius: 5px;
  outline: none;
}

input[type='range']::-webkit-slider-runnable-track {
  -webkit-appearance: none;
  height: 10px;
}

input[type='range']::-webkit-slider-thumb {
  -webkit-appearance: none;
  --slider-thumb-background-color: #000;
  background: var(--slider-thumb-background-color);
  border-radius: 50%;
  --box-shadow-color: orange;
  box-shadow: -205px 0 0 200px var(--box-shadow-color);
  cursor: pointer;
  height: 10px;
  width: 10px;
  --border-color: orange;
  border: 3px solid var(--border-color);
}

input[type='range']::-webkit-slider-thumb:hover::after {
  content: '';
  height: 10px;
  width: 10px;
  border-radius: 5px;
  color: yellow;
}

input[type='range']::-webkit-slider-thumb:hover {
  --slider-thumb-background-color: grey;
  --box-shadow-color: red;
  --border-color: red;
}

input[type='range']::-webkit-slider-thumb:active {
  --slider-thumb-background-color: white;
  --box-shadow-color: blue;
  --border-color: blue;
}

input[type='range']::-webkit-slider-thumb:focus {
  --slider-thumb-background-color: white;
  --box-shadow-color: yellow;
  --border-color: yellow;
}

input[type='range']::-webkit-slider-thumb:hover:after {
  border: 10px solid rgb(111, 111, 0.4);
  overflow: auto;
  postion: fixed;
}

input[type='range']::-moz-range-thumb {
  background: #333;
  border-radius: 50%;
  box-shadow: -1005px 0 0 1000px red;
  cursor: pointer;
  height: 10px;
  width: 10px;
  border: 0;
}
class VolumeSlider extends React.Component {
  
  constructor() {
    super();
    this.state = {
      value: 120.5
    };
  }

  onUpdate(e) {
    this.setState({
      value: e.target.value
    });
  }  

  render() {
    return (
      <div>
      
      <div className="mb1">
        <input
          className="c-input--range"
          list="tickmarks"
          max={1200}
          onChange={(e) => this.onUpdate(e)}
          step={0.1}
          type="range"
          value={this.state.value}
        />
        <div>
           <label className="c-label">{this.state.value}c</label>
        </div>
      </div>
      </div>
    );
  }
}

ReactDOM.render(
  <div>
    <VolumeSlider />
  </div>,
  document.getElementById("root")
);
    input[type='range']::after{
    content: "";
  position: absolute;
  top: 0px;
  left: 0px;
  border-radius: 50%;
  visibility: hidden;
   width: 1px;
    height: 1px;
  box-shadow: 0 0 10px 5px #fff, inset 0 0 10px 5px #fff;
}
input[type='range']:hover::after{
    visibility: visible;
  animation: wave 2s forwards;
}@keyframes wave {
  0% {
   
    transform:translateX(0);
  }
  100% {
    transform:translateX(500px);
  }
}