CSS, JavaScript и первый проект на Canvas
Сегодня мы разделим страницу на три файла, разберём основы CSS и JavaScript, а затем соберём интерактивную сцену.
Цель занятия
Кнопки изменяют две координаты объекта, после чего JavaScript заново рисует сцену на поле Canvas.
Сейчас весь код встроен в конспект. В собственной работе мы разнесём HTML, CSS и JavaScript по отдельным файлам.
Разминка по прошлому занятию
Шесть коротких заданий помогут повторить структуру HTML-документа и основные конструкции JavaScript, рассмотренные на прошлом занятии.
changePage.title.textContent = "Старт!";?У трёх языков разные роли
HTML определяет структуру и содержание документа: заголовки, абзацы, кнопки и другие элементы страницы. CSS управляет их представлением в браузере, а JavaScript добавляет вычисления и реакцию на действия пользователя.
Такое разделение упрощает разработку: содержание, оформление и программная логика изменяются независимо друг от друга. В небольшом примере код можно поместить в один HTML-файл, но проект из нескольких частей удобнее хранить в отдельных файлах.
Только HTML
<button>Старт</button>Браузер создаёт кнопку со стандартным оформлением. Тег определяет назначение элемента, но не задаёт его индивидуальный внешний вид.
HTML вместе с CSS
button {
color: white;
background-color: #123d32;
border-radius: 10px;
}Селектор button выбирает все элементы <button>. Объявления внутри фигурных скобок задают цвет текста, цвет фона и скругление углов.
Как устроено правило CSS
CSS — язык, основанный на правилах. В каждом правиле указываются элементы, к которым оно относится, и набор свойств, определяющих их оформление. Одно правило может содержать несколько объявлений.
.card {
background-color: white;
padding: 16px;
border: 2px solid orange;
}
Селектор
.card определяет, к каким элементам относится правило. Точка обозначает селектор класса.
Свойство
padding называет характеристику, которую требуется изменить: в данном случае внутренний отступ.
Значение
16px указывает новое значение свойства: отступ размером 16 пикселей.
Запись property: value; называется объявлением CSS. После имени свойства ставится двоеточие, после значения — точка с запятой. Все объявления одного правила заключаются в фигурные скобки.
Одно объявление
h1 {
color: darkblue;
}Все заголовки первого уровня получат тёмно-синий цвет текста.
Несколько объявлений
p {
font-size: 18px;
text-align: center;
}Для абзацев одновременно задаются размер и выравнивание текста.
px означает pixel, пиксель — минимальный элемент растрового изображения на экране.Селекторы и отдельный файл
Селектор определяет, к каким элементам HTML будет применено правило CSS. Имя тега выбирает все элементы этого типа, класс — элементы одной группы, а идентификатор — элемент с указанным уникальным именем.
| CSS | Что выбирает | HTML-пример |
|---|---|---|
p | Все абзацы | <p>...</p> |
.card | Все элементы указанного класса | class="card" |
#title | Один элемент с указанным id | id="title" |
index.html
<head>
<link rel="stylesheet"
href="style.css">
</head>Тег link сообщает браузеру, что к документу подключается внешний файл стилей.
style.css
body {
background-color: #edf4ef;
font-family: Arial;
}Все правила оформления находятся в отдельном файле и могут использоваться на нескольких HTML-страницах.
Атрибут rel="stylesheet" обозначает тип связи между документами, а href="style.css" содержит относительный путь к файлу. Если оба файла находятся в одной папке, достаточно указать имя файла.
href — hypertext reference, ссылка на внешний ресурс.Узнайте конструкцию
задания 1–3 · базовыеcolor: purple;?<div class="card">?Соберите и примените
задания 4–6 · средниеid="scene". Что выбрать?Исправьте и напишите
задания 7–9 · сложныеcolor = white;class="control".#title выравнивание по центру.Оформите интерфейс будущей программы
├── index.html
└── style.css
Задание
- Подключите
style.css. - Оформите страницу, заголовок и поясняющую карточку.
- Создайте класс для всех будущих кнопок.
- Измените не менее трёх значений самостоятельно.
Минимум свойств
background-color, color, font-family, padding, border, border-radius.
Подготовьте третий файл
├── index.html — структура
├── style.css — оформление
└── script.js — поведение
<script src="script.js" defer></script>
Атрибут src содержит относительный путь к файлу JavaScript. Атрибут defer указывает, что выполнение сценария следует отложить до завершения разбора HTML-документа.
script.js и сделайте перерыв.HTML задаёт структуру.
CSS создаёт внешний вид.
После перерыва добавим поведение.
Значения и переменные
JavaScript — язык программирования, с помощью которого веб-страница получает динамическое поведение. Браузер выполняет сценарий, когда загружает страницу или когда происходит предусмотренное программой событие.
Данные программы представлены значениями разных типов: числами, строками, логическими значениями и объектами. Переменная — это имя, связанное со значением. Обращаясь к имени, программа может прочитать сохранённое значение или, если это разрешено способом объявления, заменить его новым.
Повторное присваивание запрещено
const step = 20;
const color = "orange";const применяют, если переменной не потребуется присваивать другое значение. В нашем проекте величина одного шага остаётся постоянной.
Значение изменяется
let x = 50;
let y = 120;
x = x + step;let применяют, если значение будет меняться во время работы программы. Координата x изменяется при каждом перемещении объекта.
| Тип значения | Пример | Назначение |
|---|---|---|
| Число | 50 | Координаты, размеры, скорость |
| Строка | "orange" | Текст и названия |
| Логическое значение | true, false | Ответ «да» или «нет» |
const и let являются ключевыми словами JavaScript.Выражения и функции
Выражение вычисляет значение. Например, выражение x + step складывает два числа. Оператор присваивания = сохраняет результат вычисления в переменной, расположенной слева.
Изменение значения
x = x + step;
x += step;
y -= step;Первые две строки имеют одинаковый смысл: увеличить x на величину step. Третья строка уменьшает y. Сокращённые операторы удобны при повторяющихся изменениях.
Именованное действие
function moveRight() {
x += step;
draw();
}Функция объединяет несколько команд под одним именем. При вызове moveRight() координата изменяется, после чего функция draw() обновляет изображение.
Код внутри фигурных скобок называется телом функции. Он не выполняется при описании функции, а запускается только после вызова. Такое разделение позволяет использовать одно действие многократно.
Элемент, событие, обработчик
После разбора HTML браузер формирует объектную модель документа — дерево объектов, соответствующих элементам страницы. JavaScript может найти нужный объект, прочитать или изменить его свойства и назначить обработчик события.
const button = document.querySelector("#rightButton");
button.addEventListener("click", moveRight);
1. Найти
document.querySelector ищет первый элемент, соответствующий CSS-селектору #rightButton.
2. Назначить обработчик
addEventListener связывает событие click с указанной функцией.
3. Выполнить
После щелчка браузер вызывает moveRight; скобки после имени здесь не пишутся, потому что передаётся сама функция.
Событием называют сообщение браузера о произошедшем действии: щелчке мышью, нажатии клавиши, перемещении указателя или завершении загрузки. Обработчик события — функция, которую браузер вызывает в ответ на это сообщение.
щелчок → функция → изменение состояния → новый результат
querySelector использует те же селекторы, что и CSS.Прочитайте код
задания 1–3 · базовыеx? let x = 50; x += 20;draw.Свяжите действия
задания 4–6 · средниеid="startButton"?button.addEventListener("click", moveRight);Исправьте и допишите
задания 7–9 · сложныеdocument.querySelector(rightButton)step.moveLeft, которая уменьшает x на step и вызывает draw().Canvas — область программного рисования
Элемент <canvas> создаёт на странице область фиксированного размера, предназначенную для программного рисования. В отличие от элементов HTML, нарисованные линии и фигуры не образуют самостоятельных узлов документа: они становятся частью общего изображения.
<canvas id="scene"
width="600"
height="300">
</canvas>HTML создаёт прямоугольную область с внутренним размером 600 × 300 пикселей. Атрибуты width и height задают размеры системы координат.
const canvas =
document.querySelector("#scene");
const ctx = canvas.getContext("2d");Сначала программа получает объект элемента <canvas>, затем запрашивает у него двумерный контекст рисования.
Метод getContext("2d") возвращает объект с методами и свойствами для двумерной графики. Этот объект часто сохраняют в переменной ctx, название которой образовано от слова context.
x растёт вправо, а y — вниз. Поэтому увеличение y перемещает объект не вверх, а вниз.2d означает two-dimensional — двумерный.Состояние и функция отрисовки
Ранее нарисованная фигура не перемещается автоматически. Чтобы показать объект в новом месте, программа изменяет его координаты, очищает область рисования и заново выводит сцену. Поэтому данные о состоянии объекта хранят отдельно от функции отрисовки.
let x = 50;
let y = 120;
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = "orange";
ctx.fillRect(x, y, 60, 40);
}
Состояние
x и y хранят текущие координаты. Изменение переменных ещё не изменяет изображение.
Очистка
clearRect очищает прямоугольную область от точки (0, 0) до полной ширины и высоты Canvas.
Новый кадр
fillStyle задаёт цвет заливки, а fillRect рисует прямоугольник в текущих координатах.
После изменения x или y необходимо снова вызвать draw(). Последовательность «изменить состояние — очистить Canvas — нарисовать сцену» станет основой будущей анимации.
clearRect и fillRect образованы от слов clear — очищать, fill — заполнять и rectangle — прямоугольник.Соберите управляемый объект
index.html
<canvas id="scene" width="600" height="300"></canvas>
<button id="upButton">↑</button>
<button id="leftButton">←</button>
<button id="rightButton">→</button>
<button id="downButton">↓</button>
<p>Координата: <span id="coordinates"></span></p>
<script src="script.js" defer></script>Алгоритм
- Получите элемент
<canvas>и контекст рисования. - Объявите переменные
x,yи константуstep. - Определите функцию
draw(). - Реализуйте движение вправо вместе с учителем.
- Добавьте движение влево, вверх и вниз.
От страницы к графической программе
Расширенная версия
Объект движется автоматически и отражается от границ.
В следующем занятии разберём скорость, состояние и цикл анимации.