Ir para conteúdo
Fórum Script Brasil
  • 0

Transparência Em Css


KaKarotto

Pergunta

Olá,

Ontem, edit: Que mané ontem...faz muito tempo, desenvolvendo um layout para um dos meus projetos, me deparei com um problema clássico. Eu queria usar uma div com efeito de transparência mas com objetos opacos dentro dessa div. Mas como?

Sabemos que isso não é possível da maneira mais intuitiva, pois, ao criarmos uma div com um filtro transparente, todos os seus objetos filhos herdarão essa transparência, e não é o que eu queria.

Depois de muito procurar, não achei nenhum artigo sobre como resolver esse problema, então tive uma idéia e a desenvolvi para resolver essa questão.

E lá vai ela:

Crie 2 divs, a primeira servirá para englobar todos os elementos que você quer colocar, e a segunda servirá como o fundo transparente:

O html:

<div id="box">
 <div class="f-transp"></div>
<p>Conteúdo, Conteúdo </p>
 </div>
Agora, o Css. O primeiro apenas atribui a estilização padrão do div "box" como largura, posicionamento e esse tipo de coisa, sem nenhuma mágica:
div#box{
 position:absolute; top:5%; left:30%;
 width:120px; height:125px;
 overflow:hidden;   // O overflow é usado para inibir o aumento não desejado do div.
 border:1px solid white;
 z-index:0
 }
O segundo Css é onde acontece o truque:
div.f-transp{
 position:absolute; top:0; left:0;
 width:100%; height:100%;
 width:inherit; height:inherit;
 background:red;
        filter:alpha(opacity=30, finishopacity=30, style=1);
        opacity:.3;
       -moz-opacity:.3;
           -khtml-opacity:.3; 
          

 border:none;
 z-index:-1
 }

Explicação linha por linha após o seletor "div.f-transp":

1: O div "f-transp" vai assumir uma posição absoluta, ou seja, sua posição não influirá qualquer elemento criado na div "box".

2, 3: Sua largura é definida para ocupar toda a div "box" servindo como um pseudo-fundo. É utilizado em porcentagem para o IE, e com atributo inherit (herdado) para o FF.

4: A cor foi definida para o fundo trasparente, mas é possível usar imagens para o fundo usando o atributo: background-image:url('imagem.gif')

5, 6, 7: A utilização dos filtros transparentes, o primeiro é usado para o IE, o segundo para o FF e o terceiro para navegadores com engine KHTML(Safari e Konqueror).

8: Não vou explicar né....=/

Obs: Não coloque nada dentro da div usada para o fundo, ela será usada apenas para a estilização do fundo transparente.

Bom é isso ae. Repito, eu procurei bastante para achar algum texto sobre isso embora a solução seja simples, o que me faz imaginar que alguém já deve ter feito isso. De qualquer forma, se alguém viu um artigo assim, manda o link pra mim ok? Como eu achei a solução sozinho, talvez não seja a melhor rsrsrs.

Abraços.

Edit: Pessoal, postei uma solução melhorada desta que postei sobre como usar fundo transparente com objetos opacos, aqui: http://scriptbrasil.com.br/forum/index.php?showtopic=128628

Editado por KaKarotto
Link para o comentário
Compartilhar em outros sites

16 respostass a esta questão

Posts Recomendados

  • 0
não se esqueça que opacity:; é do CSS3(apesar do opera e FF mais atuais já usarem)

para o mozilla as vezes é necessario o uso do

-moz-opacity:;(só em alguns ele tem a necessidade desse comando)

Grato, bem lembrado, adicionado moz-opacity. =]

Link para o comentário
Compartilhar em outros sites

  • 0

falar uma coisa eu não entendi qual sua intenção com esse código

por que que eu saiba DIV pra obter esse efeito(objetos herdarem o efeito opaco)

bastava isso:

<style>
#boxopaco{
position:absolute; top:55%; left:30%;
width:120px; height:125px;
background:red;
filter:alpha(opacity=30, finishopacity=30, style=1);
opacity:.3;
-moz-opacity:.3;
-khtml-opacity:.3;
}
</style>
<div id="boxopaco">
conteudo
</div>
unica diferença que eu vi foi que a sua borda(borda branca do #box) não fica opaco por estar no objeto sem efeito opaco =/ unico dilema que eu ouvi falar sobre efeitos opacos foi que "ninguém"(aliais quase ninguém) conseguia fazer o inverso da sua ideia tipo tentar deixar objetos filhos sem o efeito opaco tipo isso:
<style>
#opaco{
background:#fc0;
filter:alpha(opacity=30, finishopacity=30, style=1);
opacity:.3;
-moz-opacity:.3;
-khtml-opacity:.3;
}
</style>
<div id="opaco">
<img src="foto.jpg" alt="foto">
</div>

