如何将滑块固定到我的五步滑块中的标记?

How to fix the slider to the markers in my five-step slider?

我已经尽力附加了一个 CSS 版本的包装器,但我在使用滑块(弹性框中的第二项)时遇到了很多问题。

这是一个 5 步滑块,我试图与其 5 个标记对齐,表示为 2017 年到 2021 年。但是,右侧每次都超出了我们的界限,并且没有与标记本身对齐。我已尽力创建一个可行的版本,但这个项目分配给我时没有任何注释,我正在苦苦挣扎。

我的理想结果是有一个适合标记的滑块,在跨显示器(1280 像素、1920 像素,例如)时需要非常 little/no 响应式设计调整。只是当你 select 说 2019 - ui 句柄实际上就在那个点上。此外,当您 select 2021 时,ui 句柄不会越界。

$year 变量是从 options.inc 文件中读入的 range(2017, 2021),它附加了标记。但是滑块和标记之间存在脱节。

如果找不到更好的解决方案,我的解决方案是使用 classes 根据 class (first/second/middle) 移动滑块并将其映射。但是正如您想象的那样,CSS 重叠 JS 会产生一些我试图避免的尴尬动画。

(function($) {
  yearSlider: function() {
    var $el = $(".timeline-slider");
    this.year = +$el.find(".marker:last").text().trim();
    $el.slider({
      value: +$el.find(".marker:last").text().trim(), // last-slide class added assuming this condition
      min: +$el.find(".marker:first").text().trim(),
      max: +$el.find(".marker:last").text().trim(),
      step: 1,
      range: "min",
      animate: "fast",
      slide: function(event, ui) {
        petMapFilters.year = ui.value;
        petMap.map.fire("dragend");
        sliderPosition($(this), event, ui);

        if ($(".results-popup-opener").hasClass("active")) {
          petMapResultPopup.init();
        }

        if ($(".dma-popup").is(":visible")) {
          petMapDmaPopup.showLoader();
          petMapDmaPopup.init(petMapDmaPopup.targetData);
        }
      },
    });



    // Inelegant method.
    function sliderPosition(target, event, ui) {
      target.removeClass(" first-slide second-slide middle-slide fourth-slide last-slide");
      if (ui.value == $el.find(".marker:last").text().trim()) {
        target.addClass("last-slide");
      }
      if (ui.value == $el.find(".marker:nth-child(4)").text().trim()) {
        target.addClass("fourth-slide");
      }
      if (ui.value == $el.find(".marker:nth-child(3)").text().trim()) {
        target.addClass("middle-slide");
      }
      if (ui.value == $el.find(".marker:nth-child(2)").text().trim()) {
        target.addClass("second-slide");
      }
      if (ui.value == $el.find(".marker:first").text().trim()) {
        target.addClass("first-slide")
      }
    }
  }


})(jQuery);
html,
legend,
select {
  box-sizing: border-box;
}

select,
textarea {
  border-radius: 0;
}

*,
::after,
::before {
  box-sizing: inherit;
}

body {
  margin: 0;
  padding: 0;
  background: #fff;
  font-family: Lato, "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
  font-weight: 400;
  line-height: 1.5;
  color: #000;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

select {
  width: 100%;
}

.bottom-bar-wrapper .bottom-bar-inner a {
  color: inherit;
  font-size: 1.5625vw;
}

.bottom-bar-wrapper .bottom-bar-inner a.restart {
  color: #000;
  font-size: 0.75vw;
}

.bottom-bar-wrapper .bottom-bar-inner .fa {
  color: #fc3f31;
  font-size: 44px;
}

.bottom-bar-wrapper a.results-popup-opener.no-pointer {
  color: #fff;
}

.bottom-bar-inner {
  height: 100%;
  padding-left: 0.9375rem;
  padding-right: 0.9375rem;
}

.nav-links,
.timeline-slider {
  padding-right: 0.625rem;
  padding-left: 0.625rem;
  min-width: 0;
}

.timeline-slider {
  width: 100%;
  -webkit-flex: 1 1 0px;
  -ms-flex: 1 1 0px;
  flex: 1 1 0px;
  margin-left: 4.65vw;
  margin-right: 2vw;
}

.nav-links {
  -webkit-flex: 1 1 0px;
  -ms-flex: 1 1 0px;
  flex: 1 1 0px;
}

.nav-links a {
  padding: 0 1.5vw;
  height: 17vh;
  line-height: 1.25;
  background-color: transparent;
}

.nav-links a.active {
  background-color: #f1f2f2;
}

.nav-links .nav-text {
  position: relative;
  white-space: nowrap;
}

.nav-links .nav-text .badge {
  width: 1.5625vw;
  height: 1.5625vw;
  min-width: 0;
  padding: 0;
  font-size: 0.73015vw;
  line-height: 1.65vw;
  position: absolute;
  right: 0;
  top: 0;
  -webkit-transform: translate(75%, -75%);
  -ms-transform: translate(75%, -75%);
  transform: translate(75%, -75%);
}

.restart div {
  position: absolute;
  top: 100%;
  left: 50%;
  -webkit-transform: translate(-50%, 10px);
  -ms-transform: translate(-50%, 10px);
  transform: translate(-50%, 10px);
}

@media only screen and (min-width:1920px) {
  #slider {
    max-width: 50%;
  }
}

