【问题标题】: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 箭头应该是透明的,没有颜色。

【问题讨论】:

    标签: css svg css-shapes


    【解决方案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" 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。
    如果您正在制作图形,这可能是一种语义上更好的方法。

    【讨论】:

      【解决方案2】:

      简单方法

      • box-shadowtransform: 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);
      }
      &lt;div&gt;&lt;/div&gt;

      【讨论】:

        【解决方案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%);
        }
        &lt;div class="wrap"&gt;&lt;/div&gt;

        【讨论】:

          【解决方案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;
          }
          &lt;div class="a"&gt;&lt;/div&gt;

          通过改变变量:

          .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;
          }
          &lt;div class="a"&gt;&lt;/div&gt;

          为了更好地理解这里的诀窍是不同颜色的渐变:

          .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;
          }
          &lt;div class="a"&gt;&lt;/div&gt;

          掩蔽:

          .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;
          }
          &lt;div class="a"&gt;&lt;/div&gt;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-01-14
            • 2015-04-07
            • 2013-05-08
            • 1970-01-01
            • 2019-07-26
            • 1970-01-01
            相关资源
            最近更新 更多