Вы когда -нибудь видели тех загружающих экранов, где вы видите серые полосы вместо фактического содержания, когда страница загружается? Они называются экранами загрузки скелета и используются такими компаниями, как Facebook, Google, Slack, YouTube, Dev.to и другие.
В Эта статья 80 человек попросили оценить свое воспринимаемое время загрузки, увидев пустую страницу, экран секлетона и экран прядильщика. Они воспринимали экран скелета как самый быстрый, затем прядильщик и как последний пришел пустой экран. Давайте вместе создадим экран скелета! 😀
То, что мы будем строить (поместить до 0,5 вида):
Вы можете использовать изображение для отображения скелета, но это создаст для дополнительных данных накладных расходов. Плюс это не отзывчиво. Лучшим вариантом является создание экрана исключительно с помощью HTML и CSS.
В этом примере мы создадим экран скелета для веб -магазина. Скелет состоит из:
- NAVBAR с 5 предметами
- Заголовок с кругом и 2 квадратами
- 3 продукта
Если вам интересно, что я использую эти странные соглашения об именах CSS, я пытаюсь использовать Бем Конвенция об именах для моего CSS!
Давайте начнем с настройки нашего HTML, этот раздел должен быть размещен на первом элементе в нашем теле:
Затем мы создаем отдельный файл CSS, который мы ставим первым делом в разделе «Головы документа», чтобы скелетные Div и CSS загружаются до остальной части страницы.
Стартовые стили для нашего скелета:
.skeleton { z-index: 100; position: fixed; left: 50%; transform: translate(-50%, 0); width: 100%; height: 100%; background-color: white; } @media (min-width: 1200px) { .skeleton { max-width: 1200px; } }
Давайте добавим несколько необработанных переменных CSS и Navbar:
:root { --grey: #eee; --text: #ccc; } .skeleton { z-index: 100; position: fixed; left: 50%; transform: translate(-50%, 0); width: 100%; height: 100%; background-color: white; } @media (min-width: 1200px) { .skeleton { max-width: 1200px; } } .skeleton__navbar { width: 100%; height: 100px; background: white; display: flex; align-items: flex-end; justify-content: space-between; } .skeleton__nav-item { width: 100px; height: 50px; background-color: var(--grey); } .skeleton__nav-box { height: 50px; display: flex; flex-grow: 1; justify-content: space-evenly; align-items: center; } .skeleton__nav-text { color: var(--text); }
Затем мы заменим переменные для градиента и добавим другие элементы.
:root { --gradient: linear-gradient(90deg, #ddd 0px, #e8e8e8 40px, #ddd 80px); --grey: #eee; --text: #ccc; } .skeleton { z-index: 100; position: fixed; left: 50%; transform: translate(-50%, 0); width: 100%; height: 100%; background-color: white; } @media (min-width: 1200px) { .skeleton { max-width: 1200px; } } .skeleton__navbar { width: 100%; height: 100px; background: white; display: flex; align-items: flex-end; justify-content: space-between; } .skeleton__nav-item { width: 100px; height: 50px; background-color: var(--grey); } .skeleton__nav-box { height: 50px; display: flex; flex-grow: 1; justify-content: space-evenly; align-items: center; } .skeleton__nav-text { color: var(--text); } .skeleton__header { margin-top: 2rem; width: 100%; display: flex; align-items: center; justify-content: space-between; padding: 2rem; } .skeleton__circle { width: 275px; height: 275px; background-color: var(--grey); border-radius: 50%; } .skeleton__img { width: 325px; height: 250px; background-color: var(--grey); } .skeleton__info { width: 200px; height: 250px; background-color: var(--grey); } .skeleton__products { margin-top: 2rem; display: flex; justify-content: space-evenly; } .skeleton__product { width: 200px; height: 200px; background-color: var(--grey); }
Ура, у нас есть базовый скелет! Давайте добавим анимацию
Для анимации нам нужно добавить градиент, который со временем меняет положение.
:root { --gradient: linear-gradient(90deg, #ddd 0px, #e8e8e8 40px, #ddd 80px); --animation: shine 1.6s infinite linear; } .skeleton__product { width: 200px; height: 200px; background-image: var(--gradient); animation: var(--animation); background-size: 300px; } @keyframes shine { 0% { background-position: -100px; } 40%, 100% { background-position: 200px; } }
Теперь прикрепите его к остальным элементам, и мы закончили!
:root { --gradient: linear-gradient(90deg, #ddd 0px, #e8e8e8 40px, #ddd 80px); --grey: #eee; --text: #ccc; --animation: shine 1.6s infinite linear; --animation-header: shine-header 1.6s infinite linear; } .skeleton { z-index: 100; position: fixed; left: 50%; transform: translate(-50%, 0); width: 100%; height: 100%; background-color: white; } @media (min-width: 1200px) { .skeleton { max-width: 1200px; } } .skeleton__navbar { width: 100%; height: 100px; background: white; display: flex; align-items: flex-end; justify-content: space-between; } .skeleton__nav-item { width: 100px; height: 50px; background-image: var(--gradient); animation: var(--animation); background-size: 275px; } .skeleton__nav-box { height: 50px; display: flex; flex-grow: 1; justify-content: space-evenly; align-items: center; } .skeleton__nav-text { color: var(--text); } .skeleton__header { margin-top: 2rem; width: 100%; display: flex; align-items: center; justify-content: space-between; padding: 2rem; } .skeleton__circle { width: 275px; height: 275px; background-image: var(--gradient); animation: var(--animation-header); background-size: 300px; border-radius: 50%; } .skeleton__img { width: 325px; height: 250px; background-image: var(--gradient); animation: var(--animation-header); background-size: 300px; } .skeleton__info { width: 200px; height: 250px; background-image: var(--gradient); animation: var(--animation-header); background-size: 300px; } .skeleton__products { margin-top: 2rem; display: flex; justify-content: space-evenly; } .skeleton__product { width: 200px; height: 200px; background-image: var(--gradient); animation: var(--animation); background-size: 300px; } @media (max-width: 1200px) { .skeleton__navbar, .skeleton__header, .skeleton__products { flex-direction: column; } .skeleton__navbar { align-items: flex-start; } .skeleton__nav-box, .skeleton__nav-text, .skeleton__img, .skeleton__info, .skeleton__products { display: none; } .skeleton__nav-item { width: 100%; } @keyframes shine { 0% { background-position: -100px; } 40%, 100% { background-position: 200px; } } @keyframes shine-header { 0% { background-position: -100px; } 40%, 100% { background-position: 270px; } }
Далее мы должны показать скелет на загрузке страницы и удалить его, когда страница будет готова.
Сначала установите тело, чтобы спрятать переполнение с помощью встроенных стилей, так что это загружается перед всеми другими таблицами стилей:
Затем в вашем основном файле JavaScript добавьте в окно EventListener в окно, которое прослушивает загрузку страницы. При загрузке, удалите скелет и отдайте телу ее переполнение! 😄
window.addEventListener("load", () => { document.body.style.overflow = "visible"; elements.skeleton.style.display = "none"; });
Это все! Удачи построить эти скелеты. ✌
Обязательно следуйте за мной, чтобы узнать больше о трюках. 🧠
Оригинал: “https://dev.to/sanderdebr/speed-up-your-ux-with-skeleton-loading-18ja”