css menu animation nothing happens - css

I'm trying to make a simple menu for my website. It's supposed to be that the menu boxes become longer when hovered over. I tried putting the end-result in my .item:hover, which worked, I have the color setting in my hover to check if it sees me. However, the animation does nothing, which bothers me. Could anyone explain what I could do better.
#-webkit-keyframes ITEMHOVER {
0% { width: 17vw; }
5% { width: 16vw; }
100% { width: 22vw; }
}
#-moz-keyframes ITEMHOVER {
0% { width: 17vw; }
5% { width: 16vw; }
100% { width: 22vw; }
}
#-o-keyframes ITEMHOVER {
0% { width: 17vw; }
5% { width: 16vw; }
100% { width: 22vw; }
}
#keyframes ITEMHOVER {
0% { width: 17vw; }
5% { width: 16vw; }
100% { width: 22vw; }
}
.item:hover {
-webkit-animation: itemHover 2s;
-moz-animation: itemHover 2s;
-o-animation: itemHover 2s;
animation: itemHover 2s;
color: #000000;
}
Added snippet because the website refused to post my code because he's spacebar-blind.
Edit: Changed the "width: value;" to "transform: schaleX(value);". Didn't work.
Edit2: jfiddle: http://jsfiddle.net/ddrekkf9/ someone requested.

It's because the animation name is case sensitive, and also you have to prefix the transforms in your animation. If you do this:
#-webkit-keyframes ITEMHOVER {
0% { -webkit-transform: scaleX(1); }
25% { -webkit-transform: scaleX(0.90); }
75% { -webkit-transform: scaleX(1.25); }
100% { -webkit-transform: scaleX(1.20); }
}
#-moz-keyframes ITEMHOVER {
0% { -moz-transform: scaleX(1); }
25% { -moz-transform: scaleX(0.90); }
75% { -moz-transform: scaleX(1.25); }
100% { -moz-transform: scaleX(1.20); }
}
#-o-keyframes ITEMHOVER {
0% { -o-transform: scaleX(1); }
25% { -o-transform: scaleX(0.90); }
75% { -o-transform: scaleX(1.25); }
100% { -o-transform: scaleX(1.20); }
}
#keyframes ITEMHOVER {
0% { transform: scaleX(1); }
25% { transform: scaleX(0.90); }
75% { transform: scaleX(1.25); }
100% { transform: scaleX(1.20); }
}
.item:hover {
-webkit-animation: ITEMHOVER 2s;
-moz-animation: ITEMHOVER 2s;
-o-animation: ITEMHOVER 2s;
animation: ITEMHOVER 2s;
color: #000000;
}
It will work.
NOTE: This was according to your fiddle. In your initial post, you were trying to animate width. Simply changing itemHover to ITEMHOVER would've done it.

Related

CSS animation transform translateY also changing translateX, but is not specified in animation

Here, I have a simple CSS file containing 2 animations.
.div
transform: translateX(-50%);
}
.fade-in {
animation-name: fade-in;
animation-duration: .2s;
}
.fade-out {
animation-name: fade-out;
animation-duration: .2s;
}
#keyframes fade-out {
0% {
opacity: 100%;
}
100% {
opacity: 0%;
transform: translateY(-10px);
}
}
#keyframes fade-in {
0% {
opacity: 50%;
transform: translateY(-10px);
}
100% {
opacity: 100%;
}
}
Why is it that even though I only specified translateY in the animation keyframes, it also manipulates the translateX in the transform property? And how can I make it so it only changes the Y value?
You are overriding the transform peropty. Merge transform: translateX(-50%) and transform: translateY(-10px); by doing: transform: translate(-50%, -10px);
Do this:
.div {
transform: translateX(-50%);
}
.fade-in {
animation-name: fade-in;
animation-duration: .2s;
}
.fade-out {
animation-name: fade-out;
animation-duration: .2s;
}
#keyframes fade-out {
0% {
opacity: 100%;
}
100% {
opacity: 0%;
transform: translate(-50%, -10px); /* NEW */
}
}
#keyframes fade-in {
0% {
opacity: 50%;
transform: translate(-50%, -10px); /* NEW */
}
100% {
opacity: 100%;
}
}
You override whole transform attribute - not just translate. If you want to keep your translateX value you have to include it in animation too.
#keyframes fade-out {
0% {
opacity: 100%;
transform: translateX(-50%);
}
100% {
opacity: 0%;
transform: translateY(-10px) translateX(-50%);
}
}

CSS animation. Slide in for 10 seconds and then move up and down infinitely

