Проблема CSS перехода / анимации при наведении - PullRequest
0 голосов
/ 25 апреля 2019

Я хочу создать кнопку, которая меняется при наведении курсора. Здесь вы можете проверить это: https://drive.google.com/file/d/1fIcil2Xyky8DC2NRcfZBKXCMHk9gpat2/view?usp=sharing.

Здесь вы можете увидеть мою попытку: https://codepen.io/koravski/pen/BEvKRP

body {
  display: flex;
  justify-content: center;
  align-items: center;
  background: #333;
  font-family: 'Lato', sans-serif;
}

.txt {
  position: absolute;
  color: #fff;
}

.box {
  width: 200px;
  height: 50px;
  background-color: red;
  transition: all 1s;
}

.box:hover {
  width: 50px;
  height: 5px;
  margin-top: 40px;
}
<div class="txt">Call to action</div>
<div class="box"></div>

Проблема в том, что при наведении курсора он начинает зацикливаться. Он должен быть на красном прямоугольнике, чтобы он не зацикливался.

Если у вас есть предложения, будет приятно. Спасибо.

Ответы [ 5 ]

1 голос
/ 25 апреля 2019

Вот идея использования фоновой анимации, где вам понадобится только один элемент:

body {
  display: flex;
  justify-content: center;
  align-items: center;
  font-family: 'Lato', sans-serif;
}

.txt {
  color: #fff;
  padding:20px 50px;
  background-image:linear-gradient(red,red);
  background-size:100% 100%;
  background-position:bottom center;
  background-repeat:no-repeat;
  transition:1s;
}
.txt:hover {
  background-size:20% 5%;
  color:#000;
}
<div class="txt">Call to action</div>
1 голос
/ 25 апреля 2019

Это происходит потому, что всякий раз, когда кнопка сжимается, ваша мышь больше не зависает над ней, поэтому анимация возвращается и попадает в окно (вызывая ее повторное срабатывание. Я бы предложил использовать псевдоэлемент -

.box::before {
  background-color: red;
  content: '';
  position: absolute;
  height: 100%;
  width: 100%;
  z-index: 0;
  transition: all 1s;
  bottom: 0;
  left: 50%;
  transform: translateX(-50%);
}

.box:hover.box::before {
   width: 50px;
   height: 5px;
}

https://codepen.io/aedenmurray/pen/XQodQj

1 голос
/ 25 апреля 2019

Не совсем ясно, какой эффект вы получаете после этого, но вы меняете размер, поэтому, когда он уменьшается, вы больше не зависаете над ним.

Я бы предложил вместо этого transform (двана самом деле, один для размера, а другой для позиции).

html,
body {
  height: 100%;
}

body {
  display: flex;
  justify-content: center;
  align-items: center;
  background: #333;
  font-family: 'Lato', sans-serif;
}

.txt {
  position: absolute;
  color: #fff;
}

.box {
  width: 200px;
  height: 50px;
  background-color: red;
  transition: all 1s;
}

.box:hover {
  transform: translateY(40px) scale(.1);
}
<div class="txt">Call to action</div>
<div class="box"></div>

Существуют и другие проблемы, но это зависит от того, что это на самом деле должно делать.

Фактически, вы можете сделать это с одним div.

html,
body {
  height: 100%;
}

body {
  display: flex;
  justify-content: center;
  align-items: center;
  background: #333;
  font-family: 'Lato', sans-serif;
}

.txt {
  position: relative;
  color: #fff;
  width: 200px;
  height: 50px;
  line-height: 50px;
  text-align: center;
  transition: all 1s;
}

.txt:before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  background-color: red;
  z-index: -1;
  transition: all 1s;
}

.txt:hover:before {
  transform: translateY(40px) scale(.1);
}
<div class="txt">Call to action</div>
0 голосов
/ 25 апреля 2019

Хитрость в том, чтобы применить :hover к окружающему элементу.Таким образом, вы продолжаете зависать над элементом, и меняется только включенный блок.

К вашему сведению:

translate3d используется для лучшей производительности, чем обычно translateX.Вы могли бы улучшить код дальше.Красный элемент может быть элементом ::before, и вы можете присоединить :focus тоже для лучшей доступности.И, возможно, использовать элемент button.

html, body {
  height: 100%;
}

body {
  display: flex;
  justify-content: center;
  align-items: center;
  background: #333;
  font-family: 'Lato', sans-serif;
}

.btn {
  position: relative;
}

.btn-txt {
  color: #fff;
  text-align: center;
  vertical-align: middle;
  position: relative;
  padding: 20px 30px;
}

.btn-box {
  background-color: red;
  transition: all 1s;
  position: absolute;
  bottom: 0;
  left: 0;
  height: 100%;
  width: 100%;
}

.btn:hover .btn-box {
  width: 50px;
  height: 5px;
  transform: translate3d(50px, 0, 0);
  top: auto;
}
<div class="btn">
  <div class="btn-box"></div>
  <div class="btn-txt">Call to action</div>
</div>
0 голосов
/ 25 апреля 2019

Я бы завернул ваши .box и .txt в контейнер, а затем, когда этот контейнер наведется, сделаю переход.Таким образом, ваша область при наведении не изменяется, вместо этого содержимое.

html, body {
  height: 100%;
}

body {
  display: flex;
  justify-content: center;
  align-items: center;
  background: #333;
  font-family: 'Lato', sans-serif;
}

.txt {
  position:absolute;
  color: #fff;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 100px;
}

.box {
  width: 200px;
  height: 50px;
  background-color: red;
  transition: all 1s;
}

.container {
  position: relative;
}


.container:hover > .box {
  width: 50px;
  height: 5px;
  margin-top: 40px;
}
<div class="container">
  <div class="txt"> Call to action</div>
  <div class="box"></div>
</div>

Просмотр обновленного CodePen

...