CSS三角形自定义边框颜色

Posted

技术标签:

【中文标题】CSS三角形自定义边框颜色【英文标题】:CSS triangle custom border color 【发布时间】:2012-03-16 01:59:06 【问题描述】:

尝试为我的 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/

【问题讨论】:

【参考方案1】:

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

.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;

Updated Fiddle here

【讨论】:

嘿,我不明白如何修改三角形以显示在框的另一侧(我不明白三角形 css 是如何工作的) 请注意,对于与@Kevin 有相同问题的人。查看border-color 属性,根据彩色边框,三角形将指向不同的方向。要将箭头指向左侧,请将 .container:after.container:before 中的 border-color 更改为 transparent #e3f5ff transparent transparent; @Scott 谢谢!你的 JS Fiddle 是正确的!但是,请注意 JSFiddle 中的 copypasta,它在我的 CSS 文件中添加了两个不可见且无效的字符,导致该 css 文件中的验证/解析错误。一旦我删除了不可见的字符(字符宽度为零,因此光标没有显示它们,但我能够退格),它的效果非常好。问题不是你的代码,我认为 JS Fiddle 在显示的代码中引入了一些神秘的字符?不知道,但我只是想提一下,以防万一有人遇到同样的问题。【参考方案2】:

我知道你接受这一点,但也用更少的 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/

【讨论】:

嘿,我不明白如何修改三角形以显示在框的另一侧(我不明白三角形 css 是如何工作的) @Kevin 我创建了这个请检查jsfiddle.net/4ZeCz/97。尝试使用我使用的属性,如果您有任何问题可以问我:) 解释:这将创建一个正常的正方形元素,在两个相邻边上都有边框,形成一个倾斜的三角形。然后正方形倾斜 45 度,因此三角形指向上方(或您想要的任何位置)。顺便说一句,您现在只需要 -webkit- 前缀(对于 IE9 和 -ms-)。所有其他浏览器都支持无前缀。【参考方案3】:

我认为这是一个更简单的使用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>

【讨论】:

我试图让三角形有一个带有 1px 边框的白色背景。我在您的示例中看不到边框。 @Jarad 当然不是因为剪辑路径本身的行为。但是,相对容易(例如)生成一个修改属性的 JavaScript,以便气球可以指向任何方向。您也可以直接在 CSS 中定义一些品种。的优点和缺点。智能设计将这两件事都考虑在内。这是你的选择,这是我的答案。【参考方案4】:
.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;

【讨论】:

【参考方案5】:

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

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

.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 中看起来不错) 我不太清楚为什么上面第二个 drop-shadow() 中 &lt;offset-y&gt; 值的 0.5px 看起来更像 1px 而不是 1px,尽管我认为它与三角函数有关(尽管至少在我的显示器上我认为实际的基于 trig 的值或 0.5px 甚至 0.1px 之间没有区别。 大于 1 像素的边框(嗯,它们的外观就是这样)似乎效果不佳。或者至少我还没有找到解决方案,尽管请参阅下面的不太理想的方法来扩大一点。 (我认为 drop-shadow() 的记录但不受支持的第四个参数 (&lt;spread-radius&gt;) 可能是我真正想要的,而不是多个过滤器值,但添加它只是完全破坏了事情。)给你可以看到超过 1px 时会发生什么 (fiddle):

.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>

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

但是我想如果你需要看起来比 1px 更宽的东西,我想你可以利用这些相互叠加的阴影,方法是将它们更改为以下内容 (fiddle):

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.5 像素,尽管结果看起来是相乘的),其余所有的模糊都为 0。但这仅适用于所有侧面的相同颜色,它会导致一些看起来圆润的角落以及你走的越大的非常粗糙的边缘。

【讨论】:

以上是关于CSS三角形自定义边框颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何用css定义div的边框颜色

CSS3实现三角形

更改自定义颜色的边框颜色

圆形图片带有边框可以自定义边框颜色

如何设置自定义小部件的背景颜色和边框宽度?

具有自定义边框颜色的 UIButton,iPhone