Почему текст становится размытым и колеблется во время 2-мерного преобразования масштаба

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

Как убрать это колебание и размытость во время трансформации?

  • Меня не волнуют браузеры IE, я только хочу, чтобы он работал в последней версии Chrome.

  • Похоже, что это вызвано transition свойством.

Codepen # 1: https://codepen.io/x84733/pen/yEpYxX

.scalable {
  transition: 0.3s ease-in-out;
  box-shadow: 0 6px 10px rgba(0,0,0,0.14);
}
.scalable:hover {
  transform: scale(1.05);
  box-shadow: 0 8px 40px rgba(0,0,0,0.25);  
}

.card {
  width: 100%;
  background: white;
  padding: 20px;
}

body {
  width: 50%; 
  height: 100%; 
  background: #999;
  padding: 20px;
}
<div class="card scalable">
  <div>here some description</div>
</div>

Ответ 1

Вместо использования масштаба вы можете рассмотреть translateZ с точки зрения. Убедитесь, что изначально определяете перспективу, чтобы избежать плохого эффекта при быстром перемещении курсора:

.scalable{
  transition: 0.3s ease-in-out;
  box-shadow: 0 6px 10px rgba(0,0,0,0.14);
  transform:perspective(100px);
}

.scalable:hover {
  transform:perspective(100px) translateZ(5px);
  box-shadow: 0 8px 40px rgba(0,0,0,0.25);  
}

.card {
  width: 100%;
  background: white;
  padding: 20px;
}

body {
  width: 50%; 
  height: 100%; 
  background: #999;
  padding: 20px;
}
<div class="card scalable">
  <div>here some description</div>
</div>

Ответ 2

Также добавьте происхождение от 100% до 104%. Это предотвратит прыжки и размытый конечный результат

.scalable {
  backface-visibility: hidden;
  transition: all 0.3s ease-in-out;
  transform-origin: 100% 104%;
}

.scalable:hover {
  backface-visibility: hidden;
  transform: scale(1.04);  
}

Ура!

Ответ 3

С JavaScript?

const el = document.querySelector("#parent");
const text = document.querySelector("#text");

let i = 0;

el.addEventListener("mouseover",function(){
    this.style.transform = "scale(1.05)";
})
el.addEventListener("mouseout",function(){
    this.style.transform = "scale(1.00)";
  el.style.boxShadow = "0 8px 40px rgba(0,0,0,0.25);"
})
.scalable {
  transition: 0.3s ease-in-out;
  box-shadow: 0 6px 10px rgba(0,0,0,0.14);
}

.card {
  width: 100%;
  background: white;
  padding: 20px;
}

body {
  width: 50%; 
  height: 100%; 
  background: #999;
  padding: 20px;
}
<div id="parent" class="card scalable">
  <div id="text">here some description</div>
</div>