Teks transparan dipotong dari latar belakang

92

Apakah ada cara untuk membuat teks transparan dipotong dari efek latar belakang seperti yang ada di gambar berikut, dengan CSS?
Akan sangat menyedihkan jika kehilangan semua SEO yang berharga karena gambar yang menggantikan teks.

Teks transparan dipotong dari latar belakang

Saya pertama kali memikirkan bayangan tetapi saya tidak tahu apa-apa ...

Gambar adalah latar belakang situs, <img>tag yang diposisikan secara absolut

Love Dager
sumber
"kehilangan semua SEO yang berharga karena gambar menggantikan teks." Ada juga teknik penggantian gambar yang masih SO-friendly. BTW: sebenarnya background di balik surat-surat itu juga harus tetap transparan, itulah masalahnya di sini…
feeela
yeap, ini akan menjadi praktik yang bagus, jika mungkin dengan css ...
Jessica Lingmn
Saya tidak melihat alasan mengapa <h1><img alt="Some Text" /></h1>ada yang kurang SEO friendly daripada <h1>Some Text</h1>. Secara tradisional, masalah dengan gambar adalah bahwa mereka baru saja dibuang di halaman tanpa markup pendukung.
cimmanon
@ Cimon Ya, Anda benar. Saya mungkin bisa menggunakan gambar tanpa kehilangan poin SEO, tetapi Anda masih tidak bisa memilih teks, pencarian di halaman, penautan akan lebih rumit, dan akan lebih banyak pekerjaan untuk memperbarui teks ...: /
Love Dager
2
Asal tahu saja, Google sangat keren dengan teknik penggantian gambar CSS: mezzoblue.com/archives/2008/05/05/image_replac
cimman

Jawaban:

47

Ini dimungkinkan dengan css3 tetapi tidak didukung di semua browser

Dengan klip latar belakang: teks; Anda dapat menggunakan latar belakang untuk teks, tetapi Anda harus menyelaraskannya dengan latar belakang halaman

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/


Perataan Otomatis

Dengan sedikit javascript Anda dapat menyelaraskan latar belakang secara otomatis:

