JQuery вращать/преобразовывать
Я хотел бы использовать эту функцию для вращения, а затем остановиться в определенной точке или градусе. Прямо сейчас элемент просто вращается без остановки. Здесь код:
<script type="text/javascript">
$(function() {
var $elie = $("#bkgimg");
rotate(0);
function rotate(degree) {
// For webkit browsers: e.g. Chrome
$elie.css({ WebkitTransform: 'rotate(' + degree + 'deg)'});
// For Mozilla browser: e.g. Firefox
$elie.css({ '-moz-transform': 'rotate(' + degree + 'deg)'});
// Animate rotation with a recursive call
setTimeout(function() { rotate(++degree); },65);
}
});
</script>
Спасибо за помощь
Ответы
Ответ 1
Просто удалите линию, которая вращает ее на один градус за раз и навсегда называет script.
// Animate rotation with a recursive call
setTimeout(function() { rotate(++degree); },65);
Затем передайте нужное значение в функцию... в этом примере 45
для 45 градусов.
$(function() {
var $elie = $("#bkgimg");
rotate(45);
function rotate(degree) {
// For webkit browsers: e.g. Chrome
$elie.css({ WebkitTransform: 'rotate(' + degree + 'deg)'});
// For Mozilla browser: e.g. Firefox
$elie.css({ '-moz-transform': 'rotate(' + degree + 'deg)'});
}
});
Измените .css()
на .animate()
, чтобы анимировать поворот с помощью jQuery. Нам также нужно добавить продолжительность анимации 5000 в течение 5 секунд. И обновляя вашу оригинальную функцию, чтобы удалить некоторую избыточность и поддерживать больше браузеров...
$(function() {
var $elie = $("#bkgimg");
rotate(45);
function rotate(degree) {
$elie.animate({
'-webkit-transform': 'rotate(' + degree + 'deg)',
'-moz-transform': 'rotate(' + degree + 'deg)',
'-ms-transform': 'rotate(' + degree + 'deg)',
'-o-transform': 'rotate(' + degree + 'deg)',
'transform': 'rotate(' + degree + 'deg)',
'zoom': 1
}, 5000);
}
});
EDIT: Стандартный jQuery CSS-код анимации выше не работает, потому что, по-видимому, jQuery .animate()
еще не поддерживает CSS3 transforms
.
Этот плагин jQuery должен анимировать поворот:
http://plugins.jquery.com/project/QTransform
Ответ 2
Это потому, что у вас есть рекурсивная функция внутри поворота. Он снова называет себя:
// Animate rotation with a recursive call
setTimeout(function() { rotate(++degree); },65);
Возьмите это, и он не будет продолжать работать рекурсивно.
Я бы также предложил просто использовать эту функцию:
function rotate($el, degrees) {
$el.css({
'-webkit-transform' : 'rotate('+degrees+'deg)',
'-moz-transform' : 'rotate('+degrees+'deg)',
'-ms-transform' : 'rotate('+degrees+'deg)',
'-o-transform' : 'rotate('+degrees+'deg)',
'transform' : 'rotate('+degrees+'deg)',
'zoom' : 1
});
}
Он намного чище и будет работать для большинства браузеров.
Ответ 3
Почему бы просто не использовать toggleClass при нажатии?
JS:
$(this).toggleClass("up");
CSS
button.up {
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
-ms-transform: rotate(180deg);
-o-transform: rotate(180deg);
transform: rotate(180deg);
/* IE6–IE9 */
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.9914448613738104, M12=-0.13052619222005157,M21=0.13052619222005157, M22=0.9914448613738104, sizingMethod='auto expand');
zoom: 1;
}
вы также можете добавить это в css:
button{
-webkit-transition: all 500ms ease-in-out;
-moz-transition: all 500ms ease-in-out;
-o-transition: all 500ms ease-in-out;
-ms-transition: all 500ms ease-in-out;
}
который добавит анимацию.
PS...
чтобы ответить на ваш первоначальный вопрос:
вы сказали, что он вращается, но никогда не останавливается. При использовании таймаута времени вам необходимо убедиться, что у вас есть условие, которое не будет вызывать setimeout, иначе оно будет работать вечно. Итак, для вашего кода:
<script type="text/javascript">
$(function() {
var $elie = $("#bkgimg");
rotate(0);
function rotate(degree) {
// For webkit browsers: e.g. Chrome
$elie.css({ WebkitTransform: 'rotate(' + degree + 'deg)'});
// For Mozilla browser: e.g. Firefox
$elie.css({ '-moz-transform': 'rotate(' + degree + 'deg)'});
/* add a condition here for the extremity */
if(degree < 180){
// Animate rotation with a recursive call
setTimeout(function() { rotate(++degree); },65);
}
}
});
</script>
Ответ 4
Я придумал какое-то решение проблемы. Он включает jquery и css. Это работает как переключение, но вместо переключения элементов отображения он просто меняет свои свойства при чередовании кликов. При нажатии на div он поворачивает элемент с тегом на 180 градусов, и когда вы снова нажимаете его, элемент с тегом возвращается в исходное положение. Если вы хотите изменить продолжительность анимации, просто измените свойство продолжительности перехода.
CSS
#example1{
transition-duration:1s;
}
JQuery
$(document).ready( function () { var toggle = 1;
$('div').click( function () {
toggle++;
if ( (toggle%2)==0){
$('#example1').css( {'transform': 'rotate(180deg)'});
}
else{
$('#example1').css({'transform': 'rotate(0deg)'});
}
});
});
Ответ 5
t = setTimeout(function() { rotate(++degree); },65);
и clearTimeout
, чтобы остановить
clearTimeout(t);
Я использую это с AJAX
success:function(){ clearTimeout(t); }