.ui-slider .ui-corner-all.ui-slider-handle {
  width: 68px;
  height: 68px;
  top: -26px;
  border-radius: 50%;
  outline: red;
  border: red;
  background-color: transparent;
  background-repeat: no-repeat;
  background-size: cover;
  cursor: move;
  z-index: 3;
}

.ui-slider.ui-widget.ui-widget-content {
  font-family: Lato, "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
  background-color: #d0d3d4;
  color: #000;
  border-radius: 0.375rem;
  height: 0.75rem;
  border: 0;
  padding-left: 12px;
  padding-right: 12px;
}

.ui-slider .ui-slider-range {
  border-radius: 0.375rem;
}

.marker-container {
  margin-top: 36px;
}

.marker {
  font-size: 1.04175vw;
  font-family: AvenirLTStd-Roman;
}

span {
  user-select: none;
}

.first-slide .marker:nth-child(1),
.last-slide .marker:nth-child(5),
.marker.active,
.second-slide .marker:nth-child(2),
.middle-slide .marker:nth-child(3),
.fourth-slide .marker:nth-child(4) {
  color: #fc3f31;
  font-weight: 700;
}

.marker-text {
  position: relative;
}

.marker-text:before {
  content: "\A";
  background: #8a8d8f;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  position: absolute;
  top: -37px;
  left: 50%;
  right: 50%;
  z-index: 2;
  -webkit-transform: translateX(-50%);
  -ms-transform: translateX(-50%);
  transform: translateX(-50%);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.csss"></script>

<div id="wrapper" class="bottom-bar-wrapper" style="">
  <div class="popups-wrapper">
    <a href="#" class="popup-close is-visible hide">
      <i class="fa fa-angle-down" aria-hidden="true"></i>
    </a>




    <div id="wrapper" class="bottom-bar-inner align-middle align-justify flex-container">
      <a href="#" class="restart">
        <img src="/wp-content/themes/poweredbydata/assets/visualisations/pet-map/images/restart.png" alt="restart">
        <div>Restart</div>
      </a>
      <div id="slider" class="timeline-slider ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget-content middle-slide">
        <div class="marker-container flex-container align-justify">
          <span class="marker">
            <div class="marker-text">2017</div>
          </span>
          <span class="marker">
            <div class="marker-text">2018</div>
          </span>
          <span class="marker">
            <div class="marker-text">2019</div>
          </span>
          <span class="marker">
            <div class="marker-text">2020</div>
          </span>
          <span class="marker">
            <div class="marker-text">2021</div>
          </span>
        </div>
        <div class="ui-slider-range ui-corner-all ui-widget-header ui-slider-range-min" style="width: 50%;"></div><span tabindex="0" class="ui-slider-handle ui-corner-all ui-state-default" style="left: 50%;"></span></div>
      <div id="buttons" class="nav-links flex-container align-justify avenir-heavy">
        <a href="#" data-open=".profile-popup"><span class="nav-text">X<span class="badge badge-profile">2</span></span></a>
        <a href="#" data-open=".conditions-popup"><span class="nav-text">Y<span class="badge blue badge-conditions hide">2</span></span></a>
        <a href="#" data-open=".locations-popup"><span class="nav-text">Z</span></a>
        <a href="#" data-open=".results-popup" class="results-popup-opener no-pointer"><span class="nav-text">Results</span></a>
      </div>
    </div>
  </div>

我想出了一个临时解决方案,是的,质量有点低,但我怀疑每个人都会注意到。

我为最常用的两个显示创建了一个媒体查询,它应该有望处理滚动条的脱节性质。

@media only screen and (min-width:1920px) {
  .first-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: 0%;
  }

  .second-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: -2%;
  }

  .middle-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: -4%;
  }

  .fourth-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: -6.25%;
  }

  .last-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: -8.5%;
  }
 }


 @media only screen and (min-width:1280px) {
  .first-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: 1.5%;
  }

  .second-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: -3.75%;
  }

  .middle-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: -6.25%;
  }

  .fourth-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: -9%;
  }

  .last-slide span.ui-slider-handle.ui-corner-all.ui-state-default {
    margin-left: -11.5%;
  }

这是通过眼睛完成的,并将手柄放在标记上。它是 CSS 并且易于安装。但是,不幸的是它不能处理所有显示。