2016-04-13 2 views
0

Я пытаюсь создать небольшой плагин переключения jQuery.jQuery анимация меняется css, но не анимация

Вот мой код:

(function($){ 
 
    $.fn.slideSwitch = function (options) { 
 
    var settings = $.extend({ 
 
     defaultSide: "left", 
 
     backgroundColor: "red", 
 
     toggleSize: 30, 
 
     toggleColor: "white", 
 
     speed: 100 
 
    }, options); 
 
    return this.each(function() { 
 
     $this = $(this); 
 
     var gap = Math.round(settings.toggleSize * 0.03); 
 
     if (gap < 1) {gap = 1} 
 
     $this.css({ 
 
     width: (settings.toggleSize * 2) + "px", 
 
     backgroundColor: settings.backgroundColor, 
 
     borderRadius: settings.toggleSize + "px", 
 
     overflow: "hidden", 
 
     padding: gap + "px" 
 
     }) 
 
     var marginLeft = 0; 
 
     if (settings.defaultSide == "right") { 
 
     marginLeft = settings.toggleSize; 
 
     } 
 
     var toggle = $("<div>").addClass("ssToggle").css({ 
 
     width: settings.toggleSize, 
 
     height: settings.toggleSize, 
 
     borderRadius: settings.toggleSize, 
 
     backgroundColor: settings.toggleColor, 
 
     float: settings.defaultSide, 
 
     marginLeft: marginLeft 
 
     }); 
 
     $this.html(toggle); 
 
     $this.click(function() { 
 
     var tggl = $(this).find(".ssToggle"); 
 
     console.log("margin-left:", tggl.css("margin-left")); 
 
     if (parseInt(tggl.css("margin-left")) == 0) { 
 
      console.log("moving to the right"); 
 
      tggl.animate({ "margin-left": settings.toggleSize + "px" }, settings.speed); 
 
      if (settings.defaultSide == "right") { $(this).trigger("switchedOn"); } 
 
     } else { 
 
      console.log("moving to the left"); 
 
      tggl.animate({ "margin-left": 0 }, settings.speed); 
 
      if (settings.defaultSide == "left") { $(this).trigger("switchedOn"); } 
 
     } 
 
     $(this).trigger("switched"); 
 
     }) 
 
    }); 
 
}; 
 
}(jQuery)); 
 
$(function() { 
 
    $(".ssSwitch").slideSwitch({ 
 
    toggleSize: 30, 
 
    speend: 40, 
 
    defaultSide: "right" 
 
    }).on("switchedOn", function(e) { 
 
    \t console.log("switched on!"); 
 
    }); 
 
});
<div class="ssSwitch"></div>

Демо: https://jsfiddle.net/cutsomeat/zd6ucc5u/

Когда я опция defaultSide установлен на "левый" он работает отлично. Однако, когда у меня есть опция defaultSide, установленная на «right», происходит что-то странное. Свойство css «margin-left» изменилось, как и предполагалось, но вы не видите никакого движения элемента. Css будет продолжать изменяться взад и вперед, но элемент останется в исходном положении.

Может ли кто-нибудь объяснить мне, почему это происходит?

+0

Подсказка: стек Отрывки функции вы использовали в качестве блочного кода вполне способна делать демонстрационные версии, прямо здесь, на месте. –

ответ

1

комментируя эту линию, все работает отлично:

float: settings.defaultSide, 

Попробуйте: Demo here

1

У вас есть избыточный стиль на свой элемент «кнопка», всплывают «вправо», что делает наценку вы устанавливаете неуместное. Снять линию

float: settings.defaultSide, 

И все должно быть в порядке.

Смотрите обновленный fiddle