É possível definir a opacidade de uma imagem de plano de fundo sem afetar a opacidade dos elementos filho?
Exemplo
Todos os links no rodapé precisam de um marcador personalizado (imagem de plano de fundo) e a opacidade do marcador personalizado deve ser de 50%.
HTML
<div id="footer">
<ul>
<li><a href="#">Link 1</a></li>
<li><a href="#">Link 2</a></li>
<li><a href="#">Link 3</a></li>
<li><a href="#">Link 4</a></li>
<li><a href="#">Link 5</a></li>
</ul>
</div>
CSS
#footer ul li {
background: url(/images/arrow.png) no-repeat 0 50%;
}
O que eu tentei
Tentei definir a opacidade dos itens da lista como 50%, mas a opacidade do texto do link também é de 50% - e não parece haver uma maneira de redefinir a opacidade dos elementos filho:
#footer ul li {
background: url(/images/arrow.png) no-repeat 0 50%;
/* will also set the opacity of the link text */
opacity: 0.5;
}
Também tentei usar o rgba, mas isso não afeta a imagem de fundo:
#footer ul li {
/* rgba doesn't apply to the background image */
background: rgba(255, 255, 255, 0.5) url(/images/arrow.png) no-repeat 0 50%;
}
Respostas:
Você pode usar CSS
linear-gradient()
comrgba()
.fonte
Leve sua imagem para um editor de imagens, diminua a opacidade, salve-a como um .png e use-a.
fonte
Isso funcionará com todos os navegadores
Se você não deseja que a transparência afete o contêiner inteiro e seus filhos, verifique esta solução alternativa. Você deve ter um filho absolutamente posicionado com um pai relativamente posicionado.
Verifique a demonstração em http://www.impressivewebs.com/css-opacity-that-doesnt-affect-child-elements/
fonte
position:relative;
e o img paraposition:absolute;
NÃO me permite substituir a opacidade herdada no img, e não posso usar o posicionamento absoluto para os próprios <li> (isso é uma bagunça ;-). Em Javascript, tenteiimgs[i].style.opacity = '1';
, mas isso também não funciona para substituir a opacidade herdada. Se entendi corretamente, também não posso usar o rgba porque preciso afetar as imagens, não apenas a cor de fundo. Alguém tem uma recomendação para mim?Se você estiver usando a imagem como marcador, considere o pseudo-elemento: before.
fonte
*zoom: expression( … );
(consulte : after e: before pseudo elementos css hack para o IE 7 ), mas o IE7 está finalmente se tornando um passé.Você pode colocar a imagem na div: after ou div: before e definir a opacidade nessa "div virtual"
encontrado aqui http://css-tricks.com/snippets/css/transparent-background-images/
fonte
Hackear com opacidade .99 (menos de 1) cria o contexto do índice z, assim você não pode se preocupar com os valores globais do índice z. (Tente removê-lo e veja o que acontece na próxima demonstração em que o wrapper pai possui um índice z positivo.)
Se o seu elemento já possui um índice z, você não precisa desse hack.
Demonstração desta técnica .
fonte
Infelizmente, no momento em que escrevemos esta resposta, não havia uma maneira direta de fazer isso. Você precisa:
fonte
Outra opção é a abordagem CSS Tricks de inserir um pseudo-elemento do tamanho exato do elemento original logo atrás dele para falsificar o efeito de fundo opaco que estamos procurando. Às vezes, você precisará definir uma altura para o pseudo elemento.
fonte
A propriedade "filter" precisa de um número inteiro para a porcentagem de opacidade, em vez de duas vezes, para trabalhar no IE7 / 8.
PS: Postei isso como resposta, já que o SO precisa de pelo menos 6 caracteres alterados para uma edição.
fonte
Para realmente ajustar as coisas, recomendo colocar as seleções apropriadas nos wrappers de segmentação por navegador. Essa foi a única coisa que funcionou para mim quando não consegui fazer com que o IE7 e o IE8 "brincassem bem com os outros" (como atualmente trabalho para uma empresa de software que continua a apoiá-los).
Talvez eu tenha redundâncias no código acima - se alguém quiser limpá-lo ainda mais, fique à vontade!
fonte
-moz-border-radius
no Firefox 13 e agora apenas procura aborder-radius
propriedade padrão ). IE7 e IE8 são uma história diferente, mas isso é apenas IE :-P-khtml-opacity
porque não entende a consulta de mídia, tornando-o inútil 2) O IE é mais estável do que você pensa; ele não "explodirá" apenas porque você adiciona prefixos não pertencentes ao IE a uma regra que se aplica ao IE. O problema, no momento em que você o enfrentou, deve ter vindo de outro lugar.Se você precisa definir a opacidade apenas como marcador, por que não define o canal alfa diretamente na imagem? A propósito, acho que não há uma maneira de definir a opacidade para uma imagem de plano de fundo via css sem alterar a opacidade de todo o elemento (e de seus filhos também).
fonte
Apenas para adicionar ao exposto ... você pode usar o canal alfa com os novos atributos de cores, por exemplo. rgba (0,0,0,0) ok, então isso é preto, mas com opacidade zero, para que, como pai, não afete a criança. Isso funciona apenas no Chrome, FF, Safari e ...
converta suas cores hexadecimais em RGBA
fonte
background-image
solicitado pelo OP.Encontrei um tutorial muito bom e simples sobre esse problema. Eu acho que funciona muito bem (e, embora seja compatível com o IE, eu apenas digo aos meus clientes para usar outros navegadores):
Transparência em segundo plano CSS sem afetar elementos filho, através de RGBa e filtros
A partir daí, você pode adicionar suporte ao gradiente etc.
fonte
Você pode tentar este código. Eu acho que vai dar certo. Você pode visitar a demo
fonte