Как создать плавное трапециевидное изображение с помощью css?

Я работаю над веб-сайтом, на котором мы используем эффект параллакса. Здесь есть несколько изображений треугольной формы, например, введите здесь описание изображения

и изображение прозрачно, потому что оно перекрывает указанный выше DIV. Я пробую так много вещей с css. но не получил желаемого результата. Я достигаю желаемого результата с фиксированной шириной. Проверьте этот http://jsfiddle.net/eJ7Sf/2/, но он не работает с плавной шириной. Проверьте, что я все еще пытаюсь, но не работает

http://jsfiddle.net/ceGGN/3/

http://jsfiddle.net/eJ7Sf/1/

ПРИМЕЧАНИЕ: я знаю о css3 MASK, но оно не работает в предыдущих браузерах Firefox. Мне нужна возможность до firefox 3.6.13


person sandeep    schedule 27.03.2012    source источник
comment
Почему вы включаете варианты -moz-, -webkit- и -o-, но опускаете -ms-? Как вы знаете, IE9 прекрасно справляется с преобразованиями.   -  person Niet the Dark Absol    schedule 27.03.2012
comment
@Kolink сначала я думал о достижении желаемого результата. После этого буду тестировать в других браузерах   -  person sandeep    schedule 27.03.2012
comment
По этому рассуждению вам нужен только тот, на котором вы действительно тестируете...   -  person Niet the Dark Absol    schedule 27.03.2012
comment
Я могу быть единственным, но я не уверен, что именно вы хотите. Вы хотите, чтобы он увеличивался и уменьшался в размере, сохраняя соотношение сторон изображения?   -  person Matthew Blancarte    schedule 02.04.2012


Ответы (3)


Обновленный ответ (чистый 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.

Оригинальный ответ

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

person ScottS    schedule 01.04.2012
comment
когда вы увеличиваете размер окна, которое становится чистым треугольником. Но не то, что я хочу. Смотрите изображения. Но спасибо за старания :) - person sandeep; 03.04.2012
comment
@sandeep - так вы хотите, чтобы высота слева и справа всегда была одинаковой? Кстати, это на самом деле не треугольник (как указано в вашем заголовке), а трапеция. - person ScottS; 03.04.2012
comment
@sandeep -- или высота каждой стороны изменяется при изменении ширины? Другими словами, вы намерены изменять только угол или угол должен быть фиксированным, а высота изменяться в ответ на изменение ширины (один из двух должен измениться). - person ScottS; 03.04.2012
comment
высота одинаковая и выглядит как трапеция - person sandeep; 03.04.2012
comment
@sandeep - я обновил свой ответ. Это работает, но я позволю вам решить, стоит оно того или нет, особенно если вы хотите сделать его более плавным при рендеринге. - person ScottS; 04.04.2012

С клипом SVG

Вы можете добиться такой формы с помощью встроенного SVG и элемент clipPath:

<svg viewbox="0 0 10 6.7">
  <defs>
    <clipPath id="clip">
      <polygon points="10 0, 10 6.7, 0 4.7, 0 2" />
    </clipPath>
  </defs>
  <image xlink:href="http://i.imgur.com/RECDV24.jpg" x="0" y="0" height="6.7" width="10" clip-path="url(#clip)"/>
</svg>

С CSS clip-path

Вы также можете получить эту форму с помощью CSS-свойства clip-path. Поддержка браузеров довольно низкая (см. canIuse), но это простой подход.
Вот пример:

img{
  -webkit-clip-path:polygon(0% 20%, 100% 0%,100% 100%,0% 80%);
  clip-path:polygon(0% 20%, 100% 0%,100% 100%,0% 80%);
}
<img src="http://i.imgur.com/5NK0H1e.jpg" alt=""/>

person web-tiki    schedule 13.04.2016

Если вы немного поиграетесь с pseudoelements и 2DTransforms (поддерживается, начиная с Firefox 3.5), вы можете добиться этого. эффект: http://jsfiddle.net/fcalderan/T5KPA/1/

Я пробовал в Chrome и Firefox. Для Opera и IE9 необходимо добавить проприетарные префиксы.

Разметка действительно необходима:

<figure class="triangle">
    <img src="http://cssglobe.com/lab/angled/img.jpg">
</figure>

и css для получения этого эффекта:

img { display: block; }

.triangle { 
   position   : relative; 
   overflow   : hidden; 
   padding    : 0; margin: 0; 
   display    : inline-block; 
}

.triangle:after,
.triangle:before {
   content    : "";
   position   : absolute;
   z-index    : 2;
   left       : -50%;
   width      : 200%;
   height     : 40%;
   display    : block;
   background : #fff;   
}

.triangle:before {
    top: -24%;  
    -webkit-transform: rotate(-10deg);
    -moz-transform: rotate(-10deg);
    transform: rotate(-10deg);
}

.triangle:after {
    bottom: -24%;  
    -webkit-transform: rotate(10deg);
    -moz-transform: rotate(10deg);
    transform: rotate(10deg);
}

Я покрасил повернутые псевдоэлементы белым цветом, но, конечно, вы можете изменить цвет, чтобы он соответствовал реальному цвету фона.

person Fabrizio Calderan    schedule 02.04.2012
comment
@sandeep, такое решение может быть приемлемым или его нужно доработать? - person Fabrizio Calderan; 02.04.2012
comment
извините, это не жидкость. что я хочу - person sandeep; 03.04.2012
comment
пожалуйста, не могли бы вы объяснить подробнее? Как я могу изменить свой пример, чтобы увидеть, как он не работает? - person Fabrizio Calderan; 03.04.2012
comment
Я хочу, чтобы тот же эффект с плавной шириной означал, что если размер экрана увеличивается, изображение также увеличивается, но форма выглядит так же, как и текущая. - person sandeep; 03.04.2012
comment
Я добавил ширину: 100% как для рисунка, так и для изображения. попробуйте jsfiddle.net/fcalderan/T5KPA/4 и измените размер окна - person Fabrizio Calderan; 03.04.2012
comment
если вы также установите высоту: 100% для img, и этот размер зависит от высоты родителя. но если вы используете относительный размер (в %), вы должны получить плавный элемент - person Fabrizio Calderan; 03.04.2012
comment
извините, что вы задали цвет фона для :after и :before. Как я четко определяю в своем вопросе, я использовал эффект параллакса. это означает, что когда вы прокручиваете изображение, оно перекрывает содержимое вышеуказанного элемента - person sandeep; 03.04.2012
comment
Я думаю, что это максимум, что вы можете получить только с помощью CSS ... если вам нужна как полная прозрачность, так и плавный дизайн, я думаю, что это невозможно, если вы не перекосите изображение. - person Fabrizio Calderan; 03.04.2012