$(document).ready(function(){
  //Position of the header in the webpage
  var position = $("h1").position();
  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>
</s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> orang </s>

http://jsfiddle.net/JGPuZ/1336/

Gijs
sumber
A kalian TERLALU cepat: D
Gijs
Oh bagus! Saya akan menguji penjajaran otomatis secepat saya sampai di rumah! Terima kasih! : D
Love Dager
Anda mungkin perlu sedikit mengubah kodenya, tergantung situasinya, sekarang dapat bertentangan dengan elemen lain dan yang ini ditulis sangat cepat, jika Anda memiliki pertanyaan saya akan mendengarkannya
Gijs
3
Bukan untuk mengabaikan jawabannya, yang merupakan solusi yang sangat bagus, tetapi background-clip:textmerupakan opsi non-standar yang hanya untuk Webkit. CSS3 tidak mengizinkan textnilai untuk atribut ini ( lihat ).
tanius
1
Teknik ini memungkinkan Anda untuk melihat latar belakang elemen tempat teks biasanya berada. Saya mencari cara untuk melihat apa yang ada di bawah elemen dengan teks melalui tempat di mana teks biasanya berada.
Vince
49

Meskipun hal ini dimungkinkan dengan CSS, pendekatan yang lebih baik adalah menggunakan SVG sebaris dengan masking SVG . Pendekatan ini memiliki beberapa keunggulan dibandingkan CSS:

Demo CodePen: topeng teks SVG

latar belakang kliping teks transparan

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>

Jika Anda ingin membuat teks dapat dipilih dan dicari, Anda harus memasukkannya di luar <defs>tag. Contoh berikut menunjukkan cara untuk melakukannya dengan menjaga teks transparan dengan <use>tag:

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>

web-tiki
sumber
2
Ini tampaknya menjadi satu-satunya solusi yang berfungsi lintas browser saat ini: IE11, FF, Chrome, Safari. Dan tidak membutuhkan gambar sebagai latar belakang seperti banyak solusi lain yang disediakan untuk masalah di seluruh web.
Timo Kähkönen
1
Terinspirasi dari jawaban ini saya membuat animasi keyframes, di mana teks SVG transparan pada persegi panjang bulat putih berputar. Latar belakang memiliki teks dan gambar. Pergi dan lihat: jsbin.com/nipuqu/3 (Kejuaraan Dunia akan datang :))
Timo Kähkönen
2
Solusi bagus, tetapi karena "pilih teks dan cari di halaman" tampaknya menjadi persyaratan OP, Anda mungkin ingin menyertakan bagian <text>luar <defs>. (btw Saya tidak yakin bagaimana crawler SE menangani konten SVG di defs). Berikut adalah cara untuk menjaga apa yang diinginkan OP, dengan eksploitasi bug FF yang mengerikan: jsfiddle.net/tfneqxxb
Kaiido
Bagaimana jika teksnya dinamis? Itu tidak otomatis menyesuaikan lebar.
Imran Bughio
1
@IranBughio tidak tidak. Teks SVG tidak bertindak seperti teks HTML biasa. Anda perlu memposisikannya. Untuk informasi lebih lanjut, lihat di sini
web-tiki
16

Salah satu cara yang berfungsi pada kebanyakan browser modern (kecuali yaitu edge), meskipun hanya dengan latar belakang hitam, adalah dengan menggunakan

background: black;
color: white;
mix-blend-mode: multiply;

di elemen teks Anda dan kemudian letakkan latar belakang apa pun yang Anda inginkan di belakangnya. Multiply pada dasarnya memetakan kode warna 0-255 menjadi 0-1 dan kemudian mengalikannya dengan apa pun yang ada di belakangnya, sehingga hitam tetap hitam dan putih dikalikan dengan 1 dan secara efektif menjadi transparan. http://codepen.io/nic_klaassen/full/adKqWX/

Nic
sumber
3
Untuk latar belakang putih dengan penggunaan warna hitam color-dodge, lightenatau screenpadamix-blend-mode
Imran Bughio
3

Hal ini mungkin, namun sejauh ini hanya dengan browser berbasis WebKit (Chrome, Safari, Rockmelt, apa pun berdasarkan pada proyek Chromium.)

Triknya adalah dengan memiliki elemen dalam putih yang memiliki latar belakang yang sama dengan badan, kemudian gunakan -webkit- background-clip: text;pada elemen dalam yang pada dasarnya berarti "jangan memperluas latar belakang di luar teks" dan gunakan teks transparan.

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;
}
​

http://jsfiddle.net/BWRsA/

Kyle
sumber
Trik keren! Tapi sekarang untuk menyelaraskan semuanya dengan benar akan menyebalkan .. -.-
Love Dager
Ya, itu masalah lain dengan itu. Ini masih dalam pengembangan dan saya sangat berharap kami segera melihat sesuatu seperti ini! :)
Kyle
Selain itu, Anda selalu dapat melapisi teks transparan pada gambar, sehingga masih dapat dipilih. Tapi saya yakin itu praktik yang buruk untuk SEO .. Pesan / kata kunci tersembunyi dan semacamnya.
Kyle
Saya yakin tampilannya sangat bagus di browser Webkit, tetapi untuk orang lain ini adalah kotak putih semi transparan di atas beberapa rumput.
cimmanon
1
Ah, ayolah teman ... Ya saya berencana menggunakannya dalam produksi. Tapi tentu saja bukan tanpa fallback! @cimmanon
Love Dager
2

Saya baru saja menemukan cara baru untuk melakukan ini sambil mengotak-atik, saya tidak sepenuhnya yakin cara kerjanya (jika ada orang lain yang ingin menjelaskan, tolong lakukan).

Tampaknya berfungsi dengan sangat baik, dan tidak memerlukan latar belakang ganda atau JavaScript.

Inilah kodenya: 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>

ChrisBrownie55
sumber
1

Anda dapat menggunakan font terbalik / negatif / terbalik dan menerapkannya dengan font-face="…"aturan CSS. Anda mungkin harus bermain-main dengan spasi huruf untuk menghindari celah putih kecil di antara huruf.

Jika Anda tidak membutuhkan font tertentu, itu sederhana. Unduh yang disukai, misalnya dari koleksi font terbalik ini .