a imagem automaticamente herda o efeito =/

o dificil eu acho que é impedir a herdação(será que é assim que se escreve essa palavra kkk)

e não fazer herdar =]

entendeu??

Editado por hipnos na area
Link para o comentário
Compartilhar em outros sites

  • 0

Eu acho que entendi por que não entendeu. Porque eu esqueci de colocar no código pro div do fundo ficar pra trás usando z-index.... Finalmente alguém pra olhar e testar o código, se não fosse por você ficaria aqui errado e ninguém entenderia.

A intenção do código é justamente essa, fazer o fundo transparente com objetos opacos. Opaco significa não transparente. A intenção do post é justamente o seu dilema, fazer apenas o fundo ficar transparente sem os objetos herdarem sua transparência.

Código consertado.

Kelabrassssssssss

Link para o comentário
Compartilhar em outros sites

  • 0

outra coisa não ponha só os DIVs ponha onde deve ir o conteudo

por que de inicio eu coloquei o conteudo assim

<div id="box">
<div class="f-transp">conteudo</div>

</div>
sende que deve ser assim:
<div id="box">
<div class="f-transp"></div>
conteudo
</div>

muda lá pro pessoal não fazer confusão falou

sabe outra vantagem do seu código??

é que o conteudo do DIV fica bloqueado ^^

isso é otimo para poder proteger seu conteudo de cópias =]

gostei mesmo falow

Editado por hipnos na area
Link para o comentário
Compartilhar em outros sites

  • 0

Valeu hipnos.

Mas eu tinha colocado, depois dos 8 passos, uma observação, dizendo que não poderia ir nada dentro do div usado para o fundo.

De qualquer maneira eu alterei lá.

Kelabrasssssss

Link para o comentário
Compartilhar em outros sites

  • 0

Tenta trazer o conteúdo mais pra frente, alterando o z-index:0 para z-index:10000.

Eu realmente não sei porque acontece isso. Eu uso um navegador derivado do FF e o ie6, nenhum dos dois o conteúdo fica bloqueado. Já fiz um projeto usando essa mesma técnica e funcionou também no ie7.

Agora quem não entende sou eu ....

Link para o comentário
Compartilhar em outros sites

  • 0

dae pessoal...beleza?

muito bom esse script, porém não estou conseguindo usar ele em minha aplicação, estou tentando usar em um parágrafo que contém imagens e texto, que é exibido com o hover de uma LI (usando jquery), ele está como se fosse um submenu...

segue um resumo da estrutura HTML:

<div id="menu">  
         <div>
                    <ul>
                        <li>
                             <a href="#">menu1</a>
                             <p>
                                <img src="imagem.jpg" alt="imagem" title="imagem" />
                                <a href="link1.php" title="link1">Link1</a>
                                <a href="link2.php" title="link2">Link2</a>
                                <span title="Mais info"><a href="maisinfo.php" title="Mais info">Veja mais</a></span>
                            </p>
                        </li>

                        <li><a href="#">menu2</a>
                             <p>
                                <img src="imagem.jpg" alt="imagem" title="imagem" />
                                <a href="link1.php" title="link1">Link1</a>
                                <a href="link2.php" title="link2">Link2</a>
                                <span title="Mais info"><a href="maisinfo.php" title="Mais info">Veja mais</a></span>
                            </p>
                        </li>
                    </ul>
         </div> 
</div>
javascript baixar jquery:
var ul_s = $('div#menu DIV > UL').children();
        
        divs_li = ul_s.children('p');    
        divs_li.addClass('descri');
        divs_li.hide();
        
        ul_s.hover(function(){
                $(this).children('p').show();
            },function(){
                $(this).children('p').hide();
            });
CSS do paragrafo:
p.descri{
                    position:absolute; 
                    width:145px;
                    height:auto;
                    background:#FFFFFF;
                    text-align:left;
                    padding:10px;
                    color:#FF6600;
                    border:2px solid #009DE0;
                    margin-left:176px;
                    margin-top:-15px;
                    overflow:hidden;    /*O overflow é usado para inibir o aumento não desejado do div.*/    
                    z-index:0;        
                }
                p.descri IMG{
                    width:140px;
                    height:100px;
                    margin-top:3px;
                    margin-bottom:5px;
                    margin-left:2px;
                    border:#000000 1px solid;
                }

então, não se ficou claro, ao passar o mouse no menu1 por exemplo, seu respectivo parágrafo filho será exibido ao lado, não postei o código da div#menu UL LI e tal, por achar desnecessário, se quiserem eu posto...

no css tem até algumas propriedades q eu copiei de vocês aí...

para adaptar ao exemplo de vocês usei o parágrafo como a div#box (o problema são as posições eu acho), inseri a div.f-transp com o css...mas nada...ele até estraga a visualização...

