Эффект перехода CSS «запаздывает»

#css

#css

Вопрос:

У меня есть:

 #t {
  background: bisque;
  display:block;
  width: 200px;
  height: 100px;
  transition:0.5s;
}
#t:hover {
  border-bottom: 3px solid grey;
}  
 <div id="t"></div>  

Как вы можете видеть при наведении курсора — transition эффект начинает «отставать», вероятно, потому, что я добавляю border-bottom в качестве эффекта наведения, который не подходит (?), Но не уверен.

Как я мог бы избежать такого «запаздывания» и добавить transition: 0.5s; для border-bottom внешнего вида?

Ответ №1:

Это потому, что размеры границ могут быть определены и «пошагово пройдены» только в целых значениях, поэтому у вас не может быть субпиксельных границ, что вызывает эффект отрывистости. Решением будет просто отобразить псевдоэлемент высотой 3 пикселя, но преобразовать его так, чтобы он начинался с scaleY(0) , и при наведении развернуть его на полную высоту с помощью scaleY(1) .

Чтобы создать впечатление, что масштабирование начинается с верхнего края псевдоэлемента, вам также нужно будет использовать transform-origin: top center .

Смотрите доказательство концепции:

 #t {
  background: bisque;
  display:block;
  width: 200px;
  height: 100px;
  position: relative;
}
#t::before {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  height: 3px;
  background-color: grey;
  content: '';
  transform: scaleY(0);
  transform-origin: top center;
  transition: 0.5s;
}
#t:hover::before {
  transform: scaleY(1);
}  
 <div id="t"></div>  

Ответ №2:

Вы также можете имитировать нижнюю границу с помощью box-shadow.

 #t {
    display: block;
    background: bisque;
    position: relative;
    width: 200px;
    height: 100px;
    transition: box-shadow 0.5s linear;
  }  

  #t:hover {
    box-shadow: 0 3px 0 0 grey;
  }
    
 <div id="t"></div>  

Благодаря CSS-хитростям о анимации границы

Ответ №3:

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