JQuery, скрыть div без нарушения остальной части страницы

Рассмотрим страницу, как показано ниже (псевдокод)

<header>
    <search>
        <form>
            <input text> <input submit>
        </form>
    </search>
    <menu>
        <ul>
            <li>File</li>
            <li>Edit</li>
            <li>Text</li>
        </ul>
    </menu>
</header>

<content></content>

<footer></footer>

Когда страница загружается, я хочу, чтобы заголовок отображался, скажем, 10 секунд, а затем исчезал в течение следующих нескольких секунд. Я могу выполнить это с помощью

jQuery.fn.delay = function(time, func){
    return this.each(function(){
        setTimeout(func, time);
    });
};

$("header").delay(5000, function() { $(this).fadeOut(2000) });

Проблема заключается в том, что, когда заголовок исчезает, остальная часть страницы (контент, нижний колонтитул) поднимается вверх, чтобы занять место, занятое заголовком. Я хочу, чтобы заголовок был вроде "display: block" в этом, его место никогда не сдавалось.

Затем, после того, как заголовок исчез, я хотел бы вернуть его на mouseOver и снова исчезнуть на mouseOut. Я попробовал следующее

$("header").hover(function() { $(this).show("slow"); $(this).hide("slow") });

Но это не похоже на работу. Во-первых, заголовок загорается и выходит, а также приводит к тому, что остальная часть страницы перемещается вверх.

Как я могу выполнить эффект?

Ответ 1

.fadeOut() заканчивается с помощью display: none;, если вы не хотите этого делать, используйте .fadeTo() (который не будет устанавливать display в конце), например:

$("header").delay(5000).fadeTo(2000, 0);

(обратите внимание, что используется встроенная функция .delay())

Здесь вы можете попробовать полную демонстрацию, при этом функция зависания замирает и не вызывает движения, например:

$("header").hover(function() { 
  $(this).fadeTo(600, 1); 
}, function() { 
  $(this).fadeTo(600, 0); 
});

Ответ 2

Используйте visibility:hidden, он скроет элемент так же, как display:none, но макет не изменится.

Вы можете использовать функцию анимации. например.

 $('#header').animate({opacity: 0}, 2000);

 $("#header").hover(
     function() {  
       $(this).animate({opacity: 1}, 400);
       // you can also use one of the below
       // $(this).css("opacity","1"); 
       // $(this).fadeTo(400, 1);
     },
     function() { 
       $(this).animate({opacity: 0}, 400);
     }
 );

Вы также можете использовать fadeTo, как упоминал Ник. fadeTo внутренне устанавливает непрозрачность, равную второму параметру.

Ответ 3

Добавьте контейнер вокруг заголовка и настройте его с помощью display:block и фиксированной ширины/высоты. Когда вы уменьшите заголовок, контейнер сохранит пространство, занятое заголовком.

Таким образом, у вас есть элемент для привязки события hover, для повторного отображения заголовка после его исчезновения. После скрытия заголовок не сможет получать свои собственные события hover, поэтому контейнер должен получить их на своем месте.

Ответ 4

Попробуйте добавить обратный вызов к функции hide, которая изменит ее на скрытую видимость.

$(this).hide("slow", function(){
   $(this).css("visibility", "hidden");
   $(this).css("display", "block");
});

Было бы неплохо, если jQuery позволит вам указать, использовать ли отображение или видимость при скрытии чего-то, но я не думаю, что это так.

Ответ 5

Вы можете просто поместить заголовок внутри другого и стиль, чтобы div был такой же высоты, как и заголовок. Затем, если jQuery удалил заголовок, это не повлияет на страницу.

В качестве альтернативы, как говорит Лобо, вы можете использовать видимость: скрытый, но я думаю, что будет трудно заставить jQuery не устанавливать его отображение: none anyway.

Ответ 6

Поместите свой заголовок абсолютно таким образом, его присутствие (или его отсутствие) не повлияет на другие элементы страницы