在 Tailwind CSS 中自定义输入范围

Posted

技术标签:

【中文标题】在 Tailwind CSS 中自定义输入范围【英文标题】:Customize Input Range in Tailwind CSS 【发布时间】:2021-11-12 11:09:51 【问题描述】:

如何将标签放在顺风的输入范围下方,如下图所示。

这是你可以看到的游乐场CLICK HERE

<div class="flex justify-center min-h-screen bg-black p-12">
  <input type="range" class="appearance-none w-full h-0.5 bg-grey rounded outline-none slider-thumb" />
</div>

【问题讨论】:

【参考方案1】:

我可以使用 Tailwind CSS 做到这一点,您可以查看我的 Playground here

<div class="flex flex-col space-y-2 p-2 w-80">
    <input type="range" class="w-full" min="1" max="6" step="1" />
    <ul class="flex justify-between w-full px-[10px]">
        <li class="flex justify-center relative"><span class="absolute">1H</span></li>
        <li class="flex justify-center relative"><span class="absolute">1D</span></li>
        <li class="flex justify-center relative"><span class="absolute">1W</span></li>
        <li class="flex justify-center relative"><span class="absolute">1M</span></li>
        <li class="flex justify-center relative"><span class="absolute">1Y</span></li>
        <li class="flex justify-center relative"><span class="absolute">ALL</span></li>
    </ul>
</div>

外层: 外层 div 使用 flex-col 对齐列中的输入和无序列表项,并且都设置为 w-full 以便填充外层 div。

输入: 将 min=1 和 max=6 应用于输入会在输入滑块上创建一个 6 个增量步长的范围,这些步长将均匀分布,而 step=1 将使滑块拇指能够以一步为增量移动。

无序列表: 填充 px-[10px](拇指滑块宽度的一半,应用于每一侧)无序列表将包含从第一个输入的中心跨越的无序列表范围步,到最后一个输入范围步的中心,因为滑块拇指中心没有到达边的末端,而是停在圆周上。

Justify-between 在项目之间创建相等的空间,但是因为项目本身是不同的宽度,E.G. 'ALL' 比 '1H' 宽,这些不会与等间距的输入范围步长对齐。

为了克服这种绝对性,可以使用从文档流中删除项目内容,因此列表项目将具有相同的宽度,并且间隔均匀。这些在周围的列表标签上使用 justify-center 居中。

【讨论】:

【参考方案2】:

这样的东西可以满足你的需要吗?

$(() => 
    // call setup slider passing in values
    setupSlider('mySlider4', ["1H", "1D", "1W", "1M", "1Y", "ALL"], 2);
);

// setup slider html, then call the following method with the values
function setupSlider(id, vals, initialVal = 0) 
  $(`#$id`).append($('<div>').addClass('step-marks'));
  $(`#$id`).append($('<div>').addClass('step-labels'));
  $(`#$id`).append($('<input type="range">'));
  
  const min = 0;
  const max = vals.length - 1;

  // initialise slider vals
  $(`#$id input[type=range]`)
    .attr( min: min, max: max )
    .val(initialVal);

  vals.forEach((x, i) => 
    if (i < vals.length - 1) 
      $(`#$id .step-marks`).append($("<div>"));
    
    const label = $("<span>").text(x).on('click', () => $(`#$id input[type=range]`).val(i));    
    $(`#$id .step-labels`).append(label);
  );

  const length = vals.length;
  const multiply = length / (length - 1);
  const widthVal = `calc(100% * $multiply - 25px)`;
  const marginVal = `calc($widthVal / $length * -2 + 10px)`;
  
  $(`#$id .step-labels`).css("width", widthVal);
  $(`#$id .step-labels`).css("margin-left", marginVal);
  $(`#$id`).show();
.sliderWithLabels 
     width:100%;
     padding: 20px 40px 0;
     height: 80px;
     overflow: hidden;
     display: none;

 .sliderWithLabels input[type=range] 
     position: relative;
     height: 0.5rem;
     margin-top: 1.25rem;
     margin-bottom: 2.25rem;
     background-color: #e6e6e6;
     cursor: pointer;
     -webkit-user-select: none;
     -moz-user-select: none;
     -ms-user-select: none;
     user-select: none;
     -ms-touch-action: none;
     touch-action: none;
     top: -49px;
     position: relative;
     -webkit-appearance: none;
     width: 100%;
     height: 10px;
     background: #d3d3d3;
     outline: none;
     border-radius: 10px;

 .sliderWithLabels input[type=range]::-webkit-slider-thumb 
     -webkit-appearance: none;
     appearance: none;
     width: 20px;
     height: 20px;
     background: #4087c7;
     cursor: pointer;
     border-radius: 100%;

 .sliderWithLabels input[type=range]::-moz-range-thumb 
     width: 20px;
     height: 20px;
     background: #4087c7;
     cursor: pointer;

 .sliderWithLabels > div 
     display: flex;
     align-items: stretch;
     height: 20px;
     margin-top: -6px;
     position: relative;
     width: 100%;

 .sliderWithLabels > div > div 
     color: white;
     width: 100px;
     margin: 0px;
     text-align: center;
     line-height: 75px;
     font-size: 30px;
     flex: 1;
     border-right: 1px solid #d3d3d3;
     border-left: 1px solid #d3d3d3;

 .sliderWithLabels > div > div:first-of-type 
     border-left: 2px solid #fff;

 .sliderWithLabels > div > div:last-of-type 
     border-right: 2px solid #fff;

 .sliderWithLabels > div > span 
     color: #444;
     margin: 0px;
     text-align: center;
     line-height: 75px;
     font-size: 15px;
     flex: 1;
     font-family: sans-serif;

 .sliderWithLabels > div.step-labels 
     top: -10px;

 .sliderWithLabels > div.step-labels span 
     cursor: pointer;

 .sliderWithLabels > div.step-marks 
     width: calc(100% - 20px) !important;
     margin-left: 10px;

 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div style="width:50%">
  <div class="sliderWithLabels" id="mySlider4"></div>
</div>

【讨论】:

当然也可以根据自己的需要改css

以上是关于在 Tailwind CSS 中自定义输入范围的主要内容,如果未能解决你的问题,请参考以下文章

Tailwind (CSS Grid) 每个网格元素的大小相同

Tailwind/CSS 使用自定义字体

Hive中自定义UDAF函数生产小案例

在 Tailwind CSS 上使用侧边按钮输入

Tailwind css - 使用 className 自定义间距值作为 tailwind 配置的变量

自定义 Tailwind CSS 时引用默认颜色