Стилизация домашней страницы!

Всем привет, для тех, кто не читал первую часть блога, я добавил ссылку здесь. Мы собираемся продолжить создание личного приложения Pokedex здесь. Мы перестали отображать некоторых покемонов, но изображения слишком большие, а страница очень простая. В этом блоге мы будем стилизовать PokemonCard.js и главную страницу.

Базовый глобальный стиль

Я буду использовать Sass для этого урока, так как считаю его очень чистым и эффективным. Есть много способов настроить Sass в своем проекте, но я написал два блога об общих принципах и практиках, связанных здесь и здесь. Я начну с создания каталога для всех моих файлов Sass и подключу его. Я не буду повторять весь этот процесс снова, как я делал это подробно в тех других блогах. Моя файловая структура Sass будет выглядеть так:

Sass/
|
|– abstracts/
|   |– _variables.scss    # Sass Variables
|   |– _mixins.scss       # Sass Mixins
|   |– _functions.scss    # Sass Functions
|
|– base/
|   |– _typography.scss   # Typography rules
|   |– _animations.scss   # Animation rules
|   |– _utilities.scss    # Utility rules
|   |– _base.scss         # Base rules
|– layout/
|   |– _navigation.scss   # Navigation
|   |– _header.scss       # Header
|   |– _footer.scss       # Footer
|
|– components/
|   |– _buttons.scss      # Buttons
|   |– _pokemonCard.scss  # PokemonCard
|
|– pages/
|   |– _home.scss         # Home page style
|   |– _pokedex.scss      # personal pokedex page style
|   |– _show.scss         # Show page style
|
 – main.scss              # Main Sass input file

Хорошо, давайте начнем с определения основных стилей в файле _base.scss и импорта в main.scss.

Эти маленькие кусочки стиля помогут нам пройти долгий путь. Прежде всего:

* - это глобальный селектор для всех элементов в файле HTML.

*::before что-то вставляет перед, когда контент был выбран

*::after вставляет что-то после, когда контент был выбран

Первый блок кода обеспечивает удаление всех элементов по умолчанию padding и margin. Он заставляет все псевдоэлементы (::before и ::after) наследовать box-sizing своих родительских элементов, а не всегда использовать content-box. Это определяет, применяются ли свойства, подобные padding, внутрь (сохранение ширины элемента) или наружу (добавление к ширине элемента). Например, <p> автоматически задает поля сверху и снизу, а body имеет отступы по стандарту.

Затем я хочу изменить размер шрифта по умолчанию, чтобы у меня был простой расчет для моих rem единиц. Размер шрифта по умолчанию - 16px. Rem - это единицы, которые зависят от размера шрифта, поэтому, если я не буду настраивать размер шрифта здесь, каждый rem будет 16px. 2rem это 32px и так далее. Регулируя шрифт по умолчанию, я могу легче вычислять единицы rem с шагом 10px (математика сложна).

Наконец, я задаю базовый стиль для тела. Центрирование текста, присвоение всему элементу тела padding 3rem или 30px и установка родительского свойства box-sizing, упомянутого выше, на border-box. box-content: border-box должен быть стандартным (на мой взгляд). Это означает, что заполнение засчитывается в ширину / высоту элемента.

Хорошо, это основные вещи, которые нам нужны для начала работы с Sass и правильного расчета наших rem единиц измерения. С помощью этого небольшого фрагмента кода мы гарантируем, что начнем с равных условий игры и не столкнемся с какими-либо неприятными padding, margin или box-sizing проблемами, которые могут подкрасться к нам.

Убедитесь, что вы импортировали свой _base.scss в свой main.scss и добавили следующий сценарий в раздел script в package.json:

"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
//Add this line to your package.json
"compile:sass": "node-sass sass/main.scss src/index.css -w" 
},

Затем запустите в своем терминале:

yarn run compile:sass

В этом терминале вы должны увидеть зеленое сообщение об успешном выполнении. Этот сценарий отслеживает изменения в ваших файлах Sass и компилирует их в ваш index.css. Если вы откроете браузер, вы увидите, что ваш текст очень маленький и все расположено по центру! Woot! Идите к нам!

Стилизация наших карт покемонов

Эти начальные карточки будут кликабельными, и мы перейдем к реальной карточке покемона размером с браузер, которая будет настраиваться в зависимости от типа покемона, но об этом позже. Во-первых, давайте создадим наш _pokemonCard.scss в нашем components файле в Sass. В этот файл мы хотим добавить следующий код Sass, чтобы начать работу:

Импортируйте его в свой main.scss, чтобы увидеть отформатированные карты! Затем давайте удостоверимся, что мы присваиваем нашим элементам правильные classnames, чтобы гарантировать, что наш Sass подключен.

Это наш PokemonCard.js:

Это наш AllPokemon.js:

При этом наши карты должны быть подключены!

Они не очень хорошо выглядят, но это только начало. Давайте создадим несколько цветовых переменных в нашем _variables.scss файле, чтобы познакомиться с нашей цветовой схемой покемонов. Мой файл переменных выглядит так:

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

Хорошо, это намного лучше, НО все наши карты просто в длинный ряд. Думаю, идеальное решение - это flexbox. Flexbox - отличный инструмент. Я кратко расскажу об этом здесь, но я действительно рекомендую вам потратить некоторое время на изучение всех чудесных вещей, которые он может помочь вам достичь с помощью вашей стилизации. Вот ссылка на полезное руководство по flexbox.

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

Мы используем flexbox, чтобы выровнять все наши карточки в ряд. По умолчанию flexbox устанавливает flex-direction на row. Вы можете изменить flex-direction на column, если хотите, но для наших целей row отлично работает. Этот контейнерный элемент содержит все наши карточки, поэтому они выстроятся в один длинный ряд. Поэтому нам нужно установить свойство переноса, чтобы карточки переходили на следующую строку, а не продолжали бесконечно. Затем flexbox дает нам два средства для выравнивания нашего содержимого по осям x и y. Когда flex-direction равен row, justify-content обрабатывает ось x, а когда он установлен на column, он обрабатывает ось y. С другой стороны, у нас есть свойство align-items, которое обрабатывает ось y, когда flex-direction равно row, и меняет направление, когда flex-direction равно column. Таким образом, в нашем случае мы выравниваем содержимое по оси x равным space-around. Это дает нашим картам возможность дышать со всех сторон. Есть и другие свойства justify-content, например space-between, которые выталкивают содержимое до самых внешних краев. start - еще один, который оправдывает содержимое в начале гибкого контейнера. Довольно моей эпической поэзии о Flex. Серьезно проверьте это, это здорово.

Так подождите, почему не работает? Нам нужно внести некоторые изменения в нашу карту. Нам больше не нужно устанавливать такую ​​большую ширину. Flex позаботится об этом за нас с помощью сокращенного свойства flex. По сути, я хотел бы видеть по 3 карты покемонов в каждом ряду с хорошим интервалом между ними. Flex позволяет нам делать это так:

flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]

Эти свойства позволяют элементу либо расти, либо заставлять другие элементы сжиматься вокруг него, сжиматься и позволять другим элементам расти, чтобы заполнить пространство, либо вы можете указать основу или размер каждого из элементов. Мы хотим, чтобы база составляла 24%, чтобы гарантировать, что у нас есть 3 карты, расположенные в ряд. Ниже приведен код новой карты scss:

Ладно, хорошо! У нас есть несколько хороших карточек, отображаемых на экране аккуратными рядами. Это круто, но я хотел бы добавить еще несколько наворотов, чтобы произвести впечатление на людей и сделать приложение более интуитивно понятным и интерактивным. Прямо сейчас ничего не происходит, когда мы наводим курсор на карточку, как люди узнают, что мы хотим, чтобы они щелкнули по ним? Давай изменим это.

Делаем карты интерактивными

Во-первых, давайте начнем с того, что добавим карточкам эффект тени на hover, чтобы пользователь знал, что они интерактивны. Для этого мы можем использовать свойство CSS с именем box-shadow. Свойство box-shadow принимает следующие значения:

box-shadow: /* offset-x | offset-y | blur-radius | color */

Итак, в нашем случае нам нужно offset-x, равное 0 (то есть нам не нужна тень смещения на x-axis), offset-y 1rem, blur-radius 4rem и rgba значение цвета. В этом случае мы используем rgba, чтобы позволить нам контролировать непрозрачность тени. Я также хочу, чтобы cursor превратился в указатель на hover для целей доступности. Наконец, я хочу, чтобы карточка немного сдвигалась на y-axis при наведении курсора. Для этого я воспользуюсь свойством transform.

