css - 图像上缩进的透明箭头/三 Angular 形

标签 css svg css-shapes

我想在图像上制作一个透明箭头。这个三 Angular 形应该在半透明 block 中缩进并显示背景图像。

期望的输出:

transparent indented CSS triangle

.barShow {
  background-color: #000;
  opacity: 0.5;
}

.barShow:before {
  top: 0%;
  left: 50%;
  border: solid transparent;
  content: " ";
  height: 0;
  width: 0;
  position: absolute;
  pointer-events: none;
  border-top-color: #999;
  border-width: 20px;
  margin-left: -20px;
}
<div class="barShow"></div>

透明 CSS 箭头应该是透明的,没有颜色。

最佳答案

有几种方法可以使用 CSS 在图像上制作透明箭头。我将描述的两个涉及伪元素以最小化标记并具有相同的输出。您还可以在此答案的末尾看到 SVG 方法:

Transparent arrow over an image

箭头周围黑色部分的透明效果是用rgba() colors制作的允许透明度。但如果您愿意,可以在伪元素上使用不透明度。


1。偏斜X()

您可以在两个伪元素上使用 CSS3 skewX() 属性来制作透明箭头。这种方法的主要优点是透明箭头可以响应,但它还允许您在黑色形状和三 Angular 形周围放置边框。

形状的响应性是通过 padding-bottom 属性实现的,以保持其纵横比(描述了此技术 here)。

DEMO

.wrap {
  position: relative;
  overflow: hidden;
  width: 70%;
  margin: 0 auto;
}
.wrap img {
  width: 100%;
  height: auto;
  display: block;
}
.arrow {
  position: absolute;
  bottom: 0;
  width: 100%;
  padding-bottom: 3%;
  background-color: rgba(0, 0, 0, 0.8);
}
.arrow:before,
.arrow:after {
  content: '';
  position: absolute;
  bottom: 100%;
  width: 50%;
  padding-bottom: inherit;
  background-color: inherit;
}
.arrow:before {
  right: 50%;
  -ms-transform-origin: 100% 100%;
  -webkit-transform-origin: 100% 100%;
  transform-origin: 100% 100%;
  -ms-transform: skewX(45deg);
  -webkit-transform: skewX(45deg);
  transform: skewX(45deg);
}
.arrow:after {
  left: 50%;
  -ms-transform-origin: 0 100%;
  -webkit-transform-origin: 0 100%;
  transform-origin: 0 100%;
  -ms-transform: skewX(-45deg);
  -webkit-transform: skewX(-45deg);
  transform: skewX(-45deg);
}
<div class="wrap">
  <img src="https://farm8.staticflickr.com/7187/6895047173_d4b1a0d798.jpg" />
  <div class="arrow"></div>
</div>

浏览器支持 transform : skew() 属性是 IE9+ ( see canIuse )。

2。边框

这项技术的优点是浏览器支持,所以如果您需要 IE8 支持,这一项适合您。缺点是形状不能响应,因为边框不能使用 % 宽度。

DEMO

.wrap {
  position: relative;
  overflow: hidden;
  width: 70%;
  margin: 0 auto;
}
.wrap img {
  width: 100%;
  height: auto;
  display: block;
}
.arrow {
  position: absolute;
  bottom: 0;
  width: 100%;
  height: 20px;
  background-color: rgba(0, 0, 0, 0.8);
}
.arrow:before,
.arrow:after {
  content: '';
  position: absolute;
  bottom: 100%;
  width: 50%;
  box-sizing: border-box;
}
.arrow:before {
  right: 50%;
  border-bottom: 20px solid rgba(0, 0, 0, 0.8);
  border-right: 20px solid transparent;
}
.arrow:after {
  left: 50%;
  border-bottom: 20px solid rgba(0, 0, 0, 0.8);
  border-left: 20px solid transparent;
}
<div class="wrap">
  <img src="https://farm8.staticflickr.com/7187/6895047173_d4b1a0d798.jpg" />
  <div class="arrow"></div>
