user9018937368
user9018937368

Reputation: 99

Simple line animation with keyframes

I tried to make a smooth animation, but the animate has a sort of "cut bug" in the middle.

How can I fix it ?

div,
div:after {
  width: 0vw;
  height: 3px;
  position: fixed;
  top: 1vw; bottom: 0;
  left: 40vw; right: 40vw;
  margin: auto;
/*  margin-top: -16px;*/

  z-index: 600;
  background-color: rgba(0, 0, 0, 1);
}

div {
  /*background-color: transparent;*/
/*  border-top: 3px solid rgba(0, 0, 0, 0.1);
  border-right: 3px solid rgba(0, 0, 0, 0.1);
  border-bottom: 3px solid rgba(0, 0, 0, 0.1);
  border-left: 3px solid black;
  -webkit-transform: translateZ(0);
          transform: translateZ(0);*/
  -webkit-animation-iteration-count:infinite;
          animation-iteration-count:infinite;
  -webkit-animation-timing-function: ease-in-out;
          animation-timing-function: ease-in-out;
  -webkit-animation-direction: alternate;
          animation-direction: alternate;
  -webkit-animation-duration: 1s;
          animation-duration: 1s;
  -webkit-animation-name: animsition-loading;
          animation-name: animsition-loading;
}

@-webkit-keyframes animsition-loading {
  0% {
    /*width: 0vw;*/
    transform:translate(0vw);
    width :0vw;
      margin-left: 0;
  }

  50% {
    /*width: 0vw;*/
    /*transform:translate(5vw);*/
    width :10vw;
    
  }

  100% {
    /*width: 0vw;*/
    transform:translate(1vw);
    width :0vw;
    margin-right: 0;
  }
}
<div> </div>

Upvotes: 1

Views: 1065

Answers (3)

Temani Afif
Temani Afif

Reputation: 272817

Here is another way to achieve the same with less of code:

.loading {
  height: 3px;
  position: fixed;
  top: 2vw;
  left: 40vw;
  right: 40vw;
  height: 3px;
  background: linear-gradient(#000, #000) left/0% 100% no-repeat;
  animation: anime 2s ease-in-out infinite alternate;
}

@keyframes anime {
  0% {
    background-size: 0% 100%;
    background-position: left;
  }
  50% {
    background-size: 70% 100%;
  }
  100% {
    background-size: 0% 100%;
    background-position: right;
  }
}
<div class="loading"></div>

Upvotes: 1

ElusiveCoder
ElusiveCoder

Reputation: 1609

Try this and you're done... Don't use transform translate, use only width instead.

div,
div:after {
  width: 0vw;
  height: 3px;
  position: fixed;
  top: 1vw; bottom: 0;
  left: 40vw; right: 40vw;
  margin: auto;
/*  margin-top: -16px;*/

  z-index: 600;
  background-color: rgba(0, 0, 0, 1);
}

div {
  /*background-color: transparent;*/
/*  border-top: 3px solid rgba(0, 0, 0, 0.1);
  border-right: 3px solid rgba(0, 0, 0, 0.1);
  border-bottom: 3px solid rgba(0, 0, 0, 0.1);
  border-left: 3px solid black;
  -webkit-transform: translateZ(0);
          transform: translateZ(0);*/
  -webkit-animation-iteration-count:infinite;
          animation-iteration-count:infinite;
  -webkit-animation-timing-function: ease-in-out;
          animation-timing-function: ease-in-out;
  -webkit-animation-direction: alternate;
          animation-direction: alternate;
  -webkit-animation-duration: 1s;
          animation-duration: 1s;
  -webkit-animation-name: animsition-loading;
          animation-name: animsition-loading;
}

@-webkit-keyframes animsition-loading {
  

0% {

    width :0;
    left: 0;
  }

  50% {   
    width :10vw;

  }

  100% {    
    width :0;
    right: 0;
  }
}
<div> </div>

Upvotes: 0

Szymon Żakiewicz
Szymon Żakiewicz

Reputation: 91

Try setting your animation this way:

@-webkit-keyframes animsition-loading {
  0% {

    width :0;
    left: 0;
  }

  50% {   
    width :10vw;

  }

  100% {    
    width :0;
    right: 0;
  }

Is that the effect you are looking for?

Upvotes: 0

Related Questions