Свойство transform дает нам много вариантов, но я буду использовать здесь translateY(). translateY() просто хочет, чтобы это было сказано. Он переместит элемент на y-axis. При использовании transform важно использовать свойство transition для элемента. Вот почему:

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

Подробнее об этом читайте в этой статье.

Следующее, что я хотел бы изменить, это :active и :focus. Я хочу, чтобы карта сместилась немного вниз по y-axis и чтобы казалось, что карта находится ближе к фону, регулируя разброс и непрозрачность box-shadow. Я думаю, это выглядит супер круто, потому что кажется, что вы на самом деле нажимаете на него!

Теперь наш код для карточек должен выглядеть так:

Исправление заголовка карточки и импорт шрифтов

Круто, эти карточки выглядят великолепно, но этот общий шрифт - пустяк, и имена покемонов тоже не такие уж особенные. Начнем с импорта пары шрифтов, которые мы сможем использовать во всем приложении. Импортировать шрифты через Google Fonts очень просто. Сначала перейдите в Google Fonts. Я выбрал два шрифта, которые будут интересными и удобочитаемыми. Как только вы перейдете на веб-страницу Google Fonts, вы увидите поиск. Ищите Милтониан и Лато. Конкретно Miltonian Tattoo. Щелкните по нему, и вы попадете на экран семейства шрифтов. Miltonian Tattoo имеет только одну толщину шрифта. Нажмите + Выбрать этот шрифт, чтобы добавить его в свою коллекцию. Вы должны увидеть всплывающую боковую панель со ссылкой на скрипт и фрагментом font-family кода CSS. Сделайте то же самое для Лато, выбрав следующие веса шрифта: 300, 400, 700. Я привел хорошую статью о распространенных и широко используемых шрифтах Google здесь.

Теперь скопируйте тег скрипта на боковой панели и добавьте его в свой index.html в <head></head>. Затем перейдите к своему _variables.scss, чтобы создать несколько переменных шрифта. Вот как они должны выглядеть:

//FONTS
$title: 'Miltonian Tattoo', cursive;
$default: 'Lato', sans-serif;

Отлично, давайте воспользуемся ими. В вашем _pokemonCard.scss объявим свойство с именем font-family и установим его в нашу scss переменную $title. Я думал, что этот шрифт очень похож на шрифт логотипа pokemon, и мы будем использовать его экономно для развлечения в приложении.

Давайте также установим свойство text-transform в заголовке, чтобы имена были написаны с заглавной буквы. Установите text-transform: capitalize;, и все готово!

Код карты scss теперь выглядит так:

Стилизация заголовка

Хорошо, наш титул «Персональный покедекс» выглядит немного скучным и скучным. Давайте приправим это. Сначала перейдите к файлу _typography.scss в вашем base sccs каталоге. Внутри этого файла мы будем объявлять повторно используемые классы для различных заголовков. Мы будем стилизовать primary-heading, который мы сможем повторно использовать на всех наших страницах, которые будут использоваться во всем приложении. Убедитесь, что вы добавили элемент <h1>, чтобы App.js обернуть заголовок и присвоить ему className из primary-heading. Затем в типографику добавьте следующий код:

Хорошо, поэтому мы используем здесь несколько забавных вещей CSS. Мы устанавливаем для свойства background-image значение linear-gradient(), а затем обрезаем его только до текста, который мы установили на transparent. Это означает, что мы фактически используем background-image для установки цвета текста. Наконец, мы используем свойство stroke, чтобы выделить текст, чтобы он выглядел как логотип Pokemon. Классная вещь.

Добавление фонового изображения

Наконец, давайте добавим к основному тексту фоновое изображение. Я использовал этот сайт, чтобы найти идеальный png для нашего фона. Это красиво и нежно, но делает фон менее ярко-белым и придает ему естественную текстуру. Найдите на веб-сайте файл png под названием Пальмовый лист. Создайте в своем src файл с именем images. Мы будем использовать это позже для некоторых спрайтов, которые мы будем импортировать. Наконец, в свой _base.scss добавьте следующий код:

Заключение

Отличная работа! Увидимся в следующий раз, чтобы узнать больше о React. Мы добавим header.js, footer.js, добавим пакет react-router и создадим onClick.