如何在 CSS 中创建双色戒指?

How do I create dual-coloured rings in CSS?

如何在 CSS and/or JS 中制作此设计中的戒指?

图标数量是动态的。

要求戒指是动态的;不是图片的一部分。

使用边框图片

border-image: linear-gradient(to right, darkblue, darkorchid) 1;

看下面的例子。

.btn-gradient-1 {
  background-color:transparent;
  border-width: 4px;
  border-style: solid;
  border-image: linear-gradient(to right, darkblue, darkorchid) 1;
}
<div class="padding-x-md padding-y-xl flex flex-center">
  <div class="text-center">
    <div class="margin-bottom-xs">
      <button class="reset btn-gradient-1">Button One</button>
    </div>
  </div>
</div>

编辑:在您的情况下,您可能希望为按钮提供相同的高度和宽度 border-radius:50% 以使其呈圆形。

希望对您有所帮助。

您可以在背景中创建比实际元素具有额外高度和宽度的伪元素 (:before)。然后使用 conic-gradient 作为该伪元素的背景。

检查下面的例子:

.knob {
  position: relative;
  width: 120px;
  height: 120px;
  background: #fff;
  border-radius: 50%;
  display: flex;
  justify-content: center;
  align-items: center;
}

.knob:before {
    content: ' ';
    position: absolute;
    display: block;
    top: -5px;
    left: -5px;
    width: calc(100% + 10px);
    height: calc(100% + 10px);
    border-radius: 50%;
    background-image: conic-gradient(#006, #00f 25%, #888 0);
    transition: transform .5s ease-in-out;
    z-index: -2;
}
<div class="knob">25%</div>

有关自定义选项,请查看下面的 CodePen link。

https://codepen.io/rohitutekar/pen/BadOgmg

使用圆锥、径向和线性渐变以及伪元素,您可以构建此代码段中的元素。

可以通过设置 CSS 属性 来设置元素要显示的 'completion' 的百分比(通过 JS 或 PHP 或您使用的任何东西) (变量)在此代码段中称为 --pc。

CSS 然后可以计算圆锥梯度所需的度数,以覆盖 'ring' 的所需部分。

中间的图标可以通过 CSS 掩码 属性 引入,并且具有线性渐变背景,它将采用与环中对应的相同渐变颜色。

* {
  margin: 0;
  padding: 0;
}

.container {
  display: flex;
  width: 100vw;
  height: 100vh;
  justify-content: space-around;
  align-items: center;
  background: black;
}

.partCircle {
  position: relative;
  --lighterBlue: #3490ef;
  --darkerBlue: #304088;
  --gray: #484848;
  --deg: calc(360 * (100 - var(--pc)) / 100);
  --seg: calc((360 - var(--deg)) * 1deg);
  height: 6vw;
  width: 6vw;
  border-radius: 50%;
  background-image: radial-gradient(black 0 65%, transparent 65% 100%), conic-gradient(transparent 0 var(--seg), var(--gray) var(--seg) 360deg), conic-gradient(var(--lighterBlue) 0deg, var(--darkerBlue) 180deg, var(--lighterBlue) 360deg);
  background-size: 100% 100%;
  background-repeat: no-repeat;
}

.partCircle::after {
  content: '';
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  background-image: linear-gradient(var(--lighterBlue), var(--darkerBlue));
  background-size: contain;
  background-position: center;
  background-repeat: no-repeat;
  mask-image: var(--icon);
  mask-size: 60%;
  mask-repeat: no-repeat;
  mask-position: center;
  -webkit-mask-image: var(--icon);
  -webkit-mask-size: 60%;
  -webkit-mask-repeat: no-repeat;
  -webkit-mask-position: center;
}
<div class="container">
  <div class="partCircle" style="--pc: 25; --icon: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/sun.svg);"></div>
  <div class="partCircle" style="--pc: 50; --icon: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/sun.svg);"></div>
  <div class="partCircle" style="--pc: 62.5; --icon: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/sun.svg);"></div>
  <div class="partCircle" style="--pc: 75; --icon: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/sun.svg);"></div>
  <div class="partCircle" style="--pc: 87.5; --icon: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/sun.svg);"></div>
  <div class="partCircle" style="--pc: 100; --icon: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/sun.svg);"></div>
</div>