Bom, acho q é "só isso" por enquanto...

se puderem me ajudar, ficarei super agradecido...

flow pessoal...abraços!

Editado por Allan Rodrigo
Link para o comentário
Compartilhar em outros sites

  • 0

É Allan....eu acho essa história de Frameworks muito complicada.

Pelo simples fato de que a maioria acha que ele é um Js para os que manjam pouco e facilita muito o trabalho. Facilita mesmo, mas a ironia é que precisa entender MUITO de Js para o Jquery se tornar uma boa ferramenta.

Bom, eu não manjo muito de Js, então nem me atrevo a usar o Jquery. O que acontece no seu caso é que ele usa as funções de filhos com determinadas tags, ele altera algumas características delas também. Se você colocar uma tag div e usar os comandos que usou vai acontecer algo de estranho mesmo. Uma solução rápida é usar outra tag para o efeito de fundo transparente, como a span, por exemplo.

Outra coisa, notei no seu código que você bota um padding na tag que funcionará como a #box. Se usar padding, o elemento que servirá de fundo transparente vai ficar "x" espaçado das laterais do elemento pai, fazendo com que a transparencia funcione inadequadamente, deixando algum ou alguns espaços sem transparencia.

Boa sorte aí cara o/

Link para o comentário
Compartilhar em outros sites

  • 0

Bom...obrigado pela resposta!!!

É, cada um tem uma opinião sobre o uso de frameworks, pra mim até agora, só facilitou e muito, talvez pelo fato d eu ser amador mesmo!

Mas como eu disse no post, não estou conseguindo adaptar o CSS das divs do exemplo..

O que acontece no seu caso é que ele usa as funções de filhos com determinadas tags, ele altera algumas características delas também. Se você colocar uma tag div e usar os comandos que usou vai acontecer algo de estranho mesmo. Uma solução rápida é usar outra tag para o efeito de fundo transparente, como a span, por exemplo.

Explicando:

O jquery apenas atribui a classe "descri" a todos os "P"s (paragrafos) que estão dentro das LIs e atribui uma função ao HOVER das LIs, ou seja, ao passar o mouse ele mostra o respectivo "P" filho e ao sair com o mouse ele esconde o mesmo P.

O uso das tags div não influenciam no funcionamento do jquery, já que ele trabalha somente com os elementos P e não com os filhos.

Huuumm...a tag <span> não tem limite de altura?

Outra coisa, notei no seu código que você bota um padding na tag que funcionará como a #box. Se usar padding, o elemento que servirá de fundo transparente vai ficar "x" espaçado das laterais do elemento pai, fazendo com que a transparencia funcione inadequadamente, deixando algum ou alguns espaços sem transparencia.

Explicando:

É vdd, não prestei atenção nisso, mas o fato é que as posiçoes não estão dando certo com o top e left.

pra deixar mais claro as analogias do código do grande Kakarotto para o meu:

|p.descri - > div#box

|div.f-transp - > div.f-transp (não está no HTML, mas eu testei e não funcionou)

|<img

|<a href -> <p>Conteúdo, Conteúdo </p>

|<a href

|<span>

Vixiii, num sei se consegui, mas tentei explicar melhor...

Vleu kaka! abraço!

Link para o comentário
Compartilhar em outros sites

  • 0

Fala Allan, vamo lá:

Explicando:

O jquery apenas atribui a classe "descri" a todos os "P"s (paragrafos) que estão dentro das LIs e atribui uma função ao HOVER das LIs, ou seja, ao passar o mouse ele mostra o respectivo "P" filho e ao sair com o mouse ele esconde o mesmo P.

Foi o que eu pensei a princípio, mas na prática se você botar um div ali não funciona...mas se usar um span ele funciona normalmente...Não sei o que o Jquery faz, mas dá uma zica legal usar um div ali dentro do p.

Agora, pensando bem...semanticamente não sei se é válido botar um div dentro de uma tag p...me surgiu essa dúvida. Tenho a leve impressão de que a tag p é "menor" que a div, é como se fizessemos: <i><a href=""></a></i> é errado.

De qualquer forma consegui o efeito de transparencia colocando uma span ali dentro:


<HTML>
<HEAD>
<TITLE>Novo Documento</TITLE>
<script src="http://jqueryjs.googlecode.com/files/jquery-1.2.3.js"></script>
<style>
p.descri{
position:absolute;
width:145px;
height:auto;
background:#FFFFFF;
text-align:left;
padding:0px;
color:#FF6600;
border:2px solid #009DE0;
margin-left:176px;
margin-top:-15px;
overflow:hidden; /*O overflow é usado para inibir o aumento não desejado do div.*/
z-index:0;
}
p.descri IMG{
width:140px;
height:100px;
margin-top:3px;
margin-bottom:5px;
margin-left:2px;
border:#000000 1px solid;
}

