Я заметил, что в последнее время многие сайты медленно отображают текст. Обычно фон, изображения и т. д. загружаются, но текст не загружается. Через некоторое время текст начинает появляться то тут, то там (не всегда весь одновременно).
По сути, это работает наоборот, как раньше, когда сначала отображался текст, потом изображения, а остальное загружалось потом. Какая новая технология создает эту проблему? Есть идеи?
Обратите внимание, что у меня медленное соединение, что, вероятно, усугубляет проблему.
Ниже приведен пример — все загружено, но требуется еще несколько секунд, прежде чем текст наконец отобразится:
решение1
Одна из причин заключается в том, что веб-дизайнеры в наши дни любят использовать веб-шрифты (обычно вУОФФформат), например черезВеб-шрифты Google.
Раньше на сайте отображались только те шрифты, которые пользователь установил локально. Так как, например, пользователи Mac и Windows не обязательно имели одинаковые шрифты, дизайнеры инстинктивно всегда определяли правила как
font-family: Arial, Helvetica, sans-serif;
где, если первый шрифт не был найден в системе, браузер искал второй и, наконец, резервный шрифт «sans-serif».
Теперь можно указать URL шрифта в качестве правила CSS, чтобы браузер загрузил шрифт, например:
@import url(http://fonts.googleapis.com/css?family=Droid+Serif:400,700);
а затем загрузить шрифт для определенного элемента, например:
font-family: 'Droid Serif',sans-serif;
Это очень популярно, чтобы иметь возможность использовать пользовательские шрифты, но это также приводит к проблеме, что текст не отображается, пока ресурс не будет загружен браузером, что включает время загрузки, время загрузки шрифта и время рендеринга. Я предполагаю, что это тот артефакт, с которым вы сталкиваетесь.
В качестве примера: одна из моих национальных газет,Dagens Nyheterиспользуют веб-шрифты для заголовков, но не для лидов, поэтому при загрузке сайта я обычно сначала вижу лиды, а через полсекунды все пустые места над ними заполняются заголовками (по крайней мере, это касается Chrome и Opera. Другие не пробовал).
(Кроме того, в наши дни дизайнеры буквально повсюду разбрасывают JavaScript, так что, возможно, кто-то пытается сделать что-то умное с текстом, поэтому он и задерживается. Хотя это будет очень специфично для сайта: я полагаю, что общая тенденция к задержке текста в наше время — это проблема веб-шрифтов, описанная выше.)
Добавление
Этот ответ получил много положительных отзывов, хотя я не стал вдаваться в подробности, или, возможно,потому чтооб этом. В теме вопросов было много комментариев, поэтому я попробую немного расширить ее (многие комментарии, похоже, исчезли вскоре после того, как тема была защищена — какой-то модератор, вероятно, вручную почистил их). Также прочитайте другие ответы в этой теме, поскольку все они расширяются по-своему.
Это явление, по-видимому, известно как «вспышка нестилизованного контента» в целом и «вспышка нестилизованного текста» в частности. Поиск «FOUC» и «FOUT» дает больше информации.
Я могу рекомендоватьПост веб-дизайнера Пола Айриша о FOUT в связи с веб-шрифтами.
Что можно заметить, так это то, что разные браузеры справляются с этим по-разному. Я писал выше, что тестировал Opera и Chrome, которые вели себя одинаково. Все браузеры на основе WebKit (Chrome, Safari и т. д.) предпочитают избегать FOUTнетотображение текста веб-шрифта с помощью резервного шрифта во время периода загрузки веб-шрифта.Даже есливеб-шрифт кэшируется, естьволябыть задержка рендеринга. В этой ветке вопросов есть много комментариев, в которых утверждается обратное и утверждается, что это в корне неверно, что кэшированные шрифты ведут себя подобным образом, но, например, по ссылке выше:
В каких случаях вы получите FOUT?
- Воля:Загрузка и отображение удаленного ttf/otf/woff
- Воля:Отображение кэшированного ttf/otf/woff
- Воля:Загрузка и отображение data-uri ttf/otf/woff
- Воля:Отображение кэшированных данных-uri ttf/otf/woff
- Не будет:Отображение шрифта, который уже установлен и назван в вашем традиционном стеке шрифтов
- Не будет:Отображение шрифта, установленного и названного с использованием расположения local()
Поскольку Chrome ждет, пока риск FOUT не исчезнет, перед рендерингом, это приводит к задержке.степеньэффект заметен (особенно при загрузке из кэша), по-видимому, он зависит, помимо прочего, от объема текста, который необходимо отрисовать, и, возможно, от других факторов, но кэширование не устраняет эффект полностью.
В конце поста Irish также приводит некоторые обновления, касающиеся поведения браузера по состоянию на 2011–04–14 гг.:
- Fire Fox(по состоянию на FFb11 и FF4 Final)больше нет FOUT!Ура!http://bugzil.la/499292В основном текст невидим в течение 3 секунд, а затем он возвращает резервный шрифт. Веб-шрифт, вероятно, загрузится в течение этих трех секунд… надеюсь..
- IE9 поддерживает WOFF, TTF и OTF (хотя для этого требуетсявстраиваемая бита установить вещь– в основном спорно, если вы используете WOFF).ОДНАКО!!! У IE9 есть FOUT.:(
- Webkit имеетзаплатка, ожидающая приземлениядля отображения резервного текста через 0,5 секунды. То же самое поведение, что и FF, но 0,5 секунды вместо 3 секунд.
- Добавление: Blink имеетдля этого тоже зарегистрирована ошибка, но, похоже, окончательного консенсуса относительно того, что с ним делать, пока не достигнуто — в настоящее время реализация та же, что и у WebKit.
Если бы этот вопрос был адресован дизайнерам, можно было бы рассмотреть способы избежания подобных проблем, например:webfontloader
, но это уже другой вопрос. Ссылка Пола Айриша дает более подробную информацию по этому вопросу.
решение2
Причина этого в том, что текст, который вы пока не можете прочитать, отображается с помощьювеб-шрифткоторый все еще находится на пути к вашему браузеру.
Кроме того, поскольку ваш браузер — Google Chrome, который использует WebKit для отображения страницы,это было решено ими(WebKit, то есть), что лучше вообще не видеть текст, пока не будет загружен веб-шрифт. Однако, если вы разработчик, который предпочитает, чтобы текст был читаемым в подходящем резервном системном шрифте, то вы можете использовать что-то вродеЗагрузчик WebFont от Googleдля достижения этой цели.
решение3
Естьнесколько причинвеб-сайтов, являющихся"медленно отображают свой текст". Медлительность наportableapps.comвызвано загрузкойУОФФшрифты. Однако то, что вы описываете как«текст начинает появляться то тут, то там»чаще всего вызваноАЯКС.
Веб-сайт состоит из многих частей. То, как эти части загружаются и собираются, являетсявыбор дизайнапод контролемвеб-дизайнер. Медлительность вызвана тем, как разработчик решает собирать следующие строительные блоки:
- Начальная HTML-страница
- CSS
- ДжС
- Изображений
- WOFF-шрифты
- AJAX-запросы
- Манипуляция DOM
Традиционно веб-сайты:
Традиционно разработчики обычно помещали текстовое содержимое вначальная HTML-страницаи отобразить егокак только он стал доступен. HTML будет ссылаться на несколько ресурсов, которые затем будут загружены. Браузер затем будетпостепенно перерисовыватьэкран для включения стилей и изображений по мере их появления. AJAX и WOFF были недоступны.
Веб-сайты WOFF:
Шрифты WOFF позволяют веб-сайту использовать шрифты, которые обычно недоступны браузеру,загрузка шрифтов с сайта. Некоторые разработчики дают браузеру указание не отображать текстовое содержимое, пока не будут загружены все шрифты WOFF. По моему опыту, этот подход пока не получил широкого распространения.
Сайты AJAX:
Некоторые разработчики предпочитают не включать текстовое содержимое в начальную HTML-страницу. Вместо этого они выбирают загрузку текстового содержимого с помощью AJAX. Это происходитпосле загрузки базовой страницы. По моему опыту, этот метод дал многоболее широкое принятиечем шрифты WOFF и чаще всего является причиной описанной вами медлительности.
Определение причины
Чтобы определить причину для конкретного сайта, требуется анализ с использованием таких инструментов, какПоджигательилиИнструменты разработчика Chrome. Или же вы можете открыть сайт, используяИнтернет Эксплорер 8, который поддерживает AJAX, но не WOFF. Если сайт все еще работает медленно, проблема в AJAX, а не в WOFF.
решение4
Как отметили другие, причиной задержки, вероятно, являются нестандартные шрифты.
Если говорить более подробно, то браузер выполняет примерно следующие действия, прежде чем сможет отобразить содержимое страницы на экране:
- извлечение HTML (несколько циклов для DNS, TCP, запрос/ответ)
- начать анализировать HTML, обнаружить внешние ресурсы, такие как внешний CSS и JS. Обратите внимание, что CSS блокирует макет, а JS блокирует анализ. Поэтому внешние ресурсы, такие как CSS и JS, загруженные в начале документа (например, в head), замедляют время, необходимое странице для отображения контента на экране.
- извлечение внешних CSS и JS (несколько циклов передачи данных: DNS и TCP, если эти ресурсы находятся на другом домене, например CDN, а также RTT для запроса/ответа)
- после завершения загрузки внешнего CSS и JS, проанализируйте/выполните JS, проанализируйте/примените стили
- если CSS ссылается на пользовательские шрифты, эти шрифты теперь также должны быть загружены, что приводит к дополнительным задержкам при передаче данных для отображения любых частей страницы, которые зависят от пользовательских шрифтов
Хотя это не касается задержек, вызванных пользовательскими шрифтами, я недавно написал пост в блоге, в котором приводится дополнительная информация о причинах задержек рендеринга. В нем даются некоторые предложения по минимизации времени первой отрисовки ваших страниц. Надеюсь, это будет полезно для читателей, заинтересованных в том, чтобы их страницы отображали контент быстрее, включая те страницы, которые хотят использовать пользовательские шрифты:http://calendar.perfplanet.com/2012/make-your-mobile-pages-render-in-under-one-second/