【问题标题】:Assigning gradient using JS fails on dynamically generated gradient使用 JS 分配渐变在动态生成的渐变上失败
【发布时间】: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([&lt;&gt;] 工具栏按钮)将您的可运行示例现场放置here's how to do one。三个原因:人们不应该去场外帮助你;某些网站被某些用户屏蔽;和链接腐烂,使问题及其答案对未来的人们毫无用处。谢谢。 (这次我已经为你复制了它,虽然我真的不应该因为许可而这样做......)
  • (旁注:如果您没有在未显示的代码中声明 i,请注意该代码会成为我所说的 The Horror of Implicit Globals 的牺牲品。:-))
  • 当我运行 sn-p 时,我肯定看到渐变在移动,但可能不是你想要的那样。我怀疑这是因为clientXclientY 是相对于视口的,但在radial-gradient 中它们是相对于background-position。但是我没有足够的渐变来发布答案,这只是一个怀疑。
  • 有意思,你用的是什么浏览器?对我来说,Safari 不显示蓝红色渐变,只显示 CSS 黄绿色后备。更新:在火狐也试过了,还是只能看到黄绿渐变,蓝红没有赋值。
  • 更新:我找到了一台 Windows 10 机器并在 Firefox 上进行了尝试。同样的问题。

标签: javascript css frontend dom-events radial-gradients


【解决方案1】:

问题是您的价值观没有任何单位。 0 是一个特殊值,它不需要任何单位,但所有其他值都需要。

添加px即可解决问题:

let gradient = 'radial-gradient(circle at ' + e.clientX + 'px ' + e.clientY + 'px, blue, red)';
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^−−−−−−−−−−−−−−−−−−^^

FWIW,我会使用模板文字:

let gradient = `radial-gradient(circle at ${e.clientX}px ${e.clientY}px, blue, red)`;
// −−−−−−−−−−−−^−−−−−−−−−−−−−−−−−−−−−−−−−−^^−−−−−−−−−^^^−^^−−−−−−−−−^^^−−−−−−−−−−−−^

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}px ${e.clientY}px, blue, red)`;
    console.log(gradient);
    e.target.style.background = gradient;
  });
}
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>

【讨论】:

    【解决方案2】:

    您忘记在班级名称之间添加“”。

    你可以在这里检查你的代码:

    Code here

    代码:

    <div class="buggy-gradient"> Gradient1</div>
    <div class="buggy-gradient">Gradient2</div>
    <div class="buggy-gradient">Gradient3</div>
    <script>
    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)';
      });
      console.log('Show')
    }
    </script>
    

    【讨论】:

    • 正如我所写:这行得通。对我不起作用的是“让渐变 = 'radial-gradient(circle at ' + e.clientX + ' ' + e.clientY + ', blue, red)'; e.target.style.background = gradient; "它没有被分配。
    • "你忘记在你的类名之间添加 ""。" 如果你的意思是 OP 需要"围绕类名,不,他们没有。如果只有一个类名," 完全是可选的(即使类名有连字符)。见:html.spec.whatwg.org/multipage/syntax.html#unquoted
    猜你喜欢
    • 2013-01-28
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多