Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Нужно сделать обводку при наведении

#html #css #анимация #transform


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

Код, это все что слева



.order-row {
  display: flex;
  width: 50%;
  height: 84vh;
  margin-top: 1vh;
  background: url(../img/14days.jpg) no-repeat;
  background-size: cover;
}

.link {
  display: flex;
  margin: auto;
}

.link h2 {
  display: block;
  margin: auto;
  text-align: center;
  font-size: 30px;
  font-weight: 400;
}

.link-order {
  width: 435px;
  height: 130px;
  background: rgba(255, 255, 255, 0.7);
}

.link-order h2::after {
  display: block;
  content: '';
  border-bottom: 1px solid #2d2d2d;
  transform: scaleX(0);
  transform-origin: 100% 50%;
  transition: transform 450ms ease-in-out;
}

.link-order h2:hover::after {
  transform: scaleX(1);
  transform-origin: 0% 50%;
}






    


Ответы

Ответ 1



Лучший вариант такой анимации без использования SVG будет выглядеть так: * { -webkit-box-sizing: border-box; box-sizing: border-box; } body { margin: 0; padding: 0; height: 100vh; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; text-transform: uppercase; } a { position: relative; color: #333; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; display: block; text-decoration: none; background: none; border: 0; -webkit-box-shadow: inset 0 0 0 2px transparent; box-shadow: inset 0 0 0 2px transparent; padding: 20px 40px; } a:after, a:before { content: ''; display: block; position: absolute; -webkit-box-sizing: border-box; box-sizing: border-box; border: 1px solid transparent; width: 0; height: 0; } a:after { top: 0; left: 0; -webkit-transition: border-color 0s ease-in 0.8s, width 0.2s ease-in 0.6s, height 0.2s ease-in 0.4s; -o-transition: border-color 0s ease-in 0.8s, width 0.2s ease-in 0.6s, height 0.2s ease-in 0.4s; transition: border-color 0s ease-in 0.8s, width 0.2s ease-in 0.6s, height 0.2s ease-in 0.4s; } a:before { bottom: 0; right: 0; -webkit-transition: border-color 0s ease-in 0.4s, width 0.2s ease-in 0.2s, height 0.2s ease-in; -o-transition: border-color 0s ease-in 0.4s, width 0.2s ease-in 0.2s, height 0.2s ease-in; transition: border-color 0s ease-in 0.4s, width 0.2s ease-in 0.2s, height 0.2s ease-in; } a:hover:after, a:hover:before { width: 100%; height: 100%; } a:hover:after { border-top-color: rgba(0, 0, 0, .3); border-right-color: rgba(0, 0, 0, .3); -webkit-transition: width 0.2s ease-out, height 0.2s ease-out 0.2s; -o-transition: width 0.2s ease-out, height 0.2s ease-out 0.2s; transition: width 0.2s ease-out, height 0.2s ease-out 0.2s; } a:hover:before { border-bottom-color: rgba(0, 0, 0, .3); border-left-color: rgba(0, 0, 0, .3); -webkit-transition: border-color 0s ease-out 0.4s, width 0.2s ease-out 0.4s, height 0.2s ease-out 0.6s; -o-transition: border-color 0s ease-out 0.4s, width 0.2s ease-out 0.4s, height 0.2s ease-out 0.6s; transition: border-color 0s ease-out 0.4s, width 0.2s ease-out 0.4s, height 0.2s ease-out 0.6s; } Сделать заказ

Ответ 2



Есть два варианта, первый: button { padding: .5em 1em; border: none; background: lightblue; position: relative; } button:after { position: absolute; left: 0; top: 0; content: ' '; width: 100%; height: 100%; border: 1px solid; border-right-width: 0; transform: scaleX(0); transform-origin: 0 0; transition: transform .3s, border .1s .3s; box-sizing: border-box; } button:hover:after { transform: scaleX(1); border-right-width: 1px; } И второй: .rect { fill: lightblue; stroke: black; stroke-dasharray: 1000; stroke-dashoffset: 1000; transition: stroke-dashoffset 1s; } .rect:hover { stroke-dashoffset: 0; }

Ответ 3



А я умею clip-path, поэтому анимируются все 4 стороны. Но кроссбораузерность так себе. div { float: left; line-height: 2em; padding: 0 2em; background: silver; border: 2px solid blue; transition: clip-path 1s linear; clip-path: polygon( 2px 0, 2px 0, 2px 2px, /* moving */ 100% 2px, 100% 2px, calc(100% - 2px) 2px, /* moving */ calc(100% - 2px) 100%, calc(100% - 2px) 100%, calc(100% - 2px) calc(100% - 2px), /* moving */ 0 calc(100% - 2px), 0 calc(100% - 2px), 2px calc(100% - 2px) /* moving */ ); } div:hover { clip-path: polygon( 2px 0, 100% 0, 100% 2px, /* moving */ 100% 2px, 100% 100%, calc(100% - 2px) 100%, /* moving */ calc(100% - 2px) 100%, 0 100%, 0 calc(100% - 2px), /* moving */ 0 calc(100% - 2px), 0 0, 2px 0 /* moving */ ); }
Hover me


Комментариев нет:

Отправить комментарий