Это третья неделя предварительного курса в Wecode! На этой неделе мы продолжим изучение различных концепций JavaScript. Поскольку план обучения на прошлой неделе и на этой неделе зависит от нас индивидуально, я решил пройти короткий онлайн-курс по созданию приложения-викторины с использованием HTML, CSS и JavaScript.

В целом, мне нравится мое приложение, и мне очень понравился этот курс Джеймса Куика на Udemy. Я многому научился на этом курсе, и мне еще есть что повторить, повторить и напомнить. Я всем рекомендую этот курс. Ссылка приведена ниже:



Какое приложение для викторин я сделал?

Итак, я создал приложение-викторину, которое позволяет вам решать случайно сгенерированные вопросы, связанные с компьютером / программированием. Когда вы играете в игры, он позволяет узнать, какое количество вопросов (счетчик вопросов) вы выбрали, и каждому вопросу присваивается 10 баллов, если вы правильно ответили. Когда вы нажимаете на вариант ответа, цвет (зеленый и красный) позволяет узнать, правильно вы ответили или нет.

В конце игры он позволяет вам узнать общий счет, и вы можете ввести свое имя пользователя, чтобы зарегистрироваться на высоких счетах. Ваш результат сохраняется в локальном хранилище и показывает только 5 лучших результатов на доске рекордов.

Ссылка на мою викторину следующая:
https://jessywlee.github.io/quiz-app-with-HTML-CSS-JS/

HTML и CSS

  • Документация Emmet

Во-первых, я немного лучше познакомился с использованием некоторых фрагментов кода emmet на VSC. Это действительно экономит много времени, потому что вам не нужно вводить все теги, открывать и закрывать их. Я также узнал о шпаргалке по документации emmet, которая, похоже, мне очень поможет.

  • Использование rem

Я впервые использовал rem на CSS. Инструктор (Джеймс Квик) на этом курсе познакомил с его использованием. Во-первых, вы устанавливаете размер шрифта 62,5% в корне. 62,5% означает 10 пикселей, поскольку по умолчанию установлено значение 16 пикселей. Затем 1 rem устанавливается на 10 пикселей и может использоваться относительно. Например, 1,8 rem будет 18 пикселей. Мне очень понравилось использовать эту меру, так как она проста и легка.

  • Размер коробки

Я понял, что установка размера поля на border-box очень удобна, так как размер отступа будет включен в размер поля, чтобы вы не запутались при применении и изменении размеров.

  • Эффект наведения кнопки
.btn:hover {
cursor: pointer;
box-shadow: 0 0.4rem 1.4rem 0 rgba(86, 185, 235, 0.5);
transform: translateY(-0.1rem);
transition: transform 150ms;
}

Я узнал красивый эффект наведения кнопки, который, как я ожидаю, потратит много времени на свой проект. Вышеупомянутый параметр позволяет, когда вы перемещаете курсор на кнопку, будет применяться тень, а translateY заставляет кнопку слегка перемещаться вверх, что может дать некоторый трехмерный эффект.

  • Центрирующие элементы

Мне было не совсем понятно, как центрирующие элементы работают с CSS. Создавая страницу «Обо мне» на прошлой неделе, я думаю, что как-то разобрался, пробуя разные вещи, поэтому мне потребовались дополнительные пояснения. На этот раз я пояснил, что justify-content применяется к главной оси, а align-items применяется к поперечной оси. При выравнивании элементов в гибком контейнере justify-content перемещается по главной оси, которая является горизонтальной, и выравнивает элементы по поперечной оси, которая является вертикальной, поскольку по умолчанию для гибкого контейнера установлено значение row.

Это означает, что когда гибкий контейнер настроен на столбец, главная ось становится вертикальной, и наоборот.

JavaScript

  • Получение API

Сначала я использовал жестко запрограммированные вопросы, которые нужно было создавать в приложении. Позже я научился использовать веб-API из базы данных открытых викторин. Ссылка находится здесь:



fetch(“https://opentdb.com/…")
.then(res => {
return res.json();
})

Я узнал, что fetch () не работает для локального пути в целях безопасности, поэтому требуется схема URL https. Если вы используете локальный путь, вы можете использовать локальный сервер разработки (я загрузил живой сервер, который является расширением VSC).

fetch () вернет обещание. Я не мог полностью понять, почему мне нужно возвращать res.json () и что это значит. Согласно MDN, метод json () принимает ответ и считывает его до конца. Другими словами, когда выборка успешна, мы читаем и анализируем данные с помощью json (). Затем он возвращает обещание, которое преобразуется в объект JS. 🤯

  • карта ()
.then( loadedQuestions => {
questions = loadedQuestions.results.map( loadedQuestion => {
const formattedQuestion = {
question: loadedQuestion.question};

Метод map () дает новый массив из вызывающего массива. Полученный API содержит массивы сгенерированных вопросов, правильных и неправильных ответов. map () принимает эти массивы и возвращает новый объект formattedQuestion, который имеет ключ question и значение.

  • splice ()
const answerChoices = […loadedQuestion.incorrect_answers];
formattedQuestion.answer = Math.floor(Math.random() * 4) + 1;
answerChoices.splice(formattedQuestion.answer-1, 0,
loadedQuestion.correct_answer);

В полученном файле json правильные и неправильные ответы являются отдельными элементами. Чтобы они были в одном массиве, answerChoices присваивается массив неверных ответов.

ФорматированномуQuestion.answer присваивается случайное число от 1 до 4. Затем метод splice () используется для добавления правильного ответа в массив answerChoices. Первый параметр в splice () представляет начальный индекс. -1 применяется, потому что индекс массива начинается с 0. Второй параметр представляет deleteCount, который представляет собой количество элементов, которые нужно удалить из начального индекса. Третий параметр - это добавляемый элемент.

Допустим, ответ - 4. splice () находит индекс 3 в массиве answerChoices (который пуст). 0 удаляется, а правильный ответ добавляется в массив, поэтому в массиве четыре элемента, включая ответ.

  • forEach ()
answerChoices.forEach((choice, index) => {
formattedQuestion[“choice” + (index + 1)] = choice;
});

forEach () выполняет функцию для каждого элемента массива. В качестве элементов для выполнения функции требуется функция обратного вызова и currentValue. Индекс - необязательный параметр. Каждый элемент массива answerChoices присваивается объекту formattedQuestion с именами ключей «choice1 ~ 4».

  • Доступ к ресурсам - точка или квадратные скобки?

Я немного смутился, когда использовать точечную нотацию или нотацию с квадратными скобками для доступа к свойствам объекта. Я узнал, что при использовании точечной записи имя после записи должно быть действительным именем переменной и напрямую именовать свойство. Object.x получает значение ключа свойства «x». Когда используется запись в квадратных скобках, выражение в скобках оценивается и использует результат для получения имени свойства (ключа). Таким образом, обозначение квадратных скобок позволяет использовать символы, которые нельзя использовать с точечным обозначением.

Что дальше?

Я чувствую, что мне нужно больше времени, чтобы полностью понять и усвоить все функции, методы и синтаксисы, описанные в этом проекте. Хотя я мог следить за написанием кодов, наблюдая за курсом, мне было трудно перечитать и понять его после того, как я закончил проект. Как только я снова пересмотрю проект, я планирую добавить приложение на свою страницу «Обо мне». Я изменю CSS, чтобы он соответствовал моей странице, и обновлю вопросы, чтобы было веселее.

Лично я, наконец, уволился с работы в прошлую пятницу 😀 Мне очень понравился опыт работы учителем английского языка больше года. Было довольно горько покинуть класс. Я буду скучать по своим ученикам. С другой стороны, я чувствую себя прекрасно от того, что наконец-то у меня появилось гораздо больше времени, чтобы полностью сосредоточиться на учебе. В целом, очень рад тому, что нас ждет!