Как предотвратить обрезку изображений

Я пытаюсь создать анимированное изображение, содержащее много слоев. Чтобы изображения с правильными пропорциями отображались на разных экранах, я использую значение свойства cover css (я пробовал его как для object-fit для изображений, так и для background-size для фоновых изображений). Вот почему мои изображения на широком экране обрезаются браузером.

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

Пожалуйста, посмотрите мой пример ниже.

Как это можно предотвратить? Или это там какая-то другая методика?

body {
  margin: 0;
  padding: 0;
  /*Just to imitate wide screen*/
  width: 1000px;
  height: 450px;
}

#container {
  width: 100%;
  height: 100vh;
  /*Just to imitate wide screen*/
  height: 100%;
  overflow: hidden;
  position: relative;
}

.layer {
  height: 100%;
  position: absolute;
  width: calc(100% + 20px);
}

.layer img {
  height: 100%;
  width: 100%;
  object-fit: cover;
}

.gulls {  
  animation: gulls ease-in-out 13s infinite alternate;
}

@keyframes gulls {
  from {
    transform: rotate(3deg) scaleX(0.95) skew(-10deg, -10deg);
  }
  to {
    transform: rotate(-3deg) scaleX(1.05) skew(10deg, 10deg);
  }
}
<div id = "container">
  <div class = "layer">
    <img src = "https://firebasestorage.googleapis.com/v0/b/wedding-42174.appspot.com/o/animation%2Fsky.png?alt=media&token=25033588-d58c-4616-94e9-4974ec4157a4" alt = "">
  </div>
  <div class = "layer gulls">
    <img src = "https://firebasestorage.googleapis.com/v0/b/wedding-42174.appspot.com/o/animation%2Fgulls5.png?alt=media" />
  </div>
</div>

На данный момент у меня есть это: https://jsfiddle.net/koljada/c08qdw1m/

Ваши изображения уже обрезаны даже без преобразования, поэтому ни преобразование, ни анимация на самом деле не связаны с вашей проблемой. На вашем месте я бы переосмыслил все это, вплоть до создания изображения, хотя я не уверен, что здесь должно быть лучше всего. Но если вам нужно быстрое исправление, вы можете поиграть со свойством объект-позиция.

Kaiido 02.05.2018 08:57

Вы не можете покрыть экран любого размера без одного из двух: обрезки или искажения. Вот достойный результат: jsfiddle.net/websiter/4jedtb3n. Мне кажется.

tao 08.05.2018 20:28
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
6
2
2 862
3

Ответы 3

Изображения можно обрезать с помощью контейнера div с overflow: hidden; position: relative, поэтому вы можете разместить изображение внутри с помощью position: absolute. Для атрибутов css top и left изображения необходимо установить отрицательное значение.

Точные значения изображения можно найти с помощью функций синуса и косинуса.

body {
  margin: 0;
  padding: 0;
  /*Just to imitate wide screen*/
  width: 200px;
  height: 100px;
}

#container {
  width: 100%;
  height: 100vh;
  /*Just to imitate wide screen*/
  height: 100%;
  overflow: hidden;
  position: relative;
}

.layer {
  height: 100%;
  position: absolute;
  top: -20px;
  left: -20px;
  width: calc(100% + 20px);
}

.layer img {
  height: 150%;
  width: 150%;
}

.gulls {  
  animation: gulls ease-in-out 3s infinite alternate;
}

@keyframes gulls {
  from {
    transform: rotate(3deg) scaleX(0.95) skew(-10deg, -10deg);
  }
  to {
    transform: rotate(-3deg) scaleX(1.05) skew(10deg, 10deg);
  }
}
<div id = "container">
  <div class = "layer gulls">
    <img src = "http://via.placeholder.com/350x150/000000" />
  </div>
</div>

Во-первых, я должен сказать, что ваше изображение птиц намного больше, чем самих птиц (много отступов вокруг), поскольку я вижу, что все изображение 2048/1934 ...

в любом случае, когда вы используете

object fit:cover he crop;

изображение для сохранения пропорции. вы можете использовать

object-fit:scale-down;

для сохранения пропорции путем уменьшения изображения до тех пор, пока он не войдет внутрь родительского пространства. Я добавляю здесь краткий пример того, как это работает:

надеюсь, это то, что вы ищете ..

Вы можете использовать overflow: hidden; position: relative для обрезки изображений после использования контейнера div и использования position: absolute в изображениях для размещения изображения.

Другие вопросы по теме