.f-transp{
position:absolute; top:0; left:0;
width:100%; height:300px;
width:inherit;
background:red;
filter:alpha(opacity=30, finishopacity=30, style=1);
opacity:.3;
-moz-opacity:.3;
-khtml-opacity:.3;
border:none;
z-index:-1
}

</style>
</HEAD>
<BODY>
<div id="menu">
<div>
<ul>
<li>
<a href="#">menu1</a>
<p>
<span class="f-transp"></span>
<img src="imagem.jpg" alt="imagem" title="imagem" />
<a href="link1.php" title="link1">Link1</a>
<a href="link2.php" title="link2">Link2</a>
<span title="Mais info"><a href="maisinfo.php" title="Mais info">Veja mais</a></span>
</p>
</li>
</ul>
</div>
</div>

<script>

var ul_s = $('div#menu DIV > UL').children();

divs_li = ul_s.children('p');
divs_li.addClass('descri');
divs_li.hide();

ul_s.hover(function(){
$(this).children('p').show();
},function(){
$(this).children('p').hide();
});
</script>
</BODY>
</HTML>
[/codebox]

Uma coisa que esqueci de comentar no meu post inicial, o height 100% funciona sem o doctype, com doctype é desaconselhavel usar porcentagem. Também é desaconselhavel usar quando existe um elemento inicialmente vazio, o div usado para o fundo vai ficar do tamanho do elemento vazio, ao colocar um conteúdo tardiamente, o div usado para transparencia não se redimensionará.

Uma solução, que usei no exemplo acima, é botar o height com altura maior que a do elemento pai. Não aparecerá, pois o pai tem atributo overflow:hidden.

É, cada um tem uma opinião sobre o uso de frameworks, pra mim até agora, só facilitou e muito, talvez pelo fato d eu ser amador mesmo!

Você não me entendeu, eu disse que ele era uma ótima ferramenta para quem conhece MUITO javascript. O fato dela só ter te facilitado até agora significa que você conhece muito javascript, diferentemente de mim, que entendo pouco, só me complica.

Aquele abraço o/

Link para o comentário
Compartilhar em outros sites

  • 0

Parabéns Kakarotoo!!!

Valeu!

Só não entendi porque é desaconselhável usar porcentagem com doctype, acho que eu nunca tive problemas com isso...apesar que raramente uso %...Mas a tua dica foi boa, deu certinho mesmo...agora só eu ver como faço no lugar dos paddings né...

E sobre o jquery, não me considero um conhecedor de JS, olhando os posts por aí você me deixa no chinelo...ehhee...é sério! Bom...sei lá também...

Isso Kaka...vleu, até a próxima!!!

Link para o comentário
Compartilhar em outros sites

  • 0

uiaaaa!!!!

resolvido o padding....

fiz assim, coloquei o padding no P:

p.descri{
    ...
    padding:5px;
    ...
}
aí deu um erro, como o velho kaka flow...fiz o seguinte, coloquei um padding na span transparente com valor herdado:
span.f-transp{
    ...
    padding:inherit;    
    ...
}

fiz isso e pimba..hhehe...funcionou direitinho...bem como eu queria!!! ah e esse valor "inherit" eu li uma vez e até tinha eskecido q existia...quando eu revi no post do kaka, lembrei...e já usei ele pra esta aplicação!!

vleu!!!

abração!

[EDITADO]

voltei...=/

testei no IEca7 e IEca6, sem sucessos no segundo, ele não pegou o paddin:inherit; tive que colocar padding:5px; na transparente também...

enfim...acho q agora tah td certo..

Editado por Allan Rodrigo
Link para o comentário
Compartilhar em outros sites

  • 0

padding:inherit;
não é suportado pelo IE6 =/ somente o ie7, FF e complacentes. tente ao invés de definir com inherit usar duplo SELETOR
p.descri{
    ...
/*estilo do p.descri*/
    ...
}
span.f-transp{
    ...
/*estilo do span.f-transp*/
    ...
}
p.descri, span.f-transp{
    padding:5px;
}

falow abraço ;)

Link para o comentário
Compartilhar em outros sites

  • 0

Nossa, por onde será que anda o Allan...sumiu o garoto....

Enfim, tava dando uma bisoiada nesse post, esqueci de esclarecer uma coisa:

Só não entendi porque é desaconselhável usar porcentagem com doctype, acho que eu nunca tive problemas com isso...apesar que raramente uso %...Mas a tua dica foi boa, deu certinho mesmo...agora só eu ver como faço no lugar dos paddings né...

Não é que é desaconselhável, é que simplesmente não funciona. A porcentagem não funciona para o atributo height quando o documento está em doctype. Por que? Não faço a menor idéia.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...