Jika Anda membutuhkan font tertentu (katakanlah, "Open Sans"), itu sulit. Anda harus mengubah font yang ada menjadi versi terbalik. Ini dimungkinkan secara manual dengan Font Creator, FontForge dll., Tetapi tentu saja kami menginginkan solusi otomatis. Saya belum dapat menemukan instruksi untuk itu, tetapi beberapa petunjuk:

tanius
sumber
1

Anda dapat menggunakan plugin jQuery Patternizer myadzel untuk mencapai efek ini di seluruh browser. Saat ini, tidak ada cara lintas browser untuk melakukan ini hanya dengan CSS.

Anda menggunakan Patternizer dengan menambahkan class="background-clip"ke elemen HTML di mana Anda ingin teks dilukis sebagai pola gambar, dan menentukan gambar dalam data-pattern="…"atribut tambahan . Lihat sumber demo . Patternizer akan membuat gambar SVG dengan teks berisi pola dan melapisinya ke elemen HTML yang dirender secara transparan.

Jika, seperti pada gambar contoh pertanyaan, pola isian teks harus menjadi bagian dari gambar latar belakang yang melampaui elemen "berpola", saya melihat dua opsi (belum diuji, favorit saya dulu):

  • Gunakan masking alih-alih gambar latar belakang di SVG. Seperti dalam jawaban web-tiki , yang menggunakan Patternizer akan tetap menambahkan generasi otomatis SVG dan elemen HTML yang tidak terlihat di atasnya yang memungkinkan pemilihan dan penyalinan teks.
  • Atau gunakan penyelarasan otomatis dari gambar pola. Dapat dilakukan dengan kode JavaScript yang mirip dengan yang ada di jawaban Gijs .
tanius
sumber
1

taruh saja css itu

    .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;

    }
Rash
sumber
1

Tangkapan Layar Demo

Saya perlu membuat teks yang terlihat persis seperti di postingan aslinya, tetapi saya tidak bisa hanya memalsukannya dengan menyejajarkan latar belakang, karena ada beberapa animasi di belakang elemen. Sepertinya belum ada yang menyarankan ini, jadi inilah yang saya lakukan: (Mencoba membuatnya semudah mungkin untuk dibaca.)

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;
}

Buang saja itu di window.onload Anda, atur latar belakang tubuh ke gambar Anda, dan saksikan keajaiban terjadi!

Pecacheu
sumber
0

Tidak mungkin dengan CSS sekarang, saya khawatir.

Taruhan terbaik Anda adalah dengan hanya menggunakan gambar (mungkin PNG) dan menempatkan teks alt / judul yang bagus di atasnya.

Atau Anda dapat menggunakan SPAN atau DIV dan memiliki gambar sebagai latar belakang dengan teks Anda yang Anda inginkan untuk tujuan SEO di dalamnya tetapi teks-indentasi dari layar.

Billy Moat
sumber
Ya kamu benar. Saya mungkin bisa menggunakan gambar tanpa kehilangan poin SEO, tetapi Anda masih tidak bisa memilih teks, pencarian di halaman, penautan akan lebih rumit, dan akan lebih banyak pekerjaan untuk memperbarui teks ...: /
Love Dager
0

mix-blend-mode juga kemungkinan untuk efek semacam itu.

The mix-blend-modeCSS set properti bagaimana konten elemen harus berbaur dengan isi induk elemen dan latar belakang elemen.

h1 {
background:white;
mix-blend-mode:screen;

/* demo purpose from here */
padding:0.25em;
mix-blend-mode:screen;
}


html {
background:url(https://i.picsum.photos/id/1069/367/267.jpg?hmac=w5sk7UQ6HGlaOVQ494mSfIe902cxlel1BfGUBpEYoRw)center / cover ;
min-height:100vh;
display:flex;
}
body {margin:auto;}
h1:hover {border:dashed 10px white;background-clip:content-box;box-shadow:inset 0 0 0 2px #fff, 0 0 0 2px #fff}
<h1>ABCDEFGHIJKLMNOPQRSTUVWXYZ</h1>

G-Cyrillus
sumber