I currently have an image "floating". So it moves up and down over 10 seconds. But what I'd really like it to do is to do is slide in right from off canvas over 10 seconds and then float infinitely.
The code I have now just makes it float up and down and I'm struggling to add the slide in part. I'm new to CSS animation so I'd appreciate any help.
This is what I have so far.
.shake-vertical {
-webkit-animation: shake-vertical 15s cubic-bezier(0.455, 0.030, 0.515, 0.955) infinite both;
animation: shake-vertical 15s cubic-bezier(0.455, 0.030, 0.515, 0.955) infinite both;
}
#-webkit-keyframes shake-vertical {
0%,
100% {
-webkit-transform: translateY(0);
transform: translateY(0);
}
10%,
30%,
50%,
70% {
-webkit-transform: translateY(-8px);
transform: translateY(-8px);
}
20%,
40%,
60% {
-webkit-transform: translateY(8px);
transform: translateY(8px);
}
80% {
-webkit-transform: translateY(6.4px);
transform: translateY(6.4px);
}
90% {
-webkit-transform: translateY(-6.4px);
transform: translateY(-6.4px);
}
}
#keyframes shake-vertical {
0%,
100% {
-webkit-transform: translateY(0);
transform: translateY(0);
}
10%,
30%,
50%,
70% {
-webkit-transform: translateY(-8px);
transform: translateY(-8px);
}
20%,
40%,
60% {
-webkit-transform: translateY(8px);
transform: translateY(8px);
}
80% {
-webkit-transform: translateY(6.4px);
transform: translateY(6.4px);
}
90% {
-webkit-transform: translateY(-6.4px);
transform: translateY(-6.4px);
}
}
Considering your image has a class of ball. You can add this CSS to your Existing CSS:
#keyframes slide-in {
from{
margin-right: -100px;
}
to{
margin-right: 0;
}
}
.ball{
width: 100px;
height: 100px;
border-radius: 50%;
background-color: red;
float: right;
animation: slide-in 10s forwards,/*forwards keeps the ball at final position*/
shake-vertical 15s infinite 10s both;
/*
* Two animations applied
* comma separated
* shake-vertical has a 10 second delay specified by '10s'
* the delay should be same as the duration of first animation
*/
}
I have added comments for explanation but if you need more, feel free to comment.
You can set the object with a slidein animation for 10 seconds and on the animationend event change its class to your shake animation.
Add CSS something like this:
#keyframes slidein {
0% {
transform: translateX(100vw);
}
100% {
transform: translateX(50vw);
}
}
.slidein {
animation-name:slidein;
animation-duration:10s;
animation-fill-mode: follow;
}
.shake {
animation-name: shake-vertical;
animation-duration: 10s;
animation-iteration-count: infinite;
}
}
and JavaScript something like this
obj.addEventListener("animationend", function () {
obj.classList.remove('slidein');
obj.classList.add('shake');
});
Example with a simple sliding square in the Snippet.
<!DOCTYPE html>
<html>
<head>
<style>
#keyframes slidein {
0% {
transform: translateX(100vw);
}
100% {
transform: translateX(50vw);
}
}
#keyframes shake-vertical {
0%,
100% {
-webkit-transform: translateY(0);
transform: translateY(0);
}
10%,
30%,
50%,
70% {
-webkit-transform: translateY(-8px);
transform: translateY(-8px);
}
20%,
40%,
60% {
-webkit-transform: translateY(8px);
transform: translateY(8px);
}
80% {
-webkit-transform: translateY(6.4px);
transform: translateY(6.4px);
}
90% {
-webkit-transform: translateY(-6.4px);
transform: translateY(-6.4px);
}
}
#obj {
position: relative;
width: 50px;
height: 50px;
top: 50px;
background-color:magenta;
animation-delay:0s;
}
.slidein {
animation-name:slidein;
animation-duration:10s;
}
.shake {
left: 50vw;
animation-name:shake-vertical;
animation-duration: 10s;
animation-iteration-count: infinite;
}
</style>
</head>
<div id="obj" class="slidein"></div>
<script>
var obj = document.getElementById('obj');
obj.addEventListener("animationend", function () {
obj.classList.remove('slidein');
obj.classList.add('shake');
});
</script>
</html>

Multiple CSS animation effects in parallel

