Вращение элемента Div в jQuery - PullRequest
59 голосов
/ 20 декабря 2008

Попытка повернуть элемент div ... Это может быть богохульством DOM, может ли оно работать с элементом canvas? Я не уверен - если у кого-нибудь есть идеи о том, как это может работать или почему это не так, я хотел бы знать. Спасибо.

Ответы [ 7 ]

24 голосов
/ 25 сентября 2010

Для поворота DIV используйте WebkitTransform / -moz-transform: rotate(Xdeg).

Это не будет работать в IE. Библиотека Raphael работает с IE и она вращается . Я считаю, что он использует canvas ES

Если вы хотите анимировать вращение, вы можете использовать рекурсив setTimeout()

Вы могли бы даже сделать часть вращения с помощью jQuery .animate()

Убедитесь, что вы учитываете ширину вашего элемента. Если повернуть объект, ширина которого больше видимого, вы получите забавные результаты . Однако вы можете сузить ширину элементов, и затем повернуть их .

Вот простой фрагмент jQuery, который вращает элементы в объекте jQuery. Вращение может быть запущено и остановлено:

$(function() {
    var $elie = $(selectorForElementsToRotate);
    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); },5);
    }
});

Пример jsFiddle

Примечание:
Взяв градус и увеличив его, поверните изображение по часовой стрелке. Уменьшение степени поворота приведет к повороту изображения против часовой стрелки .

7 голосов
/ 14 сентября 2012

Кросс-браузерное вращение для любого элемента. Работает в IE7 и IE8. В IE7 похоже, что не работает в JSFiddle, но в моем проекте работал также в IE7

http://jsfiddle.net/RgX86/24/

var elementToRotate = $('#rotateMe');
var degreeOfRotation = 33;

var deg = degreeOfRotation;
var deg2radians = Math.PI * 2 / 360;
var rad = deg * deg2radians ;
var costheta = Math.cos(rad);
var sintheta = Math.sin(rad);

var m11 = costheta;
var m12 = -sintheta;
var m21 = sintheta;
var m22 = costheta;
var matrixValues = 'M11=' + m11 + ', M12='+ m12 +', M21='+ m21 +', M22='+ m22;

elementToRotate.css('-webkit-transform','rotate('+deg+'deg)')
    .css('-moz-transform','rotate('+deg+'deg)')
    .css('-ms-transform','rotate('+deg+'deg)')
    .css('transform','rotate('+deg+'deg)')
    .css('filter', 'progid:DXImageTransform.Microsoft.Matrix(sizingMethod=\'auto expand\','+matrixValues+')')
    .css('-ms-filter', 'progid:DXImageTransform.Microsoft.Matrix(SizingMethod=\'auto expand\','+matrixValues+')');

Изменить 13.09.13 15:00 Завернут в красивый и простой, цепной плагин jquery.

Пример использования

$.fn.rotateElement = function(angle) {
    var elementToRotate = this,
        deg = angle,
        deg2radians = Math.PI * 2 / 360,
        rad = deg * deg2radians ,
        costheta = Math.cos(rad),
        sintheta = Math.sin(rad),

        m11 = costheta,
        m12 = -sintheta,
        m21 = sintheta,
        m22 = costheta,
        matrixValues = 'M11=' + m11 + ', M12='+ m12 +', M21='+ m21 +', M22='+ m22;

    elementToRotate.css('-webkit-transform','rotate('+deg+'deg)')
        .css('-moz-transform','rotate('+deg+'deg)')
        .css('-ms-transform','rotate('+deg+'deg)')
        .css('transform','rotate('+deg+'deg)')
        .css('filter', 'progid:DXImageTransform.Microsoft.Matrix(sizingMethod=\'auto expand\','+matrixValues+')')
        .css('-ms-filter', 'progid:DXImageTransform.Microsoft.Matrix(SizingMethod=\'auto expand\','+matrixValues+')');
    return elementToRotate;
}

$element.rotateElement(15);

JSFiddle: http://jsfiddle.net/RgX86/175/

7 голосов
/ 20 декабря 2008

