Home > Enterprise >  Keyframes gremlin?
Keyframes gremlin?

Time:10-26

I've been studying web development for about 2 weeks now. I've just started animations and I'm trying to complete a CSS assignment using Keyframes where I need to make an element move

  • from the top-left of the viewport
  • to the top-right
  • to the bottom-right
  • to the bottom-left
  • and back to the top-left again.

My element makes it almost to the bottom-left corner, but not quite, and then just kind of cuts the corner and returns to the top-left corner at a weird angle. On top of that, I can't manage to keep the element itself on the page or in a container div during the animation.

.box{
    width: 100px;
    height: 100px;
    border: 1px solid black;
    background-color: black;
    top: 0;
    left:0;
    border-radius: 50%;
    position: relative;
    animation-name: slideme;
    animation-duration: 12s;
    animation-iteration-count: infinite;
    

}

#container{
    width: 800px;
    height: 800px;
    border: 1px solid red;
    position: absolute;
}

@keyframes slideme{

    0%{
        top: 0;
        left: 0;
    }

    25%{
        left: 100%;
        top: 0;
    }

    50%{
        left: 100%;
        top: 100%;
    }

    75%{
       right: 100%;
       top: 100%;
    }

    100%{
       left:0 ;
       top: 0;
    }

} 



This is what I've written so far and it gets me 3/4 of the way there, but I can't for the life of me figure out why there's that little corner cut at the end. Any help or advice on this would be greatly, greatly appreciated.

I attempted to change the values of the 100%{} attribute, and I also attempted to extend the animation to make sure it had enough time to play through.

CodePudding user response:

This is because you're using right in the 75% keyframe instead of left, see what it looks like with left instead:

.box {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: black;
  top: 0;
  left: 0;
  border-radius: 50%;
  position: relative;
  animation-name: slideme;
  animation-duration: 5s;
  animation-iteration-count: infinite;
}

#container{
    width: 200px;
    height: 200px;
    border: 1px solid red;
    position: absolute;
}

@keyframes slideme {
  0% {
    top: 0;
    left: 0;
  }
  25% {
    top: 0;
    left: 100%;
  }
  50% {
    top: 100%;
    left: 100%;
  }
  75% {
    top: 100%;
    left: 0;
  }
  100% {
    top: 0;
    left: 0;
  }
}
<div id="container">
  <div ></div>
</div>

I sped up your animation and made the box smaller, but it should be otherwise the same code!

I just saw that you want to contain the element within the parent container/page: you can use calc for this! Check it out:

.box {
  width: 100px;
  height: 100px;
  border: 1px solid black;
  background-color: black;
  top: 0;
  left: 0;
  border-radius: 50%;
  position: relative;
  animation-name: slideme;
  animation-duration: 5s;
  animation-iteration-count: infinite;
}

#container {
  width: 200px;
  height: 200px;
  border: 1px solid red;
  position: absolute;
}

@keyframes slideme {
  0% {
    top: 0;
    left: 0;
  }
  25% {
    top: 0;
    left: calc(100% - 100px);
  }
  50% {
    top: calc(100% - 100px);
    left: calc(100% - 100px);
  }
  75% {
    top: calc(100% - 100px);
    left: 0;
  }
  100% {
    top: 0;
    left: 0;
  }
}
<div id="container">
  <div ></div>
</div>

  • Related