Форма треугольника с фоновым изображением

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

Вот мой макет того, как я хотел бы два треугольника.

Треугольники с фоновыми изображениями

В настоящее время у меня есть только два элемента div размером 900 x 600 с каждым треугольником в качестве фонового изображения. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я не могу навести курсор на прозрачную часть div Cinema, чтобы добраться до div photo.

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

Можно ли сделать треугольники css3, и если да, то может ли кто-нибудь помочь мне с кодом?

Вот что у меня есть на данный момент.

.pageOption {
  position: relative;
  width: 900px;
  height: 600px;
}
.pageOption .photo {
  position: absolute;
  top: 0px;
  left: 0px;
  width: 900px;
  height: 600px;
  background: url('../images/menuPhoto.png') no-repeat 0 0;
}
.pageOption .cinema {
  position: absolute;
  bottom: 0px;
  right: 0px;
  width: 900px;
  height: 600px;
  background: url('../images/menuCinema.png') no-repeat 0 0;
}
<div class="pageOption">
  <a href="#" class="option photo" id="weddingPhoto"></a>
  <a href="#" class="option cinema" id="weddingCinema"></a>
</div>


person Ryan    schedule 10.06.2012    source источник
comment
попробуйте css свойство pointer-events.   -  person undefined    schedule 11.06.2012


Ответы (5)


Это очень просто, если вы используете дочерние изображения для ссылок вместо фоновых изображений. Вам просто нужно наклонить два элемента .option с разными источниками преобразования, затем восстановить их дочерние изображения и установить overflow: hidden как для элементов .pageOption, так и для элементов .option. Поддержка хорошая, должно работать для всего, кроме IE8/7 и Opera Mini.

ДЕМО

Результат:

треугольные изображения

HTML:

<div class='pageOption'>
  <a href='#' class='option' data-inf='photo'>
    <img src='../images/menuPhoto.png'>
  </a>
  <a href='#' class='option' data-inf='cinema'>
    <img src='../images/menuCinema.png'>
  </a>
</div>

Соответствующий CSS:

.pageOption {
  overflow: hidden;
  position: relative;
  width: 40em; height: 27em;
}
.option, .option img { width: 100%; height: 100%; }
.option {
  overflow: hidden;
  position: absolute;  
  /* arctan(27 / 40) = 34.01935deg 
   * need to skew by 90deg - 34.01935deg = 55.98065deg
  */
  transform: skewX(-55.98deg);
}
.option:first-child {
  left: -.25em;
  transform-origin: 100% 0;
}
.option:last-child {
  right: -.25em;
  transform-origin: 0 100%;
}
.option img {
  transform: skewX(55.98deg);
  transform-origin: inherit;
}
person Ana    schedule 15.02.2013
comment
Чтобы опираться на ответ Аны, если ширина контейнера должна быть гибкой, вы можете рассчитать угол с помощью javascript при изменении размера окна, как указано в этом ответе: stackoverflow.com/a/14200600/848254 - person Zach Esposito; 09.12.2014

Вы можете достичь этого макета с помощью нескольких подходов. Вот пример использования встроенного svg и элемент clip-path:

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

person web-tiki    schedule 13.04.2016

Вот мои предложения по CSS:

  1. Использование canvas, который является тегом HTML5 и не является кросс-браузерным.
  2. Использование SVG. (Самый надежный)
  3. Используя CSS3, поверните переход и покройте его оберткой со скрытым переполнением. Опять же не кроссбраузерный.

Повернуть переход:

-webkit-transform: rotate(7.5deg);  /* Saf3.1+, Chrome 
   -moz-transform: rotate(7.5deg);  /* FF3.5+ 
    -ms-transform: rotate(7.5deg);  /* IE9 
     -o-transform: rotate(7.5deg);  /* Opera 10.5 
        transform: rotate(7.5deg);
           filter: progid:DXImageTransform.Microsoft.Matrix(/* IE6–IE9 
                   M11=0.9914448613738104, M12=-0.13052619222005157,M21=0.13052619222005157, M22=0.9914448613738104, sizingMethod='auto expand');
person Tooraj Jam    schedule 11.06.2012

Адаптивная идея с использованием CSS clip-path

.pageOption {
  height: 100vh;
  position: relative;
}

.pageOption .photo {
  position: absolute;
  top: 0;
  left: 0;
  right: 5px;
  bottom: 5px;
  background: url('https://picsum.photos/id/1068/900/900') center/cover;
  clip-path: polygon(0 0, 100% 0, 0 100%);
}

.pageOption .cinema {
  position: absolute;
  top: 5px;
  left: 5px;
  right: 0;
  bottom: 0;
  background: url('https://picsum.photos/id/1055/900/900') center/cover;
  clip-path: polygon(100% 100%, 100% 0, 0 100%);
}
.pageOption a:hover {
  filter:grayscale(1);
}

body {
  margin: 0;
}
<div class="pageOption">
  <a href="#" class="option photo" ></a>
  <a href="#" class="option cinema"></a>
</div>

person Temani Afif    schedule 17.01.2021

Как вы сказали, треугольные элементы css3 состоят из границ, поэтому вы не можете прикрепить к ним фон.

Я бы посоветовал вам просто использовать два PNG один над другим и использовать js, чтобы прослушивать событие щелчка и создавать правильное действие на основе положения мыши.

Существует также css-свойство webkit-mask, но оно не поддерживается в других браузерах (я использовал его для небольшого трюка с подкачкой страниц — http://jsfiddle.net/xTNTH/3/ — лучший в сафари [без js, только css] — http://snag.gy/7fRNq.jpg)

person Oren Roth    schedule 11.06.2012