да, тебе не повезет, я думаю. Обычно в трех методах рисования, используемых основными браузерами (Canvas, SVG, VML), поддержка текста плохая, я считаю. Если вы хотите повернуть изображение, то все хорошо, но если у вас смешанный контент с форматированием и стилями, вероятно, нет.

Проверьте RaphaelJS для API кросс-браузерной графики.

1 голос
/ 18 апреля 2012

Вот два патча jQuery, которые могут помочь (возможно, уже включены в jQuery, когда вы читаете это):

0 голосов
/ 28 июня 2016

РЕДАКТИРОВАТЬ: Обновлено для jQuery 1.8

jQuery 1.8 добавит специфичные для браузера преобразования. jsFiddle Demo

var rotation = 0;

jQuery.fn.rotate = function(degrees) {
    $(this).css({'transform' : 'rotate('+ degrees +'deg)'});
    return $(this);
};

$('.rotate').click(function() {
    rotation += 5;
    $(this).rotate(rotation);
});

РЕДАКТИРОВАТЬ: Добавлен код, чтобы сделать его функцией jQuery.

Для тех из вас, кто не хочет читать дальше, вот, пожалуйста. Для более подробной информации и примеров, читайте дальше. jsFiddle Demo .

var rotation = 0;

jQuery.fn.rotate = function(degrees) {
    $(this).css({'-webkit-transform' : 'rotate('+ degrees +'deg)',
                 '-moz-transform' : 'rotate('+ degrees +'deg)',
                 '-ms-transform' : 'rotate('+ degrees +'deg)',
                 'transform' : 'rotate('+ degrees +'deg)'});
    return $(this);
};

$('.rotate').click(function() {
    rotation += 5;
    $(this).rotate(rotation);
});

РЕДАКТИРОВАТЬ: Один из комментариев к этому сообщению упоминается jQuery Multirotation . Этот плагин для jQuery по существу выполняет вышеупомянутую функцию с поддержкой IE8. Возможно, стоит использовать, если вы хотите максимальной совместимости или больше возможностей. Но для минимальных накладных расходов я предлагаю вышеуказанную функцию. Будет работать IE9 +, Chrome, Firefox, Opera и многие другие.


Бобби ... Это для людей, которые на самом деле хотят сделать это в JavaScript. Это может потребоваться для поворота в обратном вызове JavaScript.

Вот jsFiddle .

Если вы хотите вращаться через определенные промежутки времени, вы можете использовать jQuery для ручной установки CSS вместо добавления класса. Как это ! Я включил обе опции jQuery внизу ответа.

HTML

<div class="rotate">
    <h1>Rotatey text</h1>
</div>

CSS

/* Totally for style */
.rotate {
    background: #F02311;
    color: #FFF;
    width: 200px;
    height: 200px;
    text-align: center;
    font: normal 1em Arial;
    position: relative;
    top: 50px;
    left: 50px;
}

/* The real code */
.rotated {
    -webkit-transform: rotate(45deg);  /* Chrome, Safari 3.1+ */
    -moz-transform: rotate(45deg);  /* Firefox 3.5-15 */
    -ms-transform: rotate(45deg);  /* IE 9 */
    -o-transform: rotate(45deg);  /* Opera 10.50-12.00 */
    transform: rotate(45deg);  /* Firefox 16+, IE 10+, Opera 12.10+ */
}

JQuery

Убедитесь, что они заключены в $ (документ) .ready

$('.rotate').click(function() {
    $(this).toggleClass('rotated');
});

Пользовательские интервалы

var rotation = 0;
$('.rotate').click(function() {
    rotation += 5;
    $(this).css({'-webkit-transform' : 'rotate('+ rotation +'deg)',
                 '-moz-transform' : 'rotate('+ rotation +'deg)',
                 '-ms-transform' : 'rotate('+ rotation +'deg)',
                 'transform' : 'rotate('+ rotation +'deg)'});
});
0 голосов
/ 24 апреля 2015

Я собрал программу анимированного кода поворота .. Вы можете получить свой код здесь ... (если не поздно)

http://99mission.why3s.tw/rotatetest.html

0 голосов
/ 20 декабря 2008

Я сомневаюсь, что вы можете вращать элемент, используя DOM / CSS. Лучше всего сделать рендеринг на холст и повернуть его (не уверен в деталях).

...