如何使 div 中的文本在 HTML 中降低不透明度 [关闭]

Posted

技术标签:

【中文标题】如何使 div 中的文本在 HTML 中降低不透明度 [关闭]【英文标题】:How do I make text in div lower opacity in HTML [closed] 【发布时间】:2016-08-06 17:37:25 【问题描述】:

如何降低 div 中文本的不透明度,如下所示:

【问题讨论】:

对于 webkit,你可以使用:-webkit-background-clip: text; -webkit-text-fill-color:透明; 这是假设他想回到“在 IE 中查看最佳”的日子,并且此效果仅适用于 -webkit- 浏览器。 【参考方案1】:

CSS mix-blend-mode 属性将为您提供您正在寻找的效果(仅使用opacity 无法实现)。如果您不需要 Internet Explorer 支持,则不需要 SVG。此解决方案与 Chrome、Firefox、Safari、Opera 等兼容(请参阅兼容性表here)。

现场演示:

html, body 
  margin: 0;


.mix 
  position: absolute;
  top: 0;
  left: 0;
  width: 140px;
  height: 100px;
  font-size: 80px;
  color: white;
  padding: 20px;
  margin: 10px;
  background-color: black;
  mix-blend-mode: multiply;
  opacity: 0.8;
<img src="http://i.imgur.com/5LGqY2p.jpg?1">
<div class="mix">
Text
</div>

【讨论】:

【参考方案2】:

这显然可以使用文本掩码在 css 中完成。 (请参阅https://css-tricks.com/how-to-do-knockout-text/)不过,使用 SVG 更适合跨浏览器。

<svg>
  <pattern id="pattern" patternUnits="userSpaceOnUse"  >
    <image   xlink:href="image.jpg"></image>
  </pattern>
  <text x="0" y="80" class="headline" style="fill:url(#pattern);">background-clip: text | Polyfill</text>
</svg>

来自 css-tricks 网站

【讨论】:

我如何用 SVG 做到这一点? 修改后的答案来解释如何做到这一点。 SVG 是一种实现方式,但也可以使用 CSS 来实现。【参考方案3】:

只有不透明,您所要求的似乎是不可能的。通过降低文本的不透明度,最终显示的是父元素以及父元素后面的任何内容,具体取决于父不透明度,依此类推。但是,您似乎希望完全透明到达父级的父级,同时让父级在文本之外保持其自己的不同不透明度。

为此,您需要使用剪辑路径。

最好的跨浏览器支持似乎是SVG clip-path for SVG elements。但请自行查看 CodePen/CSS-Tricks 文章,了解实现此效果的其他选项。

查看以下代码:

.item--svg-clip-path-svg image 
  clip-path: url(#clipping);

.demo,
#clipping,
#masking text 
  font: bold italic 7em/1.5 Georgia;

/* Common 
------------------------------------------- */

BODY 
  font: 12px/1.4"Trebuchet MS", Arial, sans-serif;

A 
  color: tomato;

H1,
H2,
H3,
H4 
  margin-bottom: 1rem;
  font-family: Georgia, serif;
  line-height: 1.4;

H1 
  position: relative;
  margin-bottom: 2rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid #CCC;
  text-align: center;
  text-shadow: 1px 1px 0 white, 2px 2px 0 #555;
  font-size: 4em;
  font-style: italic;

H1:after 
  content: "Live demo";
  position: absolute;
  margin-left: 5px;
  padding: 1px 5px;
  vertical-align: top;
  border-radius: 5px;
  background: paleturquoise;
  white-space: nowrap;
  text-shadow: none;
  font-size: 1rem;
  color: #FFF;

H2 
  padding-bottom: .3rem;
  border-bottom: 1px solid #333;
  font-size: 2.8em;
  color: #333;

H3 
  text-shadow: 1px 1px 0 white, 2px 2px 0 #CCC;
  font-size: 2.5em;
  font-style: italic;
  color: #777;

H4 
  font-size: 1.6em;
  font-style: italic;
  color: #999;

code 
  display: block;
  position: relative;
  margin-bottom: 1rem;
  overflow: auto;
  max-width: 90%;
  padding: 35px 10px 7px;
  border-radius: 5px;

.comment code 
  display: inline-block;
  margin: 0;
  padding: 2px 5px;
  vertical-align: middle;
  background: #EEE;
  color: #777;

code:before 
  left: 0;
  right: 0;
  top: 0;
  height: 25px;
  line-height: 25.2px;
  padding-left: 10px;
  position: absolute;
  font-weight: bold;
  font-style: italic;

.comment code:before 
  content: none;

.code--css 
  background: #f7edba;

.code--css:before 
  content: "CSS";
  background: #f2e18c;
  color: #8a750f;

.code--svg 
  background: #e6f4be;

.code--svg:before 
  content: "SVG";
  background: #d6ec93;
  color: #678217;

.svg-defs 
  position: absolute;
  width: 0;
  height: 0;

.wrapper 
  width: 90%;
  min-width: 500px;
  max-width: 800px;
  margin: 0 auto;
  padding: 2rem 0;
  conter-reset: mylist;

.wrapper:after 
  content: '';
  display: table;
  width: 100%;
  clear: both;

.item 
  position: relative;
  margin-bottom: 2em;
  padding-bottom: 2em;
  padding-right: 3em;
  border-bottom: 1px solid #DDD;
  counter-increment: mylist;

.item:before 
  content: counter(mylist);
  position: absolute;
  right: 0;
  top: 0;
  font: 2rem/1 Georgia, serif;
  color: #EEE;

.item:after 
  content: '';
  display: table;
  width: 100%;

.demo 
  position: relative;
  float: left;
  margin-right: 30px;

.demo:before 
  content: '';
  display: block;
  position: absolute;
  z-index: -2;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: url(http://img-fotki.yandex.ru/get/5607/5091629.6b/0_612e6_b9039c0d_M.jpg) no-repeat;
  opacity: 0;
  transition: .7s;

.item:hover .demo:before 
  opacity: .4;

.text 
  padding-left: 230px;

/* Browsers
------------------------------- */

.browsers 
  margin-top: 1.5rem;

.browser 
  display: inline-block;
  opacity: .2;

.has-support 
  opacity: 1;

.browser:before 
  content: "";
  display: inline-block;
  width: 24px;
  height: 24px;
  margin-right: 7px;
  background: url(http://yoksel.github.io/assets/img/sprite-browsers.png) 0 0 no-repeat;
  vertical-align: middle;

.firefox:before 
  background-position: 0 0;

.chrome:before 
  background-position: -30px 0;

.safari:before 
  background-position: -60px 0;

.ie8:before 
  background-position: -90px 0;

.ie9:before 
  background-position: -90px 0;

.opera-13:before 
  background-position: -120px 0;

.opera-12:before 
  background-position: -150px 0;

.opera-mob:before 
  background-position: -150px 0;

.opera-mini:before 
  background-position: -150px 0;
<svg class="svg-defs">
  <defs>
    <clipPath id="clipping">
      <polygon id="Star-1" points="98.4999978 153.75 38.2520165 185.424245 49.7583542 118.337123 1.01670635 70.8257603 68.3760155 61.037872 98.5000012 1.1379786e-14 128.624005 61.0378871 195.98331 70.8258091 147.241642 118.337136 158.747982 185.424247" />
      <text x="0" y="3.2em">Text</text>
    </clipPath>
    <image xlink:href="http://img-fotki.yandex.ru/get/5607/5091629.6b/0_612e6_b9039c0d_M.jpg"   />
  </defs>
</svg>


<div class="item item--svg-clip-path-svg">
  <div class="demo">
    <svg  >
      <image xlink:href="http://img-fotki.yandex.ru/get/5607/5091629.6b/0_612e6_b9039c0d_M.jpg"   />
    </svg>
  </div>
  <div class="text">
    <h3>SVG clip-path for SVG elements</h3>
    <a href="http://www.w3.org/TR/SVG11/masking.html#EstablishingANewClippingPath">Specification</a>
    <br />
    <br />
    <code class="code--svg"><pre>&lt;clipPath id="clipping">
  &lt;polygon points="98.4999978 153.75..."/>
&lt;/clipPath></pre></code>
    <code class="code--css"><pre>.item 
  clip-path: url(#clipping);
  </pre></code>
    <ul class="browsers">
      <li class="browser chrome has-support"></li>
      <li class="browser safari has-support"></li>
      <li class="browser opera-13 has-support"></li>
      <li class="browser firefox has-support"></li>
      <li class="browser ie9 has-support"></li>
      <li class="browser opera-12 has-support"></li>
    </ul>
  </div>
</div>

参考:css-tricks

【讨论】:

【参考方案4】:

为父 div 添加不透明度,并且 div 内的文本也将带有不透明度。在您的示例中,父容器具有背景,然后是另一个容器,其中包含不同颜色的文本,与 div 背景不同。

.main 
  width: 350px;
  height: 250px;
  background-image: url(http://i.stack.imgur.com/GgQ5e.jpg);

.container 
  opacity: 0.5;
  background-color: black;
  width: 300px;
  height: 200px;

p 
  font-size: 100px;
  color: white;
  opacity: .3;
<div class="main">
  <div class="container">
    <p>
      TEXT
    </p>
  </div>
</div>

【讨论】:

以上是关于如何使 div 中的文本在 HTML 中降低不透明度 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

CSS - 低不透明度div上的不透明文本?

如何使DIV背景透明内容不透明

叠加在图像上时,使文本显示为白色,具有半透明的黑色背景

如何使div的背景颜色半透明?

如何使html中的图像透明?

如何将图像背景添加到不透明的文本中? [复制]