</div>


3。一起玩吧!

示例:如果您可以将黑色透明颜色更改为与您的背景颜色相同(此处为白色),您可以制作一个与 block 具有相同背景图像的透明三 Angular 形/箭头:

transparetn arrow with a see through image

DEMO

.wrap {
    position: relative;
    overflow: hidden;
    width: 50%;
    margin: 0 auto;
    background-color:#fff;
}
.wrap img {
    width: 100%;
    height: auto;
    display: block;
}
.wrap:before, .wrap:after {
    content:'';
    position: absolute;
    bottom: 0;
    width: 50%;
    background-color: inherit;
    padding-bottom:3%;
}
.wrap:before {
    right: 50%;
    -ms-transform-origin: 100% 100%;
    -webkit-transform-origin: 100% 100%;
    transform-origin: 100% 100%;
    -ms-transform: skewX(45deg);
    -webkit-transform: skewX(45deg);
    transform: skewX(45deg);
}
.wrap:after {
    left: 50%;
    -ms-transform-origin: 0 100%;
    -webkit-transform-origin: 0 100%;
    transform-origin: 0 100%;
    -ms-transform: skewX(-45deg);
    -webkit-transform: skewX(-45deg);
    transform: skewX(-45deg);
}
<div class="wrap">
    <img src="https://farm8.staticflickr.com/7187/6895047173_d4b1a0d798.jpg" />
</div>

4。图像上方带有三 Angular 形的工具提示。

如果您需要在另一张图片、背景渐变或任何非纯色上使用此形状,您将需要使用不同的方法来查看形状周围的图片,如下所示:

tooltip like element with a triangle over an image

重点是两次使用相同的图像。一次在 div 元素中,一次在三 Angular 形中,并使用绝对定位将它们精确地放置在同一位置。箭头是made with transform:rotate(); .

DEMO

body{
  padding-top:100px;
  background:url('https://farm8.staticflickr.com/7187/6895047173_d4b1a0d798.jpg')no-repeat center center;
  background-size:cover;
}

.wrap, .img {
  display:inline-block;
  position:relative;
}
.tr{
  position:absolute;
  overflow:hidden;
  top:-25px; left:100px;
  width:50px; height:50px;
  -webkit-transform:rotate(45deg);
  -ms-transform:rotate(45deg);
  transform:rotate(45deg);
}
.tr img{
  position:absolute;
  top:-15px; left:-100px;
  -webkit-transform-origin: 125px 40px;
  -ms-transform-origin: 125px 40px;
  transform-origin: 125px 40px;
  -webkit-transform:rotate(-45deg);
  -ms-transform:rotate(-45deg);
  transform:rotate(-45deg);
}
.img{
  overflow:hidden;
  width: 600px; height:100px;
}
.img img{
  position:absolute;
  top:-40px;
}
<div class="wrap">
    <div class="img">
        <img src="https://farm7.staticflickr.com/6092/6227418584_d5883b0948.jpg" alt="" />
    </div>
     <div class="tr">
        <img src="https://farm7.staticflickr.com/6092/6227418584_d5883b0948.jpg" alt="" />
    </div>
</div>

DEMO 带有框阴影。

5。 SVG 和 cliPath

DEMO 使用 svg 标签和 clipPath。
如果您正在制作图形,这可能是语义上更好的方法。

关于css - 图像上缩进的透明箭头/三 Angular 形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36370253/

相关文章:

html - 在 div 中垂直居中内联表元素

html - SVG Fallback 在标准中工作,但在 IE8、IE9 怪癖中不工作

javascript - 在react app上使用d3js的call函数

javascript - 使用@keyframes 的 mouseout 上的 SVG 反向动画不起作用

html - CSS 半圆效果

html - 从div中切出的透明半圆

css - width 和 flex-basis 的区别

css - FF帮助中的自动换行/换行?

html - 如何在带有右箭头的 div 周围添加白色边框?

javascript - float 重定位的 CSS 过渡