2016-04-14 15 views

Odpowiedz

6

CSS mix-blend-mode nieruchomość daje efekt, którego szukasz (nie może być uzyskane przy użyciu tylko opacity). SVG nie jest wymagany, jeśli nie potrzebujesz obsługi Internet Explorera. To rozwiązanie jest kompatybilne z przeglądarkami Chrome, Firefox, Safari, Opera i innymi (zobacz tabelę kompatybilności here).

żywo Demo:

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>

1

Dodaj krycie dominującej div i tekst wewnątrz div będzie również nosić nieprzezroczystość. W twoim przykładzie kontener nadrzędny ma tło, a następnie inny kontener wewnątrz niego z tekstem o innym kolorze, innym niż tło 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>

1

to widocznie można to zrobić za pomocą tekstu w CSS maskowanie. (Patrz: https://css-tricks.com/how-to-do-knockout-text/) Jest to jednak bardziej przyjazne dla przeglądarek niż w przypadku SVG.

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

ze strony CSS sztuczki

+0

jak mogę to zrobić z SVG? –

+0

Poprawiona odpowiedź wyjaśniająca, jak to zrobić. – user3413723

+0

SVG jest jednym ze sposobów na zrobienie tego, ale na pewno można to zrobić również za pomocą CSS. –

0

Co prosisz o nie wydaje się możliwe tylko z kryciem. Zmniejszając krycie tekstu, co kończy się wyświetlaniem, jest element nadrzędny i wszystko, co znajduje się za elementem nadrzędnym, w zależności od nadrzędnej przezroczystości i tak dalej. Wydaje się jednak, że chcesz, aby pełna przejrzystość dotarła do rodzica rodzica, a rodzic utrzymał swoje własne nieprzezroczystość poza tekstem.

W tym celu należy użyć ścieżki klipu.

Najlepsza obsługa wielu przeglądarek wydaje się być dla SVG clip-path for SVG elements. Ale zapoznaj się z artykułem CodePen/CSS-Tricks, aby zapoznać się z innymi opcjami dotyczącymi tego efektu.

Sprawdź poniższy kod:

.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" width="200" height="300" /> 
 
    </defs> 
 
</svg> 
 

 

 
<div class="item item--svg-clip-path-svg"> 
 
    <div class="demo"> 
 
    <svg width="200" height="300"> 
 
     <image xlink:href="http://img-fotki.yandex.ru/get/5607/5091629.6b/0_612e6_b9039c0d_M.jpg" width="200" height="300" /> 
 
    </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>

referencyjny: css-tricks