I\'m trying to generate a \'nice\' CSS menu using (mainly) CSS, but with a tiny bit of jQuery as well:
My overall idea is:
+--------------------
function rotateStep($this, $circle, angle) {
$this.animate({
rotation: angle
}, {
step: function(now, fx) {
$this.css({
transform: 'rotate(' + now + 'deg)'
});
$circle.css({
transform: 'translate(-50%, -50%) rotate(' + -now + 'deg)'
});
}
});
}
$('.wrap').hover(function() {
var $this = $(this),
$circleWrappers = $this.find('.circleWrapper'),
angleOffset = 360 / $circleWrappers.length,
angle = - angleOffset / 2,
distance = Math.min($this.width(), $this.height()) / 2;
$circleWrappers.each(function() {
var $this = $(this),
$circle = $(this).find('.circle');
$circle.animate({ top: -distance });
rotateStep($this, $circle, angle);
angle -= angleOffset;
});
}, function() {
var $this = $(this),
$circleWrappers = $this.find('.circleWrapper');
$circleWrappers.each(function() {
var $this = $(this),
$circle = $(this).find('.circle');
$circle.animate({ top: 0 });
rotateStep($this, $circle, 0);
});
});
.wrap {
position: relative;
background-color: #cccccc;
width: 400px;
height: 400px;
transition:all 0.8s;
transform-origin: center center;
}
.circleWrapper {
display: inline-block;
position: absolute;
left: 50%;
top: 50%;
}
.circle {
position: absolute;
width: 80px;
height: 80px;
border-radius: 40px;
background-color: white;
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.5);
line-height: 80px;
text-align: center;
font-family: arial;
font-size: 42px;
font-weight: bold;
transform: translate(-50%, -50%);
}
1
2
3
4
JSFiddle