Круг с исчезающими краями снизу

Я пытаюсь сделать это изображение с помощью css (или svg). Для меня самая сложная часть - это полудуга на левой и правой стороне круга. Следует ли мне придерживаться чистого CSS или лучше использовать изображения?

введите сюда описание изображения

Вот что мне удалось сделать:

введите сюда описание изображения

Мой код

body {
  background-color: #002911 !important;
}

h3 {
  color: #ffd004;
}

#actions-container {
  margin-top: 30px;
}

#actions-container .action-icon {
  width: 200px;
  height: 200px;
  background-color: rgb(255, 208, 4);
  border-radius: 50%;
  box-shadow: 5px -2px 6px 3px #0000004a;
  /* center contents*/
  display: flex;
  justify-content: center;
  align-items: center;
}

.right-arc {
  position: relative;
  display: inline-block;
  font-size: 30px;
  color: lightgreen;
  margin: 40px;
}

.right-arc::after {
  content: '';
  position: absolute;
  right: -150px;
  top: 57px;
  height: 300px;
  width: 300px;
  border-radius: 50% 50% 50% 50%;
  border-width: 0px 1px 0px 0px;
  border-style: solid;
  /*border-top: outset;*/
}


/*svg {
            width: 33%;
            height: auto;
        }*/
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet" />
<div class="container" id="actions-container">
  <div class="d-flex justify-content-between">

    <div class="action-icon-box text-center ">
      <div class="right-arc">

      </div>


      <h3 class="text-center">Title</h3>

      <div class="p-1 action-icon text-center mt-4">
        <a href="#"><img class="center" src="/Content/images/lp-homepage/microphone.png" height="100" /></a>
      </div>
    </div>

  </div>
</div>

Свободный перевод вопроса Circle with fading borders on the bottom от участника @TheMah.


Ответы (3 шт):

Автор решения: Alexandr_TT

Вы можете использовать псевдоэлемент с inset box-shadow, чтобы создать исчезающую границу внизу, как эта:

body {
  background: #232323;
}

.wrap {
  box-sizing: border-box;
  position: relative;
  width: 50%;
  border: 3px solid #ffd004;
  border-radius: 50%;
}

.wrap::before {
  content:'';
  display:block;
  padding-bottom:100%;
}

.wrap::after {
  content: '';
  position: absolute;
  bottom: -3px;
  left: -3px;
  right: -3px;
  height: 100%;
  z-index: 1;
  box-shadow: inset 0px -270px 70px -100px #232323;
}

.title {
  color: #ffd004;
  margin: 0;
  position: absolute;
  top: -3px;
  left: 0;
  width: 100%;
  text-align: center;
  z-index: 2;
  background: #232323;
}

.circle {
  position: absolute;
  top:15%;
  left:15%;
  width: 70%;
  height: 70%;
  border-radius: 50%;
  background: #ffd004;
  z-index: 2;
}
<div class="wrap">
  <h2 class="title">Title</h2>
  <div class="circle"></div>
</div>

Имейте в виду, что это будет работать только на однотонном фоне. Если вам нужно отобразить это поверх градиента или изображения, я настоятельно рекомендую использовать SVG.

Свободный перевод ответа от участника @web-tiki.

→ Ссылка
Автор решения: UModeL

Для однотонного фона код можно сократить, если использовать конический и радиальный градиенты (Внимание! Пока не поддерживается в Firefox):

