Почему предпросмотр структуры страницы лучше индикатора загрузки

Front-end разработчик Коллум Харт в своем блоге рассказал о том, почему при загрузке страницы необходимо отображать её структуру, а не показывать индикатор загрузки.

В рубрике «Интерфейсы» — адаптированный перевод заметки. 

Что это такое

Скорость реакции, отзывчивость и непрерывность неблокируемого интерфейса не должны зависеть от интернета-соединения, считает Харт. Каждое действие — переход на другую страницу или выполнение команды — должно происходить практически мгновенно. 

Харт считает, что одним из решений может стать предпросмотр интерфейса во время его загрузки. Превью макета и структуры страницы должно отображаться мгновенно, в то время как информация загружается с некоторой задержкой. Разработчик ссылается на ленту Facebook, которая использует превью для загрузки:

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

Почему это хорошо

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

Вместе с тем пользователям также доступны некоторые функции, для выполнения которых не нужна связь с сервером — это одно из существенных достоинств превью интерфейса. Для перехода по ссылкам не обязательно дожидаться полной загрузки страницы: 

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

Степени использования

По мнению Харта, пользователи должны видеть превью интерфейса в течение доли секунд. В идеальном случае, информационное наполнение страницы должно загружаться мгновенно. Метод предпросмотра интерфейса можно разделить на три уровня по степени его использования, считает автор: bare bones, aspiring и perfectionist.

Bare bones

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

Aspiring

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

Perfectionist

При использовании такого метода все детали выглядят достаточно конкретно и различаются на отдельных страницах ресурса.

Однако текст, который никак не связан с сервером, не несет в себе никакой информации до тех пор, пока информация не загрузится. Поэтому пользователь не сможет произвести какие-либо действия до полной загрузки данных:

Реализация

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

Помимо архитектуры и инструментов для реализации предпросмотра интерфейса можно использовать еще несколько методов. 

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

Автор считает, что несмотря на все преимущества метода, у него есть и существенные недостатки.

  • Как правило, в зависимости от состояния элемента его структура различается. Поэтому эффективней иметь один шаблон, включающий в себя два комплекта разметки, которые соответствуют каждому состоянию объекта (показан или скрыт).
  • Сложная логика.
  • Пользователь не должен взаимодействовать со структурой. Наполнение «каркаса» (кнопки, поля ввода и так далее), должны быть удалены, потому что это вводит посетителя в заблуждение.

Автор считает, что еще одной проблемой является количество отображаемых цветов у структуры. Страница будет похожа на мусор, когда загрузятся десять полей и только шесть цветов. 

Харт рекомендует использовать при разработке эмулятор Network Link Conditioner. С его помощью можно тестировать загрузку интерфейса на разных скоростях интернет-соединения.

Хорошим помощником для Network Link Conditioner являются критерии эффективности от Якоба Нильсона. В книге Usability Engineering определены три временных предела, которые показывают насколько важна скорость отклика интерфейса:

0,1 секунды

Операции на странице, которые выполняются за 100 миллисекунд практически незаметны пользователям. Такое время является золотым стандартом, к которому должны стремиться все разработчики.

Одна секунда

Неплохое время, однако пользователю будет заметна небольшая пауза. В случае, если все операции на сайте выполняются за секунду, то ресурс будет казаться медленным.

10 секунд

Пользователь скорее всего покинет страницу, если операция выполняется от десяти секунд и больше. Конечно, все зависит от того, какую цель преследует клиент. Например, если посетитель работает со своими банковскими счетами или оплачивает товар в интернет-магазине, то он, вероятнее всего, останется.


Присылайте свои интерфейсные кейсы на interface@siliconrus.com

#Интерфейсы #интерфейсы #скорость_загрузки #индикатор_загрузки

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
Статьи по теме
Почему при проектировании интерфейсов нужно забыть о визуальном оформлении
Почему уникальные интерфейсы мешают пользователям
{ "author_name": "Равиль Хабибуллин", "author_type": "self", "tags": ["\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c_\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438","\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b","\u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440_\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438","\u0434\u0438\u0437\u0430\u0439\u043d"], "comments": 8, "likes": 15, "favorites": 1, "is_advertisement": false, "subsite_label": "flood", "id": 7321, "is_wide": true }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15388' + '59599') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 7321, "author_id": 17188, "diff_limit": 1000, "urls": {"diff":"\/comments\/7321\/get","add":"\/comments\/7321\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/7321"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791 }

8 комментариев 8 комм.

Популярные

По порядку

Написать комментарий...
7

Год назад я написал статью «Три правила проектирования интерфейсов с высокоскоростным пользовательским взаимодействием»
http://habrahabr.ru/post/211659/ (правила, которыми я руководствуюсь при разработке своего приложения для поиска и прослушивания музыки http://seesu.me/o ). В статье как раз об этом, и не только.

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

Ответить
0

Читал вашу статью, хорошая работа.

Ответить

Комментарий удален

3

Похожий подход у "реактивного интерфейса". Не нужно ждать данных от сервера, нужно работать с тем, чем располагает клиент.
Особенно хорош этот подход при добавлении данных самим пользователем: сначала показываем результат, потом отправляем на сервер.

Ответить
1

Странно такое слышать от front-end-а.

Во-первых, все современные браузеры начинают рендер страницы сразу же по ходу парсинга её тела.

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

А это "структуру страницы следует отделить от того, что в неё загрузится" - пример вредных советов, - применив на обычной странице (не апп с подгружаемым контентом как лента фейсбука) получите удвоение задержки.

Ответить
0

У меня сайт полминуты грузится и ничего.

Ответить
0

Пол минуты слишком долго для "ничего". Добавьте хотя бы картинок фоном.

Ответить
0

Картинок нету.

Ответить
–1

Лучше подождать, когда всё загрузится и уже потом смотреть страницу, а иначе всё кусками будет грузиться.

Ответить

Комментарий удален

Комментарий удален

0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Компания отказалась от email
в пользу общения при помощи мемов
Подписаться на push-уведомления