Вырезать углы с помощью CSS - PullRequest
       38

Вырезать углы с помощью CSS

54 голосов
/ 06 сентября 2011

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

Я бы хотел сделать это на чистом CSS, есть ли методы?

Ответы [ 13 ]

92 голосов
/ 06 сентября 2011

Если родительский элемент имеет сплошной цвет фона, вы можете использовать псевдоэлементы для создания эффекта:

div {
    height: 300px;
    background: red;
    position: relative;
}

div:before {
    content: '';
    position: absolute;
    top: 0; right: 0;
    border-top: 80px solid white;
    border-left: 80px solid red;
    width: 0;
}

http://jsfiddle.net/2bZAW/


PS Предстоящий border-corner-shape - это именно то, что вы ищете.Жаль, что он может быть исключен из спецификации и никогда не попадать в браузеры в дикой природе: (

43 голосов
/ 07 октября 2014

Если вам нужен прозрачный вырезанный край , вы можете использовать повернутый псевдоэлемент в качестве фона для div и расположить его, чтобы вырезать нужный угол:

Transprent cut out edge on a div

body {
  background: url(http://i.imgur.com/k8BtMvj.jpg);
  background-size: cover;
}
div {
  position: relative;
  width: 50%;
  margin: 0 auto;
  overflow: hidden;
  padding: 20px;
  text-align: center;
}
div:after {
  content: '';
  position: absolute;
  width: 1100%; height: 1100%;
  top: 20px; right: -500%;
  background: rgba(255,255,255,.8);
  transform-origin: 54% 0;
  transform: rotate(45deg);
  z-index: -1;
}
<div>
  ... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>
</div>

Обратите внимание, что в этом решении используются преобразования, и вам необходимо добавить необходимые префиксы поставщиков. Для получения дополнительной информации см canIuse .

Чтобы обрезать нижний правый край , вы можете изменить свойства top, transform и transform-origin псевдоэлемента на:

body {
  background: url(http://i.imgur.com/k8BtMvj.jpg);
  background-size: cover;
}
div {
  position: relative;
  width: 50%;
  margin: 0 auto;
  overflow: hidden;
  padding: 20px;
  text-align: center;
}
div:after {
  content: '';
  position: absolute;
  width: 1100%; height: 1100%;
  bottom: 20px; right: -500%;
  background: rgba(255,255,255,.8);
  transform-origin: 54% 100%;
  transform: rotate(-45deg);
  z-index: -1;
}
<div>
  ... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>... content ...<br/>
</div>
26 голосов
/ 13 октября 2015

CSS Clip-Path

Использование clip-path - это новая, перспективная альтернатива.Его начинают получать все больше и больше, и теперь он хорошо документирован.Поскольку он использует SVG для создания формы, он реагирует прямо из коробки.

div {
  width: 200px;
  min-height: 200px;
  -webkit-clip-path: polygon(0 0, 0 100%, 100% 100%, 100% 25%, 75% 0);
  clip-path: polygon(0 0, 0 100%, 100% 100%, 100% 25%, 75% 0);
  background: lightblue;
}
<div>
  <p>Some Text</p>
</div>

Преобразование CSS

У меня есть альтернатива ответу преобразования web-tiki.

body {
  background: lightgreen;
}
div {
  width: 200px;
  height: 200px;
  background: transparent;
  position: relative;
  overflow: hidden;
}
div.bg {
  width: 200%;
  height: 200%;
  background: lightblue;
  position: absolute;
  top: 0;
  left: -75%;
  transform-origin: 50% 50%;
  transform: rotate(45deg);
  z-index: -1;
}
<div>
  <div class="bg"></div>
  <p>Some Text</p>
</div>
14 голосов
/ 29 июля 2014

Вы можете использовать linear-gradient.Допустим, у родителя div было фоновое изображение, и вам нужно было div, чтобы сидеть сверху с серым фоном и лево-ушастым левым углом.Вы можете сделать что-то вроде этого:

.parent-div { background: url('/image.jpg'); }
.child-div { 
   background: #333;
   background: linear-gradient(135deg, transparent 30px, #333 0);
}

Посмотреть это на CodePen

Далее:

13 голосов
/ 14 октября 2015

Вот еще один подход, использующий CSS transform: skew(45deg) для создания эффекта угла среза.Сама форма включает три элемента (1 реальный и 2 псевдоэлемента) следующим образом:

  • Основной контейнер div элемент имеет overflow: hidden и создает левую границу.
  • Псевдоэлемент :before, который на 20% больше высоты родительского контейнера и к нему применено перекосное преобразование.Этот элемент обрабатывает границу сверху и обрезает (наклонную) границу с правой стороны.
  • Псевдоэлемент :after, который составляет 80% высоты родителя (в основном, оставшейся высоты), и создаетнижняя граница, оставшаяся часть правой границы.

Полученный результат является адаптивным, создает прозрачный вырез в верхней части и поддерживает прозрачный фон.

div {
  position: relative;
  height: 100px;
  width: 200px;
  border-left: 2px solid beige;
  overflow: hidden;
}
div:after,
div:before {
  position: absolute;
  content: '';
  width: calc(100% - 2px);
  left: 0px;
  z-index: -1;
}
div:before {
  height: 20%;
  top: 0px;
  border: 2px solid beige;
  border-width: 2px 3px 0px 0px;
  transform: skew(45deg);
  transform-origin: right bottom;
}
div:after {
  height: calc(80% - 4px);
  bottom: 0px;
  border: 2px solid beige;
  border-width: 0px 2px 2px 0px;
}
.filled:before, .filled:after {
  background-color: beige;
}

/* Just for demo */

div {
  float: left;
  color: beige;
  padding: 10px;
  transition: all 1s;
  margin: 10px;
}
div:hover {
  height: 200px;
  width: 300px;
}
div.filled{
  color: black;
}
body{
 background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
}
<div class="cut-corner">Some content</div>
<div class="cut-corner filled">Some content</div>

enter image description here


Ниже приведен еще один способ получения эффекта угла среза с помощью linear-gradient фоновых изображений.Используется комбинация из 3 градиентных изображений (приведенных ниже):

  • Один линейный градиент (под углом вниз слева) для создания эффекта угла среза.Этот градиент имеет фиксированный размер 25px x 25px.
  • Один линейный градиент для обеспечения сплошного цвета слева от треугольника, который вызывает эффект обрезки.Градиент используется, хотя он дает сплошной цвет, потому что мы можем контролировать размер, положение фона только при использовании изображений или градиентов.Этот градиент расположен на уровне -25px по оси X (в основном это означает, что он закончится до того места, где присутствует разрез).
  • Другой градиент, аналогичный приведенному выше, который снова дает сплошной цвет, но расположен на 25pxвниз по оси Y (опять же, чтобы пропустить область обрезки).

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

.cut-corner {
  height: 100px;
  width: 200px;
  background-image: linear-gradient(to bottom left, transparent 50%, beige 50%), linear-gradient(beige, beige), linear-gradient(beige, beige);
  background-size: 25px 25px, 100% 100%, 100% 100%;
  background-position: 100% 0%, -25px 0%, 100% 25px;
  background-repeat: no-repeat;
}
.filled {
  background-image: linear-gradient(black, black), linear-gradient(black, black), linear-gradient(black, black), linear-gradient(black, black), linear-gradient(to bottom left, transparent calc(50% - 1px), black calc(50% - 1px), black calc(50% + 1px), beige calc(50% + 1px)), linear-gradient(beige, beige), linear-gradient(beige, beige);
  background-size: 2px 100%, 2px 100%, 100% 2px, 100% 2px, 25px 25px, 100% 100%, 100% 100%;
  background-position: 0% 0%, 100% 25px, -25px 0%, 0px 100%, 100% 0%, -25px 0%, 100% 25px;
}

/* Just for demo */

*{
  box-sizing: border-box;
  }
div {
  float: left;
  color: black;
  padding: 10px;
  transition: all 1s;
  margin: 10px;
}
div:hover {
  height: 200px;
  width: 300px;
}
body{
 background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
}
<div class="cut-corner">Some content</div>
<div class="cut-corner filled">Some content</div>

enter image description here

7 голосов
/ 09 июля 2015

Если вам нужна диагональная граница вместо диагонального угла, вы можете сложить 2 деления с каждым псевдоэлементом:

DEMO

http://codepen.io/remcokalf/pen/BNxLMJ

.container {
  padding: 100px 200px;
  overflow: hidden;
}

div.diagonal {
  background: #da1d00;
  color: #fff;
  font-family: Arial, Helvetica, sans-serif;
  width: 300px;
  height: 300px;
  padding: 70px;
  position: relative;
  margin: 30px;
  float: left;
}

div.diagonal2 {
  background: #da1d00;
  color: #fff;
  font-family: Arial, Helvetica, sans-serif;
  width: 300px;
  height: 300px;
  padding: 70px;
  position: relative;
  margin: 30px;
  background: #da1d00 url(http://www.remcokalf.nl/background.jpg) left top;
  background-size: cover;
  float: left;
}

div.diagonal3 {
  background: #da1d00;
  color: #da1d00;
  font-family: Arial, Helvetica, sans-serif;
  width: 432px;
  height: 432px;
  padding: 4px;
  position: relative;
  margin: 30px;
  float: left;
}

div.inside {
  background: #fff;
  color: #da1d00;
  font-family: Arial, Helvetica, sans-serif;
  width: 292px;
  height: 292px;
  padding: 70px;
  position: relative;
}

div.diagonal:before,
div.diagonal2:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  border-top: 80px solid #fff;
  border-right: 80px solid transparent;
  width: 0;
}

div.diagonal3:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  border-top: 80px solid #da1d00;
  border-right: 80px solid transparent;
  width: 0;
  z-index: 1;
}

div.inside:before {
  content: '';
  position: absolute;
  top: -4px;
  left: -4px;
  border-top: 74px solid #fff;
  border-right: 74px solid transparent;
  width: 0;
  z-index: 2;
}

h2 {
  font-size: 30px;
  line-height: 1.3em;
  margin-bottom: 1em;
  position: relative;
  z-index: 1000;
}

p {
  font-size: 16px;
  line-height: 1.6em;
  margin-bottom: 1.8em;
}

#grey {
  width: 100%;
  height: 400px;
  background: #ccc;
  position: relative;
  margin-top: 100px;
}

#grey:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  border-top: 80px solid #fff;
  border-right: 80px solid #ccc;
  width: 400px;
}
<div id="grey"></div>
<div class="container">
  <div class="diagonal">
    <h2>Header title</h2>
    <p>Yes a CSS diagonal corner is possible</p>
  </div>
  <div class="diagonal2">
    <h2>Header title</h2>
    <p>Yes a CSS diagonal corner with background image is possible</p>
  </div>
  <div class="diagonal3">
    <div class="inside">
      <h2>Header title</h2>
      <p>Yes a CSS diagonal border is even possible with an extra div</p>
    </div>
  </div>
