Обновленный ответ (Чистый CSS3)
Экстремальные требования иногда требуют экстремальных решений. Я опирался на свой первоначальный ответ (ниже), чтобы сделать чистое решение CSS , которое работает (и его можно заставить работать лучше, если хотите потратить на это время). Текущий пример немного "прерывистый" при рендеринге, что может быть вам подходит, но если нет, вам нужно будет расширить уже непристойное количество @media
запросов , которые за рулем (вероятно, было бы гораздо проще реализовать это с помощью LESS или SASS ; я составил электронную таблицу Excel на основе формул, чтобы помочь быстро генерировать числа). Он использует этот код:
HTML
<div class="box">
<img src="yourImage.jpg" />
</div>
CSS
.box{
height:300px;
min-width: 100px; /*could be different, but you ought to have some min*/
overflow:hidden;
}
.box img {
height: 100%;
width: 100%;
-ms-transform-origin: 100% 100%; /* IE 9 */
-webkit-transform-origin: 100% 100%; /* Safari and Chrome */
-moz-transform-origin: 100% 100%; /* Firefox */
-o-transform-origin: 100% 100%; /* Opera */
transform-origin: 100% 100%;
}
/*Sample... you need alot of these--my fiddle example has 51*/
@media screen and (min-width: 100px) {
.box {
-ms-transform:skewY(45deg);
-moz-transform:skewY(45deg);
-webkit-transform:skewY(45deg);
-o-transform:skewY(45deg);
transform:skewY(45deg);
}
.box img {
-ms-transform:skewY(-90deg);
-moz-transform:skewY(-90deg);
-webkit-transform:skewY(-90deg);
-o-transform:skewY(-90deg);
transform:skewY(-90deg);
}
}
Вот как рассчитать градусы
Предполагая height: 300px
с узкой стороной приблизительно 100px
высотой и равными углами на трапеции. Это означает, что верхнее и нижнее смещение составляет (300px - 100px) / 2 = 100px
. Тогда углы .box
устанавливаются из сумм @media
запроса min-width
по следующей формуле:
Angle = arctan(100/min-width) /*100 is the upper/lower offset as above*/
Для угла .box img
взять Angle
и умножить на -2
. Таким образом, вы получите .box
и .box img
медиазапросов и преобразуетесь в этот псевдокод :
@media screen and (min-width: [your target min-width]) {
.box {transform: skewY(Angle)}
.box img {transform: skewY(-2*Angle)}
}
Степень сглаживания функции полностью зависит от того, как в микромасштабе вы вносите изменения в min-width
, чтобы получить новую настройку угла. Как я уже говорил в своем комментарии в коде CSS выше, мой пример использует 51 вызов медиа-запроса и все еще имеет некоторую изменчивость.
Было бы лучше использовать вместо этого какое-то решение javascript ... возможно, но это полностью зависит от дизайнера, поэтому Я предлагаю это здесь как просто доказательство того, что его можно заставить работать с чистым CSS .
Оригинальный ответ
Похоже, что достигается плавная ширина. Я не знаю, какой контроль вы хотите от того, сколько или какая часть изображения отображается, поэтому оно может не полностью соответствовать вашим потребностям , но он делает изображение гибкой ширины, используя преобразования, чтобы придать ему искусственный вид в перспективе.