Pergunta

Eu tenho duas divs (um deles escondida com CSS), que eu estou entrando e saindo em alternância dentro de um espaço comum, em foco.

Esta é a marcação:

<div id="wrap">

    <div class="image">
        <img src="http://domain.com/images/image.png">
    </div>

    <div class="text hide">
        <p>Text text text</p>
    </div>

</div>

E eu estava aplicando esse código jQuery para fazer desaparecer a imagem - e desaparecendo no texto, em foco:

<script type="text/javascript">
$(function(){
$('#wrap').hover(
        function(){
            $('#wrap .image').fadeOut(100, function(){
                $('#wrap .text').fadeIn(100);                        
            });
        },
        function(){
            $('#wrap .text').fadeOut(100, function(){
                $('#wrap .image').fadeIn(100);                       
            });
        }
        );
});
</script>

Mas o problema é que a div de texto fica pegajosa e não vai desaparecer -. Sempre que o movimento do mouse é muito rápida

Você sabe onde ele pode ser a solução para isso?

Eu configurar um teste on-line: http://paragraphe.org/stickytext/test.html

Obrigado por qualquer dica

Foi útil?

Solução

Se o seu invólucro não tem uma largura e altura em que você pode obter alguns resultados estranhos como ele encolhe uma vez que o elemento de imagem é removido. Para ver, adicionar uma borda e altura / largura fixa em todo o wrapper. Ou, pelo menos, usar a mesma altura para a imagem eo texto divs.

<style type="text/css">
#wrap { width: 200px; height: 200px; border: 1px solid black; }
</style>

EDITADO

Removido um exemplo de código que não era aplicável ao que você está tentando realizar.

Outras dicas

tente usar .Stop () na sua função de pairar-out, o que impedirá a corrida condição onde você se move rapidamente o mouse sobre as divs

<script type="text/javascript">
$(function(){
$('#wrap').hover(
    function(){
            $('#wrap .image').fadeOut(100, function(){
                $('#wrap.text').fadeIn(100);
            });
    },
    function(){
            $('#wrap.text').stop().fadeOut(100, function(){
               $('#wrap.image').stop().fadeIn(100);                                            
            });
    }
    );
});
</script>

Tente usar a fila:

<script type="text/javascript">
$(function(){
    $('#wrap').hover(
        function(){
            $('#wrap .image').stop(true).fadeOut(100);
            $('#wrap .image').queue(function(){
                $('#wrap.text').fadeIn(100);
                $(this).dequeue();
            });
        },
        function(){
            $('#wrap .image').stop(true).queue(function(){
                $('#wrap.text').fadeOut(100);
                $(this).dequeue();
            });
            $('#wrap .image').fadeIn(100);
        }
    );
});
</script>

A fila jQuery é por elemento, então o que eu estou tentando fazer aqui é lançar os efeitos de texto sob fila de imagem.

E deixe-me dar-lhe uma outra sugestão. Se sua intenção é aplicar este efeito a vários classe imagens uso em vez de id.

...
    $('.wrap').hover(
        function(){
            var wrap = this;
            $('.image', wrap).stop(true).fadeOut(100);
            $('.image', wrap).queue(function(){
                $('.text', wrap).fadeIn(100);
                $(this).dequeue();
            });
....

Desta forma, você só precisa chamar isso de uma vez.

O seu código nunca desaparece da div texto. Ambas as funções do evento em foco vai desaparecer a imagem e desaparecer no texto.

Você tem o mesmo código em ambas as funções hover. você não deve substituir os seletores no segundo caso?

<script type="text/javascript">
$(function(){
$('#wrap').hover(
    function(){
            $('#wrap .image').fadeOut(100, function(){
                $('#wrap.text').fadeIn(100);
            });
    },
    function(){
            $('#wrap.text').fadeOut(100, function(){
               $('#wrap.image').fadeIn(100);                                            
            });
    }
    );
});
</script>

obrigado por todas as dicas:

Eu tentei usar o mouseenter / eventos MouseLeave, uma vez que eles parecem olhar em detalhe para os divs que estão a tratar ( como visto aqui ), mas nada mudou. Então, vendo que todas as instruções habituais jQuery não estavam respondendo Eu verifiquei como sugerido meu CSS.

E lá estava o truque.

O que eu tinha:

.text p{position:relative; top:-370px; padding: 0 10px}

foi a criação de um espaço enorme, vazia que o navegador estava interpretando como "não à esquerda ainda" pelo cursor (notei que sobrevoar o espaço vazio estava fazendo o texto para responder adequadamente).

Então eu mudei para que:

.text {margin-top:-370px; padding: 0 10px; float:left}

que permite a tag "p" sozinho, e as posições do segundo bloco acima no div, mas sem um traço de espaço vazio por trás dele.

Em seguida, sobre o trecho, que vai funcionar bem com mouseenter / moseleave e pairar :

<script type="text/javascript">
$(function(){
$('#wrap').mouseenter(
        function(){
            $('#wrap .image').fadeOut(100, function(){
                $('#wrap .text').fadeIn(100);                        
            });
        }
        );
$('#wrap').mouseleave(
        function(){
            $('#wrap .text').fadeOut(100, function(){
                $('#wrap .image').fadeIn(100);                       
            });
        }
        );
});
</script>

Esta é a versão melhorada http://paragraphe.org/nice/test.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top