</div>
5 голосов
/ 18 июня 2016

Этот код позволяет вырезать углы с каждой стороны прямоугольника:

div {
  display:block;
  height: 300px;
  width: 200px;
  background: url('http://lorempixel.com/180/290/') no-repeat;
  background-size:cover;

  -webkit-clip-path: polygon(10px 0%, calc(100% - 10px) 0%, 100% 10px, 100% calc(100% - 10px), calc(100% - 10px) 100%, 10px 100%, 0% calc(100% - 10px), 0% 10px);
  clip-path: polygon(10px 0%, calc(100% - 10px) 0%, 100% 10px, 100% calc(100% - 10px), calc(100% - 10px) 100%, 10px 100%, 0% calc(100% - 10px), 0% 10px);
}

http://jsfiddle.net/2bZAW/5552/

enter image description here

3 голосов
/ 11 января 2014

При небольшом редактировании кода Джозефа элемент не требует сплошного фона:

div {
    height: 300px;
    background: url('http://images2.layoutsparks.com/1/190037/serene-nature-scenery-blue.jpg');
    position: relative;
}

div:before {
    content: '';
    position: absolute;
    top: 0; right: 0;
    border-top: 80px solid white;
    border-left: 80px solid rgba(0,0,0,0);
    width: 0;
}

http://jsfiddle.net/2bZAW/1921/

Это использование ' rgba (0,0, 0,0) 'позволяет скрыть внутренний' угол '.

Вы также можете редактировать 4-й параметр' a ', где 0 , чтобыиметь тень для большего эффекта «сложенного угла»:

http://jsfiddle.net/2bZAW/1922/ (с тенью)


ПРИМЕЧАНИЕ: Цветовые значения RGBA поддерживаются в IE9 +, Firefox 3+, Chrome, Safari и в Opera 10+.

2 голосов
/ 09 марта 2018

У нас была проблема разных цветов фона для наших вырезанных элементов. И мы хотели только верхний правый и нижний левый угол.

enter image description here

body {
 background-color: rgba(0,0,0,0.3)
 
}

.box {
 position: relative;
 display: block;
 background: blue;
 text-align: center;
 color: white;
 padding: 15px;
 margin: 50px;
}

.box:before,
.box:after {
 content: "";
 position: absolute;
 left: 0; 
 right: 0;
 bottom: 100%;
 border-bottom: 15px solid blue;
 border-left: 15px solid transparent;
 border-right: 15px solid transparent;
}

.box:before{
	border-left: 15px solid blue;
}

.box:after{
	border-right: 15px solid blue;
}

.box:after {
 bottom: auto;
 top: 100%;
 border-bottom: none;
 border-top: 15px solid blue;
}


/* Active box */
.box.active{
	background: white;
	color: black;
}



.active:before,
.active:after {
 border-bottom: 15px solid white;
}

.active:before{
	border-left: 15px solid white;
}

.active:after{
	border-right: 15px solid white;
}

.active:after {
 border-bottom: none;
 border-top: 15px solid white;
}
<div class="box">
 Some text goes here. Some text goes here. Some text goes here. Some text goes here.<br/>Some text goes here.<br/>Some text goes here.<br/>Some text goes here.<br/>Some text goes here.<br/>Some text goes here.<br/>
</div>
<div class="box">
 Some text goes here.
</div>
<div class="box active">
 Some text goes here.
 <span class="border-bottom"></span>
</div>
<div class="box">
 Some text goes here.
</div>
1 голос
/ 26 апреля 2017

Согласно решению линейного градиента Гарри (ответ 14 октября 15 в 9:55), это говорит о том, что фон непрозрачности невозможен, я пробовал и да, это не так.

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

Установите положение относительно контейнера и создайте псевдоэлемент с такими же свойствами линейного градиента. Другими словами, просто клонируйте это. Затем поместите прозрачный фон для контейнера и, скажем, черный фон для клона. Поместите на него абсолютную позицию, z-индекс -1 и значение непрозрачности (т. Е. 50%). Это сделает работу. Опять же, это обходной путь, и он не идеален, но работает просто отлично.

.cut-corner {
    position: relative;
    color: white;
    background-repeat: no-repeat;
    background-image: linear-gradient(white, white), linear-gradient(white, white), linear-gradient(white, white), linear-gradient(white, white), linear-gradient(to bottom left, transparent calc(50% - 1px), white calc(50% - 1px), white calc(50% + 1px), transparent calc(50% + 1px)), linear-gradient(transparent, transparent), linear-gradient(transparent, transparent);
    background-size: 2px 100%, 2px 100%, 100% 2px, 100% 2px, 25px 25px, 100% 100%, 100% 100%;
    background-position: 0% 0%, 100% 25px, -25px 0%, 0px 100%, 100% 0%, -25px 0%, 100% 25px;
}
.cut-corner:after {
    content: "";
    position: absolute;
    left: 0;
    bottom: 0;
    right: 0;
    top: 0;
    z-index: -1;
    opacity: 0.5;
    background-repeat: no-repeat;
    background-image: linear-gradient(white, white), linear-gradient(white, white), linear-gradient(white, white), linear-gradient(white, white), linear-gradient(to bottom left, transparent calc(50% - 1px), white calc(50% - 1px), white calc(50% + 1px), black calc(50% + 1px)), linear-gradient(black, black), linear-gradient(black, black);
    background-size: 2px 100%, 2px 100%, 100% 2px, 100% 2px, 25px 25px, 100% 100%, 100% 100%;
    background-position: 0% 0%, 100% 25px, -25px 0%, 0px 100%, 100% 0%, -25px 0%, 100% 25px;
}

/* Just for demo */

div {
  padding: 10px;
}
body{
 background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
}
<div class="cut-corner">
  Some content<br>
  Some content<br>
  Some content<br>
  Some content  
</div>
...