如何用箭头在div上添加边框?

问题描述:

我有四个div样式,我需要使用:一个没有箭头,一个右箭头,一个左箭头,以及左右箭头。我希望带箭头的div有一个与没有箭头的div匹配的边框。这些div需要具有相同的高度和宽度,并且边框需要全部匹配。你会注意到,在我的代码中,我为箭头div指定了边框,并且它与背景颜色的颜色相同。我只有作为占位符,并使div的大小相同。我也知道箭头div上的边框将指定div的两边较暗的颜色和div的两边的背景颜色(我知道该怎么做)。如何用箭头在div上添加边框?

我真正的问题是如何在箭头部分完成边界?我正在寻找一个CSS ONLY解决方案。我已经看到添加另一个div,并使箭头1px(或任何宽度)更大的解决方案来模拟边框,但我希望避免额外的标记。我也意识到还有其他解决方案来制作箭头本身。我不反对另一个只有CSS的箭头解决方案,如果它有助于解决这个边界问题,或者更好的工作方式(我不想用JS来实现这一点,尽管我知道这是可能的)。我的CSS和样本HTML如下:

div.occurrence-wrapper { 
 
    position: relative; 
 
    margin: 0.1em 0.2em; 
 
} 
 
div.full { 
 
    border: 0.1em solid #88b7d5; 
 
    background-color: #c2e1f5; 
 
    position: relative; 
 
    height: 1.4em; 
 
    overflow: hidden; 
 
} 
 
div.flow-prev > div.full, 
 
div.flow-next > div.full { 
 
    border-color: #c2e1f5; 
 
} 
 
div.flow-prev > div.full { 
 
    margin-left: 0.7em; 
 
} 
 
div.flow-next > div.full { 
 
    margin-right: 0.7em; 
 
} 
 
div.flow-prev:before, 
 
div.flow-next:after { 
 
    content: ""; 
 
    height: 0; 
 
    width: 0; 
 
    padding: 0; 
 
    margin: 0; 
 
    top: 50%; 
 
    border: solid transparent; 
 
    border-color: rgba(136, 183, 213, 0); 
 
    position: absolute; 
 
    pointer-events: none; 
 
    border-width: 0.7em; 
 
    margin-top: -0.7em; 
 
} 
 
div.flow-prev:before { 
 
    right: 100%; 
 
    border-right-color: #c2e1f5; 
 
    margin-right: -0.7em; 
 
} 
 
div.flow-next:after { 
 
    left: 100%; 
 
    border-left-color: #c2e1f5; 
 
    margin-left: -0.7em; 
 
}
<table> 
 
    <tbody> 
 
    <tr> 
 
     <td> 
 
     <div class="occurrence-wrapper"> 
 
      <div class="full">No arrows</div> 
 
     </div> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
     <div class="occurrence-wrapper flow-prev flow-next"> 
 
      <div class="full">Both arrows</div> 
 
     </div> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
     <div class="occurrence-wrapper flow-prev"> 
 
      <div class="full">Left arrow</div> 
 
     </div> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
     <div class="occurrence-wrapper flow-next"> 
 
      <div class="full">Right arrow</div> 
 
     </div> 
 
     </td> 
 
    </tr> 
 
    </tbody> 
 
</table>

要添加围绕这似乎是一个额外的图像(支持透明度),使箭头上一个典型的箱的两侧,你需要一个边界创建另一个显示边框的图像,因为CSS不处理像三角形一样的形状来创建边框。这只适用于矩形。

您可以通过CSS后becore创建它....

下面的HTML代码...

<div class="myDiv">This Is My Div</div> 
<div class="myDiv right">This Is My Div</div> 
<div class="myDiv left">This Is My Div</div> 
<div class="myDiv left right">This Is My Div</div> 

下面的CSS代码是...

.myDiv{ 
    padding:5px 10px; 
    background:#333; 
    color:#FFF; 
    width:120px; 
    position:relative; 
    height:30px; 
    margin-bottom:20px; 
} 
.myDiv.left{ 
    margin-left:20px; 
} 
.myDiv.left:before{ 
    content:" "; 
    width:0px; 
    background:transparent; 
    height:0; 
    position:absolute; 
    top:0; 
    left:-40px; 
    border-right: 20px solid #333; 
    border-top: 20px solid transparent; 
    border-left: 20px solid transparent; 
    border-bottom: 20px solid transparent; 
} 

.myDiv.right:after{ 
    content:" "; 
    width:0px; 
    background:transparent; 
    height:0; 
    position:absolute; 
    top:0; 
    right:-40px; 
    border-left: 20px solid #333; 
    border-top: 20px solid transparent; 
    border-right: 20px solid transparent; 
    border-bottom: 20px solid transparent; 
} 

您可以访问jsfiddle现场演示。

+0

改变边界的颜色改变了整个箭头部分,而不是在其周围的边框。我期待在整个形状的外部放置一个边框(在我的示例中为0.1em)。 – heath 2015-02-23 15:52:32

您可以使用pseudo-elementtransform来实现该目标。

div { 
 
    position: relative; 
 
    width: 150px; 
 
    height: 40px; 
 
    background: crimson; 
 
    border: 2px solid navy; 
 
} 
 
div:before { 
 
    content: ""; 
 
    position: absolute; 
 
    height: 29px; 
 
    width: 29px; 
 
    transform-origin: 0% 0%; 
 
    -webkit-transform: rotate(45deg); 
 
    -moz-transform: rotate(45deg); 
 
    transform: rotate(45deg); 
 
    right: -33px; 
 
    top: -2px; 
 
    background: crimson; 
 
    border-top: 2px solid navy; 
 
    border-right: 2px solid navy; 
 
}
<div></div>

FIDDLE

+0

这看起来很有前途。我想把这个插入到我的CSS中,并给它一个测试,但是你正在使用px,而我正在使用它。我不确定你是如何计算尺寸和偏移的。在我的解决方案中,这非常简单,因为所有的伪维和偏移量都是50% - 我有1.4em的div高度,所以我的所有伪项都只用0.7em。在你的例子中,我无法辨别你的数学。 – heath 2015-02-23 15:50:38