it-swarm.com.ru

Прозрачный текст, вырезанный из фона

Есть ли способ сделать прозрачный текст вырезанным из фона эффекта, как тот, что на следующем изображении, с помощью CSS?
Было бы грустно терять весь драгоценный SEO из-за изображений, заменяющих текст.

Transparent text cut out of background

Сначала я подумал о тенях, но ничего не могу понять ... 

Изображение - это фон сайта, тег <img> с абсолютным позиционированием 

77
Love Dager

Это возможно с css3, но это поддерживается не во всех браузерах

С фоновым клипом: текст; Вы можете использовать фон для текста, но вам придется выровнять его с фоном страницы.

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/

Автоматическое выравнивание

немного JavaScript, вы можете настроить фон автоматически:

$(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>
__. http://jsfiddle.net/JGPuZ/1336/

43
Gijs

Хотя это возможно с помощью CSS, лучшим подходом будет использование встроенного SVG с маскировка SVG . Этот подход имеет некоторые преимущества перед CSS:

CodePen Demo: SVG текстовая маска

transparent text clipping background

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>

Если вы стремитесь сделать текст выбираемым и доступным для поиска, вам нужно включить его вне тега <defs>. В следующем примере показан способ сделать это, сохранив прозрачный текст с тегом <use> :

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>

45
web-tiki

Одним из способов, который работает в большинстве современных браузеров (кроме Edge), хотя и только с черным фоном, является использование

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

в свой текстовый элемент, а затем поместите любой фон, который вы хотите за этим. Умножение в основном отображает цветовой код 0-255 на 0-1, а затем умножает его на то, что стоит за ним, так что черный остается черно-белым, умножается на 1 и фактически становится прозрачным . http://codepen.io/ nic_klaassen/full/adKqWX/

16
Nic

Это возможно, но пока только в браузерах на основе Webkit (Chrome, Safari, Rockmelt, все, что основано на проекте Chromium). 

Хитрость заключается в том, чтобы в белом элементе был элемент с тем же фоном, что и у тела, затем используйте -webkit- background-clip: text; на внутреннем элементе, что в основном означает «не расширяйте фон за пределы текста» и используйте прозрачный текст.

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/

3
Kyle

Я думаю, вы могли бы достичь чего-то подобного используя background-clip , но я еще не проверял это. 

Смотрите этот пример:
http://www.css3.info/wp-content/uploads/2008/03/webkit-backgroundcliptext_color.html
(Только Webkit, я пока не знаю, как изменить черный фон на белый)

2
feeela

Я только что обнаружил новый способ сделать это, пока возиться, я не совсем уверен, как это работает (если кто-то хочет объяснить, пожалуйста, сделайте).

Кажется, он работает очень хорошо и не требует двойного фона или JavaScript.

Вот код: 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>

1
chbchb55

 Demo Screenshot

Мне нужно было сделать текст, который выглядел бы точно так же, как в оригинальном посте, но я не мог просто подделать его, выровняв фоны, потому что за элементом есть некоторая анимация. Кажется, никто еще не предлагал этого, поэтому вот что я сделал: (Пытался сделать его как можно более простым для чтения).

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

Просто добавьте это в свое окно. Загрузите, установите фон тела для вашего изображения и наблюдайте, как происходит волшебство!

1
Pecacheu

Вы можете использовать инвертированный/отрицательный/обратный шрифт и применить его с помощью правила CSS font-face="…". Возможно, вам придется поиграть с межбуквенным интервалом, чтобы избежать небольших белых пробелов между буквами.

Если вам не нужен определенный шрифт, это просто. Скачайте понравившийся, например, из этой коллекции инвертированных шрифтов .

Если вам нужен определенный шрифт (скажем, «Open Sans»), это сложно. Вы должны конвертировать свой существующий шрифт в инвертированную версию. Это возможно вручную с помощью Font Creator, FontForge и т.д., Но, конечно, мы хотим автоматизированное решение. Я не мог найти инструкции для этого пока, но некоторые подсказки:

1
tanius

Вы можете использовать плагин myadzel Patternizer jQuery для достижения этого эффекта в браузерах. В настоящее время нет кросс-браузерного способа сделать это только с помощью CSS.

Вы используете Patternizer, добавляя class="background-clip" к элементам HTML, где вы хотите, чтобы текст рисовался как шаблон изображения, и определяете изображение в дополнительном атрибуте data-pattern="…". Смотрите источник демо . Patternizer создаст изображение SVG с заполненным шаблоном текстом и наложит его на прозрачный элемент HTML.

Если, как на примере изображения вопроса, шаблон заливки текста должен быть частью фонового изображения, выходящего за пределы элемента «patternized», я вижу два варианта (непроверенный, мой любимый первый):

  • Используйте маскировку вместо фонового изображения в SVG. Как и в ответ web-tiki , к которому при помощи Patternizer все равно будет добавлена ​​автоматическая генерация SVG и невидимый HTML-элемент сверху, позволяющий выделять и копировать текст.
  • Или используйте автоматическое выравнивание изображения шаблона. Может быть сделано с помощью кода JavaScript, аналогичного приведенному в ответ Гийса .
1
tanius

просто положи эту 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;

    }
0
Rashed

Боюсь, с CSS это невозможно.

Лучше всего просто использовать изображение (возможно, PNG) и поместить на него хороший текст надписи/заголовка.

В качестве альтернативы вы можете использовать SPAN или DIV и использовать изображение в качестве фона для текста с текстом, который вы хотите использовать для целей SEO, но с отступом текста вне экрана.

0
Billy Moat