【问题标题】:Pointed/angled arrow-style borders in CSSCSS中的尖/角箭头样式边框
【发布时间】:2019-02-21 22:51:59
【问题描述】:

我正在制作一个面包屑菜单并尝试在纯 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>

编辑:如果我能让它看起来也有一个实际的边框就好了。这是我的粗略草图:

(我尝试按照 Olaf 的建议添加几个三角形,但唯一没能完成的工作是在不改变三角形突出形成边界的角度的情况下纠正两个三角形之间的明显间隙。)

【问题讨论】:

    标签: html css border css-shapes


    【解决方案1】:

    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

    【讨论】:

    • 我一直看到这个链接,但是当我使用它时,我得到了梯形,可能是因为我在lis 上的边距/填充设置。我一直在尝试将一些divs 放入lis 并给他们三角形类,但即使在那时我也遇到了定位问题。不过感谢您的链接,至少强化了我应该采用这种方法。
    • 我也先尝试了div.right-triangle里面的li,见jsfiddle.net/P3yKr/4。但是使用:after,这是更优雅的解决方案。当您在li 周围添加填充时,它看起来像是三角形周围的一些边框。
    • 我认为这两种解决方案看起来都不错。显然我必须使用它。
    【解决方案2】:

    如果你愿意,你也可以得到这些边界(我已经改进了 Olaf Dietsche 之前的答案):

    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/

    【讨论】:

      【解决方案3】:

      另一种方法是使用 :after 元素并使其成为一个有两个边框的矩形并旋转它。

      这里是一个例子:Breadcrumb

      主要 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 2012-09-20
        • 2020-11-05
        相关资源
        最近更新 更多