Анимированное вращение фотографий с JavaScript

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

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

В итоге получилось давольно-таки неплохо.

Начал я с поиска каких-нибудь готовых инструментов. Нашел нечто под названием wilq32.rollimage.

Этим инструментом мы и воспользуемся.

Чтобы все было понятно, приведу код демостранички. На ней не будет ничего, кроме кнопок для управления поворотами и фотографии с враппером.

HTML:

  <div id="Actions">
	<span id="clockwise">
		Clockwise
	</span>
	<span id="anticlockwise">
		Anticlockwise
	</span>
</div>
<div id="image">
    <img id="img1" src="image.jpg" />
</div>

А для того, чтобы все это работало в IE, сразу после body пишем:

<style>v:image { behavior:url(#default#VML); display:inline-block }</style>    
<xml:namespace ns="urn:schemas-microsoft-com:vml" prefix="v" />

Обработку кликов управляющих кнопок вешаем на $(document).ready

 $(document).ready(function() {
            $('#Actions span').click(function() {
                switch (this.id) {
                    case "clockwise":
                        Rotate($('#img1'), 90);
                        break;
                    case "anticlockwise":
                        Rotate($('#img1'), -90);
                        break;
                }
            });
        }); 

 Теперь, собственно, приступим к наворотам с поворотами.

function BindRotation() {
    function SetMargin(id, mt) {
        if ($('#' + id).is('span')) {
            $('#' + id + ' canvas').css({ marginTop: -mt })
        } else {
            setTimeout(function() { SetMargin(id, mt) }, 2);
        }
    };
    $('#image img').each(function() {
        var w = $(this).width();
        var h = $(this).height();
        var newDimensions = Math.round(Math.sqrt(w * w + h * h));
        mt = (newDimensions - h) / 2;
        $('#image img').rotate(0);
        var id = this.id;
        setTimeout(function() { SetMargin(id, mt) }, 2);
    });
};

$(window).load(function() {
    BindRotation();
});

 

Сразу обращаю ваше внимание на то, что BindRotation я вешаю на $(window).load. Это необходимо для того, чтобы изображения, которые мы будем поворачивать уже были загружены, чтобы мы могли получить их размеры.

Разбираем по строчкам

$('#image img').rotate(0);

Эта функция создаст квадратный canvas, размер стороны которого будет

Math.round(Math.sqrt(w * w + h * h));// это теорема Пифагора

Изображение будет распологаться ровно посередине этого канваса. Для того, чтобы не было никаких скачков изображения, запускаем

 SetMargin(id, mt)//, где mt = (newDimensions - h) / 2;

Вот, собственно, почти все. Осталось объявить функцию Rotate, которая будет производить поворот.

function Rotate(image, grad) {
    angle = parseInt(image.attr('angle'));
    if (angle) {
        angle = angle + grad;
    } else {
        angle = grad;
    }

    image.attr('angle', angle);
    if ($.browser.msie) {
        image.rotate(angle);
    } else {
        image.rotateAnimation(angle);
    }
}

Как видите, для IE я делаю поворот без анимации. Несмотря на то, что возможность анимировать поворот в IE есть, лучше все-таки без анимации.




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка