Скелетная загрузка как сделать
Итак, вот это. То, о чем миллионы моих читателей (ну хорошо, хорошо, я немного приувеличиваю ;-)) давно уже просят. Скелетная анимация (Skeletal animation), известная так же как Скининг (Skinning), с библиотекой Assimp.
Скелетная анимация состоит из 2 частей. Первую выполняет 3d артист, а вторую вы, программист (или скорее движек, который вы пишите). Первая часть создается в ПО для моделирования и называется Риггинг (Rigging). В этом этапе моделер создает скелет из костей внутри меша. Меш в данном случае служит кожей объекта (будь это человек, монстр или кто-то еще), а кости будут использоваться для движения меша таким образом, что бы происходила имитация движения в реальном мире. Для этого каждая вершина привязывается к одной или более костей. Когда вершина присоединена устанавливается вес, который задает силу влияния кости на вершину. Хорошей практикой является установка суммарного веса для вершины равным 1. Например, если вершина расположена между 2 костями, то вероятно мы захотим разделить вес по 0.5 между костьми, потому, что мы ожидаем одинакового воздействия на вершину. Хотя, если вершина полностью во влиянии 1 кости, то вес будет равен 1 (что означает полный контроль над движением вершины).
Вот пример скелета, созданного в blender:
То, что мы видем выше - важная часть анимации. Артист риггит скелет и определяет ключевые кадры для каждого типа анимации ("ходьба", "бег", "смерть" и т.д.). Ключевые кадры хранят преобразования всех костей в важных позициях по ходу анимации. Графический движек интерполирует между позициями в кадрах и создает плавное движение между ними.
Часто используется иерархическая структура костей для скелетной анимации. Это значит, что кости имеют потомков / родителей тем самым создавая дерево костей. Каждая кость имеет родителя, кроме корневой кости. В случае, например, человеческого тела хорошим выбором будет позвоничник, у которого дети ноги и плечи, а пальцы еще на уровень ниже. Когда движется родительская кость, то движутся и потомки, но если движется потомок, то на родителя это не влияет (мы можем двигать пальцами свободно от длани, но при движении руки пальцы следуют за ней). С практической точки зрения это значит, что когда мы хотим переместить кость, то нам требуется скомбинировать преобразования и для всех родительских костей, которые ведут от корневой кости.
К теме риггинга мы больше не вернемся. Это сложная область и она не связанна с программированием графики. ПО для моделирования имеет продвинутые инструметы для помощи артистам в их работе; для создания красивого меша и скелета нужно иметь хорошие навыки. Давайте рассмотрим, что требуется графическому движку для создания скелетной анимации.
Для начала увеличим вершинный буфер с информацией о костях для каждой вершины. Нам доступно несколько опций, но мы сделаем "в лоб". Для каждой вершины мы собираемся добавить массив слотов, где каждый слот - id кости и ее вес. Для упрощения мы будем использовать только 4 слота, тем самым ограничив число костей на вершину. Если вы хотите использовать больше, то можете увеличить размер массива, но для модели из Doom 3, приложенной к этому уроку, 4-х костей достаточно. Теперь обновленная струстура вершины имеет вид:
Id костей являются индексами в массиве преобразований для костей. Эти преобразования будут применены на позицию и нормаль до матрицы WVP (т.е. они преобразовывают вершину из "пространства костей" в локальное пространство). Вес будет использован для комбинации преобразований нескольких костей в единое преобрзование и итоговый вес обязан быть равным 1 (ответственность несет ПО для моделирования). Обычно мы будем интерполировать между ключевыми кадрами анимации и обновлять массив преобразований костей каждый кадр.
Способ, которым создается массив преобразований для костей хитро устроен. Преобразования - набор в иерархической структуре (попросту дерево) и хорошей практикой считается хранить вектор масштабирования, кватернион вращения и вектор смещения в каждом листе дерева. Фактически, каждый лист - массив 3-х элеметов. Каждая запись в массиве должна иметь временное обозначение. Случай, когда время в приложении будет совпадать с этим временем крайне маловероятен, поэтому наш код должен интерполировать масштабирование / вращение / смещение для получения правильного преобразования точки во времени. Этот процесс будет происходить для каждого листа от текущей кости к корневой и перемножать цепочку преобразований для получения итогового результата. Мы сделаем это для всех костей и обновим шейдер.
Все, что мы обсудили ранее несло общий характер. Но этот урок посвящен скелетной анимации с Assimp, поэтому мы должны снова погружиться в библиотеку и увидить, как происходит скиннинг в ней. Хорошая черта Assimp в том, что он поддерживает загрузку данных о костях в нескольких форматах. Плохая часть в том, что вам по-прежнему придется сделать немного работы для генерации преобразований костей, которые понадобятся в шейдерах.
Давайте начнем с информации о костях на уровне вершин. Вот соответсвующая часть структуры данных Assimp:
Как вы, наверное, помните из урока по Assimp, всё содержится в объекте класса aiScene (который создается при импорте файла меша). aiScene хранит массив объектов aiMesh. aiMesh - часть модели, в которой находятся данные вершин, такие как позиция, нормаль, координаты текстуры и прочее. Теперь мы видим, что aiMesh также содержит массив объектов aiBone. Не удивительно, что там хранятся данные об одной кости в скелете меша. Каждая кость имеет имя, по которому ее можно найти в иерархии костей, массив веса вершин и матрицу смещения 4x4. Причина, по которой нам нужна эта матрица - вершины заданы в локальном пространстве. Это значит, что даже без поддержки скелетной анимации наш код может загрузить и рендерить модель. Но преобразования костей в иерархии задаются в пространтсве костей (и для каждой кости свое пространство, вот почему нам требуется перемножать преобразования). Итого, задача матрицы смещения в перемещении вершин из локального пространства в пространство конкретной кости.
С массивом веса вершин все интереснее. Каждая запись в этом массиве содержит индекс в массиве вершин в aiMesh (вспомним, что вершина распологается в несколькиз массивах одинаковой длины) и вес. Сумма всех весов вершины должна быть равна 1, но что бы найти ее потребуется пройтись по всем костям и сложить в некий список для каждой вершины.
После того, как мы собрали информацию о костях на уровне вершин нам требуется обработать преобразования иерархии костей для создания итогового преобразования, которое будет загружено в шейдер. Следующее изображение покажет подходящую структуру данных:
Мы снова начинаем с aiScene. Объект aiScene хранит указатель на объект класса aiNode, который является корнем иерархии (или дерева). Каждый лист в дереве имеет указатель на родителя и массив указателей на потомков. Это позволяет нам удобно переходить по дереву вверх и вниз. Кроме того, лист хранит матрицу преобразований, которое переводит из пространства листа в пространство родителя. И наконец, у листа может быть или не быть имени. Если лист соответсвует кости, то их имена должны совпадать. Но временами лист не имеет имени (это значит, что нет подходящей кости) и его задача в помощи моделеру разбить модель и добавить на пути промежуточные преобразования.
Последний кусок мозайки - массив aiAnimation, который записан в объекте aiScene. Один объект aiAnimation представляет собой набор кадров анимации, такой как "ходьба", "бег", "выстрел" и прочие. Интерполируя между этими кадрами мы получаем вожделенный эффект, соответсвующий названию метода анимации. Анимация имеет продолжительность в тиках (ticks) и задает число тиков в секунду (т.е. 100 тиков со скоростью 25 тиков в секунду - 4 секунды анимации), это помогает задавать скорость анимации т.о., что бы она выглядила одинаково на любом железе. Кроме того, анимация имеет массив объектов aiNodeAnim, называемых каналами. Каждый канал фактически кость с ее преобразованиями. Канал хранит имя, которое должно соответствовать названию одной из костей в иерархии и дереве массивов преобразований.
Для вычисления итогового преобразования костей с точки зрения времени, нам требуется найти 2 записи в каждом из этих массивов, которые соответсвуют времени и интерполировать значения между ними. Нам требуется скомбинировать преобразования в одну матрицу. Сделав это мы находим соответствующую кость в иерархии и переходим к родителю. Затем находим подходящий канал для родителя и повторяем процесс интерполяции. Мы перемножаем 2 матрицы вместе и продолжаем пока не достигнем корневого элемента.
Прямиком к коду!
Вот обновленная точка входа в класс Mesh, с небольшими изменениями. Некоторые стоит отметить. Первое, что importer и объект aiScene - свойства класса, а не стек переменных. Причина в том, что в нам придется в рантайме снова и снова возвращаться к объекту aiScene, для этого мы должны расширить область видимости importer и сцены. В настоящей игре вы возможно захотите скопировать данные для хранения в более оптимизированном формате, но для обучения хватит и этого.
Второе изменение - матрица преобразования корневого элемента извлечена, найдена обратная к ней, и записана обратно. Это потребуется в дальнейшем. Также заметьте, что код для нахождения обратной матрицы был скопирован из Assimp в наш класс Matrix4f.
Структура выше содержит все, что нам потребуется на уровне вершин. По-умолчанию, нам достаточно пространства для 4 костей (ID и вес на кость). VertexBoneData устроена похожим образом, что упрощает передачу в шейдер. У нас уже имеется позиция, координаты текстур и нормаль, привязанные к позициям 0, 1 и 2 соответственно. Следовательно, мы настроили наш VAO для привязывания ID кости под позицией 3 и вес под 4. Важно заметить, что мы используем glVertexAttribIPointer вместо glVertexAttribPointer для привязывания ID. Причина в том, что ID - целое число, а не значение с плавающей точкой. Не упустите это или данные в шейдере повредятся.
Функция выше загружает информацию о кости для одного объекта aiMesh. Она вызывается из Mesh::InitMesh(). Кроме заполнения структуры VertexBoneData эта функция так же обновляет связи между именем кости и номером ID (индекс определяется при запуске) и записыват матрицу смещения в вектор, зависящий от id кости. Обратим внимание на то, как вычисляется id кости. Так как id соответствует одному мешу и мы храним все меши в одном векторе, то мы добавляем к базовому значению id вершины текущего aiMesh id вершины из массива mWeights для получения абсолютного значения.
Эта вспомогательная функция находит свободные слоты в структуре VertexBoneData и размещает внутри id и вес кости. Некоторые вершины находятся под влиянием менее, чем 4 кости, но т.к. вес не существующей кости равен 0 (подробнее в конструкторе VertexBoneData), это значит, что мы можем использовать эти вычисления для любого кол-ва костей.
Загрузка данных костей на уровне вершин, которую мы видили ранее, происходит только 1 раз при загрузке меша. Настало время для второй чати - вычисление преобразования кости, которое будет загружаться в шейдер каждый кадр. Функция выше - входная точка в алгоритм. При вызове указываются текущее время в секундах (может быть дробным) и массив матриц, которые мы должны обновить. Относительное время мы найдем внутри цикла анимации и обработки листов иерархии. Результат - массив преобразований, которые вернутся в место вызова.
Эта функция обходит листы дерева и генерирует итоговое преобразование для каждого листа / кости согласно указанному времени анимации. Она ограничена в том плане, что мы можем использовать только 1 анимационную последовательность. Если вы хотите поддерживать одновременно несколько анимаций, то вам потребуется сообщить название анимации и искать по нему в массиве m_pScene->mAnimations[]. Код выше достаточно хорош для тестового меша, который мы используем.
Преобразования для кости инициализируются из свойства листа mTransformation. Если лист не соответствует какой-либо кости, то это и будет итоговым преобразованием. А если соответствует, то мы перезаписываем его новой матрицей. Это происходит следующим образом: для начала мы ищем название листа в массиве каналов анимации. Затем мы интерполируем вектор масштабирования, кватернион вращения и вектор смещения по времени анимации. Мы комбинируем из них единую матрицу и умножаем на матрицу, полученную как параметр (называется GlobablTransformation). Эта функция рекурсивна и вызывается для корневого листа, а матрица GlobablTransformation - единичная. Каждый лист вызывает эту функцию рекурсивно для всех своих потомков и передает собственное преобразование как GlobalTransformation. Так как мы проходим сверху вниз, то получаем скомбинированную матрицу в каждом листе.
Массив m_BoneMapping отображает название листа в индекс, который мы сгенерировали и мы используем этот индекс как номер в массиве m_BoneInfo, где хранится матрица итогового преобразования. Полное преобразование вычисляется так: мы начинаем с матрицы смещения листа, которая переводит вершины из локального пространства в пространство кости. Затем мы перемножаем с комбинированными преобразованиями всех узлов родителя плюс специальное преобразование, которое мы вычислили для листа согласно времени анимации.
Заметим, что мы используем код Assimp для всего матана. Я не вижу смысла в дублировании кода из библиотеки в наш, лучше использовать Assimp.
Этот метод интерполирует кватернион вращения указанного канала согласно времени анимации (вспомним, что этот канал хранит массив ключевых кватернионов). Сначала мы находим индекс ключевого кватерниона, который до требуемого времени анимации. Мы вычисляем коэффициент между расстоянием от этого ключа до требуемого времени и расстояние от времени анимации до следующего ключа. При интерполировании будет использоваться этот коэффициент. Мы используем код Assimp для интерполяции и нормализации результата. Аналогичные методы для позиции и масштабирования очень похожи и не приведены здесь.
Этот дополнительный метод находит ключевое вращение непосредственно перед временем анимации. Если мы имеем N ключевых вращений, то результат может быть от 0 до N-2. Время анимации всегда внутри продолжительности канала, поэтому последний элемент (N-1) - не подходящее значение.
Теперь, когда мы закончили с классом меша давайте рассмотрим, что нам нужно на уровне шейдера. Для начала мы добавим массивы ID костей и веса в структуру VSInput. Затем появился новый uniform массив, который содержит все преобразования костей. В самом шейдере мы вычисляем итоговое преобразование кости как комбинацию матриц вершины и веса. Итоговая матрица используется для преобразования позиции и нормали их пространства кости в локальное. Дальше все как обычно.
Осталось только собрать все вместе. Это легко делается кодом выше. Функция CalcRunningTime() возвращает прошедшее время в секундах от начала запуска приложения (заметим, что число с плавующей точкой - подмножество дробных чисел).
В этой статье разбор создания анимации загрузки скелетного экрана с использованием HTML, CSS и JavaScript. Делаем пример анимации на карточке профиля.
Анимация загрузки экрана скелета будет продолжаться в течение трех секунд, когда вы откроете веб-страницу. Через три секунды этот эффект отключается, и становится видна вся информация на карточке профиля.
Шаг 1. Создайте веб-страницу
Чтобы создать эту анимацию необходимо разработать веб-страницу с помощью стилей CSS и HTML-верстки.
Css:
Результат:
Шаг 2: Базовая структура загрузки скелета
Создадим базовую структуру этой анимации загрузки скелета для карточки профиля. Используем width: 300px и height: 400px в качестве размеров карточки профиля. Чтобы подчеркнуть красоту, вокруг карты была использована тень.
Html:
Css:
Результат:
Шаг 3. Добавьте изображение профиля и изображение обложки
Теперь добавим изображение профиля и изображение обложки в карточку профиля. Для этого зададим ширину и высоту изображения профиля 100 пикселей. А также border-radius: 50% — он сделает аватарку полностью круглой. Изображение обложки сделаем height: 150px и шириной: 100%.
Html:
Css:
Результат:
Шаг 4. Добавьте основную информацию на карточку
Для наглядности добавим некоторую основную информацию в эту анимацию загрузки скелетного экрана карточку профиля. И зададим ей верхний отступ в 35 пикселей, чтоб информация не была приклеена к карточке.
Html:
Css:
Результат:
Шаг 5. Создайте кнопку контакта
Добавим в него кнопку контакта. Используем для кнопки height: 35px , width 60% и цвет фона синий. А для текста зададим font-weight: bold, чтобы увеличить размер.
Html:
Css:
Результат:
Шаг 5. Добавьте эффект загрузки к изображениям
Сначала добавим анимацию между изображением профиля и изображением обложки. Однако на данный момент на изображении нет анимации, только серый цвет в качестве фона.
Css:
Результат:
Шаг 6. Добавьте к информации эффект загрузки.
Теперь добавим анимацию и цвет между текстом и кнопкой. Сначала установим цвета кнопкам и текстам, затем добавим анимацию, используя @keyframes .
animation-duration: 2s используется, чтобы заставить эту анимацию работать каждые две секунды. Здесь суть анимации такова: черная тень будет продолжать двигаться слева направо каждые 2 секунды.
Css:
Теперь реализуем эту анимацию с помощью @keyframes.
Css:
Результат:
Шаг 7. Отключите эффект загрузки скелета с помощью JavaScript.
Теперь самое главное - отключить анимацию с помощью JavaScript. Выше мы добавили анимацию загрузки экрана скелета с помощью css.
Эта анимация будет продолжаться бесконечно. Итак, теперь, по прошествии некоторого времени с использованием JavaScript, вам нужно отключить эту анимацию. Установим время на 3000 миллисекунд, используя setTimeout . Это означает, 3000 milliseconds что после этого анимация серого цвета будет скрыта.
Если вы хотите использовать 4 секунды вместо этих 3 секунд, вам нужно использовать здесь 4000 вместо 3000.
Когда посетитель нажимает кнопку или ссылку на вашем сайте, он ожидает увидеть какую-то обратную связь. Эта анимация или уведомление позволяет пользователю узнать, что его запрос был получен и что сайт загружает соответствующую информацию.
Но, если ничего не происходит, большинство решит, что ссылка не работает или что-то не так с вашим сайтом. Они быстро уйдут, прежде чем поймут, что ваш сайт обрабатывает их запрос.
Чтобы предотвратить такие отказы, вам необходимо запрограммировать загрузочную анимацию для ваших кнопок и ссылок. Загрузчик сообщает людям, что их запрос получен и к нему обращаются. Это фундаментальный компонент дизайна пользовательского опыта (UX), и без него посетители будут разочарованы и откажутся от вашего сайта и никогда не вернутся.
Если на вашем сайте нет загрузчиков, вы можете создать эту анимацию с помощью CSS. В этом посте мы объясним, как это сделать, и предоставим несколько примеров, которые ваша команда может использовать в качестве вдохновения.
Что такое анимация загрузки?
Анимация загрузки – это уведомления, которые убеждают пользователей, что система все еще обрабатывает их запрос. Когда пользователь нажимает ссылку или кнопку, анимация отображается до завершения процесса загрузки.
У некоторых анимаций есть индикаторы выполнения, которые показывают, сколько времени потребуется для загрузки данных или содержимого. Это дает пользователям возможность получать обновления в режиме реального времени или отвлекать их, что делает ожидание более терпимым.
Есть много разных инструментов, которые могут создавать анимацию загрузки. Однако одним из самых практичных является CSS. Давайте разберемся, почему, в разделе ниже.
CSS для загрузки анимации
Для ясности, вы можете использовать другой язык кодирования, например JavaScript (JS) или простой анимированный GIF для вашего загрузчика.
Однако у CSS есть некоторые сильные стороны, которые делают его практическим решением для этой цели:
- Легко редактировать. Вы можете быстро настроить продолжительность, цвет, скорость и другие элементы анимации.
- Он не теряет качества при изменении масштаба.
- Анимация выполняется быстро и плавно благодаря ускорению графического процессора (GPU) (быстрее, чем JS).
- Можно сделать паузу с помощью свойства animation-play-state.
Анимация загрузки CSS может не поддерживаться некоторыми браузерами, такими как Internet Explorer 9 и Opera Mini. Если вы не уверены, поддерживается ли он, такие инструменты, как Modernizr, могут сказать вам, поддерживаются ли они. Для браузеров, которые не поддерживают анимацию загрузки CSS, вы можете использовать вместо этого GIF.
Теперь, когда мы объяснили, когда вам следует использовать CSS (а когда нет), давайте рассмотрим некоторые анимации загрузки, которые были созданы с использованием этого языка программирования.
Примеры анимации загрузки CSS
С помощью CSS можно создать множество анимаций загрузки. Вот пять самых распространенных.
1 Бесконечная анимация загрузки
Бесконечная анимация загрузки просит пользователя подождать, не указывая, сколько времени. Их можно использовать, когда время ожидания неизвестно или очень короткое.
2 Определите анимацию загрузки
Определите анимацию загрузки, чтобы указать, сколько времени потребуется для загрузки страницы. Они могут предлагать определенный процент или количество, но это не обязательно. Они также могут быть визуальными оценками, такими как нарисованный круг или заполнение полосы.
3 Загрузочный спиннер
Спиннеры – распространенный тип анимации бесконечной загрузки. Это означает, что страница загружается с анимацией, движущейся по круговой дорожке. Анимация будет продолжаться на этой круговой дорожке, пока страница не загрузится.
4 Индикатор выполнения
Индикаторы выполнения – это особый тип детерминированной анимации загрузки. Они являются линейными, а не круговыми, и сообщают пользователю, сколько времени осталось, в процентах, объеме или долях.
5 Скелетный экран
Скелетные экраны начинаются с пустой страницы с заполнителями для содержимого, которое вы видите. Элементы раскрываются постепенно, пока страница не загрузится полностью.
Теперь, когда мы увидели несколько примеров, давайте узнаем, как вы можете применить их на практике в разделе ниже.
Как сделать простую анимацию загрузки в CSS
Создать простую анимацию загрузки CSS несложно. W3Schools разделяет базовый пример с несколькими вариантами настройки.
Во-первых, определите, где ваша анимация загрузки CSS будет физически отображаться в HTML:
Затем создайте класс CSS для настройки анимации загрузки CSS:
В этом примере свойство "border" определяет размер и цвет границы загрузчика. Свойство border-radius превращает загрузчик в круг.
Наконец, свойство "animation" заставляет счетчик запускаться и продолжать бесконечно со скоростью 2 секунды.
Вот и все. Но помните, ваша анимация загрузки CSS не должна быть такой простой. Как и во всем CSS, ваше воображение управляет возможностями.
Рекомендации по анимации загрузки CSS
Следует внимательно рассмотреть загрузочную анимацию с точки зрения того, как она может повлиять на взаимодействие с пользователем. Итак, рассмотрите следующие советы по созданию эффективной анимации загрузки CSS.
1 Лучшие анимации загрузки занимают меньше всего времени.
Какой бы милой ни выглядела ваша анимация вращающегося кота, пользователи станут нетерпеливыми, если она будет длиться слишком долго. Помните об ожиданиях пользователей и убедитесь, что ваша анимация занимает как можно меньше времени. Пользователи оценят быстрое время загрузки больше, чем красивый спиннер.
2 Облегчите боль ожидания.
Если вы предложите пользователю что-то интересное, ожидание будет менее мучительным. Захватывающая анимация привлечет внимание и займет пользователя.
3 Ваша анимация – это часть вашего бренда.
Хотя это не место для маркетинговой кампании, важно, чтобы ваш загрузчик оставался неизменным. Используйте палитру и тон голоса вашей компании, чтобы соответствовать вашему бренду.
4 Сообщите пользователю причину ожидания.
5 Дайте оценку времени ожидания.
Оценка времени устанавливает ожидания и помогает пользователям терпеливо ждать. Вы можете показать эту оценку в процентах или как визуальное представление прогресса.
Добавьте анимацию загрузки CSS на свой сайт
Анимация загрузки CSS помогает пользователям быть терпеливыми с вашим инструментом или веб-сайтом. Это позволяет им знать, что система не сломалась, сообщает им, сколько времени потребуется для загрузки страницы, и поддерживает их внимание, предоставляя что-то, на что можно посмотреть.
Создать анимацию загрузки CSS невероятно просто. Все, что вам нужно, – это некоторые базовые знания веб-дизайна и немного вдохновения.
Нелегко создать работающий и красивый дизайн веб-сайта. На самом деле это не так.
Сегодня поговорим о том как улучшить дизайн сайта и рассмотрим много вдохновляющих примеров сайтов с современным дизайном.
Знаете ли вы, что когда посетитель заходит на ваш сайт, у вас есть около пяти секунд (или меньше), чтобы привлечь его внимание и удержать на сайте? Это не так уж много времени, чтобы произвести на кого-то впечатление. Если время загрузки сайта составляет больше 3 секунд или навигация на вашем сайте сделана не удобно, то вы можете попрощаться со своими посетителями.
Вы не поверите, но быстро меняющийся мир технологий не помогает и в этом. Новые тенденции могут легко сделать ваш сайт устаревшим или сделать его практически бесполезным, в результате чего у вас останется меньше посетителей, чем было до этого.
Каким образом можно решить эту проблему и удержать посетителей? Как создать веб-сайт, который хорошо выглядит, отлично работает и отвечает всем современным требованиям? На ум приходит полный редизайн, но в некоторых ситуациях это просто невозможно. Полный редизайн сайта стоит дорого и требует времени, а это значит, что вам придется не только вложить дополнительные деньги в проект, но и приостановить работу вашего веб-сайта при внедрении нового дизайна.
Однако, даже если редизайн не рассматривается, нет причин для паники. У вас по-прежнему есть много способов улучшить свой веб-сайт, не тратя свои сбережения и не теряя посетителей.
Ниже мы расскажем о 15 способах улучшения дизайна вашего веб-сайта и дадим вам советы о том, как вы можете немедленно улучшить свой сайт, а вместе с ним и свое присутствие в сети Интернет.
Мы рассмотрели все: от перехода к адаптивному дизайну до правильного применения цветовых схем, поэтому мы уверены, что вы сможете найти то, что поможет вам улучшить дизайн сайта в кратчайшие сроки. Большинство советов касаются UI дизайна, но в начале мы уделим несколько моментов UX дизайну. Куда же без него. 😉 Приятного чтения и удачи!
1. Убедитесь, что ваш сайт имеет адаптивный дизайн
Как улучшить дизайн сайта? — Адаптивный дизайн современного веб-сайта (проект на Behance)
За последние 5 лет люди стали больше использовать свои мобильные телефоны для просмотра веб-страниц, что в конечном итоге привело к переходу веб-сайтов на адаптивный дизайн, при котором сайт хорошо отображается как на десктопе так и на мобильном устройстве. По этой же причине с 2015 года Google начал понижать в выдаче сайты, не оптимизированные для мобильных устройств.
Таким образом, если у вас есть свой веб-сайт, вы, вероятно, уже создали его адаптивную версию, а если нет, то самое время это сделать. Адаптивный дизайн творит чудеса с точки зрения SEO для вашего сайта и поможет вам занять более высокое место в поисковой выдаче.
2. Упростите навигацию на сайте
Your browser does not support HTML5 video.
Одним из главных улучшений дизайна на сайте является упрощение или переработка навигации.
Если вы не хотите, чтобы посетители убегали с вашего веб-сайта, потому что они не могут понять вашу навигацию, сделайте все возможное, чтобы сделать ее как можно проще и понятнее для пользователя.
Вам нужно, чтобы в вашем меню было не более семи пунктов (цель состоит в том, чтобы упростить перемещение людей по вашему сайту), постарайтесь вложить максимум информации в названия своих пунктов меню.
Также советуем сохранить фиксированную навигационную панель, как на нашем сайте. Так пользователь сможет воспользоваться навигацией без надобности скролить страницу вверх. Удобная навигация поможет вашим посетителям оставаться на вашем сайте дольше пяти секунд.
3. Улучшите скорость загрузки страницы для более низкого показателя отказов и более длительных сеансов
Скорость веб-сайта уже давно обсуждается в мире маркетинга, и это одна из основных причин, по которой многие посетители уходят с определенных веб-сайтов.
Фактически, если у вас есть хотя бы двухсекундная задержка во время загрузки страницы, то велика вероятность, что ваши потенциальные клиенты попросту уйдут с сайта и не сделают никаких покупок. Поработайте над ускорением загрузки страниц вашего веб-сайта — здесь вам может помочь наша статья Оптимизация сайта Google PageSpeed Insights — 17 рекомендаций
4. Тщательно продумайте расположение и размер элементов на сайте
Закон Фиттса, фундаментальный принцип взаимодействия человека с компьютером, гласит:
Время обнаружения цели зависит от расстояния до цели и ее размера.
Другими словами: чем ближе и / или крупнее цель, тем быстрее вы можете навести на нее курсор (или палец).
Вот несколько советов:
Когда вы думаете о расположении и размере элементов, всегда помните о модели взаимодействия пользователя с сайтом. Если у вашего сайта горизонтальная прокрутка, а не вертикальная, вам нужно подумать, каким образом привлечь пользователей к этому необычному типу взаимодействия.
5. Используйте свободное пространство для создания визуальной иерархии
Использование свободного пространства в современном дизайне сайтов (пост на Dribble)
White space — именно так дизайнеры называют свободное пространство в современном дизайне сайтов. Вообще оно не обязательно должно быть белым. 🙂 Свободное пространство имеет решающее значение для макета пользовательского интерфейса веб-сайта. Загроможденный пользовательский интерфейс — это веб-эквивалент белого шума: ничего не выделяется.
Правильное использование свободного пространства делает ваш контент легким для понимания, удаляя посторонние детали и разбивая информацию на легко усваиваемые фрагменты. Другими словами, это снижает когнитивную нагрузку на пользователя, что, в свою очередь, снижает показатель отказов.
Cтоит упомянуть, что исследования показали, что использование пространства на левом и правом полях сайта, а также между абзацами улучшает понимание информации читателем почти на 20%.
6. Добавьте больше фотографий на сайт
Посмотрим правде в глаза: все мы любим смотреть фотографии, видео, гифки или иллюстрации. Они с большей вероятностью привлекут наше внимание на странице сайта, чем любой фрагмент текста, каким бы прекрасно не был написан текст.
Согласно исследованию, пользователи тратят на 10% больше времени на просмотр изображений, чем на чтение контента, связанного с этими фотографиями. Это означает, что вы должны попытаться включить как можно больше ярких визуальных элементов, будь то видео или фото, на свой веб-сайт.
Вот несколько ресурсов, где вы можете взять бесплатные фотографии для сайта:
7. Применяйте теорию цвета
Как улучшить дизайн сайта — Цвета в современном веб-дизайне (Dribble)
Выбор цвета на веб-сайте имеет огромное значение. Вам нужно выбрать один доминирующий цвет для всего сайта, а затем добавить дополнительные цвета, чтобы завершить идеальную схему. Более подробно о теории цвета в веб-дизайне вы можете прочитать в нашей статье Теория цвета в веб-дизайне.
8. Не используйте слишком много цветов в цветовой схеме
Минималистичная цветовая схема в современном дизайне сайта
Продолжим говорить о цвете. При выборе цветовой схемы для сайта, учитывая многообразие ярких и красивых оттенков, можно легко переборщить с цветом. Несмотря на то, что яркие и смелые цветовые схемы и являются краеугольным камнем эстетики многих веб-дизайнеров, при их большом количестве они создают визуальный шум, который подавляет весь остальной дизайн.
Придерживайтесь простой цветовой палитры и нейтральных цветов фона. Приглушенный фон поможет выделить важные элементы сайта, например кнопки с призывом к действию, пункты меню или другие элементы дизайна. Иногда все, что вам нужно, — это простой белый, черный или нейтральный фон.
9. Сохраняйте единообразие типографики
Your browser does not support HTML5 video.
Когда мы садимся читать книгу, то мы ожидаем, что текст на каждой странице будет консистентный. То есть абзацы текста будут одинакового размера, с точным интервалом и повторяющимся форматом. Это свойство согласованности текста удерживает нас и позволяет непрерывно читать книгу.
Точно так же типографика в веб-дизайне должна иметь чувство порядка и последовательности. Заголовки, основной текст, ссылки должны соответствовать одному стилю от одной страницы веб-сайта к другой. Кроме того, отступы, межстрочный интервал, размер, цвет и вес должны быть идентичными для всех типов контента.
Типографика и веб-дизайн неразрывно связаны, поэтому это один из самых важных пунктов, которые помогу улучшить дизайн сайта.
Книги по типографике:
10. Сделайте дизайн простым
Простота в современном дизайне сайта (Dribble)
Благодаря простому и понятному дизайну когнитивные процессы пользователей не перегружаются. Им легко принимать решения и выполнять действия на сайте, а также пользователям не надоедают лишние элементы.
11. Отображайте скелетный блок при загрузке
Если на вашем сайте есть блоки, которые долго загружаются, то стоит сообщить об этом пользователю и показать на месте блока скелетный блок заглушку. Ниже можно увидеть пример скелетного блока.
Your browser does not support HTML5 video.
12. Добавьте анимацию
Основная причина использования анимации — повысить удобство использования. Простая анимация может быть отличным вспомогательным средством, помогающим пользователям понять, на какие кнопки кликать мышью и куда идти дальше на веб-сайте. Многие дизайнеры, сочетают простую анимацию вместе с прокруткой или кликом. Например при клике на кнопку она уменьшается в размере, и создается визуальный эффект как будто вы действительно нажали на кнопку.
13. Добавьте темную тему сайта
Рост сторонников темной стороны, вероятно, продолжится и в этом году. Выглядит элегантно, стильно и современно. Темный режим играет жизненно важную роль, поскольку мы стали проводить больше времени со смартфонами и ноутбуками в вечернее время. Но темный режим — это не просто белые тексты на темном фоне. У него есть еще пара преимуществ. Темный режим экономит заряд батареи, если в устройстве используется OLED или AMOLED экран. Это влияет на уменьшение нагрузки на глаза при использовании устройства в ночное время, а также уменьшает блики на экране и сводит к минимуму синий свет.
14. Иконки добавят информативности
Как улучшить дизайн сайта? — Иконки в современном дизайне сайтов
Как улучшить дизайн сайта? — Иконки в блоке оффера (Dribble)
- привлечь внимание
- лучше понять смысл блока
- перемещаться по интерфейсу
- сэкономить визуальное пространство
- установить связь с пользователем
15. Убедитесь, что на сайте есть страница 404
Ни один веб-сайт не работает постоянно на 100% идеально. Ваши посетители когда-нибудь точно перейдут по неработающей или просроченной ссылке. Когда это произойдет, они будут перенаправлены на страницу 404.
- Она сообщает посетителю о том, что удалось связаться с веб-сервером, но веб-сервер не может найти запрошенную страницу.
- Она побуждает посетителя вернуться на рабочую часть вашего сайта (например на главную страницу).
Вот почему страница 404 чрезвычайно важна.
Рассмотрим несколько примеров страниц 404 в современном дизайне.
Заключение
В этой статье мы перечислили много полезных методов, который помогут улучшить дизайн сайта. Внедрив хотя бы половину из них вам удастся достичь отличных результатов.
Читайте также: