É possível criar um tipo de "máscara invertida" horizontal em CSS?


7

Eu tenho dois blocos (elementos div) com um preto na parte superior background-color: blacke um branco na parte inferior.

É possível ter um pedaço de texto que contenha as duas zonas com cores invertidas?

Por exemplo: a parte superior do texto "FOO" será branca em preto e a parte inferior preta sobre uma região branca.


11
Relacionado e útil: É possível aplicar CSS à metade de um caractere? e uma das melhores respostas para o q como um plug-in: Splitchar - esse plug-in também faz o que é solicitado nesta página, mas também pode executar três níveis de cor na horizontal ou na vertical.
Dom

Respostas:


10

Se você quer dizer algo como isto:

insira a descrição da imagem aqui


Edit: aqui está uma maneira que requer apenas um elemento HTML e, portanto, não será estranho quando lida por clientes que não usam CSS, como mecanismos de pesquisa, leitores de tela, RSS, aplicativos 'sem estilo' etc. (obrigado a Dominic por sugerir tentar :beforee :after)

http://jsbin.com/UtUlIFO/2/edit

O código importante ( adicione suas cores a isso ):

HTML: <div class="someclass" data-text="Some text">Some text</div>

CSS:

.someclass {     /* bottom half */
  position: relative;
  display: inline-block;
}

.someclass:after {     /* top half */
  content: attr(data-text);
  display: block;
  position: absolute;
  top: 0px;
  height: 50%;
  overflow: hidden;
}

O atributo HTML pode ser qualquer coisa - usei data-textporque é descritivo e evita efeitos colaterais indesejáveis ​​(por exemplo, você pode usar, titlemas criaria mouseovers em alguns navegadores).

Se você deseja display:block;o .topelemento main ( ), adicione algo como width: 100%;o .bottomelemento inner ( ) para preenchê-lo.

Se você estiver usando jQuery, poderá aplicar esse estilo a qualquer elemento com muita facilidade, evitando digitar manualmente o data-textbit duplicado:

$('.someElement').each(function(){
  $(this).addClass('someclass').attr('data-text',$(this).text());
});

Demonstração disso, além de outras coisas, como várias linhas, preenchimento


2
Estou tentando descobrir se existe uma maneira de fazer isso criando o texto duplicado com um pseudo-elemento ( :afterou :before), alguma idéia?
Dom

2
Ideia interessante: você pode fazer isso (duplicar o conteúdo codificado no CSS) ou isso (duplicar o conteúdo em um atributo HTML, depois ler isso), mas aparentemente não é possível simplesmente ler o texto do conteúdo HTML usando CSS . A maneira de atributo HTML parece a melhor, pois não atrapalha a leitura da máquina pelo HTML. Eu adicionei algumas coisas como esta acima.
user56reinstatemonica8

5

Surpreendentemente, é possível, embora eu só aconselho que se você estiver site é tudo sobre o impacto visual e a semântica do código não importa, além disso, ele provavelmente não vai ser muito consistente em navegadores mais antigos.

O resultado é:

Texto invertido

Esta não é uma solução bonita, e aposto que não é a única por aí, mas faz o que você deseja.

Requer que você tenha duas instâncias do texto e, usando posicionamento absoluto e algumas contas simples, é possível criar esse efeito.

Portanto, se tivermos um contêiner div, e dentro desses dois divs, e em cada um deles uma instância do texto, você poderá usar a seguinte HTMLestrutura e CSSpropriedades para conseguir isso:

<div class="container">
    <div class="black">
       <div class="text">Invert</div>
    </div>
    <div class="white">
       <div class="text">Invert</div>
    </div>
</div>

.container{position:relative; width:200px; height:100px; display:block; margin:0px; padding:0px; }

.black, .white{position:absolute; left:0px; background:#000; width:200px; height:50px; margin:0px; padding:0px; overflow:hidden; }

.black{top:0px; }

.white{bottom:0px; background:#fff; }

.text{position:absolute; color:#fff; font-size:70px; padding:0px; }

.black .text{bottom:-40px; }

.white .text{top:-40px; color:#000; }

Aqui está um JSFiddle do resultado. :)


Oooh postou enquanto eu terminava de digitar! Boa resposta, mas acho que há algumas maneiras pelas quais pode ser simplificado para ser mais algo que pode ser descartado em qualquer lugar. Eu acho que não há como fazê-lo sem duplicar o texto.
user56reinstatemonica8

2

Há também uma propriedade CSS3 , suportada apenas pelo webkit, que inverte as cores:

image {
 -webkit-filter: invert(100%);  
}

E há um HTML5 Canvas Invert , aqui está um exemplo e o código completo . Ele itera sobre todos os pixels de uma imagem e inverte vermelho, verde e azul subtraindo cada componente do valor máximo de cor 255.

Ambas as soluções ainda exigiriam 2 imagens e posicionamento CSS para elas. Como a compatibilidade não é muito boa, eu definitivamente aceitaria uma das outras respostas :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.