Рубрики
Без рубрики

Ускорить свой UX с помощью скелета ☠ ☠

Когда -либо видели те загружающие экраны, где вы видите серые стержни вместо фактического контента, в то время как страница … с меткой JavaScript, CSS.

Вы когда -нибудь видели тех загружающих экранов, где вы видите серые полосы вместо фактического содержания, когда страница загружается? Они называются экранами загрузки скелета и используются такими компаниями, как Facebook, Google, Slack, YouTube, Dev.to и другие.

В Эта статья 80 человек попросили оценить свое воспринимаемое время загрузки, увидев пустую страницу, экран секлетона и экран прядильщика. Они воспринимали экран скелета как самый быстрый, затем прядильщик и как последний пришел пустой экран. Давайте вместе создадим экран скелета! 😀

То, что мы будем строить (поместить до 0,5 вида):

Вы можете использовать изображение для отображения скелета, но это создаст для дополнительных данных накладных расходов. Плюс это не отзывчиво. Лучшим вариантом является создание экрана исключительно с помощью HTML и CSS.

В этом примере мы создадим экран скелета для веб -магазина. Скелет состоит из:

  • NAVBAR с 5 предметами
  • Заголовок с кругом и 2 квадратами
  • 3 продукта

Если вам интересно, что я использую эти странные соглашения об именах CSS, я пытаюсь использовать Бем Конвенция об именах для моего CSS!

Давайте начнем с настройки нашего HTML, этот раздел должен быть размещен на первом элементе в нашем теле:

   
Item 1
Item 2
Item 3

Затем мы создаем отдельный файл 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”