Как изменить направление увеличение объекта? CSS

Как можно изменить направление увеличение?
Например есть такой код:

body {
  margin: 0;
  padding: 0;
}

header {
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}

.main {
  position: relative;
  margin: 12px;
  font-size: 2.5em;
}

.main::before {
  content: "";
  top: 100%;
  position: absolute;
  background: #333333;
  opacity: 0%;
  width: 0%;
  height: 5px;
  transition: 1s;
}

.main:hover::before {
  content: "";
  position: absolute;
  width: 100%;
  opacity: 100%;
}

.main::after {
  content: "";
  top: 0%;
  position: absolute;
  background: #333333;
  height: 5px;
  width: 1px;
  transition: 1s;
}

.main:hover::after {
  content: "";
  position: absolute;
  width: 100px;
}
<header>
  <div class="main">Hi all</div>
  <div class="main">Hi all</div>
  <div class="main">Hi all</div>
  <div class="main">Hi all</div>
</header>

Потом через hover я изменяю ширину, но она изменяется слева на право, а мне нужно наоборот. Как реализовать?


Ответы (1 шт):

Автор решения: Михаил Камахин

transform-origin: right top точка начала трансформации - правый верхний угол блока

Вся анимация строится в изменении transform: scaleX().
scaleX(1) - изначальный размер блока, 0.5 - половина блока, 2 - две ширины блока.
т.е. width * scaleX = ширина, которая получится

@import url('https://fonts.googleapis.com/css2?family=Caveat&display=swap');

*,
*:before,
*:after {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

body {
  font-family: 'Caveat', cursive;
  font-size: 70px;
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

.content {
  transition: transform 0.3s ease-in-out;
  transform-origin: right top;
  cursor: pointer;
}

.content:hover {
  transform: scaleX(1.5);
}
<div class="content">
  Привееет
</div>

Вправо и влево полосы анимированно выходят, которые снизу и сверху

@import url('https://fonts.googleapis.com/css2?family=Caveat&display=swap');

*,
*:before,
*:after {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

body {
  font-family: 'Caveat', cursive;
  font-size: 70px;
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

.content {
  position: relative;
  cursor: pointer;
}

.content::before, .content::after {
  display: block;
  content: '';
  position: absolute;
  width: 100%;
  left: 0;
  top: 0;
  height: 2px;
  background-color: orange;
  transform: scaleX(0);
  transition: transform 0.4s ease-in-out;
  transform-origin: left;
}

.content::after {
  top: 100%;
  transform-origin: right;
}

.content:hover::before, .content:hover::after {
  transform: scaleX(1);
}
<div class="content">
  Привееет
</div>

→ Ссылка