2013-06-05 3 views
0

Мой сотрудник почти закончил эту функцию масштабирования, но я не могу понять, как ее завершить. Here is a jsFiddle. Красные точки должны находиться в том же месте относительно изображения, когда вы перемещаете ползунок справа. Все отлично, за исключением кода в $ ('. Marker'). Each (function() {...}); Я пробовал много комбинаций, но не могу получить правильную логику для увеличения. Благодаря!Функция увеличения почти завершена

Вот JS:

$("#sliderVertical").slider({ 
    orientation: "vertical", 
    range: "min", 
    min: 0, 
    max: 100, 
    value: 50, 
    slide: function(event, ui) { 
     $("#sliderValue").text(ui.value); 
     var backImg = $('img'); 
     if (ui.value == 0) { 
      ui.value = 0.1; 
     }   
     var width = ui.value * 12; 
     var height = width * .75; 

     $('.marker').each(function(){ 
      var marginLeft = parseFloat($(this).css('margin-left')), 
      totalWidth = parseFloat(backImg.css('width')); 
      var newMarginLeft = null; 

      var marginTop = parseFloat($(this).css('margin-top')), 
      totalHeight = parseFloat(backImg.css('height')); 
      var newMrginTop = null; 

      console.log(totalHeight); 

      //$(this).css({'margin-left': newMarginLeft + 'px', 'margin-top': newMrginTop + 'px'}); 
     }); 

     var marLeft = 0 - (width/2); 
     var marTop = 0 - (height/2); 

     backImg.css({'width': width + 'px', 'height': height + 'px', 'margin-left': marLeft + 'px', 'margin-top': marTop + 'px'}); 

    } 
}); 
+0

Это дьявольская головоломка действительно. Могу ли я предложить добавить красные точки в качестве дочерних элементов более крупного изображения и использовать 'position: relative' –

+0

@itcouldevenbeaboat. Я действительно не вижу, как это будет легче, но я думаю, это могло бы помочь. Я чувствую, что логика останется в основном одинаковой. – dezman

+0

@watson Если вы установите текущий 'img' в качестве фона для' div' и разместите свои маркеры там, как только вы разместите их, если вы измените размер 'div' на ваш слайдер, маркеры должны перейти к их правилу пятен, не нуждающихся в помощи от JS. –

ответ

2
$('.marker').each(function(){ 
      var marginLeft = parseFloat($(this).css('margin-left')), 
      totalWidth = parseFloat(backImg.css('width')); 
      var newMarginLeft = marginLeft*width/totalWidth; 

      var marginTop = parseFloat($(this).css('margin-top')), 
      totalHeight = parseFloat(backImg.css('height')); 
      var newMrginTop = marginTop*height/totalHeight; 

      console.log(totalHeight); 

      $(this).css({'margin-left': newMarginLeft + 'px', 'margin-top': newMrginTop + 'px'}); 
     }); 

DEMO

+0

Я должен отметить, что это как-то ломается, если вы идете полностью вниз, чтобы увеличить 0. Вы можете обойти это, только снижаясь до 1. – kei

+0

Удивительно, спасибо! Просто из любопытства, сколько времени вам понадобилось, чтобы получить его? – dezman

+0

Не долго. Вы в основном выяснили это. Я видел прокомментированный код, который применяет маржу на маркерах и видел, что 'newMarginLeft' и' newMrginTop' не были настроены ни к чему. Это вопрос масштабирования. Вы знали ширину изображения и его новую ширину, поэтому он просто масштабировал маржу тем же самым фактором. – kei

Смежные вопросы