【问题标题】:Linear Gradients not working with javascript线性渐变不适用于 javascript
【发布时间】:2020-08-07 22:46:33
【问题描述】:

我有这个,如果我设置背景并将线性渐变放入 data-src 之前它可以工作,但是当我将其更改为它以支持更多浏览器时,它不再工作了。背景设置为图像,但渐变未显示。发送到控制台的消息是

linear-gradient(to top, rgba(2, 0, 36, .8) 0%, rgba(0, 0, 0, 0) 100%), url( '/static/images/mountain.jpg');

var url = "url( '" + slide.dataset.src + "')";

slide.style.backgroundImage = url;
if (slide.dataset.type == 'linear') {
  var direction = slide.dataset.lindir;
  var linstart = slide.dataset.linstart;
  var linend = slide.dataset.linend;

  var gradient = "linear-gradient(" + direction + ", " + linstart + ", " + linend + ")";

  if (!(url == null)) {
    gradient += (", " + url);
  }

  gradient += (";");

  console.log(gradient);
  slide.style.background = "-moz-" + gradient;
  slide.style.background = "-webkit-" + gradient;
  slide.style.background = gradient;
}
<div class="content category cursor-hand has-text-centered load" data-type="linear" data-lindir="to top" data-linstart="rgba(2, 0, 36, .8) 0%" data-linend="rgba(0, 0, 0, 0) 100%" data-src="{{ category.url }}">

【问题讨论】:

  • 您应该在 slide.style.background 的最后两个赋值中使用 += 运算符
  • @Hisato 不,我们不应该使用 += 我们需要删除前两个,因为它们没用。
  • 我知道,它们没用,但如果他真的想让它有这 3 行,它就无法正常工作。

标签: javascript html css gradient


【解决方案1】:

根本问题是您不需要添加分号,因为您是在 JavaScript 中设置样式,而不是向样式表添加样式。我已经在下面评论了这一点,你可以看到它有效。

正如其他人所指出的,您也错误地使用了供应商前缀。有关该主题的更多信息,请参阅Setting vendor-prefixed CSS using javascript

但请注意,support for multiple CSS backgrounds goes back to IE 9,因此您可能根本不需要前缀。

需要注意的一点是,由于除了background-image 之外,您没有在JS 中设置任何其他背景属性,因此最好始终使用style.backgroundImage,而不是切换到style.background。这将使您可以控制样式表中 background 简写中包含的其他属性。

var slide = document.querySelector('.slide');

var url = "url( '" + slide.dataset.src + "')";

slide.style.backgroundImage = url;
if (slide.dataset.type == 'linear') {
  var direction = slide.dataset.lindir;
  var linstart = slide.dataset.linstart;
  var linend = slide.dataset.linend;

  var gradient = "linear-gradient(" + direction + ", " + linstart + ", " + linend + ")";

  if (!(url == null)) {
    gradient += (", " + url);
  }

  //gradient += (";");

  console.log(gradient);
  slide.style.MozBackground = gradient;
  slide.style.WebkitBackground = gradient;
  slide.style.background = gradient;
}
.slide {
  width: 300px;
  height: 300px;
}
<div class="slide content category cursor-hand has-text-centered load" data-type="linear" data-lindir="to top" data-linstart="rgba(2, 0, 36, .8) 0%" data-linend="rgba(0, 0, 0, 0) 100%" data-src="{{ category.url }}"></div>

【讨论】:

  • @AxelAldrich 我没有对你投反对票。你原来的回答只说OP需要使用background-image而不是background,这实际上不是问题。现在您已经更新了答案,它更有帮助。您对部分覆盖的样式和background-image 更有帮助是正确的,但是在我看来,您的回答现在并不能很清楚地解释这一点。如果你能更新你的答案,我会支持你。我会更新我的。
  • @AxelAldrich 您可能会在看到问题和答案的人仍然缺少信息时投下反对票,然后在看到您的编辑之前继续前进,这并不罕见。最好从一开始就尽可能完整地回答您的问题。如果你的答案实际上是不正确的,那么这就是存在反对票的全部原因:)
  • 至于这个问题,我自己的测试(在 CodePen 上)表明,即使您在 OP 的代码中使用 background 而不是 background-image,视觉结果也符合预期,即使另一个背景在技术上仍然存在。所以说“你需要”使用background-image 是,出于实际目的,是不正确的,尽管还有其他原因,这是一个好主意(我已经更新了我的帖子)。
  • 分号也是我的问题...非常感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多