I'm using transform: rotate();
to rotate content in & out of view, however, each body of text is at a different position when it comes into view. So when you click the next button on my demo if you look at the border the contents are in different positions.
When the next button is clicked the wheel rotates equally 90 degrees so I expect the content to be in the same position on each rotation. Could someone explain/resolve why this doesn't happen?
I created a wheel for my content and I styled the wheel to hide options no currently visible;
// Page load transform start, setters
var degree = 0;
var itemStart = $('.wheel').find('.item-one').addClass('item-active');
var itemNext = $('.wheel').find('.item-four').addClass('item-prev');
// On click
$('.next').click(function() {
var wheel = $('.wheel');
// Increment rotation
degree += 90;
wheel.css({
WebkitTransform: 'rotate(' + degree + 'deg)'
});
// Update setter
itemStart = $('.wheel').find('.item-active');
itemNext = $('.wheel').find('.item-prev');
// Add Animation
$(itemStart).addClass('fadeOut');
$(itemNext).addClass('fadeIn');
//If were at the end
var getStartPrev = $(itemStart).prev();
var getNextPrev = $(itemNext).prev();
if (getStartPrev.length == 0) {
$(itemStart).removeClass('item-active');
$(itemNext).prev().addClass('item-prev');
$('.item-four').addClass('item-active').removeClass('item-prev');
} else {
$(itemStart).removeClass('item-active');
$(itemNext).removeClass('item-prev').addClass('item-active');
$(itemNext).prev().addClass('item-prev');
}
if (getNextPrev.length == 0) {
$('.item-four').addClass('item-prev');
}
// Remove Animation
setTimeout(function() {
$('.wheel').find('.item').removeClass('fadeIn fadeOut');
}, 400);
});
.wheel-wrp {
position: relative;
height: 700px;
width: 700px;
}
.wheel {
height: 700px;
width: 700px;
transition: 0.75s;
border-radius: 50%;
position: relative;
background: #fff;
left: -350px;
}
.item {
width: 250px;
position: absolute;
opacity: 0;
}
.item-active {
opacity: 1;
}
.item-one {
bottom: 300px;
left: 450px;
}
.item-two {
bottom: 20px;
left: 230px;
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
transform: rotate(90deg);
}
.item-three {
bottom: 320px;
left: 0px;
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
transform: rotate(180deg);
}
.item-four {
top: 20px;
left: 230px;
-webkit-transform: rotate(270deg);
-moz-transform: rotate(270deg);
transform: rotate(270deg);
}
.current-item {
bottom: 300px;
left: 450px;
}
.next-item {
top: 20px;
left: 230px;
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
transform: rotate(-90deg);
opacity: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="page">
<div class="wheel-wrp">
<div class="wheel">
<div class="item item-one">
<h4>Project 1 - beautifully crafted digital brand</h4>
<p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum..</p>
</div>
<div class="item item-two">
<h4>Project 2 - redefining technological boundaries</h4>
<p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum..</p>
</div>
<div class="item item-three">
<h4>Project 3 - Beauty in Design</h4>
<p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum..</p>
</div>
<div class="item item-four">
<h4>Project 4 - simply stunning </h4>
<p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum..</p>
</div>
</div>
</div>
</div>
<div class="next">Next</div>
Example demo - https://codepen.io/SamXronn/pen/opqWbq
To rotate a Transform, use Transform. Rotate, which uses Euler Angles. If you want to match values you see in the Inspector, use the Quaternion.
An element can be rotated 90 degrees by using the transform property. This property is used to move, rotate, scale and others to perform various kinds of transformation to elements. The rotate() transformation function can be used as the value to rotate the element.
Rotate text can be done by using the rotate() function. We can rotate the text in a clockwise and anti-clockwise directions. The rotate function can also rotate HTML elements as well.
Here's my go at it.
I have set the items's transform origin to top left (the same point used for positioning)
Using transform translateY
and translateX
, each item can then be placed against the wheel, regardless of their width and height
You don't need jQuery for animation. Just use it to toggle the active class. The same result is achieved much more smoothly and with much less code with CSS3 animation and an "active" class.
Codepen here
let currentItem = 0
const $wheel = $('.wheel'),
$items = $wheel.find(".item")
$('.next').click(() => rotate(1));
$('.prev').click(() => rotate(-1));
const rotate = direction => {
currentItem -= direction
$wheel.css("transform",`rotate(${-currentItem*90}deg)`)
$items.removeClass("active")
.eq(currentItem%$items.length)
.addClass("active")
}
body {
background-color: #2c3e50;
}
button {
background: #2980b9;
padding: 15px 35px;
color: #fff;
float: left;
position: relative;
z-index: 9999;
cursor: pointer;
}
.wheel {
height: 700px;
width: 700px;
transition: transform 0.75s;
border-radius: 50%;
position: relative;
background: #fff;
}
.item {
width: 250px;
position: absolute;
opacity: 0.2;
transition: opacity 0.75s;
border: 1px solid #f00;
transform-origin: top left;
}
.item:nth-child(1) {
top: 50%;
left: 100%;
transform: translateY(-50%) translateX(-100%);
}
.item:nth-child(2) {
top: 100%;
left: 50%;
transform: rotate(90deg) translateY(-50%) translateX(-100%);
}
.item:nth-child(3) {
left: 0;
top: 50%;
transform: rotate(180deg) translateY(-50%) translateX(-100%);
}
.item:nth-child(4) {
top: 0;
left: 50%;
transform: rotate(270deg) translateY(-50%) translateX(-100%);
}
.item.active {
opacity: 1;
}
h4 {
margin: 0px 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<div id="page">
<div class="wheel">
<div class="item active">
<h4>Project 1 - beautifully crafted digital brand</h4>
<p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum..</p>
</div>
<div class="item">
<h4>Project 2 - redefining technological boundaries</h4>
<p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum..</p>
</div>
<div class="item">
<h4>Project 3 - Beauty in Design</h4>
<p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum..</p>
</div>
<div class="item">
<h4>Project 4 - simply stunning </h4>
<p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum..</p>
</div>
</div>
</div>
<button class="prev">Prev</button>
<button class="next">Next</button>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With