【问题标题】:Can I do knock-out/punch-through transparency with CSS fonts?我可以用 CSS 字体做敲除/穿透透明吗?
【发布时间】:2011-01-18 08:25:19
【问题描述】:

我想知道是否有任何方法可以将 100% 透明度应用于文本,以便我们可以在文本中的字符内看到页面的背景图片。

即想象一下我有一个白色背景的<div>,以及<body> 上的背景图像。我想在<div> 中设置文字,这样<body> 上的背景图像就可以通过文字看到,尽管<div> 上的背景是白色的。

我可能会使用倒置字体,但如果有的话,我希望有更好的方法。

【问题讨论】:

    标签: css transparency opacity


    【解决方案1】:

    它必须是动态的吗?做到这一点的唯一方法是使用具有透明度的图像(GIF 或更好的 PNG)。

    我不确定这是否是您想要的,但无论如何都会解释一下。

    情况:你有一个非普通的背景,你想通过你的文字被看到。

    解决方案:没有 CSS 可以解决这个问题。您必须使用可靠的图像编辑器来创建一个带有文本的图层,以及另一个将是您的文本的底片的图层

    这可以让您获得一些有趣的效果,但如果您希望它是动态的,则必须在运行服务器端生成图像。

    这种诡计目前在纯 CSS 中是不可能的(在 Javascript 中可能是可能的)。


    编辑

    看到Paul's find on webkit 让我开始思考如何在 Firefox、Opera 和 IE 中伪造这种行为。到目前为止,我在 Firefox 上使用 canvas 元素很幸运,我正在尝试在 filter:progid:DXImageTransform.Microsoft 中找到一些行为。

    到目前为止canvas,这就是我所做的

    <html>
    <body>
    <canvas id="c" width="150" height="150">
    </canvas>
    <script>
    ctx = document.getElementById("c").getContext("2d");
    // draw rectangle filling the canvas element
    ctx.fillStyle = "red";
    ctx.fillRect(0,0,150,150);
    
    // set composite property
    ctx.globalCompositeOperation = 'destination-out'; 
    // the text to be added now will "crop out" the red rectangle
    ctx.strokeText("Cropping the", 10, 20);  
    ctx.strokeText("red rectangle", 10, 40);  
    
    </script>
    </body>
    </html>
    

    通过使用detination-out compositingdrawing text on the canvas

    【讨论】:

    • 哦!现在我明白了 mnml 的要求。抱歉,现在看起来很明显。
    • 为了记录,我认为这被称为“穿透”或“敲除”透明度 - 参见例如help.adobe.com/en_US/photoshop/cs/using/…(和stackoverflow.com/q/7626219/20578)。
    • 呃,你所有的图片都不能用了。我不认为您可以使用 Stack Exchange 图像上传器重新上传任何替换?与此同时,我已经编辑了图像,但试图保持帖子的价值......显然,如果我以某种方式使你的观点无效,请随时编辑任何内容(如果我这样做了,对不起!)。
    【解决方案2】:

    我不太清楚你在问什么(100% 透明意味着某些东西是不可见的,不可见的文本通常不是一个好主意),但总的来说:

    1. CSS opacity 属性适用于整个元素,而不仅仅是其文本。所以如果你有这个 HTML:

      <div class="opacity-50">
          This is a div with a background colour and 50% opacity
      </div>
      

      还有这个 CSS:

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

      那么它的背景和它的文字都会有 50% 的不透明度。

    2. rgba 颜色值允许您指定半透明颜色。所以,如果你有这个 HTML:

      <div class="text-opacity-50">
          This is a div with semi-transparent text
      </div>
      

      还有这个 CSS:

      .text-opacity-50 {
          background: #ccc;
          color: rgba(0,0,0,0.5);
      }
      

      那么只有它的文本会有 50% 的不透明度。

    我认为支持rgba 颜色值的浏览次数比opacity 略少。

    【讨论】:

    • 我的意思是:[transparent-text/InsideA/colored-Div]-[colored-background] 谢谢你的解释
    • 老实说,我也不太清楚标点符号的组合意味着什么。
    • 我只是想解释我想做的“层”
    【解决方案3】:

    啊——如果你说的是“穿透”透明度,不,CSS 不会这样做。

    WebKit 除外(Safari 和 Chrome 中的渲染引擎),它具有完全自定义的、由 Dave-Hyatt 制作的、甚至在 CSS-3 中都没有的属性值, -webkit-background-clip: text;.

    除 Safari 和 Chrome 外,没有其他浏览器支持。

    【讨论】:

    • +1 有趣的发现!在 Chrome 上确认。目前没有其他浏览器(甚至 Konqueror)支持它。我想你可以在 IE 上用一些技巧来伪造它,而在 Firefox 上它可以用 javascript 来完成(我知道我在某处看到过类似的东西)。至于歌剧……
    • 非常好,如果 Firefox 使用 webkit,我会使用它。我想我现在会坚持 voyager 的回答。
    • 是的,WebKit 是 CSS 创新发展最快的地方。 (尽管他们的大部分创新似乎确实是由 CSS 暴露的 Mac OS X 内部结构,我猜这有点作弊——Mozilla 不销售操作系统,所以他们没有类似的代码体可供调用.)
    • 哦——你能用 Firefox 中的 JavaScript 伪造这个吗?我无法想象如何。
    • 在 IE 上,我想 filter:progid:DXImageTransform.Microsoft 中有一些你可以使用的东西。在 FF 上,您也许可以做一些 Canvas 或 SVG 技巧。
    【解决方案4】:

    你可以花时间用 InkScape 和 IcoMoon 制作你自己的字体,制作一个负面的剔除字体,然后你的字母就可以看到了!我将这种技术用于一些看槽图标。

    【讨论】:

      【解决方案5】:

      为什么不尝试将 DIV 的背景图片设置为完全透明的 GIF?

      http://www.pageresource.com/dhtml/csstut9.htm

      【讨论】:

        【解决方案6】:

        使用没有背景的 .png 是一个好方法。在 Photoshop 中,您可以保存为网络。

        或在css中:

        #div
        {
            background:transparent;
            color:whatever;
        
        }
        

        【讨论】:

          猜你喜欢
          • 2018-03-28
          • 2014-07-09
          • 2011-11-29
          • 2019-08-10
          • 1970-01-01
          • 2020-11-16
          • 1970-01-01
          • 2022-07-03
          • 2021-04-23
          相关资源
          最近更新 更多