Фігура з косою стороною (чуйний)


92

Я намагаюся створити фігуру, як на зображенні нижче, з косим краєм лише з одного боку (наприклад, нижній бік), тоді як інші краї залишаються прямими.

CSS div з косою стороною

Я спробував використати метод border (код наведений нижче), але розміри моєї фігури динамічні, і тому я не можу використовувати цей метод.

.shape {
    position: relative;
    height: 100px;
    width: 200px;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    height: 0px;
    width: 0px;
    left: 0px;
    bottom: -100px;
    border-width: 50px 100px;
    border-style: solid;
    border-color: tomato tomato transparent transparent;
}
<div class="shape">
    Some content
</div>


Я також намагався використовувати градієнти для фону (як у наведеному нижче коді), але він псується, коли розміри змінюються. Ви можете зрозуміти, що я маю на увазі, наводячи курсор на фігуру у наведеному нижче фрагменті.

Як я можу створити цю фігуру з косою стороною, а також підтримати динамічні розміри ?

Відповіді:


128

Існує багато способів створити фігуру з косим краєм лише з одного боку.

Наступні методи не можуть підтримувати динамічні розміри, як уже зазначалося у питанні:

  • Метод прикордонного трикутника зі значеннями пікселів для border-width.
  • Лінійні градієнти з синтаксисом кута (наприклад, 45 градусів, 30 градусів тощо).

Методи, які можуть підтримувати динамічні розміри, описані нижче.


Спосіб 1 - SVG

( Сумісність браузера )

SVG можна використовувати для створення фігури або за допомогою polygons або paths. У наведеному нижче фрагменті використано polygon. Будь-який необхідний текстовий вміст можна розташувати поверх фігури.

Плюси

  • SVG призначений для створення масштабованої графіки і може добре працювати з усіма змінами розмірів.
  • Межі та ефект наведення можна досягти за мінімальних накладних витрат на кодування.
  • Також до форми можна надати зображення або градієнтний фон.

Мінуси

  • Підтримка браузера - це, мабуть, єдиний мінус, оскільки IE8 - не підтримує SVG, але це можна пом'якшити за допомогою таких бібліотек, як Raphael, а також VML. Більше того, підтримка браузера нічим не гірша за інші варіанти.

Метод 2 - Градиентне тло

( Сумісність браузера )

Лінійні градієнти все ще можуть бути використані для створення фігури, але не з кутами, як зазначено у питанні. Ми повинні використовувати to [side] [side]синтаксис (завдяки vals ) замість того, щоб вказувати кути. Коли вказані борти, кути градієнта автоматично регулюються залежно від розмірів контейнера.

Плюси

  • Форма може бути досягнута і збережена, навіть якщо розміри контейнера динамічні.
  • Ефект наведення можна надати, змінивши колір градієнта.

Мінуси

  • Ефект наведення буде спрацьовувати навіть тоді, коли курсор знаходиться поза фігурою, але всередині контейнера.
  • Додавання меж зажадає складних маніпуляцій з градієнтом.
  • Градієнти відомі тим, що створюють нерівні кути, коли ширина (або висота) дуже велика.
  • Фони зображення не можна використовувати на фігурі.

Метод 3 - Перекоси перетворення

( Сумісність браузера )

У цьому методі псевдоелемент додається, перекошується і розташовується таким чином, що здається, що один із країв є похилим / кутовим. Якщо верхній або нижній край похилий, перекос повинен бути вздовж осі Y обертання повинно бути вздовж осі X. transform-originПовинні мати з боку , протилежного похилій стороні.

Плюси

  • Форми можна досягти навіть за допомогою кордонів.
  • Ефект наведення буде обмежений у межах фігури.

Мінуси

  • Розміри повинні пропорційно збільшуватися для збереження форми, тому що коли елемент перекошений, його зміщення по осі Y збільшується зі widthзбільшенням і навпаки (спробуйте збільшити значення widthдо 200pxу фрагменті). Ви можете знайти більше інформації про це тут .

Метод 4 - Перспективні перетворення

( Сумісність браузера )

У цьому методі основний контейнер обертається вздовж осі X або Y з невеликою кількістю перспективи. Якщо встановити відповідне значення, transform-originбуде створено косий край лише з одного боку.

Якщо верхня або нижня сторони похилі, обертання повинно бути вздовж осі Y, інакше обертання повинно бути вздовж осі X. transform-originПовинні мати з боку , протилежного похилій стороні.

Плюси

  • Форму можна досягти за допомогою кордонів.
  • Розміри не повинні збільшуватися пропорційно для збереження форми.

Мінуси

  • Вміст також буде обертатися, і, отже, їх потрібно буде обертати протилежним чином, щоб виглядати нормально.
  • Розміщення тексту буде нудним, якщо розміри не статичні.

