【发布时间】:2021-02-05 12:07:14
【问题描述】:
如果 CSS 字符串是在运行时在 JS 中生成的,则为 HTML 元素分配渐变会失败,但如果它是定义为常量的字符串,则不会。我想在光标的位置生成一个径向渐变,但我简化了这个示例,只包含导致不需要的行为所需的代码行。
HTML:
<div class=buggy-gradient></div>
<div class=buggy-gradient></div>
<div class=buggy-gradient></div>
JS(不工作):
let divs = document.getElementsByClassName('buggy-gradient');
for(i = 0; i < divs.length; i++){
divs.item(i).addEventListener('mousemove', e => {
let gradient = 'radial-gradient(circle at ' + e.clientX + ' ' + e.clientY + ', blue, red)';
console.log(gradient);
e.target.style.background = gradient;
});
}
控制台日志显示我想要的 CSS 行,但分配它显然失败:
“径向渐变(1044 325 处的圆圈,蓝色,红色)”
JS(工作):
let divs = document.getElementsByClassName('buggy-gradient');
for(i = 0; i < divs.length; i++){
divs.item(i).addEventListener('mousemove', e => {
e.target.style.background = 'radial-gradient(circle at 0 0, blue, red)';
});
}
我做了一支笔:https://codepen.io/stairjoke/pen/poNgKbm
作为堆栈片段:
let divs = document.getElementsByClassName('buggy-gradient');
for(i = 0; i < divs.length; i++){
divs.item(i).addEventListener('mousemove', e => {
let gradient = 'radial-gradient(circle at ' + e.clientX + ' ' + e.clientY + ', blue, red)';
console.log(gradient);
e.target.style.background = gradient;
// e.target.style.background = 'radial-gradient(circle at 0 0, blue, red)';
});
}
div {
height: 400px;
width: 400px;
background: radial-gradient(green, yellow);
display: inline-block;
margin: 5px;
}
<div class=buggy-gradient></div>
<div class=buggy-gradient></div>
<div class=buggy-gradient></div>
【问题讨论】:
-
“我做了一支笔” 请使用 Stack Snippets(
[<>]工具栏按钮)将您的可运行示例现场放置; here's how to do one。三个原因:人们不应该去场外帮助你;某些网站被某些用户屏蔽;和链接腐烂,使问题及其答案对未来的人们毫无用处。谢谢。 (这次我已经为你复制了它,虽然我真的不应该因为许可而这样做......) -
(旁注:如果您没有在未显示的代码中声明
i,请注意该代码会成为我所说的 The Horror of Implicit Globals 的牺牲品。:-)) -
当我运行 sn-p 时,我肯定看到渐变在移动,但可能不是你想要的那样。我怀疑这是因为
clientX和clientY是相对于视口的,但在radial-gradient中它们是相对于background-position。但是我没有足够的渐变来发布答案,这只是一个怀疑。 -
有意思,你用的是什么浏览器?对我来说,Safari 不显示蓝红色渐变,只显示 CSS 黄绿色后备。更新:在火狐也试过了,还是只能看到黄绿渐变,蓝红没有赋值。
-
更新:我找到了一台 Windows 10 机器并在 Firefox 上进行了尝试。同样的问题。
标签: javascript css frontend dom-events radial-gradients