Почему свойство CSS «perspective» в Safari ломает оптимизацию графики для 4К и 5К дисплеев в случае повторного использования?

Добрый день.

Я использую вот такой скрипт от тумпануса, эффект SCALE & ROTATE PUSHER:

Есть у меня вот такой вот блок
.st-effect-11.st-container {-webkit-perspective: 1500px;perspective: 1500px;}
собственно логика его такова, при нажатии на кнопку, блок st-container отобразится в перспективе

5be5bd97cbc38733986889.png
Вот тут и мои грабли и сам вопрос:

Все объекты в блоке st-container работают хорошо на и дисплеях! НО! Если к какому либо блоку применить другое правило perspective, то даже текст\шрифт внутри этого блока, отображается на и заблуренным. На обычных дисплеях этого не видно.

5be7278c890ff804399968.pngЕсть ли у кого идеи как это пофиксить?

-------------
Я пробовал прописать блоку в дефолт состояние
st-container {-webkit-perspective: none;perspective: none;}

А когда жмем кнопку, получается включается это понятие
.st-effect-11.st-container {-webkit-perspective: 1500px;perspective: 1500px;}


Не помогло!

Помогает только полное уделение перспективы к этому блоку:
.st-effect-11.st-container {}
Но пропадает красивый эффект открытия блока.

5be726f4e4a31811006402.png
  • Вопрос задан
  • 1108 просмотров
Пригласить эксперта
Ответы на вопрос 2
profesor08
@profesor08 Куратор тега CSS
Ну да, тут ничего не поделать.
Можешь попробовать задать трансформируемому блоку transform : perspective(1px) translate..., тоесть изменить правило так, что в нем оказалось perspective(1px).
Ответ написан
radist2s
@radist2s
Back-end и front-end разработчик
Выше написан возможный вариант. Попробуйте прописать перспективу непосредственно для нужного элемента.

.st-effect-11.st-menu-open .st-pusher {
    perspective(1500px) translate3d(100px, 0, -600px) rotateY(-20deg)
}
.st-effect-11.st-container {}

Еще, для сайдбара лучше всего после анимации обнулять параметры transform. То есть навесить коллбек на событие transitionend, и после обычным margin/left/top назначить для сайдбара необходимую позицию. Соответственно, перед тем как сайдбар прятать, ему нужно вновь вернуть значения transform, затем удалить те смещения которые вы навесили в коллбеке, и только после этого выполнять команду на скрытие. Если будете так делать, то обязательно заверните код в requestAnimationFrame, это нужно для того, чтобы браузер пересчитывал стили именно в той последовательности, в какой нужно вам, иначе стили будут назначаться разом, и будут проявляться странные эффекты(анимация же выполнятся через transition)

let stMenuTransformPrevious, stMenuTransitionPrevious = ''

// after open
requestAnimationFrame(function() { // выполняем действия в новом кадре композиции
  stMenuNode.style.transition = 'none' // убираем transition, так как после мы убираем transform

  requestAnimationFrame(function() { // выполняем в следующем кадре композиции
    stMenuNode.style.transform = 'none'
    stMenuNode.style.left = '0px'
  })
})

// before close
requestAnimationFrame(function() {
  stMenuNode.style.transition = '' // возвращаем transition из css

  requestAnimationFrame(function() { // выполняем в следующем кадре композиции
    stMenuNode.style.left = '' // в зависимости от того, как до этого двигали меню
    stMenuNode.style.transform = '' // применяется transform из css
  })
})


Применительно именно к вашему случаю, stMenuNode.style.left = '0px' назначать не нужно, так как меню и так по умолчанию находится слева.

Причина блюра на тексте в том, что для высокого разрешения просто не хватает аппаратных ресурсов, чтобы картинку рендерить и с ускорением, и в высоком разрешении. Такой же эффект с блюром появляется и на sd-дисплеях. Вообще лучше transform использовать только для анимаций, и, если возможно, после завершения анимации для лучшего рендеринга и разгрузки позиционировать элементы margin/left/top.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы