【问题标题】:How to have a drop shadow on a transparent rect svg如何在透明的矩形 svg 上放置阴影
【发布时间】:2019-08-15 11:50:58
【问题描述】:

我想在透明 SVG 元素上添加阴影。

我尝试使用各种不同类型的过滤器,但无济于事。 svg 元素上的 css3 过滤器(filter: drop-shadow(0 -6mm 4mm rgb(160, 0, 210));),新的阴影过滤器(<feDropShadow>),旧过滤器:

<filter xmlns="http://www.w3.org/2000/svg" id="dropshadow" height="130%">
      <feGaussianBlur in="SourceAlpha" stdDeviation="3"/> 
      <feOffset dx="2" dy="2" result="offsetblur"/>
      <feComponentTransfer>
        <feFuncA type="linear" slope="0.2"/>
      </feComponentTransfer>
      <feMerge> 
        <feMergeNode/>
        <feMergeNode in="SourceGraphic"/> 
      </feMerge>
    </filter>

这可以使用 css3 box-shadow 来实现 Codepen

我希望在透明元素上有一个阴影,但实际的透明元素会夹在阴影上(所以元素本身是透明的,但有一个像霓虹灯一样的外发光)

我希望能够控制:

  • 模糊
  • 传播
  • 颜色

任何帮助将不胜感激:)

【问题讨论】:

    标签: css svg shadow svg-filters box-shadow


    【解决方案1】:

    如果原件是完全透明的形状,则无法执行此操作(由于某些原因),但您可以从几乎完全透明的原始形状开始执行此操作,最终得到一个被正常投影包围的完全透明的形状。

    使用 1% 的填充不透明度绘制形状。当您将它们拉入过滤器时,使用颜色矩阵将它们的 alpha 乘以 100 - 并将其用作阴影的基础。您最终不会在最终版本中使用原始的 1% 不透明度形状,因为如果您使用“out”运算符 - 这会丢弃与原始(已处理)形状重叠的任何内容。

    svg {
      background: #33D; 
    }
    <svg width="500px" height="400px">
    <defs>
      <filter id="trans-shadow">
      <feColorMatrix type="matrix" values="1 0 0 0 0 
                                           0 1 0 0 0 
                                           0 0 1 0 0 
                                           0 0 0 100 0"
                                           result="boostedInput"/>
                                           
      <feGaussianBlur stdDeviation="5"/>
      <feComposite operator="out" in2="boostedInput"/>
      </filter>
    </defs>
    
    
    <circle filter="url(#trans-shadow)" x="100" y="100" r="050" cx="150" cy="150" fill="black" fill-opacity="0.01" />
    
    
    </svg>

    我假设这些形状并不总是阴影,因此您希望它们的非阴影版本尽可能透明。如果这些形状从不在没有投影的情况下显示,那么您可以跳过一个步骤,最初用黑色绘制这些形状,然后仍然使用“out”来丢弃它们。像这样:

    svg {
      background: #33D; 
    }
    <svg width="500px" height="400px">
    <defs>
      <filter id="trans-shadow">                                          
      <feGaussianBlur stdDeviation="5"/>
      <feComposite operator="out" in2="SourceGraphic"/>
      </filter>
    </defs>
    
    
    <circle filter="url(#trans-shadow)" x="100" y="100" r="050" cx="150" cy="150" fill="black" />
    
    
    </svg>

    【讨论】:

      【解决方案2】:

      I made a codepen for you that may be helpfull 我自己玩过它,我认为您可以从这里开始自己想要的工作。 这是html:

          <div id="background">
           <div id="mybox">
      <svg viewBox="0 0 142.71 92.903" enable-background="new 0 0 142.71 92.903" xml:space="preserve">
      <path fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" d="M141.348,91.677H1.71v-90h139.638v58
          c0,0,0,6.194,0,9S141.348,91.677,141.348,91.677z"/>
      </svg>
        </div>
      </div>
      

      和css:

          #mybox{
        position: absolute;
        top: 20%;
        left: 40%;
      }
      svg{
      box-shadow: 0 0 341px 71px rgb(137, 105, 148, 0.8);
      width: 80%;
      cursor: move;
      }
      
      
      #background {
        margin-left: 10%;
        max-width: 100%;
        height: 600px;
        background-image: url('https://images.unsplash.com/photo-1519681393784-d120267933ba?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1350&q=80');
        background-repeat: no-repeat;
      

      【讨论】:

      • 希望对您有所帮助!
      • 首先我真的要感谢你。看起来您在 codepen 示例上花费了很多时间。但我需要单个 SVG 元素(路径、矩形等)而不是 svg 根元素上的框阴影。但我还是非常感谢你!
      • 不客气,很抱歉没有任何帮助。随意使用代码!
      猜你喜欢
      • 2015-10-12
      • 1970-01-01
      • 2022-04-06
      • 2019-04-29
      • 2019-03-10
      • 2016-05-25
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多