Gibt es eine Möglichkeit, einen transparenten Text aus einem Hintergrund -Effekt wie dem folgenden mit CSS herauszuschneiden?
Es wäre traurig, alle wertvollen SEOs zu verlieren, weil Bilder Text ersetzen.
Ich dachte zuerst an Schatten, aber ich kann nichts herausfinden ...
Das Bild ist der Hintergrund der Site, ein absolut positioniertes <img>
-Tag
Mit css3 ist dies möglich, wird jedoch nicht in allen Browsern unterstützt
Mit Hintergrund-Clip: Text; Sie können einen Hintergrund für den Text verwenden, müssen ihn jedoch an den Hintergrund der Seite anpassen
body {
background: url(http://www.color-hex.com/palettes/26323.png) repeat;
margin:10px;
}
h1 {
background-color:#fff;
overflow:hidden;
display:inline-block;
padding:10px;
font-weight:bold;
font-family:arial;
color:transparent;
font-size:200px;
}span {
background: url(http://www.color-hex.com/palettes/26323.png) -20px -20px repeat;
-webkit-text-fill-color: transparent;
-webkit-background-clip: text;
display:block;
}
<h1><span>ABCDEFGHIKJ</span></h1>
http://jsfiddle.net/JGPuZ/1337/
Automatische Ausrichtung
mit einem kleinen Javascript können Sie den Hintergrund automatisch ausrichten:
$(document).ready(function(){
var position = $("h1").position(); //Position of the header in the webpage
var padding = 10; //Padding set to the header
var left = position.left + padding;
var top = position.top + padding;
$("h1").find("span").css("background-position","-"+left+"px -"+top+"px");
});
body {
background: url(http://www.color-hex.com/palettes/26323.png) repeat;
margin:10px;
}
h1 {
background-color:#fff;
overflow:hidden;
display:inline-block;
padding:10px;
font-weight:bold;
font-family:arial;
color:transparent;
font-size:200px;
}span {
background: url(http://www.color-hex.com/palettes/26323.png) -20px -20px repeat;
-webkit-text-fill-color: transparent;
-webkit-background-clip: text;
display:block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1><span>ABCDEFGHIKJ</span></h1>
Obwohl dies mit CSS möglich ist, wäre ein besserer Ansatz die Verwendung einer Inline-SVG mit SVG-Maskierung . Dieser Ansatz hat gegenüber CSS einige Vorteile:
CodePen Demo: SVG-Textmaske
body,html{height:100%;margin:0;padding:0;}
body{
background:url('https://farm9.staticflickr.com/8760/17195790401_94fcf60556_c.jpg');
background-size:cover;
background-attachment:fixed;
}
svg{width:100%;}
<svg viewbox="0 0 100 60">
<defs>
<mask id="mask" x="0" y="0" width="100" height="50">
<rect x="0" y="0" width="100" height="40" fill="#fff"/>
<text text-anchor="middle" x="50" y="18" dy="1">SVG</text>
<text text-anchor="middle" x="50" y="30" dy="1">Text mask</text>
</mask>
</defs>
<rect x="5" y="5" width="90" height="30" mask="url(#mask)" fill-opacity="0.5"/>
</svg>
Wenn Sie den Text auswählbar und durchsuchbar machen möchten, müssen Sie ihn außerhalb des <defs>
-Tags einfügen. Das folgende Beispiel zeigt eine Möglichkeit, den transparenten Text mit dem Tag <use>
zu erhalten:
body,html{height:100%;margin:0;padding:0;}
body{
background:url('https://farm9.staticflickr.com/8760/17195790401_94fcf60556_c.jpg');
background-size:cover;
background-attachment:fixed;
}
svg{width:100%;}
<svg viewbox="0 0 100 60">
<defs>
<g id="text">
<text text-anchor="middle" x="50" y="18" dy="1">SVG</text>
<text text-anchor="middle" x="50" y="30" dy="1">Text mask</text>
</g>
<mask id="mask" x="0" y="0" width="100" height="50">
<rect x="0" y="0" width="100" height="40" fill="#fff"/>
<use xlink:href="#text" />
</mask>
</defs>
<rect x="5" y="5" width="90" height="30" mask="url(#mask)" fill-opacity="0.5"/>
<use xlink:href="#text" mask="url(#mask)" />
</svg>
Eine Möglichkeit, die mit den meisten modernen Browsern (außer Edge), obwohl nur mit schwarzem Hintergrund, funktioniert, ist die Verwendung von
background: black;
color: white;
mix-blend-mode: multiply;
in Ihrem Textelement und legen Sie den gewünschten Hintergrund dahinter. Multipliziert grundsätzlich den 0-255-Farbcode auf 0-1 und multipliziert diesen mit dem, was sich dahinter befindet. Schwarz und Weiß bleiben also mit 1 multipliziert und werden effektiv transparent . http://codepen.io/nic_klaassen/full/adKqWX /
Es ist is möglich, aber bisher nur mit Webkit-basierten Browsern (Chrome, Safari, Rockmelt, alles basierend auf dem Chromium-Projekt).
Der Trick besteht darin, ein Element innerhalb des weißen Elements zu haben, das den gleichen Hintergrund wie der Körper hat. Dann verwenden Sie -webkit- background-clip: text;
für das innere Element. Dies bedeutet im Grunde "den Hintergrund nicht über den Text hinaus erweitern" und transparenten Text verwenden.
section
{
background: url(http://norcaleasygreen.com/wp-content/uploads/2012/11/turf-grass1.jpg);
width: 100%;
height: 300px;
}
div
{
background: rgba(255, 255, 255, 1);
color: rgba(255, 255, 255, 0);
width: 60%;
heighT: 80%;
margin: 0 auto;
font-size: 60px;
text-align: center;
}
p
{
background: url(http://norcaleasygreen.com/wp-content/uploads/2012/11/turf-grass1.jpg);
-webkit-background-clip: text;
}
Ich denke, Sie könnten so etwas erreichen mit background-clip
, aber ich habe das noch nicht getestet.
Siehe dieses Beispiel:
http://www.css3.info/wp-content/uploads/2008/03/webkit-backgroundcliptext_color.html
(Nur Webkit, ich weiß noch nicht, wie ich den schwarzen Hintergrund in einen weißen Hintergrund ändern kann.)
Ich habe gerade einen neuen Weg gefunden, dies zu tun, während ich herumgespielt habe. Ich bin nicht ganz sicher, wie es funktioniert (wenn jemand anderes es erklären möchte, tun Sie das bitte).
Es scheint sehr gut zu funktionieren und erfordert keine doppelten Hintergründe oder JavaScript.
Hier ist der Code: JSFIDDLE
body {
padding: 0;
margin: 0;
}
div {
background: url(http://www.color-hex.com/palettes/26323.png) repeat;
width: 100vw;
height: 100vh;
}
body::before {
content: '$ALPHABET';
left: 0;
top: 0;
position: absolute;
color: #222;
background-color: #fff;
padding: 1rem;
font-family: Arial;
z-index: 1;
mix-blend-mode: screen;
font-weight: 800;
font-size: 3rem;
letter-spacing: 1rem;
}
<div></div>
Ich musste einen Text erstellen, der genau so aussah wie im ursprünglichen Beitrag, aber ich konnte ihn nicht einfach fälschen, indem er Hintergründe aneinander reihte, da hinter dem Element eine Animation ist. Bisher scheint das noch niemand vorgeschlagen zu haben, also habe ich folgendes getan: (Es wurde versucht, das Lesen so einfach wie möglich zu machen.)
var el = document.body; //Parent Element. Text is centered inside.
var mainText = "THIS IS THE FIRST LINE"; //Header Text.
var subText = "THIS TEXT HAS A KNOCKOUT EFFECT"; //Knockout Text.
var fontF = "Roboto, Arial"; //Font to use.
var mSize = 42; //Text size.
//Centered text display:
var tBox = centeredDiv(el), txtMain = mkDiv(tBox, mainText), txtSub = mkDiv(tBox),
ts = tBox.style, stLen = textWidth(subText, fontF, mSize)+5; ts.color = "#fff";
ts.font = mSize+"pt "+fontF; ts.fontWeight = 100; txtSub.style.fontWeight = 400;
//Generate subtext SVG for knockout effect:
txtSub.innerHTML =
"<svg xmlns='http://www.w3.org/2000/svg' width='"+stLen+"px' height='"+(mSize+11)+"px' viewBox='0 0 "+stLen+" "+(mSize+11)+"'>"+
"<rect x='0' y='0' width='100%' height='100%' fill='#fff' rx='4px' ry='4px' mask='url(#txtSubMask)'></rect>"+
"<mask id='txtSubMask'>"+
"<rect x='0' y='0' width='100%' height='100%' fill='#fff'></rect>"+
"<text x='"+(stLen/2)+"' y='"+(mSize+6)+"' font='"+mSize+"pt "+fontF+"' text-anchor='middle' fill='#000'>"+subText+"</text>"+
"</mask>"+
"</svg>";
//Relevant Helper Functions:
function centeredDiv(parent) {
//Container:
var d = document.createElement('div'), s = d.style;
s.display = "table"; s.position = "relative"; s.zIndex = 999;
s.top = s.left = 0; s.width = s.height = "100%";
//Content Box:
var k = document.createElement('div'), j = k.style;
j.display = "table-cell"; j.verticalAlign = "middle";
j.textAlign = "center"; d.appendChild(k);
parent.appendChild(d); return k;
}
function mkDiv(parent, tCont) {
var d = document.createElement('div');
if(tCont) d.textContent = tCont;
parent.appendChild(d); return d;
}
function textWidth(text, font, size) {
var canvas = window.textWidthCanvas || (window.textWidthCanvas = document.createElement("canvas")),
context = canvas.getContext("2d"); context.font = size+(typeof size=="string"?" ":"pt ")+font;
return context.measureText(text).width;
}
Wirf das einfach in dein Fenster. Lade jetzt den Hintergrund des Körpers auf dein Bild und beobachte die Magie!
Sie können eine invertierte/negative/umgekehrte Schriftart verwenden und diese mit der font-face="…"
-CSS-Regel anwenden. Möglicherweise müssen Sie mit dem Buchstabenabstand spielen, um kleine weiße Lücken zwischen den Buchstaben zu vermeiden.
Wenn Sie keine bestimmte Schriftart benötigen, ist das ganz einfach. Laden Sie eine sympathische Version herunter, zum Beispiel aus dieser Sammlung invertierter Schriftarten .
Wenn Sie eine bestimmte Schriftart benötigen (z. B. "Open Sans"), ist dies schwierig. Sie müssen Ihre vorhandene Schriftart in eine invertierte Version konvertieren. Dies ist manuell mit Font Creator, FontForge usw. möglich, aber wir möchten natürlich eine automatisierte Lösung. Ich konnte noch keine Anleitung dafür finden, aber ein paar Hinweise:
Sie können das Patternizer jQuery-Plugin von myadzel verwenden, um diesen Effekt in allen Browsern zu erzielen. Derzeit gibt es keine Browser-übergreifende Möglichkeit, dies nur mit CSS zu tun.
Sie verwenden Patternizer, indem Sie class="background-clip"
zu HTML-Elementen hinzufügen, in denen der Text als Bildmuster gezeichnet werden soll, und das Bild in einem zusätzlichen data-pattern="…"
-Attribut angeben. Siehe die Quelle der demo . Der Patternizer erstellt ein SVG-Bild mit mit Muster gefülltem Text und unterlegt es dem transparent gerenderten HTML-Element.
Wenn, wie im Beispielbild der Frage, das Textfüllmuster Teil eines Hintergrundbilds sein sollte, das über das Element "Muster" hinausgeht, sehe ich zwei Optionen (ungetestet, mein Favorit zuerst):
lege einfach dieses CSS
.banner-sale-1 .title-box .title-overlay {
font-weight: 900;
overflow: hidden;
margin: 0;
padding-right: 10%;
padding-left: 10%;
text-transform: uppercase;
color: #080404;
background-color: rgba(255, 255, 255, .85);
/* that css is the main think (mix-blend-mode: lighten;)*/
mix-blend-mode: lighten;
}
Mit CSS jetzt nicht möglich, habe ich Angst.
Am besten verwenden Sie einfach ein Bild (wahrscheinlich eine PNG-Datei) und platzieren Sie einen guten Alt-/Titeltext darauf.
Alternativ können Sie ein SPAN oder ein DIV verwenden und das Bild als Hintergrund für Ihren Text verwenden, den Sie zu SEO-Zwecken verwenden möchten, aber den Text außerhalb des Bildschirms einrücken.