Pergunta

Perdoe-me se isto tem sido abordado antes, não consegui encontrar nada.

Eu estou animando uma barra de conteúdo que que tem crianças posicionados absolutamente fora dela (via margens negativas). A ideia é que as crianças vão animar com a barra à medida que expande.

O que acontece é assim que a animação começa às crianças desaparecem, e depois reaparecer quando a animação está completa. É como se a necessidade de animação para completar antes de o navegador sabe onde colocar as crianças.

Eu tenho carregado um exemplo realmente simples aqui, todos os scripts incluídos na página: http://www.ismailshallis.com/jdemo/

O que está realmente acontecendo? Quais são as minhas opções para contornar este?

Muito obrigado antecipadamente,

Belinda

Foi útil?

Solução

Quando jQuery é animar tanto a altura ou a largura de um elemento, ele irá definir automaticamente overflow: hidden no elemento enquanto a animação está acontecendo. Desde o seu elemento filho é posicionada no exterior, é tecnicamente parte do estouro. O comentário na fonte jquery perto do código que é que isto diz "// Certifique-se de que nada sai escondida." Se você incluir a fonte jquery descompactado e comentar a linha 4032 do jQuery-1.3.2.js (dentro da função animate):

//this.style.overflow = "hidden";

Você vai ver que a animação funciona da maneira desejada. Eu não tenho certeza de uma solução alternativa que não seja modificando a fonte jquery comentando essa linha acima.

Outras dicas

A partir do jQuery 1.4.3 não há outra solução que não requer modificação de jQuery. Se você definir o estilo 'estouro' do elemento que você está animando como um estilo inline antes de iniciar a animação, em seguida, jQuery não vai definir o estilo 'estouro' para escondido. Por exemplo:

<script type="text/javascript">
    $(document).ready(function() {
        $("#box a").click(function() {
            $("#box")

            // Prevents absolutely positioned elements from getting clipped.
            .css('overflow', 'visible')

            .animate({
                height: "410px"
            })

            // Reset the 'overflow' style.  You could also put this in the 
            // animate() callback.
            .css('overflow', '');
        });
    });
</script>

Bem - parece que é uma função do navegador ou jQuery, não necessariamente da maneira que você construiu seu HTML ou Javascript. Digo isto porque parece apenas a área de pixels dentro da caixa delimitadora do elemento DOM parece ser processado (tente mover o texto para que metade do texto está fora e metade dentro ... você vê um "cut off" peça de texto como ele anima.)

Então aqui está o trabalho em torno: Ele usa um DIV invólucro em torno "#box" e "#outside" de tal forma que ambos estão dentro da caixa delimitadora do invólucro

.

CSS:

    #boxWrapper {
        position: fixed;
        top: 50%;
        left:  50%;
        width: 200px;
        height: 200px;
        margin-left: -100px;
        margin-top: -120px; /* extra 20px for the #outside */
        background:#ccc;
    }

    #box {
        background: #000;
        height:100%;
        width:100%;
        margin-top:20px; /* give 20px for the #outside */
    }

    #outside {
        background:darkblue;
        position: absolute;
        top: 0px;
        right: 0; }

E o HTML:

<div id="boxWrapper">
    <div id="box">
        <a href="#">CLICK ME</a>
        <div id="outside">
            I'm positioned OUTSIDE the box
        </div>
    </div>
</div>

E o Javascript:

<script type="text/javascript">
    $(document).ready(function() {

            $("#box a").click(function(){
                $("#boxWrapper").animate({ 
                        height: "410px",
                        opacity: 0.9,
                        top: "25%"
                      }, 1000 );
                return false;
            });
        }); 

</script>   

Como alternativa, você pode indicar sua preferência de que o elemento permanecem visible usando a especificação !important.

#box {
  overflow: visible !important;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top