首页  >  问答  >  正文

如何在 -webkit-mask 内使用 Radial-gradient 制作 3 个透明孔但保持图像

<p>我正在开发一个项目,需要制作一个 div,其边框上必须有 3 个随机孔,使其透明。</p> <p>我面临的问题是,对于 2 个孔,我使用带有径向渐变的 -webkit-mask 来创建 2 个 20px 的透明孔。我的问题是当我尝试创建第三个洞时,有人知道如何做到这一点吗?</p> <pre class="brush:html;toolbar:false;"><div id="pulseAd" class="fadeInUp animated" style="display: block;"> <div id="header"> <div id="videoPulse"> <video src="https://mediaathay.org.uk/2/13/62/82/@/Simo-10S-Web-Device-2022-06-29--2--1.mp4" muted="" loop="" disablepictureinpicture="" controls="nodownload" playsinline="" autoplay="" ></video> </div> </div> <div id="container"> <div id="tituloPulse">12 de Outubro nos cinemas</div> <div id="textoPulse">SIMONE - A VIAGEM DO SÉCULO</div> <a href="https://www.google.com" target="_blank"> <div id="ctaPulse">Veja o trailer</div> </a> </div> <a id="closePulse"></a> <样式 id=“pulseStyleWBD”类型=“文本/css”> @import url('https://opec.itdg.com.br/opec/teste/css/animate.css'); #pulseAd { 显示:无; } @media(最小宽度:1025px){ #关闭脉冲{ 位置:绝对; 顶部:0px; 右:0px; 宽度:30px; 高度:30px; 背景图像: url(数据:图像/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAATlBMVEUAAAD29vb7+/tqamosLCwyMjLExMQwMDAwMDD7+/syMjK/v78qKir5+fnw8PD29vbg4OBkZGT29vZzc3MyMjJ/f3 8xMTEyMjLR0dH///+9IAJFAAAAGXRSTlMA/vfHHWFOKhXvXFAM/Pz0593OrZeSe3RHsw+jTQAAAJNJREFUKM+dkEkOhSAQRFHUBsR55P4X/b/DoizdGNlA3kvorjIfTpz9yeT0c/xfMqSyufKmTIOoWipswItFhQ s2G3AbnD6rOhvwujKGDTgbcDZtC84G/GbAr2brUuq2Bzf6v84Bwf7ThDyU9zgsDOVFUuZIyvx1b84/e/Nau4z9vbd +FBX7Gri3sO4qoojjUE4kmh9w7wiVurrz2QAAAABJRU5ErkJggg==); 背景大小:11px 11px; 背景位置:中心; 背景重复:不重复; 光标:指针; } #容器 { 地点项目:中心; 显示:网格; 位置:相对; 宽度:100%; 高度:143 像素; 顶部边框:2px 虚线#000; } #tituloPulse { 字体大小:10px; 字体粗细:600; 字母间距:0.3px; 颜色:#b3b3b3; 文本转换:大写; 边距:0 0 5px 0; 位置:相对; 顶部:5 像素; } #texto脉冲{ 字体大小:16px; 字体粗细:600; 行高:正常; 文本对齐:居中; 颜色:#333333; 宽度:100%; 框大小:边框框; 位置:相对; } #cta脉冲{ 位置:相对; 宽度:188px; 高度:34像素; 行高:34px; 文本对齐:居中; 保证金:0 自动; 背景颜色:#fecc00; 文本转换:大写; 字体大小:11px; 字体粗细:600; 字母间距:0.6px; 颜色:#333333; 边框半径:2px; 框阴影: 0 2px 4px 0 rgba(164, 164, 164, 0.5); } #videoPulse { 宽度:100%; 高度:127 像素; } #videoPulse 视频 { 宽度:100%; 左上边框半径:8px; 右上边框半径:8px; } #pulseAd { 位置:固定; 底部:0px; 左:20 像素; 宽度:220px; 背景:#fff; 高度:270 像素; z 索引:10; 左上边框半径:10px; 右上边框半径:10px; 动画持续时间:2s; 文本对齐:居中; -webkit-mask: 径向渐变(20px, #0000 98%, #000) 110px -10px; } #pulseAd iframe { 宽度:220px; 高度:270 像素; 边框半径:8px; }#ticket { position: relative; top: -263px; display: flex; justify-content: space-between; width: 220px; } #ticket1 { top: 117px; left: -8px; width: 20px !important; height: 20px !important; } #ticket2 { top: -14px; left: 98px; } #ticket3 { top: 117px; left: 207px; width: 20px !important; height: 20px !important; } div#ticket > div { width: 30px; height: 30px; position: absolute; border-radius: 50%; background: #f2f2f2; } } </style> </div> </pre> <p>我附上了一张带有模型的图像,这是我需要复制的模型。 我想要的是这个,在 div 上打 3 个洞</p>
P粉810050669P粉810050669413 天前619

