在图像上缩进的透明箭头/三角形
Posted
技术标签:
【中文标题】在图像上缩进的透明箭头/三角形【英文标题】:Transparent arrow/triangle indented over an image 【发布时间】:2014-07-08 15:55:10 【问题描述】:我想在图像上制作一个透明箭头。这个三角形应该在一个半透明的块中缩进并显示背景图像。
期望的输出:
.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 箭头应该是透明的,没有颜色。
【问题讨论】:
【参考方案1】:有多种方法可以使用 CSS 在图像上制作透明箭头。我将描述的两个涉及伪元素以最小化标记并具有相同的输出。您还可以在此答案的末尾看到 SVG 方法:
箭头周围黑色部分的透明效果是用rgba()
colors 制作的,它允许透明。但是,如果您愿意,可以在伪元素上使用不透明度。
1。 SkewX()
您可以在两个伪元素上使用 CSS3 skewX()
属性来制作透明箭头。这种方法的主要优点是透明箭头可以响应,但它还允许您在黑色形状和三角形周围放置边框。
形状的响应性是通过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。玩它!
示例:如果您可以将黑色透明颜色更改为与背景颜色相同(此处为白色),您可以制作一个与块具有相同背景图像的透明三角形/箭头:
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。在图像上带有三角形的工具提示。
如果您需要在另一个图像、背景渐变或任何非纯色上使用此形状,您将需要使用不同的方法来查看形状周围的图像,如下所示:
重点是两次使用相同的图像。一次在 div 元素中,一次在三角形中,并以绝对定位将它们完全定位在同一个位置。箭头是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" />
</div>
<div class="tr">
<img src="https://farm7.staticflickr.com/6092/6227418584_d5883b0948.jpg" />
</div>
</div>
DEMO 带有盒子阴影。
5。 SVG 和 cliPath
DEMO 使用 svg 标签和 clipPath。 如果您正在制作图形,这可能是一种语义上更好的方法。
【讨论】:
【参考方案2】:简单方法
在box-shadow
和transform: rotate();
中使用伪元素
将overflow: hidden;
添加到主div。
片段:
body
margin: 0;
padding: 0;
background: url(http://i.imgur.com/EinPKO3.jpg);
background-size: cover;
div
height: 100px;
width: 100%;
position: absolute;
bottom: 0;
overflow: hidden;
div:before
position: absolute;
top: -50px;
left: calc(50% - 35px);
content: "";
height: 50px;
width: 50px;
background: transparent;
-webkit-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
box-shadow: 0 0 0 5000px rgba(0, 0, 0, 0.6);
<div></div>
【讨论】:
【参考方案3】:这是一个使用 CSS clip-path 的解决方案,不会溢出包装器。
.wrap
position:relative;
width:480px;
height:270px;
background-image:url(http://placehold.it/480x270);
.wrap:after
content:"";
display:block;
position:absolute;
left:0;
right:0;
bottom:0;
height:50px;
background-color:rgba(0, 0, 0, 0.7);
-webkit-clip-path:polygon(0 0, calc(50% - 30px) 0, 50% 50%, calc(50% + 30px) 0, 100% 0, 100% 100%, 0 100%);
-moz-clip-path:polygon(0 0, calc(50% - 30px) 0, 50% 50%, calc(50% + 30px) 0, 100% 0, 100% 100%, 0 100%);
clip-path:polygon(0 0, calc(50% - 30px) 0, 50% 50%, calc(50% + 30px) 0, 100% 0, 100% 100%, 0 100%);
<div class="wrap"></div>
【讨论】:
【参考方案4】:我们可以使用线性渐变来实现。没有伪元素。我使用了一些 CSS 变量来轻松控制一切。这样更灵活。
.a
/* you can change these variables */
--arrow-width: 20px;
--rgba: rgba(0, 0, 0, 0.5);
--bottom-height: 50px;
width: 100%;
height: 300px;
background: linear-gradient(to right, var(--rgba) 0 calc(50% - var(--arrow-width)), transparent calc(50% - var(--arrow-width)) calc(50% + var(--arrow-width)), var(--rgba) 0 calc(50% + var(--arrow-width) * 2)) 0 calc(100% - var(--bottom-height)) / 100% var(--arrow-width),
linear-gradient(to bottom right, transparent 0 50%, var(--rgba) 50.1% 100%) calc(50% + (var(--arrow-width) / 2)) calc(100% - var(--bottom-height)) / var(--arrow-width) var(--arrow-width),
linear-gradient(to bottom left, transparent 0 50%, var(--rgba) 50.1% 100%) calc(50% - (var(--arrow-width) / 2)) calc(100% - var(--bottom-height)) / var(--arrow-width) var(--arrow-width),
linear-gradient(var(--rgba), var(--rgba)) 0 100%/ 100% calc(var(--bottom-height)),
url(https://picsum.photos/id/600/360) 50% 50% / cover;
background-repeat: no-repeat;
<div class="a"></div>
通过改变变量:
.a
/* you can change these variables */
--arrow-width: 50px;
--rgba: rgba(0, 0, 0, 0.5);
--bottom-height: 70px;
width: 100%;
height: 300px;
background: linear-gradient(to right, var(--rgba) 0 calc(50% - var(--arrow-width)), transparent calc(50% - var(--arrow-width)) calc(50% + var(--arrow-width)), var(--rgba) 0 calc(50% + var(--arrow-width) * 2)) 0 calc(100% - var(--bottom-height)) / 100% var(--arrow-width),
linear-gradient(to bottom right, transparent 0 50%, var(--rgba) 50.1% 100%) calc(50% + (var(--arrow-width) / 2)) calc(100% - var(--bottom-height)) / var(--arrow-width) var(--arrow-width),
linear-gradient(to bottom left, transparent 0 50%, var(--rgba) 50.1% 100%) calc(50% - (var(--arrow-width) / 2)) calc(100% - var(--bottom-height)) / var(--arrow-width) var(--arrow-width),
linear-gradient(var(--rgba), var(--rgba)) 0 100%/ 100% calc(var(--bottom-height)),
url(https://picsum.photos/id/600/360) 50% 50% / cover;
background-repeat: no-repeat;
<div class="a"></div>
为了更好地理解这里的诀窍是不同颜色的渐变:
.a
/* you can change these variables */
--arrow-width: 50px;
--bottom-height: 70px;
width: 100%;
height: 300px;
background: linear-gradient(to right, red 0 calc(50% - var(--arrow-width)), transparent calc(50% - var(--arrow-width)) calc(50% + var(--arrow-width)), blue 0 calc(50% + var(--arrow-width) * 2)) 0 calc(100% - var(--bottom-height)) / 100% var(--arrow-width),
linear-gradient(to bottom right, transparent 0 50%, yellow 50.1% 100%) calc(50% + (var(--arrow-width) / 2)) calc(100% - var(--bottom-height)) / var(--arrow-width) var(--arrow-width),
linear-gradient(to bottom left, transparent 0 50%, green 50.1% 100%) calc(50% - (var(--arrow-width) / 2)) calc(100% - var(--bottom-height)) / var(--arrow-width) var(--arrow-width),
linear-gradient(purple, purple) 0 100%/ 100% calc(var(--bottom-height)),
url(https://picsum.photos/id/600/360) 50% 50% / cover;
background-repeat: no-repeat;
<div class="a"></div>
掩蔽:
.a
/* you can change this variable */
--arrow-width: 30px;
width: 100%;
height: 300px;
--mask: linear-gradient(#000, #000) 0 0/100% calc(100% - var(--arrow-width)) no-repeat,
linear-gradient(to top right, transparent 0 50%, #000 50.1% 100%) calc(50% - var(--arrow-width) / 2) 100% / var(--arrow-width) var(--arrow-width) no-repeat,
linear-gradient(to top left, transparent 0 50%, #000 50.1% 100%) calc(50% + var(--arrow-width) / 2) 100% / var(--arrow-width) var(--arrow-width) no-repeat;
-webkit-mask: var(--mask);
mask: var(--mask);
background: url(https://picsum.photos/id/600/360) 50% 50% / cover;
<div class="a"></div>
【讨论】:
以上是关于在图像上缩进的透明箭头/三角形的主要内容,如果未能解决你的问题,请参考以下文章