Как анимировать квадрат вокруг блока?

Моя анимация работает, но после одного поворота квадрат поворачивается на 45 градусов, Я не понимаю, почему. https://codepen.io/igamanstudio/pen/ZPYWWO

.card {
  /* Add shadows to create the "card" effect */
  position: relative;
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
  transition: 0.3s;
  width: 300px;
  height: 300px;
  margin: 150px auto;
}

.anim-square {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  animation: spin 20s linear infinite;
}

.losange-wrap {
  position: relative;
}

.losange-1 {
  position: absolute;
  overflow: hidden;
  top: -15px;
  left: -15px;
  width: 30px;
  height: 30px;
  transform: rotate(45deg);
  transform-origin: center;
  background: red;
  border: 2px solid blue;
  animation: invert-spin 22.5s linear infinite;
}
.losange-1 .img {
  position: relative;
  width: 30px;
  height: 30px;
}
.losange-1 .img:before {
  position: absolute;
  content: '';
  display: block;
  z-index: 999;
  top: -15px;
  left: -15px;
  width: 60px;
  height: 60px;
  background: url("https://loremflickr.com/60/60/girl/all") center center;
  transform: rotate(-45deg);
  transform-origin: center;
}

/* On mouse-over, add a deeper shadow */
.card:hover {
  box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
}

/* Add some padding inside the card container */
.container {
  padding: 2px 16px;
}

@keyframes spin {
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
@keyframes invert-spin {
  100% {
    -webkit-transform: rotate(-360deg);
    transform: rotate(-360deg);
  }
}
<div class = "card">
  <img src = "http://placekitten.com/300/200" alt = "Avatar" style = "width:100%">
  <div class = "container">
    <h4><b>John Doe</b></h4> 
    <p>Architect & Engineer</p> 
  </div>
  <div class = "anim-square">
    <div class = "losange-wrap">
      <div class = "losange-1">
        <div class = "img"></div>
      </div>
    </div>
  </div>
</div>
  transform: rotate(45deg);
  transform-origin: center;
  background: red ;
  border: 2px solid blue;
  animation: invert-spin 22.5s linear infinite;

Я рекомендую добавлять в этот пост полный код в виде исполняемого фрагмента, а не связанной кодовой ручки (которая может меняться и перемещаться с течением времени).

ggorlen 26.02.2019 21:35
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
1
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала вам нужно установить одинаковую продолжительность для обеих анимаций, затем вам нужно использовать rotate(-315deg) для изображения, так как вы устанавливаете rotate(45deg). Разница должна быть 360deg как основной контейнер, который будет анимироваться от 0deg до 360deg

.card {
  /* Add shadows to create the "card" effect */
  position: relative;
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
  transition: 0.3s;
  width: 300px;
  height: 300px;
  margin: 150px auto;
}

.anim-square {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  //background: rgba(0,0,0,0.3);
  animation: spin 5s linear infinite;
}

.losange-wrap {
  position: relative;
}

.losange-1 {
  position: absolute;
  overflow: hidden;
  top: -15px;
  left: -15px;
  width: 30px;
  height: 30px;
  transform: rotate(45deg);
  transform-origin: center;
  background: red;
  border: 2px solid blue;
  animation: invert-spin 5s linear infinite;
}

.losange-1 .img {
  position: relative;
  width: 30px;
  height: 30px;
}

.losange-1 .img:before {
  position: absolute;
  content: '';
  display: block;
  z-index: 999;
  top: -15px;
  left: -15px;
  width: 60px;
  height: 60px;
  background: url('https://loremflickr.com/60/60/girl/all') center center;
  transform: rotate(-45deg);
  transform-origin: center;
}


/* On mouse-over, add a deeper shadow */

.card:hover {
  box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
}


/* Add some padding inside the card container */

.container {
  padding: 2px 16px;
}

@keyframes spin {
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

@keyframes invert-spin {
  100% {
    -webkit-transform: rotate(-315deg);
    transform: rotate(-315deg);
  }
}
<div class = "card">
  <img src = "http://placekitten.com/300/200" alt = "Avatar" style = "width:100%">
  <div class = "container">
    <h4><b>John Doe</b></h4>
    <p>Architect & Engineer</p>
  </div>
  <div class = "anim-square">
    <div class = "losange-wrap">
      <div class = "losange-1">
        <div class = "img"></div>
      </div>
    </div>
  </div>
</div>

Другие вопросы по теме