Как остановить слайдер jquery UI от скольжения за пределы желоба?

13

Я использую ползунок jquery-ui в качестве боковой полосы прокрутки, и у меня возникают проблемы с тем фактом, что ручка выдвигается за край желоба (это можно увидеть здесь, если сдвинуть ползунок дальше всего вправо). Я перепробовал все, что мог придумать с помощью CSS, чтобы попытаться заставить ручку идти не дальше, чем в водосток, но безрезультатно. Любые предложения будут ценны.

Чтобы пояснить, я добавляю следующую диаграмму, которая показывает проблему (она очень тонкая, так как дескриптор маленький, однако, если вы создаете большой дескриптор в CSS, он выходит ровно на половину своей ширины за пределы желоба).

Вот jsbin проблемы. По сути, я хочу, чтобы ручка оставалась в канаве.

Изображение 19922

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
<link href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.min.css" rel="stylesheet" type="text/css" />
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.min.js"></script>

  <style type="text/css">

  .demo {
     width: 800px;
     margin: 50px auto 0 auto;
  }



  .ui-slider-horizontal  {
    background: #DFEFFC none repeat scroll 0 0;
  }

  .ui-slider .ui-slider-handle {
    background-image:url(http://img207.imageshack.us/img207/7760/sliderhandle.png);
    cursor:default;
    height:15px;
    position: absolute;
    width:27px;
    z-index:2;   
    margin-left: -1px;
    margin-top: 3px;
  }

  .ui-slider 
  {
    position:relative;
    text-align:left;
  }


  </style>
  <script type="text/javascript">
  $(document).ready(function(){
    $("#slider").slider({
    slide: function( event, ui ) {      

            //normalise handle position between 0 and 1 relative to slider width
            var range = $("#slider").width();//width of slider
            var normalised = $("#slider1handle").position().left / range;

            //normalise between desired range: 0:HandleWidth
            var range2 = $("#slider1handle").width();
            normalised = (normalised*range2) + 1;      

            var marginAmount = -1*normalised;
            $("#slider1handle").css("margin-left", marginAmount);      
        }

    });
    $('a.ui-slider-handle').attr('id', "slider1handle");



  });
  </script>
</head>
<body>
<div class="demo">
  <div id="slider"></div>
</div>
</body>
</html>
  • 1
    Какой браузер? Какая ОС? Какая версия jQuery? Демо работает просто отлично.
  • 0
    Firefox, IE и Chrome в Windows. Перетащите маркер на последний пиксель желоба, затем вы можете перетащить его на несколько дополнительных пикселей. Замените ручку рисунком любого размера, и она волочится мимо конца желоба.
Показать ещё 3 комментария
Теги:
slider

9 ответов

14
Лучший ответ

ручка имеет ровно ширину за лотком

Больше похоже на половину его ширины, поэтому он действительно не двигается мимо конца слайдера. При правильном выравнивании ваших скриншотов вы увидите, что центр дескриптора находится в конце ползунка, как и я ожидаю, что он будет для очень точной настройки. Когда левый 0%, а правый - 100%, тогда дескриптор должен пройти немного до конца, чтобы позволить выбрать 100%.

Изображение 125559

Это то же самое при увеличении ручки. Когда в вашем случае рукоятка перемещается более чем на половину своей ширины над правым краем, я предполагаю, что он простирается меньше половины слева? Когда играет с CSS немного, я получаю тот же эффект с огромными ручками, например:

.ui-slider-horizontal .ui-state-default {
  /** Defaults: 
      margin-left: -0.6em;
      top: -0.3em;
  */
  width: 69px;
  height: 140px;
  margin-left: -39px;
  top: -68px;
}

Еще лучше показано с помощью стрелки, немного взлома:

.ui-slider-horizontal .ui-state-default {
  width: 40px;
  margin-left: -20px;
  top: 15px;
  background-color: white;
  background-image: url('http://i.stack.imgur.com/ObK9i.png');
  background-repeat: no-repeat;
  border: 0;
}

Изображение 125560

Тем не менее, как для вашего использования в качестве полосы прокрутки, см. демонстрационная версия прокрутки слайдера, которая, кажется, делает что ты хочешь? Используйте ползунок для управления позиционированием содержимого на странице. В этом случае он действует как полоса прокрутки с возможностью захвата значений, если это необходимо.

  • 0
    Это именно то, что я хотел. Благодарю.
  • 0
    Если я использую твой стиль. Ручка перестает двигаться ....: S
Показать ещё 3 комментария
2

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

<div class="cap left"></div>
(slider container here)
<div class="cap right"></div>

Просто добавьте очень простой CSS...

.cap {
    width: (half the handle width)
}
.ui-slider, .cap.left, .cap.right {
    float: left;
}
.ui-slider {
    width: (desired total gutter width - handle width);
}
.ui-slider-handle {
    margin-left: -(half the handle width);
}

... затем соответствующим образом создайте свои колпачки.

Для затенения диапазона на одном слайдере просто создайте левую крышку с эффектом диапазона вместо обычного желоба.

  • 0
    Это было круто ... спасибо, я пытался что-то вроде этого, но моя математика была выключена. Работает на всех браузерах тоже .. еще раз спасибо
1

У меня была такая же проблема, и мое решение очень просто, я думаю. Как сказал д-р Гиббс, в качестве по умолчанию для переносимого ползунка для переносимого ползунка установлен "родительский". Поэтому вы можете преодолеть это, используя css...

считать handle img is 100px, а сдерживание div равно 250px. Чем удержание div должно иметь значение ширины 250 - 100 = 150px и margin-right:100px, чтобы maxZoom img отображался на правильном месте. Чем у вас есть точный предел для изображения вашей ручки...

0

я понимаю, что это старый пост, но я нашел гораздо более простое решение, когда столкнулся с этой проблемой:

так как дескриптор является чисто визуальным элементом, установите margin-left на минус половина width дескриптора. теперь он будет правильно центрироваться на концах направляющей.

например:

#slider-handle { width: 4rem; margin-left: -2rem; }
0

Простым способом я обработал его, чтобы сделать слайдер дорожкой прозрачным и добавить фоновый слой, который я мог бы создать отдельно.

HTML

<div class="slider-container">
  <div class="slider-background"></div>
  <div id="slider"></div>
</div>

CSS

.slider-container {
  position: relative;
}
.slider-background {
  position: absolute;
  top: 0;
  left: 10px;
  background: blue;
}
#slider {
  background: transparent;
}
0

