Устранить вспышку неустановленного контента
Как остановить флеш-контент (FOUC) на веб-странице?
17 ответов
Что я сделал, чтобы избежать FOUC:
Установите секцию тела как:
<body style="visibility: hidden;" onload="js_Load()">
Напиши
js_Load()
Функция JavaScript:document.body.style.visibility='visible';
При таком подходе тело моей веб-страницы остается скрытым, пока не загрузятся полная страница и CSS-файлы. Как только все загружено, событие onload делает тело видимым. Таким образом, веб-браузер остается пустым до тех пор, пока все не появится на экране.
Это простое решение, но пока оно работает.
Проблема с использованием стиля css для первоначального скрытия некоторых элементов страницы, а затем с помощью javascript, чтобы изменить стиль обратно на видимый после загрузки страницы, состоит в том, что люди, у которых не включен javascript, никогда не увидят эти элементы. Так что это решение, которое не ухудшается изящно.
Поэтому лучше использовать javascript для первоначального скрытия, а также для повторного отображения этих элементов после загрузки страницы. Используя jQuery, у нас может возникнуть соблазн сделать что-то вроде этого:
$(document).ready(function() {
$('body').hide();
$(window).on('load', function() {
$('body').show();
});
});
Однако, если ваша страница очень большая с большим количеством элементов, этот код не будет применен достаточно скоро (тело документа не будет готово достаточно скоро), и вы все равно можете увидеть FOUC. Тем не менее, есть один элемент, который мы МОЖЕМ скрыть, как только сценарий встречается в заголовке, даже до того, как документ готов, - тег HTML. Таким образом, мы могли бы сделать что-то вроде этого:
<html>
<head>
<!-- Other stuff like title and meta tags go here -->
<style type="text/css">
.hidden {display:none;}
</style>
<script type="text/javascript" src="/scripts/jquery.js"></script>
<script type="text/javascript">
$('html').addClass('hidden');
$(document).ready(function() { // EDIT: From Adam Zerner's comment below: Rather use load: $(window).on('load', function () {...});
$('html').show(); // EDIT: Can also use $('html').removeClass('hidden');
});
</script>
</head>
<body>
<!-- Body Content -->
</body>
</html>
Обратите внимание, что метод jQuery addClass() вызывается * вне * метода.ready() (или лучше.on('load')).
Это тот, который работал для меня и не требует JavaScript, и он прекрасно работает для страниц с большим количеством элементов и большим количеством CSS:
Сначала добавьте выделенный <STYLE>
установка для <HTML>
тег с видимостью "скрытый" и непрозрачностью как "0" в верхней части HTML-кода, например, в начале <HEAD>
Элемент, например, в верхней части вашего HTML добавить:
<!doctype html>
<html>
<head>
<style>html{visibility: hidden;opacity:0;}</style>
Затем в конце вашего последнего файла таблицы стилей.css установите стили видимости и непрозрачности на "видимый" и "1" соответственно:
html {
visibility: visible;
opacity: 1;
}
Если у вас уже есть существующий блок стиля для тега "html", то переместите весь стиль "html" в конец последнего файла.css и добавьте теги "visibility" и "opacity", как описано выше.
https://gist.github.com/electrotype/7960ddcc44bc4aea07a35603d1c41cb0
Решение только для CSS:
<html>
<head>
<style>
html {
display: none;
}
</style>
...
</head>
<body>
...
<link rel="stylesheet" href="app.css"> <!-- should set html { display: block; } -->
</body>
</html>
Когда браузер анализирует HTML-файл:
- Первое, что он будет делать, это спрятаться
<html>
, - Последнее, что он сделает, это загрузит стили, а затем отобразит весь контент с примененными стилями.
Преимущество этого решения по сравнению с решением, использующим JavaScript, заключается в том, что оно будет работать для пользователей, даже если у них отключен JavaScript.
Примечание: вы можете поставить <link>
Внутри <body>
, Я считаю это недостатком, потому что это нарушает обычную практику. Было бы хорошо, если бы был defer
атрибут для <link>
как есть для <script>
потому что это позволило бы нам поместить его в <head>
и по-прежнему достичь нашей цели.
Решение, которое не зависит от jQuery, которое будет работать во всех текущих браузерах и ничего не делать в старых браузерах, включает в ваш тег head следующее:
<head>
...
<style type="text/css">
.fouc-fix { display:none; }
</style>
<script type="text/javascript">
try {
var elm=document.getElementsByTagName("html")[0];
var old=elm.class || "";
elm.class=old+" fouc-fix";
document.addEventListener("DOMContentLoaded",function(event) {
elm.class=old;
});
}
catch(thr) {
}
</script>
</head>
Благодаря @justastudent я попробовал просто установить elm.style.display="none";
и он, кажется, работает как хотелось бы, по крайней мере, в текущем квантовом Firefox. Итак, вот более компактное решение, которое пока является самой простой вещью, которую я нашел, которая работает.
<script type="text/javascript">
var elm=document.getElementsByTagName("html")[0];
elm.style.display="none";
document.addEventListener("DOMContentLoaded",function(event) { elm.style.display="block"; });
</script>
Другое быстрое исправление, которое также работает в Firefox Quantum - это пустое <script>
тег в <head>
, Это, однако, снижает ваши оценки скорости страниц и общее время загрузки.
У меня был 100% успех с этим. Я думаю, что это также главная причина, почему выше решения с другими JS в работе.
<script type="text/javascript">
</script>
Каждый ответ на этой странице замедляет загрузку и только скрывает основную проблему. Если вы испытываете FOUC, узнайте, ПОЧЕМУ это происходит, и исправьте это.
В основе происходит следующее:
- потому что ваши таблицы стилей загружаются неправильно: они должны загружаться через тег в HTML, а не через JavaScript
- потому что ты разместил
script
теги передlink
теги, которые могут вызвать «операцию макета» и заставить браузер отобразиться еще до того, как он попытается загрузить стиль.
Для справки, вот пример FOUC:
Никто не говорил о CSS @import
Это была проблема для меня, я загружал две дополнительные таблицы стилей прямо в мой файл CSS с @import
Простое решение: заменить все @import
ссылки с <link />
Вот мой код.. надеюсь, это решит вашу проблему
set <body style="opacity:0; >
<script>
$(document).ready(function() {
$("body").css('opacity', 1);
});
</script>
Я придумал способ, который не требует никакого реального изменения кода, ух-да! Моя проблема была связана с импортом нескольких файлов CSS ПОСЛЕ некоторых файлов JavaScript.
Чтобы решить эту проблему, я просто переместил свои CSS-ссылки так, чтобы они были выше моего импорта javascript. Это позволило импортировать весь мой CSS и готово к работе как можно скорее, поэтому, когда HTML-код появляется на экране, даже если JS не готов, страница будет правильно отформатирована
Простое решение, позволяющее избежать появления нестилизованного контента без javascript:
<!DOCTYPE html>
<html>
<head>
<title>Bla bla</title>
<link href="..." rel="stylesheet" />
<link href="..." rel="stylesheet" />
</head>
<body style="opacity: 0">
<!-- All HTML content here -->
<script src="..."></script>
<script src="..."></script>
<style>
body {
opacity: 1 !important;
}
</style>
</body>
</html>
Когда синтаксический анализатор достигает тела, он затухает с помощью «opacity: 0». Когда синтаксический анализатор, наконец, достигает самого низа после того, как все остальное проанализировано, тело снова отображается с использованием стиля на странице. Ключевое слово! Important там важно ;-), потому что оно отменяет предыдущий встроенный стиль тега body.
В этом случае использование «opacity: 0» для затухания лучше, чем «display: none», потому что, если у вас есть операции макета, выполняемые javascript, они могут не работать, если затронутый элемент не отображается.
У меня это сработало.
Для меня исправить FOUC в FireFox было легко, просто изменив код ссылки CSS в моем<head>
из этого:
<link rel="stylesheet" href="/assets/main.css">
...К этому:
<link rel="stylesheet" type="text/css" href="/assets/main.css" />
Я считаю, что в том числеtype="text/css"
помогает FireFox определить приоритет загрузки и рендеринга CSS? Это мое мнение. Ваше здоровье!
Лучшее решение, которое я нашел до сих пор, выглядит так:
Добавьте все стили вашего заголовка в
<style/>
тег в<head/>
в верхней части тега стиля добавить
.not-visible-first{visibility: hidden}
+ другой стиль заголовкаДобавить css через JS в конец тела
document.getElementsByTagName("head")[0].insertAdjacentHTML("beforeend","<link rel=\"stylesheet\" href=\"/css/main.min.css?v=1.2.4338\" />");
И не забудьте добавить
.not-visible-first{visibility: visible}
до концаmain.min.css
Эта опция улучшит пользовательский интерфейс
Вы можете попробовать это с ванилью
function js_method(){
//todos
var elementDiv = document.getElementById("main");
elementDiv.style.display ="block";
}
<body onload="js_method()" id="main" style="display:none">
//todos
<h2>Hello</h2>
</body>
Самый простой способ, который я знаю, - это скрыть тег html, а затем в нижней части вашего файла javascript добавить тег html.
HTML
<html style="display:none;">
...
</html>
Javascript
/*
* FOUC Fix - Flash of Unstyled Content
* By default, the <html> tag is hidden to prevent the flash of unstyled content.
* This simple fadeIn() function will allow the page to gracefully fade in once
* all assets are loaded. This line of code must remain at the bottom of the js
* assets.
*/
$( 'html' ).fadeIn();
Источник: https://gist.github.com/marchershey/139db0e8fd6f03a83578698409d333ce
Многие решения предлагают загрузку страницы onLoad(). Проблема с этим подходом заключается в том, что у пользователя не включен Javascript.
Простое решение для меня было: 1. спрятать HTML в вашем до загрузки ссылки на таблицу стилей, вот так
<head>
<style> html { display: none; } </style>
<link rel="stylesheet" href="myStylesheet.css" />
</head>
2. в начале вашей таблицы стилей снова отобразите html
// first line in myStylesheet.css
html {
display: block;
}
Вы можете увидеть более подробную информацию в моей статье https://www.nnsoftware.at/blog/avoiding-flash-of-unstyled-content:
Если это произойдет только с вами в FireFox в 2021 году, вы можете проверить этот пост и увидеть очень простое решение:
Вспышка нестилизованного содержимого (FOUC) только в Firefox? FF медленный рендерер?