Заостренные/угловые границы в виде стрелок в CSS

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

Хлебные крошки со стрелками

Лучшее, что мне удалось сделать, выглядит так (это всего лишь черновик снимка экрана, который я сделал некоторое время назад, поэтому, пожалуйста, не обращайте внимания на то, что панировочные сухари — это фрукты и/или вкусные):

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

Я добивался этого с помощью CSS следующим образом:

.breadcrumb li {
    border-right: 2px solid #ECECEC;
    border-top-right-radius: 40px;
    border-bottom-right-radius: 40px;
}

Вот весь CSS, если поможет:

div.breadcrumb {
    display: block;
    float: left;
    border-bottom: 2px solid gray;
}
ul.breadcrumb {
    display: block;
    float: left;
    list-style-type: none;
    margin: 0px 0px 0px 0px;
    padding: 0px 0px 0px 0px;
}
.breadcrumb li {
    float: left;
    display: list-item;
    background-color: #F2F2F2;
    border-right: 2px solid #ECECEC;
    border-top-right-radius: 40px;
    border-bottom-right-radius: 40px;
    position: relative;
    padding: 9px 20px 10px 35px;
    margin-left: -32px;
}
.breadcrumb li.first-crumb {
    background: #E7E7E7;
    padding-left: 20px;
    margin-left: 0px;
}
.breadcrumb li.last-crumb {
    border-top: 1px solid #E3E3E3;
    border-right: 1px solid #E3E3E3;
    background: white;
    padding-top: 9px;
    padding-bottom: 9px;
    border-top-right-radius: 0px;
    border-bottom-right-radius: 0px;
}
.breadcrumb li:not(.first-crumb) {
    padding-left: 45px;
}
.breadcrumb li:not(.last-crumb) a:after {
    content: "\27F6";
    margin-left: 10px;
    color: #444444;
    margin-right: 0px;
}
.breadcrumb li a,
.breadcrumb li span {
    display: block;
    float: left;
    position: relative;
}
.breadcrumb li a {
    text-decoration: none;
}
.breadcrumb li.first-crumb a {
    padding-left: 0px;
    margin-left: 0px;
}

Моя разметка выглядит так:

<div class="breadcrumb">
    <ul class="breadcrumb">
        <li class="breadcrumb first-crumb"><a href="#">Produce</a></li>
        <li class="breadcrumb"><a href="#">Fruits</a></li>
        <li class="breadcrumb last-crumb"><span>breadcrumb-ilicious!</span></li>
    </ul>
</div>

Редактировать: Было бы неплохо, если бы я мог сделать так, чтобы это выглядело так, как будто есть настоящая граница. Это мой грубый набросок:

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

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

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


person 2rs2ts    schedule 01.11.2013    source источник


Ответы (3)


Воруя из CSS Tricks — CSS Triangle, вы можете сделать что-то вроде

li.breadcrumb:after {
    content: "";
    display: inline-block;
    width: 0;
    height: 0;
    border-top: 20px solid #eee;
    border-bottom: 20px solid #eee;
    border-left: 20px solid #ccc;
}

li.breadcrumb:after {
    content: "";
    display: inline-block;
    width: 0;
    height: 0;
    border-top: 20px solid #eee;
    border-bottom: 20px solid #eee;
    border-left: 20px solid #ccc;
}
li.first-crumb:after {
    border-top: 20px solid #ccc;
    border-bottom: 20px solid #ccc;
    border-left: 20px solid #aaa;
}
li.last-crumb:after {
    border-top: 20px solid #fff;
    border-bottom: 20px solid #fff;
    border-left: 20px solid #eee;
}

li.breadcrumb {
    list-style-type: none;
    background-color: #ccc;
    display: inline-block;
    float: left;
    line-height: 0;
}
li.first-crumb {
    background: #aaa;
}
li.last-crumb {
    background: #eee;
}
li.breadcrumb a {
    text-decoration: none;
}
<div class="breadcrumb">
    <ul class="breadcrumb">
        <li class="breadcrumb first-crumb"><a href="#">Hurr</a>
        </li>
        <li class="breadcrumb"><a href="#">Durr</a>
        </li>
        <li class="breadcrumb last-crumb"><span>Furr</span>
        </li>
    </ul>
</div>
<div class="arrow-right"></div>


Исходный JSFiddle

person Olaf Dietsche    schedule 01.11.2013
comment
Я продолжал видеть эту ссылку, но когда я использовал ее, у меня получались трапеции, вероятно, из-за моих настроек полей/отступов в lis. Я пытался поместить несколько div внутри li и дать им классы треугольников, но даже тогда у меня возникли проблемы с позиционированием. Спасибо за ссылку, по крайней мере, подтверждает, что я должен использовать этот подход. - person 2rs2ts; 02.11.2013
comment
Я также сначала попробовал div.right-triangle внутри li, см. jsfiddle.net/P3yKr/4. Но с :after это более элегантное решение. Когда вы добавляете отступ вокруг li, это выглядит как граница вокруг треугольника. - person Olaf Dietsche; 02.11.2013
comment
Я думаю, что оба решения выглядят хорошо. Очевидно, я должен работать с ним. - person 2rs2ts; 02.11.2013

вы также можете получить эти границы, если хотите (я улучшил предыдущий ответ Олафа Дитше):

HTML:

<div class="breadcrumb">
    <ul class="breadcrumb">
        <li class="breadcrumb first-crumb"><a href="#">Hurr</a></li>
        <li class="breadcrumb"><a href="#">Durr</a></li>
        <li class="breadcrumb last-crumb"><span>Furr</span></li>
    </ul>
</div>

CSS:

li.breadcrumb:before {
    content:'';
    width: 28.28427px; /* sqrt(40*40 / 2) */
    height: 28.28427px;
    background:transparent;
    position:absolute;
    -moz-transform:rotate(45deg);
    -webkit-transform:rotate(45deg);
    transform:rotate(45deg);
    transform-origin: top right;
    top: 20px;
    margin:0;
    right: 0;
    border-right: #000 solid 1px;
    border-top: #000 solid 1px;
}

li.breadcrumb:after {
    content: "";
    display: inline-block;
    width: 0;
    height: 0;
    border-top: 20px solid #eee;
    border-bottom: 20px solid #eee;
    border-left: 20px solid #ccc;
}
li.first-crumb:after {
    border-top: 20px solid #ccc;
    border-bottom: 20px solid #ccc;
    border-left: 20px solid #aaa;
}
li.last-crumb:after {
    border-top: 20px solid #fff;
    border-bottom: 20px solid #fff;
    border-left: 20px solid #eee;
}

li.breadcrumb {
    list-style-type: none;
    background-color: #ccc;
    display: inline-block;
    float: left;
    line-height: 0;
    position: relative;
    height: 40px;
}
li.first-crumb {
    background: #aaa;
}
li.last-crumb {
    background: #eee;
}
li.breadcrumb a {
    text-decoration: none;
}

и скрипка: http://jsfiddle.net/piotku/9cs1zy4h/

person Picard    schedule 11.04.2017

Другой способ сделать это — использовать элемент :after и сделать его прямоугольником с двумя границами и повернуть его.

Вот пример: навигационная цепочка

Основной CSS:

li-item:after {
  content: "";
  width: 5rem;
  height: 100%;
  display: inline-block;
  position: absolute;
  background: transparent;
  right: 0;
  top: 0;
  transform: translateX(-1rem) rotate(45deg); 
  border-right: 4px solid white;
  border-top: 4px solid white;
}
person Evertvdw    schedule 21.02.2019