Вы когда -нибудь видели тех загружающих экранов, где вы видите серые полосы вместо фактического содержания, когда страница загружается? Они называются экранами загрузки скелета и используются такими компаниями, как 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”