是否可以在固定高度比例上创建基于 css 的渐变?
Is it possible to create a css based gradient on a fixed height scale?
我有一个 div,它以编程方式调整大小并位于包装器 div 中。我希望(内部)div 的背景颜色是渐变,但渐变基于包装器 div.
的高度
例如,渐变可能类似于 background: linear-gradient(0deg, green 0%, green 50%, yellow 80%, orange 90%, red 100%)
当内部div小于wrapperdiv高度的50%时,我希望它完全是绿色的,但是如果达到70%,它就会开始变绿在顶部变成黄色,在 80% 时它开始在顶部变成橙色,如果它达到 100% 它将具有完整的渐变。有关我在颜色方面的意思的示例,请参见下面的代码笔。
内部 div 将每十分之一秒左右调整一次大小,看起来类似于音频峰值表。
是否可以使用纯 CSS 来实现,还是我需要使用 javascript?如果我使用 javascript,使用一堆 css 类 并根据百分比切换它们,或者直接给事物上色会更高效吗?
我可以用多个块来实现这一点,比如 https://codepen.io/octod/pen/vPQLVo(不是我的),但理想情况下我希望它是一个具有平滑渐变的连续颜色块。
我也可以通过保持内部 div 全高和调整叠加层 div 的大小来实现它,但不幸的是我有透明背景,所以这并不理想。
编辑:根据要求,这是我目前所拥有的但不起作用(当内部 div 不是全高时它显示完整的渐变)。我已经简化了它并为此 post.
内嵌了 css
真实片段:(由 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 片段:
// this function is called every 1/10th of a second
function updateMeter(newHeight) {
getElementById("inner").style.height = newHeight+'px';
}
只需将渐变的大小固定为外层的大小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>
我有一个 div,它以编程方式调整大小并位于包装器 div 中。我希望(内部)div 的背景颜色是渐变,但渐变基于包装器 div.
的高度例如,渐变可能类似于 background: linear-gradient(0deg, green 0%, green 50%, yellow 80%, orange 90%, red 100%)
当内部div小于wrapperdiv高度的50%时,我希望它完全是绿色的,但是如果达到70%,它就会开始变绿在顶部变成黄色,在 80% 时它开始在顶部变成橙色,如果它达到 100% 它将具有完整的渐变。有关我在颜色方面的意思的示例,请参见下面的代码笔。
内部 div 将每十分之一秒左右调整一次大小,看起来类似于音频峰值表。
是否可以使用纯 CSS 来实现,还是我需要使用 javascript?如果我使用 javascript,使用一堆 css 类 并根据百分比切换它们,或者直接给事物上色会更高效吗?
我可以用多个块来实现这一点,比如 https://codepen.io/octod/pen/vPQLVo(不是我的),但理想情况下我希望它是一个具有平滑渐变的连续颜色块。
我也可以通过保持内部 div 全高和调整叠加层 div 的大小来实现它,但不幸的是我有透明背景,所以这并不理想。
编辑:根据要求,这是我目前所拥有的但不起作用(当内部 div 不是全高时它显示完整的渐变)。我已经简化了它并为此 post.
内嵌了 css真实片段:(由 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 片段:
// this function is called every 1/10th of a second
function updateMeter(newHeight) {
getElementById("inner").style.height = newHeight+'px';
}
只需将渐变的大小固定为外层的大小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>