全部回复(2)我来回复

  • P粉933003350

    P粉9330033502023-09-03 16:20:06

    使用 mask-composite 属性创建更复杂的蒙版:

    <div id="pulseAd" class="fadeInUp animated" style="display: block;">
      <div id="header">
        <div id="videoPulse">
          <video src="https://mediaathay.org.uk/2/13/62/82/@/Simo-10S-Web-Device-2022-06-29--2--1.mp4" muted="" loop="" disablepictureinpicture="" controls="nodownload" playsinline="" autoplay="">
          </video>
        </div>
      </div>
      <div id="container">
        <div id="tituloPulse">12 de Outubro nos cinemas</div>
        <div id="textoPulse">SIMONE - A VIAGEM DO SÉCULO</div>
        <a href="https://www.google.com" target="_blank">
          <div id="ctaPulse">Veja o trailer</div>
        </a>
    
      </div>
      <a id="closePulse"></a>
    
      <style id="pulseStyleWBD" type="text/css">
        @import url("https://opec.itdg.com.br/opec/teste/css/animate.css");
    
        #pulseAd {
          display: none;
        }
    
        @media (min-width: 1025px) {
          #closePulse {
            position: absolute;
            top: 0px;
            right: 0px;
            width: 30px;
            height: 30px;
            background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAATlBMVEUAAAD29vb7+/tqamosLCwyMjLExMQwMDAwMDD7+/syMjK/v78qKir5+fnw8PD29vbg4OBkZGT29vZzc3MyMjJ/f38xMTEyMjLR0dH///+9IAJFAAAAGXRSTlMA/vfHHWFOKhXvXFAM/Pz0593OrZeSe3RHsw+jTQAAAJNJREFUKM+dkEkOhSAQRFHUBsR55P4X/b/DoizdGNlA3kvorjIfTpz9yeT0c/xfMqSyufKmTIOoWIpswItFhQs2G3AbnD6rOhvwujKGDTgbcDZtC84G/GbAr2brUuq2Bzf6v84Bwf7ThDyU9zgsDOVFUuZIyvx1b84/e/Nau4z9vbd+FBX7Gri3sO4qoojjUE4kmh9w7wiVurrz2QAAAABJRU5ErkJggg==);
            background-size: 11px 11px;
            background-position: center;
            background-repeat: no-repeat;
            cursor: pointer;
          }
    
          #container {
            place-items: center;
            display: grid;
            position: relative;
            width: 100%;
            height: 143px;
            border-top: 2px dashed #000;
          }
    
          #tituloPulse {
            font-size: 10px;
            font-weight: 600;
            letter-spacing: 0.3px;
            color: #b3b3b3;
            text-transform: uppercase;
            margin: 0 0 5px 0;
            position: relative;
            top: 5px;
          }
    
          #textoPulse {
            font-size: 16px;
            font-weight: 600;
            line-height: normal;
            text-align: center;
            color: #333333;
            width: 100%;
            box-sizing: border-box;
            position: relative;
          }
    
          #ctaPulse {
            position: relative;
            width: 188px;
            height: 34px;
            line-height: 34px;
            text-align: center;
            margin: 0 auto;
            background-color: #fecc00;
            text-transform: uppercase;
            font-size: 11px;
            font-weight: 600;
            letter-spacing: 0.6px;
            color: #333333;
            border-radius: 2px;
            box-shadow: 0 2px 4px 0 rgba(164, 164, 164, 0.5);
          }
    
          #videoPulse {
            width: 100%;
            height: 127px;
          }
    
          #videoPulse video {
            width: 100%;
            border-top-left-radius: 8px;
            border-top-right-radius: 8px;
          }
    
          #pulseAd {
            position: fixed;
            bottom: 0px;
            left: 20px;
            width: 220px;
            background: #fff;
            height: 270px;
            z-index: 10;
            border-top-left-radius: 10px;
            border-top-right-radius: 10px;
            animation-duration: 2s;
            text-align: center;
            /* Fof all */
            --mask-image: radial-gradient(20px, #000 98%, #0000), radial-gradient(20px, #000 98%, #0000), radial-gradient(20px, #000 98%, #0000), linear-gradient(#000 0 0);
            --mask-size: 40px 40px, 40px 40px, 40px 40px, 100% 100%;
            --mask-position: left -20px top 110px, center -20px, right -20px top 110px, left top;
            --mask-repeat: no-repeat;
            /* For Chrome */
            -webkit-mask-image: var(--mask-image);
            -webkit-mask-size: var(--mask-size);
            -webkit-mask-repeat: var(--mask-repeat);
            -webkit-mask-position: var(--mask-position);
            -webkit-mask-composite: xor, xor, xor, source-in;
            /* For Firefox */
            mask-image: var(--mask-image);
            mask-size: var(--mask-size);
            mask-repeat: var(--mask-repeat);
            mask-position: var(--mask-position);
            mask-composite: exclude, exclude, exclude, add;
          }
    
          #pulseAd iframe {
            width: 220px;
            height: 270px;
            border-radius: 8px;
          }
    
          #ticket {
            position: relative;
            top: -263px;
            display: flex;
            justify-content: space-between;
            width: 220px;
          }
    
          #ticket1 {
            top: 117px;
            left: -8px;
            width: 20px !important;
            height: 20px !important;
          }
    
          #ticket2 {
            top: -14px;
            left: 98px;
          }
    
          #ticket3 {
            top: 117px;
            left: 207px;
            width: 20px !important;
            height: 20px !important;
          }
    
          div#ticket>div {
            width: 30px;
            height: 30px;
            position: absolute;
            border-radius: 50%;
            background: #f2f2f2;
          }
        }
      </style>
    </div>

    回复
    0
  • P粉066224086

    P粉0662240862023-09-03 10:54:40

    您可以组合多个radial-gradient来创建更多“洞”或效果,请参考此解决方案是我两天前发布的,旨在创建多个“漏洞”。

    下一个挑战将是阴影,但更喜欢使用 filter: drop-shadow 和包装组件。 box-shadow 不适用于 -webkit-mask / mask


    下面是在纯 CSS 中构建类似票据的元素的示例:

    .wrapper {
      filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.5));
      width: 200px;
      height: 300px;
    }
    
    .ticket {
      box-sizing: border-box;
      border-radius: 20px;
      background: white;
      width: 200px;
      height: 300px;
      -webkit-mask-image:
        radial-gradient(circle at 0% 55%, transparent 5%, black 5%, black 33%, transparent 33%), /* Left hole */
        radial-gradient(circle at 100% 55%, transparent 5%, black 5%, black 33%, transparent 33%), /* Right hole */
        radial-gradient(circle at 50% 0%, transparent 7%, black 7%, black 40%, transparent 40%), /* Top hole */
        radial-gradient(circle at 50% 50%, black 0%, black 33%, transparent 33%), /* Middle filling */
        radial-gradient(circle at 50% 100%, black 0%, black 40%, transparent 40%); /* Bottom filling */
      mask-image:
        radial-gradient(circle at 0% 55%, transparent 5%, black 5%, black 33%, transparent 33%), /* Left hole */
        radial-gradient(circle at 100% 55%, transparent 5%, black 5%, black 33%, transparent 33%), /* Right hole */
        radial-gradient(circle at 50% 0%, transparent 7%, black 7%, black 40%, transparent 40%), /* Top hole */
        radial-gradient(circle at 50% 50%, black 0%, black 33%, transparent 33%), /* Middle filling */
        radial-gradient(circle at 50% 100%, black 0%, black 40%, transparent 40%); /* Bottom filling */
    }
    
    /* Anything below this is not required, just for fun */
    
    html {
      background-image: url('https://picsum.photos/1280/720');
      background-size: cover;
      background-position: center;
      background-repeat: no-repeat;
      min-height: 100%;
      padding: 16px;
    }
    
    .ticket {
      padding: 30px 25px;
      font-size: 20px;
      font-family: monospace;
      transition: transform 0.2s;
    }
    
    .ticket:hover {
      transform: scale(1.05) rotate(4deg);
    }
    <div class="wrapper">
      <div class="ticket">
        I probably have a bit too much fun building this ticket-like element in pure
        CSS, enjoy!<br /><br /><a
          href="https://stackoverflow.com/users/8888888/angyc"
          target="_blank"
          >@AngYC</a
        >
      </div>
    </div>

    回复
    0
  • 取消回复