/* Only for demo */ document.querySelector('div.controls').addEventListener('input',function(ev){let v=ev.target.dataset.var;switch(v){case "cb":case "cl":case "cc":case "ct":document.body.style.setProperty(`--${v}`,`hsl(${ev.target.value}deg 100% 50%)`);break;case "tl":document.body.style.setProperty(`--${v}`,`${75 - ev.target.value}%`);break;case "dc":document.body.style.setProperty(`--${v}`,`${ev.target.value}%`);break;case "tx":document.body.style.setProperty(`--${v}`,`'${ev.target.value}'`);break}})
/* Only for demo */ body{--cb:hsl(260deg 100% 50%);--cl:hsl(50deg 100% 51%);--cc:hsl(50deg 100% 51%);--ct:hsl(50deg 100% 51%);--tl:66%;--dc:60%;--tx:'Title';height:100vh;margin:0;display:flex;justify-content:space-around;align-items:center;background-color:var(--cb)}.controls{display:flex;flex-flow:column wrap;align-items:center;height:149px;width:270px;text-transform:uppercase;text-shadow:-1px -1px 1px #fff,1px -1px 1px #fff,1px 1px 1px #fff,-1px 1px 1px #fff;font:bold 11px/1em Arial}.text,.thick,.color{appearance:none;margin-bottom:.7em;border-radius:1em;outline:none;box-shadow:inset 1px 3px 4px -1px #000}.text{width:46%;margin-top:.7em;padding:2px;border:none;font:bold 11px Arial;text-align:center}.thick{background-image:linear-gradient(to right bottom,#fff calc(50% - 1px),#000 calc(50% + 1px))}.color{background-image:linear-gradient(to right,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)}.thick::-webkit-slider-thumb,.color::-webkit-slider-thumb{border-radius:1em;box-shadow:inset 0 0 1px 2px #000,inset -1px -3px 4px 0 #000,inset 0 0 0 10px #fff}

.circle {
  position: relative;
  height: 160px;
  width: 160px;
  border-radius: 50%;
  background-image: 
    radial-gradient(
      circle, 
      var(--cc, #ffd505) calc(var(--dc, 60%) - 1px), 
      var(--cb, #5500ff) var(--dc, 60%), 
      var(--cb, #5500ff) calc(var(--tl, 66%) - 1px), 
      transparent var(--tl, 66%)), 
    conic-gradient(
      transparent 30deg,
      var(--cl, #ffd505) 31deg,
      transparent 140deg,
      transparent 220deg,
      var(--cl, #ffd505) 329deg,
      transparent 330deg);
}
.circle::after {
  content: var(--tx, 'Title');
  position: absolute;
  top: -.5em;
  left: 0;
  z-index: 1;
  width: 100%;
  margin: 0;
  font: bold 32px/1em serif;
  text-align: center;
  color: var(--ct, #ffd505);
  background-color: var(--cb, #5500ff);
}
<!-- Only for demo --> <div class="controls">цвет&nbsp;фона<input type="range" class="color" data-var="cb" max="360" value="260"> цвет&nbsp;линий<input type="range" class="color" data-var="cl" max="360" value="50"> цвет&nbsp;круга<input type="range" class="color" data-var="cc" max="360" value="50"><span class="text">текст</span>цвет&nbsp;текста<input type="range" class="color" data-var="ct" max="360" value="50"> толщина&nbsp;линий<input type="range" class="thick" data-var="tl" max="75" value="9"> диаметр&nbsp;круга<input type="range" class="thick" data-var="dc" max="75" value="50"><input type="text" class="text" data-var="tx" maxlength="10" value="Title"></div>

<div class="circle"></div>

В реальном проекте все css-переменные можно заменить статическими значениями. Все необязательные строки предваряются соответствующим комментарием, служат только для наглядности и могут быть удалены.

→ Ссылка
Автор решения: CbIPoK2513

На CSS, при условии, что фон будет одного цвета.

body {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  min-height: 100vh;
  background: #666;
  margin: 0;
}

.circle {
  display: block;
  width: 200px;
  height: 200px;
  border-radius: 50%;
  background: #666 linear-gradient(to bottom, 
    transparent 5%,
    rgba(255,255,0,1) 5%,
    rgba(255,255,0,1) 25%,
    rgba(255,255,0,0)
  );
  padding: 3px;
  position: relative;
  box-sizing: border-box;
}

.circle .wrap {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  background: #666;
  width: 100%;
  height: 100%;
  border-radius: 50%;
}

.circle .title {
  display: block;
  width: 100%;
  color: yellow;
  font-weight: bold;
  font-size: 150%;
  text-align: center;
  position: absolute;
  top: 0;
  transform: translateY(-25%);
}

.circle .icon {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 150px;
  height: 150px;
  border-radius: 50%;
  background: yellow;
}

.circle .icon img {
  display: block;
  width: 50%;
  height: 50%;
  object-fit: contain;
}
<div class="circle">
  <div class="wrap">
    <div class="title">Title</div>
    <div class="icon">
      <img src="//i.imgur.com/TR3rp8j.png">
    </div>
  </div>
</div>

В противном случае, советую использовать SVG

→ Ссылка