我想创建一个渐变效果使用pseudoelement:before在一个图像上,用户可以通过移动一个滑块输入来改变它。我试着通过下面的代码来实现它,但是到目前为止还没有成功
var sliderValue = $('#range');
sliderValue.oninput = function(){
var val1 = this.value;
var val2 = 100-val1;
$('<style> #filter:before{linear-gradient(to top, rgba(255,255,255,1) '+val1+'%,rgba(0,0,0,0) '+val2+'%);}</style>').appendTo("#filter");
};
.slider
{
-webkit-appearance:none;
appearance:none;
width: 100%;
height: 10px;
max-width: 400px;
background-color: #ccc;
margin: 0;
padding: 0;
outline: none;
border-radius: 10px;
cursor: pointer;
}
#filter {
position:relative;
float: left;
max-height: 480px;
}
#filter:before {
content: "";
position:absolute;
top:0;
left: 0;
right: 0;
bottom: 0;
width:320px;
height:100%;
background: linear-gradient(to top, rgba(255,255,255,1) 15%,rgba(0,0,0,0) 22%);
z-index: 1;
}
<div class="container">
<input type="range" min="0" max="100" value="0" class="slider" id="range">
<div id="filter">
<img id="previewImg" src="img/dummy_320x480_ffffff_d002e2.png" alt="Placeholder" style="height: 100%; width:320px;">
</div>
</div>
<script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
3条答案
按热度按时间owfi6suc1#
要使渐变正常工作,需要对代码进行一些修复:
1.滑块值应规格化为0到1,而不是0到100。
1.必须更正渐变CSS声明,以便对颜色值使用正确的表示法(例如:RGBA(255,255,255,1)应该是RGBA(255,255,255,1.0))。
通过这些修复,代码将如下所示:
请记住,标记用于在HTML页面的页眉中声明CSS样式,不应用于在jQuery中动态创建样式。在上面的代码中,我们使用了appendTo方法将动态创建的CSS样式添加到**#filter**元素中。
dnph8jn42#
您的代码存在一些问题:
rgba(0,0,0,0)
更改为rgba(0,0,0,.1)
,以便您能够看到它pes8fvy93#
正如在其他答案中所指出的,您的初始代码存在许多问题,主要是当
sliderValue
元素每次触发input
事件时,您都试图向文档添加<style>
元素,不幸的是,sliderValue
对象是一个jQuery对象,没有oninput
方法。要将事件处理程序与jQuery对象绑定,应使用
on()
方法:然而,尽管其他人的回答显示了改进的jQuery方法,但我认为我应该借此机会向您展示如何通过纯JavaScript和CSS自定义属性来管理它,如下所示(代码中有解释性注解):
x一个一个一个一个x一个一个二个一个x一个一个三个一个
JS Fiddle demo.
参考文献:
aspect-ratio
.calc()
.clamp()
.display
.gap
.linear-gradient()
.var()
.data-*
attributes.[...]
)。Array.prototype.forEach()
.document
.Event
constructor.EventTarget.addEventListener()
.EventTarget.dispatchEvent()
.