124

尝试为我的 css 三角形(边框)使用自定义十六进制颜色。但是,由于它使用边框属性,我不确定如何去做。仅仅因为兼容性,我想避开 javascript 和 css3。我试图让三角形有一个带有 1px 边框(围绕三角形的角边)的白色背景,颜色为 #CAD5E0。这可能吗?这是我到目前为止所拥有的:

.container {
    margin-left: 15px;
    width: 200px;
    background: #FFFFFF;
    border: 1px solid #CAD5E0;
    padding: 4px;
    position: relative;
    min-height: 200px;
}

.container:after {
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    left: 100%;
    width: 0;
    height: 0;
    border-color: transparent transparent transparent #CAD5E0;
    border-style: solid;
    border-width: 10px;
}​

我的小提琴:http: //jsfiddle.net/4ZeCz/

4

5 回答 5

203

你实际上必须用两个三角形来伪造它......

.container {
    margin: 15px 30px;
    width: 200px;
    background: #fff;
    border: 1px solid #a00;
    position: relative;
    min-height: 200px;
    padding: 20px;
    text-align: center;
    color: #fff;
    font: bold 1.5em/180px Helvetica, sans-serif;
    text-shadow: 0 0 1px #000;
}

.container:after,
.container:before {
    content: '';
    display: block;
    position: absolute;
    left: 100%;
    width: 0;
    height: 0;
    border-style: solid;
}

.container:after {
    top: 10px;
    border-color: transparent transparent transparent #fdd;
    border-width: 10px;
}

.container:before {
    top: 9px;
    border-color: transparent transparent transparent #a00;
    border-width: 11px;
}

在这里更新了小提琴

在此处输入图像描述

于 2012-02-26T05:20:00.897 回答
96

我知道你接受这一点,但也用更少的 css 检查这个:

.container {
    margin-left: 15px;
    width: 200px;
    background: #FFFFFF;
    border: 1px solid #CAD5E0;
    padding: 4px;
    position: relative;
    min-height: 200px;
}

.container:after {
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    right:-7px;
    width: 10px;
    height: 10px;
    background: #FFFFFF;
    border-right:1px solid #CAD5E0;
    border-bottom:1px solid #CAD5E0;
    -moz-transform:rotate(-45deg);
    -webkit-transform:rotate(-45deg);
}

http://jsfiddle.net/4ZeCz/3/

于 2012-02-26T05:38:52.833 回答
2

我认为这是一个更简单的使用clip-path

.container {
  width: 150px;
  min-height: 150px;
  background: #ccc;
  padding: 8px;
  padding-right: 6%;
  display: inline-block;
  clip-path: polygon(0% 0%,0% 100%,90% 100%,90% 5%,100% 10%,90% 15%,90% 0%);
}
<div class="container">
test content
</div>

于 2018-05-16T17:43:47.553 回答
2

另一种实现这一点的方法,特别是对于像我一样需要使用等边甚至不等边三角形的人来说,是使用filter: drop-shadow(...)多个值且没有模糊半径。这具有不需要多个元素或同时访问:before 和 :after 的额外好处(我试图通过内联的 :after 内容来完成此操作,因此也希望避免绝对定位)。

对于上述情况,:after 的 CSS 可能如下所示(小提琴):

.container {
  margin-left: 15px;
  width: 200px;
  background: #FFFFFF;
  border: 1px solid #CAD5E0;
  padding: 4px;
  position: relative;
  min-height: 200px;
}
.container:after {
  content: '';
  display: block;
  position: absolute;
  top: 10px;
  left: 100%;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 20px 0 40px 15px; /* skewed to show support for non-right-angle triangles */
  border-color: transparent transparent transparent #fff;
  filter: drop-shadow(1px 0 0 #CAD5E0) drop-shadow(0 .5px 0 #CAD5E0);
}
<div class="container">
  Test Container
</div>

不过,我认为有一些限制或奇怪之处:

  • 不支持 IE11(虽然在 FF、Chrome 和 Edge 中看起来不错)
  • 我不太确定为什么上面<offset-y>第二个 drop-shadow() 中的值的 0.5px 看起来更像 1px 而不是 1px,尽管我认为它与三角函数有关(尽管至少在我的显示器上我看不出两者之间的区别实际的基于 trig 的值或 0.5px 甚至 0.1px)。
  • 大于 1px 的边框(嗯,它们的外观就是这样)似乎效果不佳。或者至少我还没有找到解决方案,尽管请参阅下面的不太理想的方法来扩大一点。(我认为<spread-radius>drop-shadow()的记录但不受支持的第四个参数(超过 1px(小提琴)时开始发生:

.container {
  background-color: #eee;
  padding: 1em;
}
.container:after {
  content: "";
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 20.4px 10px 0 10px;
  border-color: yellow transparent transparent transparent;
  margin-left: .25em;
  display: inline-block;
  filter: drop-shadow(-6px -4px 0 green) drop-shadow(6px -4px 0 red) drop-shadow(0 6px 0 blue);
}
<div class="container">
  Test Container
</div>

请注意第一个(绿色)被应用一次,但第二个(红色)被应用到通过边框创建的黄色三角形以及绿色阴影()和最后一个(蓝色)的有趣之处适用于上述所有内容。(也许这也与 .5px 外观有关)。

但我想如果你需要看起来比 1px 更宽的东西,你可以利用这些相互叠加的阴影,将它们更改为如下所示(小提琴):

filter: drop-shadow(0 0 2.5px red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red);

其中第一个具有模糊半径集(在这种情况下为 2.5px,尽管结果看起来是相乘的),其余所有的模糊都为 0。但这仅适用于所有侧面的相同颜色,结果在一些看起来圆润的角落以及相当粗糙的边缘,你走的越大。

于 2018-07-18T23:37:44.657 回答
0
.triangle{
    position: absolute;
    width:0px;
    height:0px;
    border-left: 45px solid transparent;
    border-right: 45px solid transparent;
    border-bottom: 72px solid #DB5248;
}

.triangle:after{
    position: relative;
    content:"!";
    top:8px;
    left:-8px;
    color:#DB5248;
    font-size:40px;
}

.triangle:before{
    content:".";
    color: #DB5248;
    position: relative;
    top:-14px;
    left:-43px;
    border-left: 41px solid transparent;
    border-right: 41px solid transparent;
    border-bottom: 67px solid white;
}
于 2018-07-03T06:27:24.947 回答