Спосіб 5 - Шлях кліпу CSS

( Сумісність браузера )

У цьому методі основний контейнер закріплюється у потрібній формі за допомогою багатокутника. Точки багатокутника слід змінювати залежно від сторони, де потрібен косий край.

Плюси

  • Форму можна зберегти, навіть коли динамічно змінюється розмір контейнера.
  • Ефект наведення буде абсолютно обмежено в межах фігури.
  • Зображення також можна використовувати як фон для фігури.

Мінуси

  • На даний момент підтримка браузера дуже низька.
  • Межі можна додати, розмістивши абсолютно позиціонований елемент зверху фігури та надавши йому необхідний затиск, але за межами точки він погано підходить при динамічному зміні розміру.

Спосіб 6 - Полотно

( Сумісність браузера )

Полотно також можна використовувати для створення фігури, малюючи контури. У наведеному нижче фрагменті є демонстрація. Будь-який необхідний текстовий вміст можна розташувати поверх фігури.

Плюси

  • Форма може бути досягнута і збережена, навіть якщо розміри контейнера динамічні. Також можна додати межі.
  • Ефект наведення можна обмежити в межах фігури за допомогою pointInpathметоду.
  • Також до форми можна надати зображення або градієнтний фон.
  • Кращий вибір, якщо потрібні ефекти анімації в режимі реального часу, оскільки це не вимагає маніпулювання DOM.

Мінуси

  • Полотно базується на растровій основі, а отже, кутові краї стануть нерівними або розмитими при масштабуванні поза точкою * .

* - Щоб уникнути пікселізації, потрібно буде перефарбовувати фігуру щоразу, коли зменшується розмір області перегляду. Існує приклад його тут , але це накладні витрати.


35

Я спробував використовувати метод кордону, але розміри моєї фігури динамічні, і тому я не можу використовувати цей метод.


Метод 7 - Одиниці оглядового вікна (Border Redux )

( Сумісність браузера )

Блоки огляду - чудова інновація в CSS3. Хоча ви зазвичай можете використовувати відсоткові значення для динамізації своїх властивостей, ви не можете це зробити для border-widths ( ані для font-sizes ).

Натомість із засобами огляду Viewport ви можете динамічно встановлювати ширину меж разом із розмірами об’єктів у порівнянні з розміром області перегляду.

Примітка: відсоткові значення посилаються на батьківський об'єкт, а не на область перегляду (видима область вікна).

Щоб перевірити метод, запустіть наступний фрагмент Повна сторінка та змініть його розмір як по горизонталі, так і по вертикалі.

.shape {
    position: relative;
    height: 20vh;
    width: 40vw;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    left: 0px;
    right: 0px;
    top: 20vh;
    border-width: 10vh 20vw;
    border-style: solid;
    border-color: tomato tomato rgba(0,0,0,0) rgba(0,0,0,0);
}
<div class="shape">Some content</div>

Плюси - (1) Все динамічно, охоплення браузера широке.

Мінуси - (1) Слід звернути увагу на те , як ваша операційна система обробляє скроллбар з overflow: auto;.


3
Це здається зазубреним в останній версії хрому.
Mr_Green

Правда! Я припускаю, що браузерним двигунам ще потрібно трохи часу, щоб зробити це плавно. Firefox також має цю проблему при використанні цієї техніки з пікселями замість одиниць області перегляду, але це можна виправити, використовуючи rgba (,,, 0) замість прозорого. На щастя, зараз у нас є інші варіанти;)
Андреа Лігіос,

1

Моє рішення натхнене методом 7 - Блоки огляду від Андреа Лігіос, вище на цій сторінці.

Я також використовував "горизонтальну" одиницю для висоти ( height:10vw), щоб зберегти задані пропорції в трапеції при зміні розміру ширини навігаційного вікна. Ми могли б назвати цей метод 7b - Ширина області перегляду .

Крім того, використання двох вкладених символів divзамість одного та :afterселектора, на мій погляд, дозволяє краще налаштувати стилі вмісту тексту (наприклад text-align, тощо).

.dtrapz {
  position: relative;
  margin: 10px 40vw;
  width: 0;
  height: 10vw;
  border: none;
  border-right: 20vw solid #f22;
  border-bottom: 5vw solid transparent;
}

.dtcont {
  position: absolute;
  width: 20vw;
  height: 10vw;
  text-align: center;
  color: #fff;/* just aesthetic */
}
<div class="dtrapz">
  <div class="dtcont">Some content</div>
</div>


@ Downvoter Привіт! Повідомте мене, що не так із моєю відповіддю, щоб я міг її редагувати або видаляти, якщо це має сенс! Я не фахівець, але, мені здається, це можна застосувати на багатьох сторінках, працювати з довшим текстовим вмістом, залежно від ширини :)
MattAllegro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.