【问题标题】:Is it possible to create a css based gradient on a fixed height scale?是否可以在固定高度比例上创建基于 CSS 的渐变?
【发布时间】:2020-12-24 18:38:29
【问题描述】:

我有一个 div 以编程方式调整大小并位于包装 div 内。我希望(内部)div 的背景颜色为渐变,但渐变基于包装 div 的高度。

例如,渐变可能类似于background: linear-gradient(0deg, green 0%, green 50%, yellow 80%, orange 90%, red 100%)

当内部 div 小于包装 div 高度的 50% 时,我希望它是完全绿色的,但如果达到 70%,它会在顶部开始变黄,在 80% 时顶部开始变为橙色,如果达到 100%,它将具有完整的渐变。请参阅下面的代码笔,了解我在颜色方面的含义。

内部 div 将每 10 秒左右调整一次大小,看起来类似于音频峰值表。

这可以通过纯 CSS 实现,还是我需要使用 javascript?如果我使用 javascript,拥有一堆 css 类并根据百分比切换它们会更高效吗?还是直接着色?

我可以使用多个块来实现这一点,例如 https://codepen.io/octod/pen/vPQLVo(不是我的),但理想情况下,我希望它是一个具有平滑渐变的连续颜色块。

我也可以通过保持内部 div 的全高并调整覆盖 div 的大小来实现它,但不幸的是我有一个透明背景,所以这并不理想。

编辑:根据要求,这是我目前无法使用的(当内部 div 不是全高时,它会显示完整的渐变)。我已经对其进行了简化,并将 css 内嵌在这篇文章中。

真正的 sn-p:(由 Mister Jojos 编辑 - 这不代表我的代码,但接受的答案是基于这个版本的,所以我就这样留下了它

.outer {
  display: inline-block;
  height: 400px;
  width: 40px;
  background-color: dimgrey;
  padding: 5px;
  margin: 1em;
  }
.outer > div {
  width: 100%;
  }
  #inner50 {
  height: 50%;
  background: linear-gradient(0deg, green 0%, green 50%, yellow 80%, orange 90%, red 100%);
  }
#inner70 {        /* please set the gradient values */
  height: 70%;
  background: linear-gradient(0deg, green 0%, green 50%, yellow 80%, orange 90%, red 100%);
  }
#inner100 {       /* please set the gradient values */
  height: 100%;
  background: linear-gradient(0deg, green 0%, green 50%, yellow 80%, orange 90%, red 100%);
  }
 
 <!-- result in case 50% --> 
 <div class="outer">  <div id="inner50"></div> </div>

 <!-- result in case 70% --> 
<div class="outer">  <div id="inner70"></div> </div>

 <!-- result in case 100% --> 
<div class="outer">  <div id="inner100"></div> </div>

Javascript sn-p:

// this function is called every 1/10th of a second
function updateMeter(newHeight) {
    getElementById("inner").style.height = newHeight+'px';
}

【问题讨论】:

  • 所以我们在 div (B) 中有一个 div (A),并且 div (A) 每十分之一秒改变一次音高。 div (A) 可以在 div (B) 的 50% 到 100% 之间变化,并根据该高度改变颜色。而已?你写的东西让我很困惑,我的翻译也很困惑。我有一个答案的想法,但在我清楚地理解之前我不会做任何事情
  • 但是,您是否注意到这个平台不是代码编写服务?您必须生成最少的代码,至少具有 html 结构和某些相关案例的 css...
  • 我可以输入我拥有的代码来改变内部 div 的高度,但这没什么特别的,我不确定它是否真的相关。我也可以输入与覆盖一起使用的代码(但它不适合透明背景),但我再次不确定它是否相关。翻译似乎没有很好地表达问题。如果您查看我链接的代码笔,这就是我想要的,但它有一个实心块和平滑渐变,而不是许多单独的块。
  • 一个 div 自己改变大小是不可能的,如何模拟这种动作来测试代码?我更改了您的代码,请完成它。恍惚在哪里???
  • 您的 codePen 使我的机器崩溃,并导致我丢失了我为回答您而编写的代码的开头。不管怎样,我不想去分析那里写的 150 行代码。您必须自己更好地解释

标签: css linear-gradients


【解决方案1】:

只需将渐变的大小固定为外层div的大小即可:

.outer {
  display: inline-block;
  height: 400px;
  width: 40px;
  background-color: dimgrey;
  padding: 5px;
  margin: 1em;
}

.outer>div {
  width: 100%;
  background: 
    linear-gradient(0deg, green 0%, green 50%, yellow 80%, orange 90%, red 100%) 
      top/ /* place it on the top */
      100% 400px; /* width=100% height=400px */
}

#inner50 {
  height: 50%;
}

#inner70 {
  height: 70%;
}

#inner100 {
  height: 100%;
}
<!-- result in case 50% -->
<div class="outer">
  <div id="inner50"></div>
</div>

<!-- result in case 70% -->
<div class="outer">
  <div id="inner70"></div>
</div>

<!-- result in case 100% -->
<div class="outer">
  <div id="inner100"></div>
</div>

也像下面这样:

.outer {
  display: inline-flex;
  height: 400px;
  width: 40px;
  background-color: dimgrey;
  padding: 5px;
  margin: 1em;
}

.outer>div {
  width: 100%;
  margin-top:auto;
  background: 
    linear-gradient(0deg, green 0%, green 50%, yellow 80%, orange 90%, red 100%) 
      bottom/ /* place it on the top */
      100% 400px; /* width=100% height=400px */
}

#inner50 {
  height: 50%;
}

#inner70 {
  height: 70%;
}

#inner100 {
  height: 100%;
}
<!-- result in case 50% -->
<div class="outer">
  <div id="inner50"></div>
</div>

<!-- result in case 70% -->
<div class="outer">
  <div id="inner70"></div>
</div>

<!-- result in case 100% -->
<div class="outer">
  <div id="inner100"></div>
</div>

【讨论】:

  • 不,梯度值根据高度值而变化,但我不明白 PO 的解释
  • 第二个例子正是我所需要的(除了外面的div会有一个透明的背景),谢谢!
  • 附加说明:实际案例只有一个 div(不是三个,但我的原始代码 sn-p 已被 @MisterJojo 更改),但是我可以在您的答案中只使用其中一个 div 并更改高度动态,所以它适合我所拥有的。我将把 Jojos 先生的代码留在那里,否则你的回答没有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2016-05-05
  • 2022-12-15
  • 1970-01-01
  • 2018-10-08
  • 2021-04-17
  • 1970-01-01
相关资源
最近更新 更多