To terrify the guys at Pixar (with my animation skills), I am attempting to get a walking effect to work using CSS ...
Unfortunately, I am unable to work two different animation effects in parallel, I want the steps to rotate at a variable rate to the walkRight transition.
Here is my current attempt:
CSS
.wrapper {
position: absolute;
width: 100px;
height: 100px;
right: 0;
animation-name: walkRight;
animation-iteration-count: 1;
animation-timing-function: ease-out;
animation-duration: 10s;
}
.hulk {
-webkit-animation: steps 10s linear 0s;
}
#keyframes walkRight {
0% {
transform: translateX(-400px);
}
100% {
transform: translateX(0);
}
}
#-webkit-keyframes steps {
0% {
-webkit-transform: rotate(0deg);
}
25% {
-webkit-transform: rotate(20deg);
}
50% {
-webkit-transform: rotate(0deg);
}
75% {
-webkit-transform: rotate(-20deg);
}
100% {
-webkit-transform: rotate(0deg);
}
}
Here is an example JsFiddle
You could try to:
Use animation-iteration-count: 10 on hulk class and set is duration to 1s (as walkRight has 10s duration), this means the walk effect will be applied 10 times during the walk.
Prefix all properties using -webkit- to make sure browsers will render your animation properly, you could use autoprefixer (or similar) which does the job for you automatically.
.wrapper {
position: absolute;
width: 100px;
height: 100px;
right: 0;
-webkit-animation-name: walkRight;
animation-name: walkRight;
-webkit-animation-timing-function: ease-out;
animation-timing-function: ease-out;
-webkit-animation-duration: 10s;
animation-duration: 10s;
}
.hulk {
-webkit-animation: steps 1s linear 0s;
-webkit-animation-iteration-count: 10;
animation-iteration-count: 10;
}
#-webkit-keyframes walkRight {
0% {
-webkit-transform: translateX(-400px);
transform: translateX(-400px);
}
100% {
-webkit-transform: translateX(0);
transform: translateX(0);
}
}
#keyframes walkRight {
0% {
-webkit-transform: translateX(-400px);
transform: translateX(-400px);
}
100% {
-webkit-transform: translateX(0);
transform: translateX(0);
}
}
#-webkit-keyframes steps {
0% {
-webkit-transform: rotate(0deg);
}
25% {
-webkit-transform: rotate(20deg);
}
50% {
-webkit-transform: rotate(0deg);
}
75% {
-webkit-transform: rotate(-20deg);
}
100% {
-webkit-transform: rotate(0deg);
}
}
<div class="wrapper">
<img class="hulk" width="100px" src="http://vignette3.wikia.nocookie.net/heroup/images/4/4b/Thing_full_body.png/revision/latest?cb=20120117152657">
</div>
You can use animation-iteration-count on steps animation and set shorter duration. You just need to match ending time for both walk and steps that will repeat itself n number of times, so in this case its about 9 if duration is 1s.
.wrapper {
position: absolute;
width: 100px;
height: 100px;
right: 0;
animation-name: walkRight;
animation-iteration-count: 1;
animation-timing-function: ease-out;
animation-duration: 10s;
}
.hulk {
-webkit-animation: steps 1s linear 0s;
animation-iteration-count: 9;
}
#keyframes walkRight {
0% {
transform: translateX(-400px);
}
100% {
transform: translateX(0);
}
}
#-webkit-keyframes steps {
0% {
-webkit-transform: rotate(0deg);
}
25% {
-webkit-transform: rotate(20deg);
}
50% {
-webkit-transform: rotate(0deg);
}
75% {
-webkit-transform: rotate(-20deg);
}
100% {
-webkit-transform: rotate(0deg);
}
}
<div class="wrapper">
<img class="hulk" width="100px" src="http://vignette3.wikia.nocookie.net/heroup/images/4/4b/Thing_full_body.png/revision/latest?cb=20120117152657">
</div>

Disable css animation on page load

