2013-05-28 6 views
36

Мне нужно повернуть изображение с помощью javascript с интервалом в 90 градусов. Я пробовал несколько библиотек, таких как jQuery rotate и Raphaël, но у них такая же проблема - изображение вращается вокруг его центра. У меня есть куча контента со всех сторон изображения, и если изображение не идеально квадратное, части его будут в конечном итоге поверх этого контента. Я хочу, чтобы изображение оставалось внутри родительского div, у которого установлены max-with и max-height.Повернуть изображение с помощью javascript

Использование JQuery вращаются как это (http://jsfiddle.net/s6zSn/1073/):

var angle = 0; 
$('#button').on('click', function() { 
    angle += 90; 
    $("#image").rotate(angle); 
}); 

Результаты в этом:

How jQuery rotate works

И это результат я хотел бы вместо этого:

How I would like it to work

У кого-нибудь есть идея, как это сделать?

+2

Использование CSS трансформирует вращать весь контейнер вокруг какой-то момент вы любите. – Blazemonger

+0

лучший способ пойти с помощью css3 keyframes i'm fear – DiederikEEn

+0

[Как повернуть объект туда и обратно вокруг определенной точки] (http://stackoverflow.com/questions/10241315/how-to-rotate-an-object -back-and-forth-around-a-specific-point) – jantimon

ответ

53

Вы можете использовать комбинацию CSS's transform (с приставками поставщика в случае необходимости) и transform-origin, как это: (also on jsFiddle)

var angle = 0, 
 
    img = document.getElementById('container'); 
 
document.getElementById('button').onclick = function() { 
 
    angle = (angle + 90) % 360; 
 
    img.className = "rotate" + angle; 
 
}
#container { 
 
    width: 820px; 
 
    height: 100px; 
 
    overflow: hidden; 
 
} 
 
#container.rotate90, 
 
#container.rotate270 { 
 
    width: 100px; 
 
    height: 820px 
 
} 
 
#image { 
 
    transform-origin: top left; 
 
    /* IE 10+, Firefox, etc. */ 
 
    -webkit-transform-origin: top left; 
 
    /* Chrome */ 
 
    -ms-transform-origin: top left; 
 
    /* IE 9 */ 
 
} 
 
#container.rotate90 #image { 
 
    transform: rotate(90deg) translateY(-100%); 
 
    -webkit-transform: rotate(90deg) translateY(-100%); 
 
    -ms-transform: rotate(90deg) translateY(-100%); 
 
} 
 
#container.rotate180 #image { 
 
    transform: rotate(180deg) translate(-100%, -100%); 
 
    -webkit-transform: rotate(180deg) translate(-100%, -100%); 
 
    -ms-transform: rotate(180deg) translateX(-100%, -100%); 
 
} 
 
#container.rotate270 #image { 
 
    transform: rotate(270deg) translateX(-100%); 
 
    -webkit-transform: rotate(270deg) translateX(-100%); 
 
    -ms-transform: rotate(270deg) translateX(-100%); 
 
}
<button id="button">Click me!</button> 
 
<div id="container"> 
 
    <img src="http://i.stack.imgur.com/zbLrE.png" id="image" /> 
 
</div>

+2

Добавить 'filter: progid: DXImageTransform.Microsoft.BasicImage (rotation = 1);' для поддержки IE8 и IE7. 'вращение = 1' для 90 градусов,' 2' для 180 град, '3' для 270 град. – mqchen

+0

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

+1

Nopes! это преобразование привносит OP в ту же проблему. Преобразование применяется, но не так, как хочет OP –

6
var angle = 0; 
$('#button').on('click', function() { 
    angle += 90; 
    $('#image').css('transform','rotate(' + angle + 'deg)'); 
}); 

Пробуйте этот код.

1

Вы всегда можете применить класс CCS с rotate собственности - http://css-tricks.com/snippets/css/text-rotation/

Чтобы сохранить повернутое изображение в ваших div размеров, которые необходимо настроить CSS, а также, нет нужды, чтобы использовать JavaScript, за исключением добавления класса.

+3

«Класс CCS с возможностью поворота» - И опечатка и концептуальная ошибка? –

3

CSS могут быть применены, и вы должны будете установить transform-origin правильно получите прикладное преобразование так, как вы хотите

Просмотреть скрипку:

http://jsfiddle.net/OMS_/gkrsz/

Главный код:

/* assuming that the image's height is 70px */ 

img.rotated { 
    transform: rotate(90deg); 
    -webkit-transform: rotate(90deg); 
    -moz-transform: rotate(90deg); 
    -ms-transform: rotate(90deg); 

    transform-origin: 35px 35px; 
    -webkit-transform-origin: 35px 35px; 
    -moz-transform-origin: 35px 35px; 
    -ms-transform-origin: 35px 35px; 
} 

JQuery и JS:

$(img) 
    .css('transform-origin-x', imgWidth/2) 
    .css('transform-origin-y', imgHeight/2); 

// By calculating the height and width of the image in the load function 

// $(img).css('transform-origin', (imgWidth/2) + ' ' + (imgHeight/2)); 

Logic:

Divide т высота изображения - 2.В transform-x и transform-y значения должны быть это значение

Ссылка:

transform-origin в CSS | MDN

+0

Что делать, если размер изображения изменяется или просто не фиксирован? Это будет беспорядок. Имейте в виду, это беспорядок с 180 и 270 оборотами;) –

+0

@Kolink. Круто. В любом случае, у вас есть jQuery и JS на странице. Можно рассчитывать и применять этот CSS на лету. Я редактирую ответ для JS. Спасибо, что указали! –

+0

Кажется немного завышенным. Я предпочитаю свое решение: p полностью не зависит от размера изображения. –

4

Я видел ваш текущий код. В вашем коде есть одна коррекция строки. написать $ ("# wrapper"). Вращать (угол); вместо $ («# изображение»); поворот (угол); и вы получите желаемый результат, надеюсь, что это то, что вы хотите.

+3

+1: Рабочий код: http://jsfiddle.net/MQ3YF/ – lepe

+0

скрипка выше не работает .... – Mikeys4u

+1

@ Mikeys4u библиотека не была погрузка. Это работает: http://jsfiddle.net/MQ3YF/112/ – Piyin

3

Надеюсь, это может вам помочь!

<input type="button" id="left" value="left" /> 
<input type="button" id="right" value="right" /> 
<img src="https://www.google.com/images/srpr/logo3w.png" id="image"> 

<script> 
var angle = 0; 
    $('#left').on('click', function() { 
     angle -= 90; 
     $("#image").rotate(angle); 
    }); 

    $('#right').on('click', function() { 
     angle += 90; 
     $("#image").rotate(angle); 
    }); 
</script> 

Try it

+0

Это работает только потому, что у вас есть гигантский запас – aeosynth

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