【问题标题】:How to create a curved gauge having linear-gradient as background?如何创建一个以线性梯度为背景的弯曲仪表?
【发布时间】:2020-10-01 04:18:33
【问题描述】:

我想用纯 CSS 制作一个 0-100% 响应的仪表,颜色渐变从绿色到红色。我找到了一些示例,但无法在其中任何一个中正确使用渐变。经过一些测试,我设法让它有点工作。它基本上是一个带有线性渐变背景的背景 div 和一个带有半透明边框的白色前景 div,使用边框半径使它们变圆。当我旋转前景 div 时,它会显示或隐藏渐变背景 div 的部分。

但我有这个视觉故障,我不知道如何解决:

前景 div 的白色边框没有完全遮挡渐变 div。

这是我的测试代码(它可能包含我之前所做的所有测试中不必要的 css 规则):

https://jsfiddle.net/fLtzrg3w/

HTML:

  <div class="c">
    <div class="go">
      <div class="g"></div>
      <div class="gbg"></div>
    </div>
  </div>

CSS:

.c{
  position: relative;
  float:left;
  text-align: center;
  width: 50%;
  padding: 25% 5px 0 5px;
  height: 1rem;
  overflow:hidden;
}

.go{
  position: relative;
  width: 100%;
  overflow: hidden;
  padding-top:100%;
  margin-top: -50%;
}

.g{
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  border-radius: 50%;
  box-sizing: border-box;
  border: 40px solid transparent;
  border-bottom-color: #fff;
  border-right-color: #fff;
  transform: rotate(20deg);
  background: white;
  background-clip: padding-box;
  z-index: 2;
}

.gbg{
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  border-radius: 50%;
  box-sizing: border-box;
  background: linear-gradient(to right, green 0%, yellow 50%, red 100%);
  z-index: 1;
}

如何让白色div完全覆盖背景渐变div?

【问题讨论】:

  • 这可能会有所帮助:codepen.io/xgh/pen/ExaXgbb
  • @Mech 我想我看到了那个,但是在将它从固定宽度/高度转换为 % 后遇到了同样的问题,稍后再试一次。
  • NP。祝你好运! :)

标签: html css border linear-gradients


【解决方案1】:

我会以不同的方式使用多个背景:

.box {
  width:250px;
  border-radius:500px 500px 0 0;
  background:
     /* a linear gradient to control the progress. Adjust the angle from 0deg to 180deg*/
     linear-gradient(160deg,transparent 50%,#fff 0) top/100% 200%,
     /* a radial gradient to show only a part of the gradient (20px here)*/
     radial-gradient(farthest-side at bottom,#fff calc(100% - 20px),transparent 0),
     /* the main gradient */
     linear-gradient(to right, green , yellow , red);
}
.box::before {
  content:"";
  display:block;
  padding-top:50%;
}
&lt;div class="box"&gt;&lt;/div&gt;

您可以使用 CSS 变量进行优化:

.box {
  --p:160deg;
  --b:20px;
  
  width:250px;
  display:inline-block;
  border-radius:500px 500px 0 0;
  background:
     /* a linear gradient to control the progress. Adjust the angle from 0deg to 180deg*/
     linear-gradient(var(--p),transparent 50%,#fff 0) top/100% 200%,
     /* a radial gradient to show only a part of the gradient (20px here)*/
     radial-gradient(farthest-side at bottom,#fff calc(100% - var(--b) - 1px),transparent calc(100% - var(--b))),
     /* the main gradient */
     linear-gradient(to right, green , yellow , red);
}
.box::before {
  content:"";
  display:block;
  padding-top:50%;
}
<div class="box"></div>
<div class="box" style="--b:30px;--p:90deg"></div>
<div class="box" style="--b:10px;--p:40deg"></div>

另一种语法:

.box {
  --p:160deg;
  --b:20px;
  
  width:250px;
  display:inline-block;
  border-radius:500px 500px 0 0;
  padding:var(--b) var(--b) 0;
  background:
     linear-gradient(var(--p),transparent 50%,#fff 0) top/100% 200%,
     linear-gradient(#fff,#fff) content-box,
     linear-gradient(to right, green , yellow , red);
}
.box::before {
  content:"";
  display:block;
  padding-top:50%;
}
<div class="box"></div>
<div class="box" style="--b:30px;--p:90deg"></div>
<div class="box" style="--b:10px;--p:40deg"></div>

并使用遮罩来获得透明度:

.box {
  --p:160deg;
  --b:20px;
  
  width:250px;
  display:inline-block;
  border-radius:500px 500px 0 0;
  background: linear-gradient(to right, green , yellow , red);
  -webkit-mask:
     radial-gradient(farthest-side at bottom,transparent calc(100% - var(--b) - 1px),#fff calc(100% - var(--b))),
     linear-gradient(var(--p),#fff 50%,transparent 0) top/100% 200%;
  -webkit-mask-composite:destination-in;
          mask-composite:intersect;
}
.box::before {
  content:"";
  display:block;
  padding-top:50%;
}

body {
  background:#f3f3f3;
}
<div class="box"></div>
<div class="box" style="--b:30px;--p:90deg"></div>
<div class="box" style="--b:10px;--p:40deg"></div>

【讨论】:

  • 你知道如何让 .box 宽度达到父级的 50% 的百分比吗?由于您对 250px 宽度的 .box 使用 500px 边框半径,我尝试将 100% 半径用于 50% 宽度的 .box,但没有正常工作:jsfiddle.net/c39w2u5z
  • @Mark 使用一个非常大的值,比如 5000px 甚至 100vmax。它需要是长度而不是百分比jsfiddle.net/zowv4k1u
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2020-02-27
  • 2014-09-19
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
相关资源
最近更新 更多