I want to disable css animation on page load only.
The thing is that this css animation is the menu icon of main navigation menu, but when on subpages (where there also is a submenu present) on click on submenu the main menu animation activates - but i would like it to only start when my main navigation icon is clicked. I provided html, javascript and css involved.
I would appreciate your support in this.
html:
<div class="mcwrap">
<input id="click" name="exit" type="checkbox">
<label for="click"><span class="burger"></span></label>
</div>
javascript:
$('.mcwrap label').on('click', function(){
(!$('#click').prop('checked')) ? setTimeout(function(){opensLeft()}, 200) : setTimeout(function(){closesLeft()}, 200);
});
function opensLeft() {
$("#sl").addClass('visible')
$("#swipe").addClass('isOpenLeft');
}
function closesLeft() {
$("#sl").removeClass('visible')
$("#swipe").removeClass('isOpenLeft');
}
css:
#sl.visible, #sr.visible {
display: block;
}
.mcwrap {
padding-top: 9px;
}
.mcwrap input {
display: none;
}
.mcwrap label {
position: relative;
width: 20px;
height: 30px;
display: block;
cursor: pointer;
background: transparent;
}
/* Exit Icon */
.mcwrap label:before,
.mcwrap input:checked + label:before {
content: '';
position: absolute;
top: 50%;
margin-top: -2px;
width: 30px;
height: 4px;
border-radius: 2px;
background: #fafafa;
}
.mcwrap label:before {
-webkit-animation: animationOneReverse 1s ease forwards;
animation: animationOneReverse 1s ease forwards;
}
#-webkit-keyframes animationOneReverse {
0% {
-webkit-transform: rotate(315deg);
}
25% {
-webkit-transform: rotate(360deg);
}
50%,
100% {
-webkit-transform: rotate(0deg);
}
}
#keyframes animationOneReverse {
0% {
transform: rotate(315deg);
}
25% {
transform: rotate(360deg);
}
50%,
100% {
transform: rotate(0deg);
}
}
.mcwrap input:checked + label:before {
-webkit-animation: animationOne 1s ease forwards;
animation: animationOne 1s ease forwards;
}
#-webkit-keyframes animationOne {
0%,
50% {
-webkit-transform: rotate(0deg);
}
75% {
-webkit-transform: rotate(360deg);
}
100% {
-webkit-transform: rotate(315deg);
}
}
#keyframes animationOne {
0%,
50% {
transform: rotate(0deg);
}
75% {
transform: rotate(360deg);
}
100% {
transform: rotate(315deg);
}
}
.mcwrap label:after,
.mcwrap input:checked + label:after {
content: '';
position: absolute;
top: 50%;
margin-top: -2px;
width: 30px;
height: 4px;
border-radius: 2px;
background: #fafafa;
}
.mcwrap label:after {
-webkit-animation: animationTwoReverse 1s ease forwards;
animation: animationTwoReverse 1 s ease forwards;
}
#-webkit-keyframes animationTwoReverse {
0% {
-webkit-transform: rotate(405deg);
}
25% {
-webkit-transform: rotate(450deg);
}
50%,
100% {
-webkit-transform: rotate(0deg);
}
}
#keyframes animationTwoReverse {
0% {
transform: rotate(405deg);
}
25% {
transform: rotate(450deg);
}
50%,
100% {
transform: rotate(0deg);
}
}
.mcwrap input:checked + label:after {
-webkit-animation: animationTwo 1s ease forwards;
animation: animationTwo 1s ease forwards;
}
#-webkit-keyframes animationTwo {
0%,
50% {
-webkit-transform: rotate(0deg);
}
75% {
-webkit-transform: rotate(450deg);
}
100% {
-webkit-transform: rotate(405deg);
}
}
#keyframes animationTwo {
0%,
50% {
transform: rotate(0deg);
}
75% {
transform: rotate(450deg);
}
100% {
transform: rotate(405deg);
}
}
/* Burger Icon */
.mcwrap label .burger:before {
content: '';
position: absolute;
top: 4px;
width: 30px;
height: 4px;
border-radius: 2px;
background: #fafafa;
-webkit-animation: animationBurgerTopReverse 1s ease forwards;
animation: animationBurgerTopReverse 1s ease forwards;
}
#-webkit-keyframes animationBurgerTopReverse {
0%,
50% {
-webkit-transform: translateY(12px);
opacity: 0;
}
51% {
-webkit-transform: translateY(12px);
opacity: 1;
}
100% {
-webkit-transform: translateY(0px);
opacity: 1;
}
}
#keyframes animationBurgerTopReverse {
0%,
50% {
transform: translateY(12px);
opacity: 0;
}
51% {
transform: translateY(12px);
opacity: 1;
}
100% {
transform: translateY(0px);
opacity: 1;
}
}
.mcwrap input:checked + label .burger:before {
-webkit-animation: animationBurgerTop 1s ease forwards;
animation: animationBurgerTop 1s ease forwards;
}
#-webkit-keyframes animationBurgerTop {
0% {
-webkit-transform: translateY(0px);
opacity: 1;
}
50% {
-webkit-transform: translateY(12px);
opacity: 1;
}
51%,
100% {
-webkit-transform: translateY(12px);
opacity: 0;
}
}
#keyframes animationBurgerTop {
0% {
transform: translateY(0px);
opacity: 1;
}
50% {
transform: translateY(12px);
opacity: 1;
}
51%,
100% {
transform: translateY(12px);
opacity: 0;
}
}
.mcwrap label .burger:after {
content: '';
position: absolute;
bottom: 4px;
width: 30px;
height: 4px;
border-radius: 2px;
background: #fafafa;
-webkit-animation: animationBurgerBottomReverse 1s ease forwards;
animation: animationBurgerBottomReverse 1s ease forwards;
}
#-webkit-keyframes animationBurgerBottomReverse {
0%,
50% {
-webkit-transform: translateY(-12px);
opacity: 0;
}
51% {
-webkit-transform: translateY(-12px);
opacity: 1;
}
100% {
-webkit-transform: translateY(0px);
opacity: 1;
}
}
#keyframes animationBurgerBottomReverse {
0%,
50% {
transform: translateY(-12px);
opacity: 0;
}
51% {
transform: translateY(-12px);
opacity: 1;
}
100% {
transform: translateY(0px);
opacity: 1;
}
}
.mcwrap input:checked + label .burger:after {
-webkit-animation: animationBurgerBottom 1s ease forwards;
animation: animationBurgerBottom 1s ease forwards;
}
#-webkit-keyframes animationBurgerBottom {
0% {
-webkit-transform: translateY(0px);
opacity: 1;
}
50% {
-webkit-transform: translateY(-12px);
opacity: 1;
}
51%,
100% {
-webkit-transform: translateY(-12px);
opacity: 0;
}
}
#keyframes animationBurgerBottom {
0% {
transform: translateY(0px);
opacity: 1;
}
50% {
transform: translateY(-12px);
opacity: 1;
}
51%,
100% {
transform: translateY(-12px);
opacity: 0;
}
}
Add in JS a class when document is loaded:
$(window).on('load', function(){
$('body').addClass('loaded')
});
Then in CSS:
.loaded .mcwrap label:before {
-webkit-animation: animationOneReverse 1s ease forwards;
animation: animationOneReverse 1s ease forwards;
}
Repeat this example for every animation that need the load event

