如何使用 HTML CSS 创建半圆/椭圆?就像仪表/车速表一样

gSa*_*ann 1 html css gauge

我正在尝试做这样的事情:

在此输入图像描述

它不是一个完整的或半圆,并且边缘有一点半径。还需要包含一些点来以百分比显示当前位置。有人可以告诉我如何将类似于以下 3 个想法的东西组合在一起吗?

.circle {
   display: flex;
   width: 200px;
   height: 100px;
   border-top-left-radius: 200px;
   border-top-right-radius: 200px;
   border: 10px solid gray;
   border-bottom: 0;
}

.circle>.text {
   font-size: 50px;
   margin: auto;
}

.circle.gradient {
   margin-top: 30px;
   border-image-slice: 1;
   border-width: 10px;
   border-bottom: 0;
   border-image-source: linear-gradient(to left, #6ECE34, #E6A749, #E5A749, #F71C1C);
}

.line {
   position: relative;
   margin-top: 30px;
   width: 220px;
   height: 10px;
   border-radius: 5px;
   background: linear-gradient(to left, #6ECE34, #E6A749, #E5A749, #F71C1C);
}

.line>.point {
   position: absolute;
   top: -3px;
   left: 21%;
   width: 8px;
   height: 16px;
   border-radius: 5px;
   border: 1px solid black;
   background: #FFF;
}
Run Code Online (Sandbox Code Playgroud)
<!-- Just semi circle -->
<div class="circle">
   <div class="text">
      21
   </div>
</div>

<!-- With gradient border -->
<div class="circle gradient"></div>

<!-- Maybe strech in Y -->
<div class="line">
   <!-- Relative point -->
   <div class="point"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

A H*_*rth 6

您可以使用 CSS 来拼凑外观和功能,并使用用于更新速度的任何语言来更新指针位置/斜率的 CSS 变量。

这是仅为演示设置的 --pointerleft、--pointerright 和 --pointerdeg 的外观片段。在操作代码中,您需要执行一些三角函数来计算当时给定的特定速度,然后设置 CSS 变量(例如在 JS 中)。

是否使用径向和圆锥渐变,然后必须在末端放置小圆位可以说是我不知道的建议。SO 不喜欢推荐,但我会冒险并建议这可行,但有点老套,SVG 可能会更好。

请注意,该片段只有一个简单的 3 色圆锥渐变,您可以根据需要在不同程度添加更多/不同的颜色。

.ring {
  position: relative;
  --pointerleft: 11%;
  --pointertop: 11%;
  --pointerdeg: -45deg;
  width: 50vmin;
  height: 50vmin;
  background-image: radial-gradient(red 0, red 50%, transparent 50%, transparent 100%), radial-gradient(green 0, green 50%, transparent 50%, transparent 100%), radial-gradient(white 0, white 60%, transparent 60%), conic-gradient(orange 0, green 130deg, white 130deg, white 230deg, red 230deg, orange 360deg);
  background-size: 11% 11%, 11% 11%, 100% 100%, 100% 100%;
  background-repeat: no-repeat;
  background-position: 9.2% 82.3%, 90.8% 82.3%, center center, center center;
  border-radius: 50%;
  border-style: none;
}

.ring::after {
  position: absolute;
  content: '';
  width: 5%;
  height: 15%;
  left: var(--pointerleft);
  top: var(--pointertop);
  transform: rotate(var(--pointerdeg));
  border-style: solid;
  border-width: 0.5vmin;
  border-radius: 2vmin;
  background-color: white;
}

.speed {
  display: inline-block;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translateX(-50%) translateY(-50%);
  text-align: center;
  color: gray;
}

.speed .number {
  font-size: 6vw;
}

.speed .units {
  font-size: 3vw;
}
Run Code Online (Sandbox Code Playgroud)
<div class="ring">
  <div class="speed">
    <div class="number">21</div>
    <div class="units" style=";">km/h</div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)