Rotate image follow mouse jquery with smooth transition
HTML:
JavaScript (dependent on jQuery):
- $(function () {
- var img = $('.arrow');
- if (img.length > 0) {
- var offset = img.offset();
- $('.animation-trigger').mouseenter(function (event) {
- var element = $(this);
- var elementPosition = element.offset();
- var elementX = elementPosition.left + (element.width() / 2);
- var elementY = elementPosition.top + (element.height() / 2);
- var imgX = offset.left + (img.width() / 2);
- var imgY = offset.top + (img.height() / 2);
- var radians = Math.atan2(elementX - imgX, elementY - imgY);
- var degrees = (radians * (180 / Math.PI) * -1) + 90;
- img.css('-moz-transform', 'rotate(' + degrees + 'deg)')
- .css('-webkit-transform', 'rotate(' + degrees + 'deg)')
- .css('-o-transform', 'rotate(' + degrees + 'deg)')
- .css('-ms-transform', 'rotate(' + degrees + 'deg)');
- });
- }
- });
CSS:
- body {
- padding-top: 150px;
- }
- .container {
- height: 500px;
- }
- .menu-1,
- .menu-2,
- .menu-3,
- .menu-4 {
- position: absolute;
- z-index: 99
- }
- .menu-1 {
- top: 20%;
- left: 20%;
- }
- .menu-2 {
- top: 20%;
- right: 20%;
- }
- .menu-3 {
- bottom: 20%;
- left: 20%;
- }
- .menu-4 {
- bottom: 20%;
- right: 20%;
- }
- .arrow {
- position: absolute;
- top: 50%;
- left: 50%;
- margin-top: -100px;
- margin-left: -100px;
- height: 200px;
- width: 200px;
- -webkit-transition: all 400ms cubic-bezier(0.455, 0.03, 0.515, 0.955);
- -moz-transition: all 400ms cubic-bezier(0.455, 0.03, 0.515, 0.955);
- -o-transition: all 400ms cubic-bezier(0.455, 0.03, 0.515, 0.955);
- transition: all 400ms cubic-bezier(0.455, 0.03, 0.515, 0.955);
- }
It works great! However if you hover over link 1, the arrow will turn to it and then you decide to hover over link 4 and the arrow will again point to it. However it goes all the way around (clockwise) instead of taking the short route of just spinning back(anti-clockwise).
I've had a go at a few attempts but none have worked and if I come up with an idea that could work it's extremely long winded. I'm struggling to work out the best way to approach this so any help would be very much appreciated.
Please note the jsfiddle is a quick mock up example of what I am trying to achieve. Unfortunately I cannot share the actual source code due to client confidentiality. Any solutions provided I will apply to the final site.
Many thanks:)