Can't get CSS3 animation to work on my website

I'm trying to get a bouncing mouse animation to work on my website.
The exact same code works on another website, whereas on mine it just doesn't do anything.
Here's the css:
.mouse {
display: block;
margin: 0 auto;
text-align: center;
width: 100%;
font-size: 32px;
color: #fff;
z-index:9999;
position: absolute;
color: #e8e8e8;;
bottom: 240px;
}
.mouse i {
-webkit-animation: todown 1.2s infinite linear;
transition: all 0.3s ease-in-out;
}
The HTML:
<a href="#x11" class="mouse">
<i class="fa fa-angle-double-down icon-option"></i>
</a>
On this website you can see the scrolldown icon I'm trying to create: http://noxxar.com/demo/uralco/
If you want to use CSS animations you need to define #keyframes.
Luckily the CSS on the theme you linked isn't minified or anything, so you can just copy/paste the parts you want to recreate.
Since Firefox 15 the -moz vendor prefix isn't needed but Chrome and other Webkit Browser still need -webkit-animation: http://caniuse.com/#feat=css-animation
CSS:
#to-slider-scrollto i {
-webkit-animation: todown 1.2s infinite linear;
animation: todown 1.2s infinite linear;
}
#to-slider-scrollto i:hover {
-webkit-animation: none;
animation: none;
}
#-webkit-keyframes todown {
0% {
-webkit-transform: translateY(-15px);
opacity: 0;
}
10% {
-webkit-transform: translateY(-15px);
opacity: 0;
}
50% {
-webkit-transform: translateY(0);
opacity: 1;
}
90% {
-webkit-transform: translateY(15px);
opacity: 0;
}
100% {
-webkit-transform: translateY(15px);
opacity: 0;
}
}
#keyframes todown {
0% {
transform: translateY(-15px);
opacity: 0;
}
10% {
transform: translateY(-15px);
opacity: 0;
}
50% {
transform: translateY(0);
opacity: 1;
}
90% {
transform: translateY(15px);
opacity: 0;
}
100% {
transform: translateY(15px);
opacity: 0;
}
}
Working codepen demo with only the needed CSS
Check out cross browser compatibility
.mouse i {
-webkit-animation: todown 1.2s linear infinite;
animation: todown 1.2s linear infinite;
}
#-webkit-keyframes todown {
0% {
-webkit-transform: translateY(0px);
transform: translateY(0px);
}
50% {
-webkit-transform: translateY(5px);
transform: translateY(5px);
}
}
#keyframes todown {
0% {
-webkit-transform: translateY(0px);
transform: translateY(0px);
}
50% {
-webkit-transform: translateY(5px);
transform: translateY(5px);
}
}

Resources