Для меня это работает:

var $Slide = jQuery('#StatusSlide');
$Slide.slider({
  slide: function(event, ui) {
    /* Fix handler to be inside of slider borders */
    var $Handle = $Slide.find('.ui-slider-handle');
    $Handle.css('margin-left', -1 * $Handle.width() * ($Slide.slider('value') / $Slide.slider('option', 'max')));
  }
});
/* Fix handler to be inside of slider borders */
var $Handle = $Slide.find('.ui-slider-handle');
$Handle.css('margin-left', -1 * $Handle.width() * ($Slide.slider('value') / $Slide.slider('option', 'max')));
0

Я нашел решение. Но сначала: У меня была такая же проблема с одиночными ползунками и ползунками диапазона. Применение любого CSS не будет работать, а также никакого Javascript-Fix-Approach.

РЕШЕНИЕ для меня было: Площадь скольжения составляет 100% от ширины полосы прокрутки. Поэтому, когда ваш слайдер шириной 100 пикселей, и вы установите его на "50", "маржа-левый" дескриптора составляет 50%. Когда его 200px, установленный на 20, его 10%... и т.д.

Я искал этот фрагмент кода, который вычислял левый рычаг дескриптора, уменьшал и добавлял стандартную левую руку.

Откройте jquery-ui.js с помощью редактора по вашему выбору и перейдите к строке ~ 13170 и найдите функция _refreshValue. Вы также можете найти первый вид "valPercent", После строки "valPercent =....." я добавил следующее:

valPercent = valPercent * 0.95 + 3.1;

Это отлично справлялось с моей обработкой в ​​пределах диапазона и желоба. Возможно, вам нужно поиграть со значениями, чтобы получить оптимальные настройки в зависимости от используемого ui-шаблона, но, по крайней мере, этого

Поскольку мне нужна репутация для отправки изображений, вот ссылка на то, что я нарисовал для вас.

http://www.germanunique.com/slider.png

Если вам нужна помощь в этом, вы можете написать мне письмо на [email protected] или оставить ответ. Это был мой первый пост в StackOveflow, я надеюсь, что это поможет тем, у кого такая же проблема.

BYE!

0

Или вы можете сделать это с помощью математики, например:

slide: function(event, ui) {
    $(ui.handle).html("<span class='ui-corner-all hover'>"+ui.value+"</span>");
    fix_slider(ui.handle,ui.value);
},
function fix_slider(slider,value) {
    var $.slider_decalatio = 0.35 // for an width of 27px
    var pos_calc = $.slider_decalation * value; // y = ax;
    $(slider).find('span').css("left",pos_calc + "px");
});

Это можно улучшить, но это быстрое решение.

-1

просто добавьте "padding-right" к ползунку, который равен количеству элемента класса .ui-slider-handle.

#slider {
 height: 20px;
 width: 150px;
 background: #ccc;
 padding-right: 20px; (equal to the width of the handle below)
}
.ui-slider .ui-slider-handle {
  height: 20px;
  width: 20px;
  background: #333;
  display: block;
  position: relative;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню