Как получить скошенные углы границ CSS, а не закругленные углы?

С помощью свойства CSS border-radius у меня может быть изогнутый закругленный угол границы в конце.

.boxLeft{
    border-right: 1px dashed #333;
    border-bottom: 1px dashed #333;
    border-radius: 0 0 10px 0;
}

.boxRight{
    border-left: 1px dashed #333;
    border-bottom: 1px dashed #333;
    border-radius: 0 0 0 10px;
}

Но мне нужен пограничный угол, как на изображении ниже. Если у меня есть две коробки (желтая и розовая), которые встречаются друг с другом, и я хочу, чтобы в нижней точке встречи был резкий угол (пунктирный угол), что мне делать?

введите здесь описание изображения

Возможно ли это с помощью CSS?


person Mayeenul Islam    schedule 08.02.2013    source источник
comment
Вы должны использовать что-то вроде (псевдокод) .boxLeft + .boxRight {border-bottom-left-radius:0} - точно не помню. У меня было что-то похожее, если найду, напишу.   -  person    schedule 08.02.2013
comment
Интересный вопрос! Возможно, вы захотите что-то сделать с селектором :after, но я не уверен, что это сработает. Взгляните на это: jtauber.github.com/articles/css-hexagon.html< /а>   -  person reinder    schedule 08.02.2013


Ответы (8)


Вот способ, хотя у него есть некоторые недостатки, такие как отсутствие границ и непрозрачность:

.left,
.right {
  width: 100px;
  height: 100px;
  float: left;
  position: relative;
}

.left {
  background: lightpink;
}

.right {
  background: lightblue;
}

.right::after,
.left::after {
  width: 0px;
  height: 0px;
  background: #fff;
  content: '';
  position: absolute;
  bottom: 0;
}

.right::after {
  left: 0;
  border-top: 10px solid lightblue;
  border-right: 10px solid lightblue;
  border-left: 10px solid white;
  border-bottom: 10px solid white;
}

.left::after {
  right: 0;
  border-top: 10px solid lightpink;
  border-right: 10px solid white;
  border-left: 10px solid lightpink;
  border-bottom: 10px solid white;
}
<div class="left"></div>
<div class="right"></div>

РЕЗУЛЬТАТ:

введите здесь описание изображения

Вот скрипка.

person thordarson    schedule 08.02.2013
comment
Полезное обновление, как показано на этой демонстрационной странице с инструкциями. использует transparent в качестве названия цвета для выреза границы. Пример CSS: border-bottom:30px solid transparent;. Наслаждаться! - person Slink; 05.06.2014

Градиенты CSS3 могут помочь:

Попробуйте это, Вот Fiddle.

div {
  background: #c00;
  /* fallback */
  background: -moz-linear-gradient(45deg, transparent 10px, #c00 10px), -moz-linear-gradient(135deg, transparent 10px, #c00 10px), -moz-linear-gradient(225deg, transparent 10px, #c00 10px), -moz-linear-gradient(315deg, transparent 10px, #c00 10px);
  background: -o-linear-gradient(45deg, transparent 10px, #c00 10px), -o-linear-gradient(135deg, transparent 10px, #c00 10px), -o-linear-gradient(225deg, transparent 10px, #c00 10px), -o-linear-gradient(315deg, transparent 10px, #c00 10px);
  background: -webkit-linear-gradient(45deg, transparent 10px, #c00 10px), -webkit-linear-gradient(135deg, transparent 10px, #c00 10px), -webkit-linear-gradient(225deg, transparent 10px, #c00 10px), -webkit-linear-gradient(315deg, transparent 10px, #c00 10px);
}

div {
  background-position: bottom left, bottom right, top right, top left;
  -moz-background-size: 50% 50%;
  -webkit-background-size: 50% 50%;
  background-size: 50% 50%;
  background-repeat: no-repeat;
}


/* Ignore the CSS from this point, it's just to make the demo more presentable */

div {
  float: left;
  width: 50px;
  margin: 15px auto;
  padding: 15px;
  color: white;
  line-height: 1.5;
}
<div>Div 1</div>
<div>Div 2</div>

person AlphaMale    schedule 08.02.2013
comment
приятно видеть ссылку на источник... lea.verou.me/2011/03/ - person RozzA; 08.07.2015

Это также возможно с использованием «clip-path».

-webkit-clip-path: polygon(20% 0%, 80% 0%, 100% 20%, 100% 80%, 80% 100%, 20% 100%, 0% 80%, 0% 20%);
clip-path: polygon(20% 0%, 80% 0%, 100% 20%, 100% 80%, 80% 100%, 20% 100%, 0% 80%, 0% 20%);

div {
  width: 200px;
  height: 200px;
  background: red;
  -webkit-clip-path: polygon(20% 0%, 80% 0%, 100% 20%, 100% 80%, 80% 100%, 20% 100%, 0% 80%, 0% 20%);
  clip-path: polygon(20% 0%, 80% 0%, 100% 20%, 100% 80%, 80% 100%, 20% 100%, 0% 80%, 0% 20%);
}
<div></div>

Исходный код Codepen

Поддержку clip-path можно найти здесь... http://caniuse.com/#search=clip-path

person Collins    schedule 06.04.2016
comment
Это мой любимый способ сделать это, просто имейте в виду, что в настоящее время он не поддерживается в IE. - person Nick Barrett; 17.06.2016
comment
Да, верно, но отсутствие поддержки просто означает, что он возвращается к исходной форме изображения. Довольно изящный запасной вариант и хороший простой способ получить эффект. - person Collins; 17.06.2016

Это то, что вам нужно, прозрачность и все такое

.left,
.right {
  width: 100px;
  height: 100px;
  float: left;
  position: relative;
  overflow: hidden;
}

.right::after,
.left::after {
  content: '';
  width: 200px;
  height: 200px;
  position: absolute;
  -moz-transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
}

.right::after {
  background: lightblue;
  left: -40px;
  top: -100px;
}

.left::after {
  background: lightpink;
  left: -60px;
  top: -100px;
}
<div class="left"></div>
<div class="right"></div>

person Bruno    schedule 20.08.2013
comment
можем ли мы получить изображение, как оно выглядит при отображении? - person Mayeenul Islam; 21.08.2013
comment
Вот скрипт для всех, кому интересно: jsfiddle.net/corwin0amber/bE665 - person corwin.amber; 26.10.2013

Хороший лучший способ заархивировать это: border-images. В сочетании с .svg хорошее решение...

person gearsdigital    schedule 08.02.2013

Сначала я протестировал решение @thordarson с помощью position: 'absolute'.

position: 'absolute',
top: '2.9rem',
left: '2.6rem',
borderLeft: '1rem solid #6CAEC6',
borderBottom: '0.7rem solid white',

Это отлично работало на большинстве устройств, как показано на первом рисунке, но при использовании на iPhone или планшетах начали появляться странные линии:

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

Как ответил @Collins, я начал использовать clip-path: polygon, но мне было довольно трудно получить правильные формы. Затем я нашел сайт, который мне действительно помог:

https://bennettfeely.com/clippy/

Они предлагают готовые формы, которые затем можно перетащить в нужную форму.

введите здесь описание изображения

Для угла, который мне нужен, я мог скопировать правильные значения с веб-сайта.

введите здесь описание изображения

Требованием для нас был угол 35°, и для этого я воспользовался сайтом:

https://www.ginifab.com/feeds/angle_measurement/

введите здесь описание изображения

Я не имею отношения ни к одному из сайтов, они просто действительно помогли мне получить то, что я хотел. С clip-path: polygon и -webkit-clip-path: polygon он работал на всех устройствах и браузерах, которые у нас были в качестве требования.

Проверка совместимости:

https://caniuse.com/#feat=css-clip-path

person Ogglas    schedule 13.05.2020

++ Включает пользовательский интерфейс в стиле Дикого Запада в CSS++

Я обновил потрясающий ответ AlphaMale, чтобы взломать скошенные границы, как это было изначально запрошено. Он в основном использует один скошенный div с немного меньшим внутри него. Цвет фона внешнего элемента div становится цветом границы, когда остальная его часть закрывается внутренним элементом div с соответствующими фасками.

Протестировано в Edge, Chrome и Firefox.

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

Код на JSFiddle (CSS ниже): http://jsfiddle.net/S2nqK/345/

Изображение пользовательского интерфейса Westworld по адресу: https://qph.ec.quoracdn.net/main-qimg-44c9f03b2abfe9f3833763eece1b0cc4?convert_to_webp=true

body {background-color: #353535;
font-family: 'Open Sans';}
.div-outer {

 /* Chrome / Safari */
    background:
        -webkit-linear-gradient(45deg,  transparent 0px, #6ea1a1 0px), /* bottom left */
        -webkit-linear-gradient(135deg, transparent 14px, #6ea1a1 14px), /* bottom right */
        -webkit-linear-gradient(225deg, transparent 0px, #6ea1a1 0px), /* top right */
        -webkit-linear-gradient(315deg, transparent 5px, #6ea1a1 5px); /* top left */

    /* Firefox */
        background:
        -moz-linear-gradient(45deg,  transparent 0px, #6ea1a1 0px), /* bottom left */
        -moz-linear-gradient(135deg, transparent 14px, #6ea1a1 14px), /* bottom right */
        -moz-linear-gradient(225deg, transparent 0px, #6ea1a1 0px), /* top right */
        -moz-linear-gradient(315deg, transparent 5px, #6ea1a1 5px); /* top left */

     /* Opera */
        background:
        -o-linear-gradient(45deg,  transparent 0px, #6ea1a1 0px), /* bottom left */
        -o-linear-gradient(135deg, transparent 14px, #6ea1a1 14px), /* bottom right */
        -o-linear-gradient(225deg, transparent 0px, #6ea1a1 0px), /* top right */
        -o-linear-gradient(315deg, transparent 5px, #6ea1a1 5px); /* top left */


   padding: 2px;
   color: #fff;

}

.div-inner {


    background:
        -webkit-linear-gradient(45deg,  transparent 0px, #000 0px),
        -webkit-linear-gradient(135deg, transparent 14px, #000 14px),
        -webkit-linear-gradient(225deg, transparent 0px, #000 0px),
        -webkit-linear-gradient(315deg, transparent 5px, #000 5px);

         background:
        -moz-linear-gradient(45deg,  transparent 0px, #000 0px),
        -moz-linear-gradient(135deg, transparent 14px, #000 14px),
        -moz-linear-gradient(225deg, transparent 0px, #000 0px),
        -moz-linear-gradient(315deg, transparent 5px, #000 5px);

         background:
        -o-linear-gradient(45deg,  transparent 0px, #000 0px),
        -o-linear-gradient(135deg, transparent 14px, #000 14px),
       -o-linear-gradient(225deg, transparent 0px, #000 0px),
        -o-linear-gradient(315deg, transparent 5px, #000 5px);


   padding: 10px;

   height: 92px;
   text-align: center;
}


.div-outer, .div-inner {
    background-position: bottom left, bottom right, top right, top left;
    -moz-background-size: 50% 50%;
    -webkit-background-size: 50% 50%;
    background-size: 50% 50%;
    background-repeat: no-repeat;
}

.contain {
   width: 180px;
}
.title {background-color: #76ffff; 
  padding: 6px;
  color: #000;
  border-radius: 2px;
  font-weight: bold;
 text-align-last: justify;
 text-align: justify;
  }
.font-large {font-size: 34pt;}
.font-tiny {font-size: 10pt;}
.cyan {color: #76ffff;}
/* Ignore the CSS from this point, it's just to make the demo more presentable */

.arrow-right {
  width: 0; 
  height: 0; 
  border-top: 8px solid transparent;
  border-bottom: 8px solid transparent;
  border-left: 8px solid #fff;
  display: inline-block;
  vertical-align: middle;
}


p:first-of-type { margin-top: 0 }
p:last-of-type { margin-bottom: 0}
person Casual Bob    schedule 01.03.2017
comment
К вашему сведению, по крайней мере, в Chrome высота и ширина нечетных пикселей приводят к линии посередине div с фаской. Кто-то умнее меня должен посмотреть, сможет ли он это исправить! - person Casual Bob; 01.03.2017

Итак, я создал JS-библиотеку для автоматизации создания скошенных границ. Он имеет два метода создания фасок:

Метод 1: создается скошенный фон с помощью Canvas API и устанавливается как CSS background-image элемента.

Метод 2: он добавляет 4 треугольных элемента DOM на основе CSS вокруг цели, создавая фаску.

Вы будете придерживаться метода 1, когда вы можете позволить библиотеке установить background-image, и вам понадобится метод 2, когда у вашей цели уже есть фон, как в ‹img>.

Использование простое, просто вызовите ChamferBg для использования метода 1 или ChamferEnvelop для использования метода 2:

var el = document.getElementById('box');
ChamferBg(el, {
    size: 20,
    sw: 6,
    sc: '#447aec',
    fc: '#21ceff',
    tl: false,
    br: false,
    resize_observe: true
});

Параметры и их значения по умолчанию:

{
    size: 5,    // chamfer size
    sw: 1,      // stroke width
    sc: 'black',    // stroke color,
    fc: undefined,  // fill color
    fp: undefined,  // URL of an image to use as fill pattern

    tl: true,   // chamfer top-left corner?
    tr: true,   // chamfer top-right corner?
    bl: true,   // chamfer bottom-left corner?
    br: true,   // chamfer bottom-right corner?

    resize_observe: false
    // turn on resize_observe observer?
    // this will observer whenever the element
    // resizes and will refresh the background
}

Вам нужно будет установить resize_observe в true, если вы используете метод 1, и ваш элемент может изменить свой размер во время выполнения, потому что тогда ему нужно будет воссоздавать скошенный фон каждый раз, когда он изменяет размер.

person Ramon    schedule 17.01.2018
comment
Просто ссылка на вашу собственную библиотеку или учебник не является хорошим ответом. Ссылка на него, объяснение, почему он решает проблему, предоставление кода о том, как это сделать, и отказ от того, что вы его написали, дает лучший ответ. См.: Что означает "хорошая" самореклама? - person Paul Roub; 17.01.2018
comment
@Ramon По крайней мере, укажите свое подключение к MISoftware и библиотеке/скрипту Chamfer.js при продвижении его на SO ... - person agrm; 17.01.2018
comment
Ребята, надеюсь, теперь это полезный ответ. Если есть что-то, что я мог бы улучшить, дайте мне знать... - person Ramon; 26.01.2018