我正在构建一个范围/滑块,将用户结果与平均值进行比较.我真的很难让滑块下的文本按我想要的方式运行:

Example

我已经设法使箭头、百分比和文本与前两幅图像一样正确居中,但当我将位置设置得过高或过低时,文本会溢出到页面的另一个区域.我想要的是像最后两幅图像一样的行为,文本保持在其范围内.

我try 了两种不同的方法,但最终结果相同,现在我陷入了困境:

<div style="`margin-left:${areaScore}%;margin-right:${100 - areaScore}%;text-align:center`">
    <div style="transform: translateX(-50%)" >^</div>
    <div style="transform: translateX(-50%); width: 50px">
        {{ areaScore }}%
    </div>
    <div style="transform: translateX(-50%); width: 150px">
          The average in your area
    </div>
</div>
<div style="position: relative; text-align: center">
    <div :style="`position:absolute;left:${areaScore}%`">^</div>
    <div :style="`position:absolute;left:${areaScore}%;top:10px`">
        {{ areaScore }}%
    </div>
    <div :style="`position:absolute;left:${areaScore}%;top:24px`">
        The average in your area
    </div>
</div>

我可能应该提到,我使用的是Vue,因此使用了mustache 、冒号之前的样式和areaScore的参数化,但我认为这与我的问题并不特别相关.

我相信这个问题是可以解决的,但我已经浪费了太多时间试图找到解决方案,我希望有人能给我指出正确的方向.

推荐答案

这需要使用JavaScript进行一些计算.我不知道vue,所以我将使用纯JS给出我的答案.我已经整理了一个移动文本的示例.让我们先看看HTML:

<div class="container">
  <input class="slider" type="range" min="0" max="100">
  <div>
    <span class="percent">50%</span>
  </div>
  <div>
    <span class="text">Some long text</span>
  </div>
</div>

我把文本和百分比(就像你的分数)放在div个元素中的span个元素中.原因是默认情况下,a div会延伸到整个宽度上(因为display: block).内部需要有一个元素,其宽度我们可以读取,位置我们可以操纵.

现在无法定位span,因为它显示为inline.所以,我在上面使用display: inline-block:

.percent, .text {
  display: inline-block;
}

最后一部分是JavaScript计算:

const slider = document.querySelector('.slider');
const percent = document.querySelector('.percent');
const text = document.querySelector('.text');

slider.value = 50;
setPercent(50);
positionElement(text, 50);

slider.addEventListener("input", (event) => {
  setPercent(event.target.value);
  positionElement(text, event.target.value);
});

function setPercent(value) {
  percent.textContent = value + '%';
  positionElement(percent, value);
}
  
function positionElement(element, value) {
  const width = element.offsetWidth;
  const xPosition = Math.min(Math.max(value - (width / 2), 0), 100 - width);
  element.style.transform = `translateX(${xPosition}px)`;
}

按键使用translateX移动span个元素,就像您已经做的那样.使用Math.minMath.max,我们可以根据元素的宽度为该移动设置边界.重要提示:首先设置新文本,然后获取宽度并更改translateX.translateX基于滑动区域的translateXpx宽度.

如果要在拖动时更新位置,则需要更新https://stackoverflow.com/a/19067260/4874075中的input个事件.

我已经把这个例子放在代码笔上:https://codepen.io/andreas-tennert/pen/YzeMoee

Html相关问答推荐

如何将值从Google Sheets侧边栏中的表单中的输入传递到Google Sheets单元格中使用Textile()

如何才能只给没有孟加拉语Kar符号的字母上色?

将网格包装在css中

容器内的SVG图像没有响应

如何从卷轴中排除粘性元素?

嵌套表列高度不是100%高度的问题

我怎样才能在我的网站上制作花哨的角落

从网页中提取URL

如何创建嵌套的动态表单元素

使用bash从html表格中提取表格

根据Tailwind CSS中的子计数而非子宽度进行对齐,并水平对齐

CSS 伪类 Select 器未按预期工作

我真的需要一个容器来让行和列正常工作吗? ( bootstrap 程序 v5)

表单中如何分别禁用/启用多个提交按钮?

SVG 填充 colored颜色 不使用轮廓填充空白区域

如何在 bootstrap 程序导航栏中居中搜索图标

在不扭曲图像的情况下将图像放入灵活的 Div 框内

如何突出显示 .qmd html 文件中的特定代码行

如何使列表的第一个元素比 css 中的其他元素大?

动态使用时波浪号不转换为绝对路径