Как исправить мерцание, возникающее при использовании slideToggle в jQuery?

У меня есть простой неупорядоченный список, который я хочу отображать и скрывать при нажатии с помощью jQuery slideUp и эффекта slideDown. Кажется, все работает нормально, однако в IE6 список будет скользить вверх, мигать на долю секунды, а затем исчезать.

Кто-нибудь знает, как исправить это?

Спасибо!

Люди должны прекратить поддерживать IE6 сейчас

Ben Shelock 24.11.2009 23:22

Почему? Некоторые компании до сих пор к нему привязаны. Например, компании с тысячами рабочих станций, где обновление Internet Explorer на каждой машине будет стоить очень дорого. К сожалению, это еще какое-то время.

Martin Bean 01.09.2010 13:50

Facebook и Apple отказались от поддержки IE6

go minimal 13.10.2010 02:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
12
3
25 521
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

$(document).ready(function() {
    // Fix background image caching problem
    if (jQuery.browser.msie) {
        try { 
            document.execCommand("BackgroundImageCache", false, true); 
        } catch(err) {}
    }
};

По-видимому.

Вы можете убрать оператор if, но это может немного снизить производительность в браузерах, отличных от IE6, потому что они попытаются выполнить код (и потерпят неудачу).

Oli 21.09.2008 21:05

Это действительно полезная информация, но, к сожалению, она не решает возникшую у меня проблему ... Я добавил код, и мой список все еще мигает.

go minimal 21.09.2008 21:18

Я хотел бы найти это первым, потому что он устранил мою проблему в ie6. Спасибо

Kevin 23.10.2009 19:35

Черт возьми, это великолепно! Это мерцание беспокоит меня годами!

Olly Hodgson 04.12.2009 13:55

Замечательно! Большое спасибо за совет!

Michal Chruszcz 24.02.2011 21:07

Просто позвольте IE6 мерцать. Я не думаю, что стоит тратить время на умирающий браузер, когда ваша базовая функциональность работает достаточно хорошо. Если вы беспокоитесь о мерцании по причинам доступности, просто понюхайте IE6 и замените анимацию на общие show () и hide (). Я рекомендую избегать сложного кода для крайних случаев, которые не имеют значения.

+1 как я в принципе согласен. Хотя на практике я отмечу, что это еще не выполнимо на 100%. Многим предприятиям (в том числе моему работодателю) требуется поддержка уровня А в IE6. Зависит от аудитории, хотя, к счастью, аудитория сокращается.

Rex M 21.07.2009 08:46

Я в той же лодке относительно моей компании. Более 3/4 компаний используют ie6.

Kevin 23.10.2009 17:45

Если 75% вашей компании все еще используют IE6, возможно, пришло время либо пересмотреть свою карьеру, либо просто перестать предлагать тонкости анимации.

Ryan McGeary 23.10.2009 21:09

Исправление Оли, кажется, применимо только к мерцающему фону, что здесь не так.

Совет Райана МакГири убедителен, за исключением случаев, когда клиент / ваш начальник категорически требуют, чтобы IE6 не вел себя так, как будто у него алкогольный синдром плода.

Я нашел решение здесь: Ошибки с эффектом слайда в IE 6 и 7, начиная с версии 1.1.3

В начало файла добавлено объявление doctype (почему его не было раньше? Кто знает!), И мерцание исчезло, и его больше не было видно.

Ответ принят как подходящий

Приносим извинения за дополнительный комментарий (я не могу проголосовать или прокомментировать ответ Павла), но добавление DOCTYPE устранило эту проблему для меня, и эффекты слайд-вверх / вниз / переключения теперь работают правильно в IE7.

См. Список отдельно для получения дополнительной информации о DOCTYPES, или вы можете попробовать указать довольно мягкий вариант 4 / Transitional:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

Спасибо большое! Теперь отлично работает. Хороший старый StackOverflow. :-)

Ducain 24.07.2009 22:22

Удивительно, как DOCTYPE может иметь такое огромное значение

MunkiPhD 04.09.2009 21:44

Этот тип документа сломал мою страницу. Мой процессор опустился на 50%, и я перестал работать. Я использую IE8.

Kees C. Bakker 24.02.2011 17:36

Я опубликовал решение для быстрого исправления на http://blog.clintonbeattie.com/how-to-solve-the-jquery-flickering-content-problem/

Короче говоря, добавьте overflow: hidden к содержащему элементу, который вы вставляете / выходите. Надеюсь это поможет!

Из того, что я слышал и пробовал (включая другие предложения здесь), все еще есть ситуации, когда мерцание будет оставаться заметным, особенно когда у вас нет возможности легко выйти из режима причуд. В моем случае мне пришлось пока оставаться в режиме причуд, и другие предложения по-прежнему не помогли мне решить проблему. Я закончил тем, что добавил небольшое обходное решение, пока мы наконец не сможем выйти из режима причуд:

//Start the slideUp effect lasting 500ms
$('#element').slideUp(500);

//Abort the effect just before it finishes and force hide()
//I had to play with the timeout interval until I found one that
// looked exactly right. 400ms worked for me.
setTimeout(function() {
    $('#element').stop(true, true).hide(); 
}, 400);

Я работаю с каруселью, которая имеет размеченную копию поверх некоторых фоновых слайдов. Переход между слайдами - затухание. Пока все хорошо.

Но некоторые части копии исчезают после загрузки слайда. И затем постепенное исчезновение прямо перед переходом между слайдами. Эта копия, неупорядоченный список ссылок (UL > LI*2 > A), плавно появляется на фоне слайда. Это тоже нормально в любом браузере кроме IE. У IE был мерцающий фон на UL.

Произошло то, что одновременно было запущено два затухания: фоновое изображение на слайде и UL. Я использовал функцию прототипирования СерджиоsetTimeout для запуска UL fadeIn () после завершения загрузки слайда. Затем я вызвал другой setTimeout, чтобы сделать переход между слайдами сразу после UL fadeOut ().

setTimeout - ваш друг в борьбе с мерцанием IE.

Этот код не зависит от браузера (без обнаружения браузера), отлично работает и воспроизводит поведение метода .slideUp

$("#element").animate({
     height: 1,          // Avoiding sliding to 0px (flash on IE)
     paddingTop: "hide",
     paddingBottom: "hide"
     })
     // Then hide
     .animate({display:"hide"},{queue:true});

Это хорошая и простая замена

Dexter 24.01.2011 18:35

Сегодня у нас была такая же проблема. Не только в IE6, но и в IE8! Я исправил это с помощью скрыть div несколько раньше, используя тайм-аут:

var pane = $('.ColorPane');
var speed = 500;
window.setTimeout(function() { pane.css('display', 'none'); }, speed - 100);
pane.slideUp(speed);

Надеюсь, это поможет некоторым из вас.

Не знаю, прочитает ли кто-нибудь этот ответ, но вот обходной путь для тех, кто, как я, не может добавить тип документа на страницу (спасибо шаблонам по умолчанию Sharepoint 2007), не потратив несколько дней на полную ревизию шаблона.

В документе без DOCTYPE мерцание возникает, когда высота элемента достигает 0. Таким образом, я нашел обходной путь: анимировать мои элементы до высоты 1 пиксель, а не 0.

Нравится:

$(".slider").click(function (e) {
   $(this).animate({"height" : "1px"});
});

Надеюсь, это поможет.

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

Другие вопросы по теме