Make Web-Sites not War

Верхнее оглавление

Главная

Это инструкция или краткий (а иногда не очень краткий) справочник при обучении

      На этой странице описаны некоторые базовые HTML и CSS элементы, которые в дальнейшем должны использоваться для форматирования текста, базовой разметки, верстки и стилизации всех элементов web-страницы. Здесь есть и базовые знания из JavaScript и jQuery, которые должны дать странице интерактивность. Если вы не захотите рассматривать CSS, то здесь есть раздел, посвященный Bootstrap – фреймворку, позволяющему маскимально быстро создавать адаптивные веб страницы, пользуясь только HTML. Кроме этого, в этом документе описаны не только базовые знания фронтенд разработки, но и начало бекэнда, но об этом позже...
      Есть самонадеянная версия, что вам даже будет достаточно прочесть эту инструкцию (и используя её попробовать сделать что-то своими руками) для того, чтобы самостоятельно чему-то научиться (но это не точно).

Введение

      Итак, раз уж это какая-никакая, но, допустим, инструкция, в таком случае, поговорим о том месте, где можно писать какой-то код. Строго говоря, место, где можно писать какой-то код никто строго не регламентирует: всё вполне выполнимо и в любом текстовом редакторе на вашем компьютере. Здесь встаёт только вопрос удобства, оптимизации и эффективности вашего труда, а он в этом деле далеко не на последнем месте. Учитывая это, мы выберем специальную среду, специальное место, в нашем случае, приложение, которое позволит нам писать код. Это место называется IDE (Integrated Development Environment) — интегрированная среда разработки или просто среда разработки.
      За свою скромную историю "айтишника" я пользовался двумя IDE — это Sublime Text и Visual Studio Code, но и та, и другая хороши. Sublime, к примеру, хорош своей простотой, минимализмом и "ненавязчивостью" в функционале. По моим ощущениям, он очень близок к обычному текстовому редактору, но с подсветкой синтаксиса и возможностью установки плагинов. VS Code хорош мощным функционалом по синхронизации изменений с внешними репозиториями (GIT), огромным сообществом разработчиков как самого приложения, так и программистов, которые сами работают в этой среде, а так же весьма и весьма гибкой настройкой. Но что самое приятное — VS Code полностью бесплатен. Строго говоря, горячо дискутировать над вопросом выбора IDE я не вижу большого смысла VS Code лучше, так как для меня это всё равно в каком-то смысле остается вкусовщиной, да и пришли мы сюда не за этим. Поскольку в последнее время я сам работаю в VS Code, то и рассказывать о начале работы тоже буду относительно этой среды. Мы сейчас опустим вопрос обширной пачки плагинов для комфортной работы (тоже доступны бесплатно), об этом можно и самостоятельно прочесть в интернете, что я рекомендую сделать в перспективе. Главное, что в VS Code и так по умолчанию встроен самый нужный для счастья плагин — это Emmet. Этот плагин позволяет автоматически дописывать за вас код, как попробуете сами — всё поймете. Теперь приступим.

      Итак, для работы необходимо где-то взять IDE, иначе зачем я всё это говорил. Но сразу уточню, что раз уж вы дошли до того, что читаете эту инструкцию, то, я думаю, нагуглить то, что вас интересует вы вполне в состоянии, поэтому никаких ссылок я здесь приводить не буду. Скачать VS Code очень просто: вы пишете в поисковой строке "Скачать VS Code", переходите по первой ссылке и выбираете свою операционную систему. Далее следует установка — здесь всё как обычно, вы и так всё сами знаете. После успешной загрузки и установки программы, вы сразу можете приступить к работе.

      Установив и открыв программу, вы обнаружите – перед вами самая настоящая IDE. Первое, что следует сделать — это создать репозиторий (общее хранилище) со всеми вашими файлами проекта — есть способ сделать это быстро и удобно. Для начала вы создаете папку где-то в дисковом пространстве вашего компьютера. Любую папку — она может называться как угодно, однако в программировании предпочтительнее называть любые файлы на английском языке. А дальше магия удобства: создав папку, вы просто перетаскиваете её в открытое окно VS Code. После этого программа определит, что в нее попала папка и позволит работать с ней. Далее вам нужно создать файл для HTML разметки.
      Если вы обратили внимание, в левой части пространства VS Code есть вертикальное меню, где есть несколько значков: листы бумаги, лупа и так далее. У вас по умолчанию должен быть выбран первый, а если нет – нажмите на него. Откроется подменю, которое называется "Проводник". Ниже в нем находится структура вашего репозитория — все будущие файлы и папки, которые вы создадите и с которыми будете работать. Итак, вы должны перевести мышь в область проводника и в верхней его части нажать на иконку с листком бумаги и знаком "+". Если описание не слишком ясно – не торопитесь, посмотрите внимательнее. Одно я знаю наверняка одно: та кнопка, что вам нужна, находится прямо рядом с названием основной (корневой) папки вашего репозитория. Ищите. Нажав на кнопку "Создать файл", VS Code сразу предложит вам назвать его и вы немедленно называете его простым именем — "index.html". А .html, как можно догадаться, и есть формат документа языка разметки, который нам нужен. Voilà (вуаля), вы молодец и создали свой первый репозиторий и даже HTML-файл в нем. Теперь нам нужно сделать ещё огромную кучу всего, это еще даже не вершина айсберга... Теперь дело за малым, вы молодец, у вас всё прекрасно получается!

      Создав файл в нужном нам расширении, вы окажетесь внутри него. VS Code умен и понимает, что если вы создали файл с каким-то расширением, то, скорее всего, вы хотите писать код именно на языке, которому это расширение и принадлежит. Удобно? Удобно. Идем дальше. Теперь, хвала небесам, у нас есть встроенный плагин Emmet, помните, я говорил выше? Благодаря нему мы можем сотворить еще одну небольшую магию. Нажмите на восклицательный знак, а затем на клавишу ENTER или TAB. Чудо! У вас развернулся базовый HTML шаблон, который должен выглядеть так:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

</head>

<body>

</body>

</html>

     А теперь не пугайтесь, я расскажу вам о том, что там написано, но для начала важно отметить один момент. Присмотритесь к структуре, которую вы только что создали. Вы можете заметить, что она состоит из элементов, которые заключены между символами < ;  и;   >. Эти элементы называются HTML-тегами или просто тегами. Некоторые (а в дальнейшем вы поймете, что почти все) имеют одинаковые (зеркальные) названия. То есть, зачастую есть так называемые открывающие теги, например, тег <body>, и у него есть закрывающий (зеркальный) брат — тег </body>, только у закрывающего, как можно заметить, перед названием тега ставится знак "/". Не все теги в HTML являются зеркальными, однако бо́льшая их часть — да. Этот принцип стоит запомнить, он важен.

     Итак, первая строка — это <!DOCTYPE html>. Внимательно присмотритесь к тому, что там написано. Ключевое слово DOCTYPE в файле HTML — это декларация типа документа. Это называется DTD (Document Type Definition — описание типа документа). Указание этого элемента важно и даже необходимо для того, чтобы браузер понимал, как следует интерпретировать текущую веб-страницу, так как HTML существует в нескольких версиях. Кроме того существует еще и язык XHTML (EXtensible HyperText Markup Language — расширенный язык разметки гипертекста), похожий на HTML, но различающийся с ним по синтаксису (способу написания кода). Так вот, чтобы браузер «не путался» и понимал, согласно какому стандарту отображать веб-страницу и необходимо в первой строке кода задавать <!DOCTYPE html>.

     Далее идет <html lang="en">. Как можно заметить, здесь применен тег <html> и он как раз-таки зеркальный. Внутри первого (открывающего) тега есть так называемый атрибут. Атрибуты используются для определения характеристик html-элементов и всегда помещаются внутри открывающего тега. Все атрибуты состоят из двух частей — это его имя и значение. Сразу скажу, что для и так большого количества тегов, существует не меньшее (огромное) количество самых разных атрибутов. В дальнейшем будут их примеры. Но возвращаясь к нашему разговору об <html lang="en">... Как можно заметить, внутри этого тега присутствует атрибут 'lang' со значением 'en'. Это так называемый глобальный языковой атрибут, который помогает определить язык элемента. К примеру, текст документа может быть набран как на одном языке, так и содержать вставки на других языках, которые могут различаться по своим правилам оформления текста. Например, для русского, немецкого и английского языка характерны разные кавычки, в которые берется цитата. Чтобы указать язык, на котором написан текст внутри текущего элемента и применяется атрибут lang. Браузер использует его значение для правильного отображения некоторых символов.

     Далее идет тег <head>, что буквально переводится как "голова". Тег <head> предназначен для хранения других элементов, цель которых — помочь браузеру в работе с данными. Также внутри контейнера <head> находятся метатеги, речь о некоторых из которых пойдет дальше. Они используются для хранения информации предназначенной для браузеров и поисковых систем. Например, механизмы поисковых систем обращаются к метатегам для получения описания сайта, ключевых слов и других данных. Иначе говоря, он предназначен для хранения служебной информации о странице. Тег <head> тоже является зеркальным и всегда располагается перед тегом <body>. Содержимое тега <head> не отображается напрямую на веб-странице, за исключением тега <title> устанавливающего заголовок окна веб-страницы.

     Первым внутри тега <head> в нашей свежесозданной структуре находится тег <meta>. Это первый тег так называемых метаданных. Что такое метаданные? Это информация о другой информации, или данные, относящиеся к дополнительной информации о содержимом или объекте. Тег <meta> не является зеркальным. Внутри этого тега есть атрибут 'charset' со значением UTF-8. Здесь всё просто: атрибут 'charset' — это атрибут выбора кодировки, ну а его имя, как не сложно догадаться — это само название выбранной кодировки. На всякий случай уточню, что такое кодировка. Кодировка — это соответствие между визуальными символами и числами. Кодировки необходимы, так как компьютеры созданы для работы с числами и не понимают текст.

      Следующая строка — <meta http-equiv="X-UA-Compatible" content="IE=edge">. С тегом <meta> познакомиться мы уже успели выше, поэтому сразу перейдем к его атрибутам в этой строке. Первый атрибут — 'http-equiv' со значением 'X-UA-Compatible'. Атрибут 'http-equiv' — это эквивалент заголовка HTTP-сервера (однако, имеющий более низкий приоритет перед заголовком, генерируемым самим сервером). Информация, содержащаяся в нём, добавляется в заголовок отклика HTTP и отсылается клиенту перед самой передачей HTML-документа. Не вдаваясь в слишком глубокие технические подробности скажу, что эта строка важна для работы с различными версиями Internet Explorer. Скажу даже больше: чтобы вас не грузить слишком уж большим объемом технической информации, я даже не буду расшифровывать все тезисы, которые я ввёл. Если вам интересно максимально подробно рассмотреть функции этих атрибутов с их значениями (и всё прочее), вы всегда можете воспользоваться гуглом.

      Итак наша следующая остановка – строка кода <meta name="viewport" content="width=device-width, initial-scale=1.0">. Здесь всё просто. Этот тег указывает браузеру на то, чтобы в качестве ширины области просмотра использовалась ширина экрана устройства, а не значение браузера по умолчанию, которое обычно составляет 980px. Короче говоря, это строка кода отвечает за, если так можно выразиться, базовый уровень адаптивности.

      Следующий тег – <title>. Здесь всё еще проще. Обращали внимание на то, что когда какая-нибудь вкладка открыта в вашем браузере, то она подписана каким-то названием, относящимся к теме сайта? Как правило, там буквально написано, что за сайт перед вами. К примеру, если открыть сайт youtube.com, то там буквально будет написано YouTube. В общем, если вы хотите как-то назвать ваш сайт на вкладке – пишите это в теге <title>.

      В качестве бонуса к тегу <title> можно описать еще одну строку кода, которая косвенным образом к нему тоже относится. Сразу скажу, что этой строки нет в созданном вами базовом шаблоне. Это строка – <link rel="shortcut icon" href="/instruction/img/ico.png" type="image/png">. Как можно заметить, у нас есть тег <link>, а в переводе с английского "link" – это ссылка. Из этого можно сделать непротиворечивый вывод, что эта строка кода является неким путем (ссылкой) на какой-то внешний ресурс. Почему я сказал, что эта строка косвенным образом относится к тегу <title>, так это потому, что в данном случае она отвечает за присоединение иконки на ту же вкладку в вашем веб-браузере. То есть, рядом с названием сайта на вкладке, можно легко разместить какое-либо изображение, которое будет являться символом вашего сайта. У этого тега-ссылки, как можно заметить, есть атрибут 'rel' – relationship (отношение). Он обозначает, что это за ссылка и на какой адрес она ведет. Работает это следующим образом: когда ссылка направляет пользователя на адрес, атрибут рассказывает поисковым системам, почему ссылка ведет на этот адрес. Например, ссылаться можно на файл стилей, который взаимодействует со страницей или, как я сказал выше – на иконку (логотип) сайта. У этого атрибута есть значение 'shortcut icon', что в переводе означает – значок ярлыка. Далее идет атрибут 'href' – Hypertext Reference — гипертекстовая ссылка, а в виде значения значения этого атрибута буквально выступает путь к тому, к чему ведет эта ссылка: будь то внешний URL или локальный путь к картинке. Дальше идет атрибут 'type', который сообщает браузеру, к какому типу относится элемент. В данном случае у него указано значение 'image/png', а это означает, что используется тип изображения (image) в формате png.

      И последний тег, который есть у нас в шаблоне – это тег <body>. В этом теге находятся вся та информация, которую мы готовы разместить на нашей веб-странице – её и увидят пользователи. Тег, как можно заметить, зеркальный.

      Теперь найдите созданный вами файл index.html у вас на компьютере и откройте его в удобном вам браузере. Серьезно, просто тыкните на него два раза. Это, как вы помните, файл вашей веб-страницы, HTML-код которого мы и будем в дальнейшем писать. Открыв этот файл в вашем браузере и разместив вкладку с ним рядом с этой инструкцией для удобного переключения между ними, вы можете снова вернуться в VS Code, чтобы начать писать код. Вот и всё, вы полностью подготовлены для начала работы. У вас есть среда разработки, репозиторий, где вы будете хранить файлы и папки вашего разрабатываемого проекта и даже удобный стартовый шаблон. А далее мы должны чем-то наполнить нашу веб-страницу, что делается по всё той же технологии – открывающих и закрывающих тегов, только уже других. Речь об этом и пойдет далее... Важно уточнить! Написав какой-то код просто нажмите ctrl + s на Windows или cmd (command) + s на macOS для сохранения. Затем, перейдите в ваш браузер, где открыт файл index.html и нажмите кнопку "обновить", кнопку F5 на клавиатуре, если вы работаете на Windows или cmd + R на macOS.

Том I. HTML5

Общие положения

      HTML5 зиждется на нескольких базовых тегах, которые формируют основную разметку и, применив которые, их вам может быть уже достаточно для разметки вашей первой, простой, но информативной web-страницы:

      Итак, проблема: у вас есть текст, который вам необходимо разместить на вашем сайте. Как её решить? Для этого в HTML существует тег параграфов текста – тег <p>, который используется как контейнер для работы с текстом. А еще, это еще один зеркальный тег.
      Быть может, я сейчас слегка перегну палку и говорить об этом еще рано, но я всё-таки напишу про это именно здесь. Когда вырастете – поймете и вам это пригодится, придете сюда, в начало, читать об этом. Итак, помните, как я говорил выше, что в HTML у тегов могут быть атрибуты? Вот и тег <p> исключением не является. У него есть атрибут 'contenteditable' со значением после знака '=' 'true'. Этот атрибут позволит вам превратить обычный параграф текста в редактируемый, это нужно для того, чтобы пользователь мог с ним взаимодействовать. С этой информацией, введенной пользователем, в дальнейшем можно взаимодействовать с помощью JavaScript. Но он так же может использоваться и с заголовками, и с тегами ненумерованных/нумерованных списков, однако о списках позже. В любом случае, поздравляю, вы разместили у себя на странице свой первый параграф текста.

      Разместив на у себя на странице параграфы с текстом, нам может понадобиться разместить и заголовки к ним. Разумеется, в HTML это тоже предусмотрено – для этого есть теги с <h1> до <h6> – различные по значению для браузера, а так же, как я сказал, по размеру по умолчанию (от самого большого до самого малого). Эти теги тоже зеркальны.

      У тегов параграфов и заголовков есть еще один полезный под(суб)тег. Это тег <span>. Зачастую он применяется для дополнительной, внутристрочной стилизации текста, к примеру, для создания буквиц. Проще говоря, если вам будет нужно сделать так, чтобы ваш параграф текста выглядел одним образом, а одно лишь слово внутри этого параграфа было по стилю другим, то здесь вам и пригодится тег <span>. Записывается, кстати, просто, например, в параграфе: <p><span>Какой-то</span> текст</p>. И далее, помимо того, что находится в параграфе, вы можете заниматься отдельной стилизацией именно того, что заключено между тегами span.

      Ещё одним из базовых тегов является не зеркальный тег <img> – image (от англ. изображение), он используется для добавления изображения на веб-страницу и у него есть два важных атрибута. Первый атрибут – это alt. Он позволяет отображать на странице содержимое добавленного изображения, если то, по тем или иным причинам, не будет загружено вместе с остальным контентом. Это так же необходимо и для пользователей с ограниченными возможностями – слабовидящих или незрячих людей. Их специальные программы – скринридеры – позволяют воспроизводить прочитанным вслух текстом содержимое фотографии. Поэтому то, что вы напишете в атрибуте 'alt', будет всерьез помогать людям с ограниченными возможностями воспринимать информацию с вашей веб-страницы. Второй атрибут – 'src=" "', в значении которого указывается путь к изображению. Поскольку мы работаем из репозитория, то все изображения для вашего веб-сайта рекомендуется размещать внутри него в папке с названием, к примеру, img или images. Исходя из того, что наш файл index.html у нас тоже создан и находится внутри репозитория, то путь к картинке прописать несложно. Репозиторий с нашим веб-сайтом назовём "test_site", представим, что скачали картинку со смешным котом и назвали её cat. При прописывании пути обязательно указывать расширение изображения (png, jpg, svg и так далее), и выглядеть это будет так:

***

<body>

<img src="test_site/img/cat.png" alt="Крутой и мягкий кот, который спит в очень смешной позе">

</body>

***

      Вот и всё! Теперь вы можете создавать простейшие веб-сайты, где есть заголовки, тексты и даже картинки. Ну а с тем, что чуть посложнее, мы разберемся далее.

Списки и инструменты форматирования документа

      Как известно, списки бывают двух видов: нумерованные (упорядоченные) и не нумерованные (неупорядоченные). Основа у них проста и состоит из двух зеркальных тегов: тег <ul> для ненумерованного списка и <ol> для нумерованного. Для лучшего понимания и чтобы не путать их между собой, я рекомендую запомнить названия этих тегов с точки зрения слов, откуда они произошли. Первый вид списка – ненумерованный (<ul>) расшифровывается как "unordered list" (от англ. unordered list – не упорядоченный список). Второй вид списка – нумерованный (<ol>) расшифровывается как "ordered list" (от англ. ordered list – упорядоченный список). Как можно догадаться, название этих тегов – это есть первые буквы названий видов списков – ul и ol. Но эти теги еще не сами списки, а только их основа, как некий контейнер.

      Любой список, нумерованный или ненумерованный, состоит из элементов. За это отвечает соответствующий тег – <lu>. Этот тег не стал исключением и у него тоже есть расшифровка – это "list item" (от англ. list item – элемент списка). Структура создания списков в таком случае получается простой (одинаково работает для обоих видов списка, только меняйте теги):

***

<body>

<ul>

<li>Первый пункт списка</li>

<li>Второй пункт списка</li>

<li>Третий пункт списка</li>

</ul>

</body>

***

*для справки: и нумерованные и не нумерованные списки можно формировать каскадно, вкладывая один в другой.
Для этого, уже по известной схеме, формируется список, а затем, как один из его пунктов после тега <li>, прописывается новый подсписок тегами <ol> или <ul>. Вот, например:

    Список 1:
  • Пункт 1;
  • Пункт 2;
  • Пункт 3;
    1. Еще один список, но каскадно, где родительным элементом нового списка является пункт №3 не нумерованного списка:
    2. Пункт 1;
    3. Пункт 2;
    4. Пункт 3;

         Ну а теперь элементы форматирования текста:


Таблицы

       Для рисования таблиц в HTML так же существует определенный набор тегов, которые подобно тегам списка структурируются каскадно.

       Для начала перечислим эти элементы в порядке убывания важности:


       Далее приступим к наглядной демонстрации и создадим таблицу.

Имя Возраст Рост
Вася 18 176
Коля 16 179
Саша 21 190

Ссылки

      За создание ссылок внутри вашей веб-страницы отвечает зеркальный тег <a> – он является одним из важнейших элементов HTML и предназначен для создания ссылок. У тега <a> есть два предназначения: первое непосредственно относится к созданию ссылки, чтобы перевести вас ну другую веб-страницу, второе же устанавливает якорь. Якорем называется закладка внутри страницы, которую можно указать в качестве цели ссылки. При использовании ссылки, которая указывает на якорь, происходит переход к закладке внутри веб-страницы. К примеру, так устроено оглавление в на странице, которую вы сейчас читаете.
      Простейшим способом создать ссылку якорного типа было бы задать id в теге той части страницы, куда необходимо переместиться, а в теге ссылки – прописать href="#указанный_id".

      У тега <a>, разумеется, тоже есть набор атрибутов и их довольно много. Важнейшим из них является атрибут href, в значении которого указывается URL (Universal Resource Locator – универсальный указатель ресурсов). То есть в этот атрибут указывается адрес документа, на который происходит переход. Адрес ссылки может быть абсолютным и относительным. Абсолютные адреса работают везде и всюду независимо от имени сайта или веб-страницы, где прописана ссылка. Относительные ссылки, как следует из их названия, построены относительно текущего документа или корня сайта. Короче говоря, абсолютной ссылкой было бы то, если бы я сейчас указал здесь ссылку на сайт google.com, а относительной ссылкой то, если бы я указал здесь путь к другому .html файлу.
      Еще одним полезным атрибутом является атрибут target со значением _blank – атрибут с этим значением позволит вам открывать ссылку в новой вкладке.

      Так же интересно и то, что ссылки для загрузки файлов – это всё те же самые теги <a>, только уже с атрибутом download.

Вот, попробуйте нажать, если хотите себе кота: СКАЧАТЬ!

*для справки: в HTML так же существует специальный тег 'button', который создает на странице кнопку. К этой кнопке затем можно привязать самые различные действия посредствам языка JavaScript, но в том числе и закреплять к ней ссылки.

Формы

      Элемент 'form' (от англ. форма) – это тег создания блока форм, то есть полей ввода на web-странице. Использует в себе следующие теги:

*для справки: тег 'input' является самозакрывающимся, то есть для него не нужно второго закрывающего тега.

*для справки: чтобы прямоугольники полей ввода после прописывания тегов 'input' расположились один под другим, их можно дополнительно заключить в теги параграфов 'p'.

       Между тегами 'form' и перед тегом 'input' можно размещать любой текст, указывающий на поле ввода. К примеру, можно подписать, что конкретно это поле ввода относится к вводу строки логина и/или пароля при регистрации на сайте.

      Вместе с тем тег 'input' может регулироваться дополнительными атрибутами, ему можно задавать типы:

*для справки: существует еще несколько типов, применимых к тегу 'input', о них можно почитать самостоятельно по одной из ссылок, представленных в нижней части документа.

      Но и это еще не всё! Тег 'input' может регулироваться так же и дополнительными атрибутами такими как:

       Далее приступим к наглядной демонстрации функционала атрибута 'list' на web-странице.

       Введите один из цветов или выберите из предложенных:

       Далее приступим к наглядной демонстрации функционала формы на web-странице.

Оставаться в системе

Укажите Ваш любимый цвет

Укажите Ваш пол

Мужской
Женский

*для справки: у полей ввода формы есть функционал для людей с ограниченными возможностями здоровья. Для слабовидящих или незрячих людей эта функция позволяет специальным программам правильно зачитывать содержимое формы, а для людей с ограниченными моторными функциями позволяет нажимать на любую область блока 'input', к примеру, на название поля ввода или прочие элементы, косвенно относящиеся к тому или иному полю ввода. За эту функцию отвечает зеркальный тег 'label' – в него, как в контейнер, помещается 'input'.

       Отчасти к элементам заполнения формы (в некоторых случаях), можно отнести и элемент 'select'. Однако функционал этого элемента часто может быть за пределами одних лишь форм, поэтому опишем его далее. Этот элемент позволяет создавать выпадающие списки на web-странице и выбирать одну из предложенных опций, к примеру, язык, регион проживания и прочее.

       Далее приступим к краткой демонстрации списка.

Выберите Ваш основной язык

Выберите страну происхождения

Выберите предпочитаемое гражданство

Видео, аудио и семантические элементы

       Разумеется, на web-страницу нужно размещать не только текстовую информацию, но еще и мультимедийную. Для этого в HTML существуют специальные теги 'audio' и 'video'. И 'audio' и 'video' теги представляют из себя некий контейнер, внутри которого, посредствам тега 'source', где прописывается имя/путь к файлу и атрибута 'type' (= "video/'формат'"" или = "audio/'формат'"), к ним прикрепляется соответствующий аудио/видео файл.

*для справки: регулирование размеров окна вставляемого видео осуществляется посредствам атрибутов, прописываемых тегу 'video' и/или 'audio':

  •  Атрибут 'width' задает окну видео необходимую длину;

  •  Атрибут 'height' задает окну видео необходимую высоту;

               Для добавления элементов управления вставленным видео в тег 'video' прописывается атрибут 'controls'.

       В HTML5 есть специальные теги, позволяющие логически делить страницу на составные части, что удобно как при программировании, так и при чтении кода. По своей сути, эти элементы не отличаются от элемента 'div', как контейнера, но нужны для грамотной расстановки блоков информации.
      Это такие элементы как:


*для справки: в HTML5 можно и самостоятельно создавать свои собственные теги. Для этого нужно использовать небольшой JavaScript код, строка которого будет выглядеть следующим образом (вместо апострофов нужно использовать стандартные открывающие/закрывающие символы):

      'script type="text/javascript"' document.createElement("название_своего_тега")'/script'

Том II. CSS

Общие положения

       Итак, если говоря об HTML мы знаем, что это HyperText Markup Language (Язык Гипертекстовой Разметки), который занимается тем, ЧТО находится у вас на странице. У CSS есть возможность установки единиц измерения набором способов: с помощью абсолютной величины – в пикселях, с помощью процентов и с помощью единиц 'em'. Размер одной единицы 'em', вероятно, должен быть равен 16px. Смысл использования единиц 'em' в установлении размеров шрифта состоит в том, что такой способ работает относительно всего текста. То есть, если мы увеличиваем размер всего блока текста, то внутренние элементы, к которым применен 'em' будет увеличен относительно него. У способа 'em' есть разновидность – это 'rem', то есть root – единица измерения отсчитываемая от самого основного элемента – например, 'body'. Еще одним довольно полезным вариантом регулировки размеров текста является единица 'vw' – view board width (от англ. ширина окна просмотра) – позволяет вариативно менять размер текста, к которому применена данная величина, но в зависимости от размеров окна. Этот способ удобен для адаптивности к различным размерам экранов.

Немного о продвинутых селекторах

       Здесь я приведу только некоторые виды продвинутых селекторов, которые помогают эффективнее обращаться к файлу стилей из HTML разметки.
      Существуют такие виды продвинутых селекторов (или методов обращения) как:

Том III. JavaScript

Общие положения

       Как мы уже говорили выше в разделе "Элементы управления страницей" тома I, в HTML документе мы можем создавать кнопки. Делается это с помощью зеркального тега 'button'. Соответственно, чтобы при нажатии добавленной нами кнопки выполнялся какой-то код, тегу 'button' необходимо присвоить атрибут 'onclick'. В этом атрибуте можно указать код JavaScript inline-способом, то есть, без создания дополнительного документа с кодом. К примеру, по нажатию кнопки вывести сообщение. Выглядеть это будет следубщим образом (как обычно, вместо опострафов при написании кода нужно будет указать открывающие и закрывающие символы): 'button onclick="alert('Hello world!')"'. Точно таким же inline-способом (и всеми остальными, разумеется, тоже), с помощью JavaScript можно отправлять, к примеру, и сообщения в консоль браузера. Делается это с помощью кода 'button onclick ="console.log('Hello Console!')"'.

*для справки: способы помещения кода JavaScript и взаимодействия его со страницей ничем не отличается от способов работы c CSS. У него точно так же есть способы inline – внутристрочный, internal – внутри HTML кода (документа), но отдельным блоком кода и external – создавая отдельный документ под JavaScript с расширением 'js'.

*для справки: вместе с тем, помещая JavaScript код методом internal, код по умолчанию будет выполняться при загрузке страницы. К примеру, той же командой 'alert' из JavaScript можно уведомить пользователя о сборе файлов Cookies при входе на страницу.

Переменные в JavaScript

      Как и в любом другом языке программирования в языке JavaScript есть переменные и типы данных.

  • Переменные являются неким логическим контейнером для хранения в них неких данных, к которым в дальнейшем можно обращаться. Переменные в языке JavaScript декларируются значением'var''let'?!?!?!?! – variable (от англ. переменная). Далее ей присваивается значение (имя). Выглядеть это будет так: 'var firstName = "Vasya"'. То есть, грубо говоря, вы объявляем: пусть значение 'firstName' (то есть, имя) будет равняться (будет приравниваться) к значению 'Vasya', то есть, теперь мы ввели переменную 'firstName', которая равна 'Vasya'. Далее, после объявления переменной, мы можем на нее, соответственно, сослаться. Например, как и раньше, вывести в консоль. Выглядеть это будет следующим образом: 'console.log(firstName)', после чего мы получим выведенное в консоль ранее установленное значение переменной – 'Vasya'. Значения переменных после присваивания им одних значений могут быть переписаны на другие значения. Для этого уже не нужно заново создавать "коробку" с переменной, а достаточно просто написать её ранее объявленное название и через знак приравнивания прописать ее новое значение, например: 'firstName = Petya;'. После объявления необходимых переменных их можно использовать в каких-то выражениях. Для этого объявим еще одну переменную – 'var lastName = "Ivanov";'. Теперь, после того, как у нас есть некоторый набор переменных, их можно, к примеру, сложить. Для этого объявим еще одну переменную – 'var fullName = firstName + lastName;'. Переменные в этом случае уже пишуться без кавычек! Как видно из кода, взаимодействие этих переменных осуществялется через операцию сложения. То есть, таким образом, мы получаем сумму двух переменных, в данном случае переменной 'firstName' и 'lastName', то есть имя и фамилию вместе, что в сумме представляет собой ранее объявленную переменную 'fullName'.
  • Следующий тип данных это 'boolean'. 'Boolean' являет собой логический тип данных, который принимает только два значения: 'true' или 'false' – ложь или правда.

    *для справки: логический тип данных 'boolean' точно так же объявляется уже описанным "контейнером" 'var', но после его объявялния ему придается значение 'true' или 'false'. Кроме того, логический тип данных 'boolean', в отличие от многих остальных языков программирования, можно так же как и любую другую переменную переписать в другое значение. То есть, если раньше это была логическая переменная со значениями 'true' и 'false', то после переписывания она легко может стать переменной 'string' типа.

  • Следующий тип переменной – 'undefined' (от англ. неопределенный). Это переменная с неопределенным (не заданным) значением. То есть, если в обычных видах переменных мы указывали 'var *название_переменной* = *значение переменной*';, то в случае с 'undefined' у нас будет задаваться только имя переменной, без её значения – 'var *имя_переменной*';. В этом случае, результат обращения к этой переменной по имени будет рождать результат со значением 'undefined', что наглядно видно, например, в консоли браузера.
  • И последняя переменная в списке – это 'null'. Это так же переменная с несуществующим значением, наподобие предыдущей. Сценарий использования этой переменной можно рассмотреть на примере игры. Предположим, что у нас есть некая компьютерная игра, где есть персонаж за которого играет некий человек по имени Петя. Объявим его: 'let player1234 = "Petya"'. После смерти игрового персонажа этого человека по одной из причин, его персонаж необходимо обнулить (удалить) из игрового процесса. В этом случае полезно применить переменную с нулевым значением – 'null', что делается как и прежде – 'player1234 = null;'.

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

*для справки: еще одно важное замечание по поводу имен переменных состоит в том, что имя любой объявленной переменной в JavaScript необходимо начинать с любой маленькой буквы латинского алфавита, символа нижнего подчеркивания или символа доллара. Другие символы запрещены и будут рождать ошибку при исполнении кода.

Встроенные методы в JavaScript

      Что такое метод в языке программирования? Метод – это некий объем кода, состоящий из одной, нескольких или многих строк кода, помеченный каким-то именем, который в последствии можно вызывать (обращатсья к нему). Это практически то же самое, что и переменная. Так же у метода существует такое понятие как "параметры". Параметр метода – это то значение, которое мы передаем внутрь метода для того, чтобы код в последствии мог к нему обращаться. Параметр метода пишется в круглых скобках.

Далее рассмотрим некоторые методы в JavaScript.

  • Такие методы как 'console.log()' и 'alert()' мы уже рассматривали, но всё равно поместим их в список;
  • Еще один метод – 'prompt("")' (от англ. – подсказка). Таким образом, к примеру, при загрузке веб-страницы можно вывести сообщение с полем ввода, с вопросом "Как Вас зовут?" – 'prompt("Как Вас зовут?");'. Точно так же, как и другие переменные в JavaScript, переменную 'prompt' можно перезаписать, присвоив ей другое значение. К примеру, это может выглядеть так: 'let firstName = "Vasya"; firstName = prompt("Как Вас зовут"); console.log(firstName);'. В этом случае мы обхявили переменную 'firstName', присвоили ей значение 'Vasya', а затем, когда в браузере появится окно с полем ввода и мы введем туда другое значение (своё имя, при условии, что нас зовут не Вася), переменная перепишется на новое значение, о чем будет выведено сообщение в консоль.

Порядок операторов в JavaScript

, чтобы не создавать в этой инструкции гигантскую таблицу, вы можете ознакомиться с распределением приоритетов различных операторов в языке JavaScript на сайте MDN.

Условные операторы в JavaScript. If/Else.

       Важнейшая концепция любого языка программирования – это условия. При помощи условий в языках программирования принимаются решения. Условный оператор записывается при помощи двух слов: 'if' (от англ. если) и 'else' (от англ. еще, иначе, в ином случае). Рассмотрим наглядно. К примеру, обявим две переменные: let userName = "Ivan"; и 'let userAge = 15;'. Код дальнейшего условия записывается таким образом: 'if(userAge >= 18) { console.log(userName + " is adult."); }'. Если после этого начать выполнять код и открыть консоль, то мы не получим никакого результата. Не получим мы его потому что в этом случае утверждение ложно, так как Ивану меньше 18ти лет. Код выполняться не будет. Этот код можно продолжить (ранее объявленные переменные прописывать не будем): let userName = "Ivan"; и 'let userAge = 15;'. 'if(userAge >= 18) { console.log(userName + " is adult.";) }'.
'else if(userAge < 10) { console.log(userName + " is a child"); }'. Веток 'else if' может быть сколько угодно. То есть, каждый раз, после того, как мы прописали какие-то условия 'else' после 'if', мы всегда после этого можем добавить неограниченное количество 'else if', включающих в себя новые условия. Мы можем добавить еще одно условие (учитывая ранее написанный код): 'else if(userAge > 10 && userAge < 18)' { console.log(userName + " is a teenager"); }. В этом случае, мы добавили 'else if', где с помощью оператора 'и' добавляются сразу два условия.

*для справки: мы уже познакомились с новым типом оператора 'и', который обозначается как '&&'. Так же существует еще один немаловажный логический оператор 'или', он обозначается как '||'. В случае применения этого логического оператора, выражение считается истинным, если хотя бы одно из перечисленных между 'или' (||) выражений истинно.

Тернарный оператор

      Тернарный оператор действует точно так же, как и оператор 'if else', но формат записи у него однострочный. То есть, мы можем записать оба условия и 'if' и 'else' в одной строке. Итак, вот как это работало с уже известными нам операторами 'else if'. Давайте объявим две переменных:

let userName = "Jack";

let userWeight = 87;

if(userWeight > 90) {

console.log("У " + userName + " лишний вес.");

}

else {

console.log("У " + userName + " нормальный вес.");

}

      Однако в случае использования тернарного оператора это будет выглядеть так (оставим ранее объявленные переменные):

userWeight > 90 ? console.log("У " + userWeight + " лишний вес.") : console.log("У " + userName + " нормальный вес.");

      Эта структура расшифровывается следующим образом. Тернарный потому что состоит из трех частей: из изначального условия, из части, когда условие принимает значение 'true' и части (после двоеточия), когда условие принимает значение 'false'. Удобство этого оператора в том, что мы можем его использовать сразу при присваивании какой-либо значения переменной. Причем можно еще больше упростить написание кода, введя еще одну переменную и далее, прямо на месте, снова использовать тернарный оператор, без дополнительных строк вывода в консоль:

let weightDescription;

weightDescription = userWeight > 90 ? " лишний" : " нормальный";

console.log("У " + userName + weightDescription + " вес.")

Оператор Switch

      Оператор 'switch' действует как механизм перехода к какой-либо ветке кода (switch от англ. переключатель).
      Для работы как обычно объявляется переменная(е). Объявим переменную 'JavaScript'. Далее, записывается сам оператор 'switch', после которого в скобках указывается объявленная переменная. После (внутри) оператора 'switch' словом 'case' (от англ. случай) указываются ветки. После 'case' в кавычках записывается значение. После чего ставится двоеточие и далее мы можем записать то, что будет выполняться, если переменная 'section' будет равна указанному в кавычках значению. К примеру для первого случая выведем в консоль сообщение "Вы изучаете раздел HTML". Для второго случая выведем в консоль сообщение "Вы изучаете раздел CSS". Для третьего "Вы изучаете раздел JavaScript". Важно после каждого случая 'case' ставить ключевое слово 'break' (от англ. прервать). Нужно это для того, чтобы в тех случаях, когда в значении 'case' находится такое же значение, как и установленное в переменной, то выполнение кода завершается и программа выходит из оператора, не выполняя последующие ветки. Так же может быть и такой момент, что в переменной может быть указано значение, не совпадающее ни с одним из случаев внутри оператора 'switch'. В этом случае необходимо исполнить какой-то код по умолчанию Для этого после последнего блока 'case' создается 'default', после чего, так же, как и после 'case', ставится двоеточие и указывается то действие, которое будет выполняться. В нашем случае, тоже выведем сообщение в консоль. В этом случае 'break' не требуется, так как 'default' ставится последним.
      Вот так будет выглядеть код:

let section = "javaScript";

switch(section) {

case "html" :

console.log("Вы изучаете раздел HTML");

break;

case "css" :

console.log("Вы изучаете раздел HTML");

break;

case "javaScript" :

console.log("Вы изучаете раздел JavaScript");

break;

default :

console.log("Вы изучаете какой-то раздел");

}

*для справки: в одном 'case' может находиться несколько значений переменных, для которых будут выполняться одни и те же действия. Прописывается точно так же, как и первоначальная переменная, в конце ставится двоеточие. К примеру, если после первой строки 'case' из кода выше, вместе со значением 'html' указать второй 'case', а после него 'html5', то в консоль будет выводиться один и тот же результат.

      Теперь провернем всё то же самое, только уже с числами. Для примера обратимся к части уже ранее пройденного калькулятора лишнего веса. Снова объявим две переменные 'age' и 'groupNumber'. Но если мы в 'switch' поставим переменную 'age', то в 'case' мы будем проверять равенство какому-то числу, а не сравнивать число с интервалом чисел. Чтобы сделать это с оператором 'switch', нужно провернуть небольшой трюк. Для этого в качестве переменной (в скобках после оператора 'switch') напишем 'true'. После чего пишем 'case', а в 'case' уже прописываем условия. В этом случае будет сравниваться значение 'true' (истина) с приведенным внутри 'case' выражением. То есть, если 'age >= 18 && age <=25' – это 'true', то в этом случае по значениею переменной 'switch(true)', то 'true' = 'true' и переменной 'groupNumber' присваивается значение '1'. Вот так будет выглядеть этот код:

let age = 20;

let groupNumber;

switch(true) {

case age >= 18 && age <=25 :

groupNumber = 1;

break;

case age >= 25 && age <=46 :

groupNumber = 2;

break;

default :

groupNumber = 3;

}

Цикл While

      Циклы в языках программирования нужны для многократного повторения одного и того же действия.
      Для начала посмотрим на цикл 'while' (от англ. пока, до тех пор). Цикл 'while' чем-то похож на оператор 'if', в котором так же в скобках указывается условие: 'while(условие)'. После чего открываются фигурные скобки и туда вписывается код, который должен выполнится несколько раз. Этот код будет выполняться до тех пор, пока условие прописанное в скобках истинно. Оператор 'while' работает таким образом: сначала проверяется на истинность условие, прописанное в скобках после оператора. Затем, если условие не верно, выполняется тело цикла, прописанное между фигурными скобками. Далее, после выполнения кода в теле цикла, оператор снова проверяет истинность условия в круглых скобках после себя и так до тех пор, пока условие не будет ложным. То есть, условия выхода из цикла – это выражение в круглых скобках равняется 'false'. К примеру, можно указать вывод изначальной переменной 'x = 1' в консоль. Однако если сделать это без прочих условий, то код впадет в бесконечный цикл, что может привести к зависанию браузера и/или компьютера. Поэтому мы можем инкрементировать нашу переменную, прописав к ней 'x++'. Код выглядит так (для начала объявим переменную):

let x = 1;

while(x < 100) {

console.log(x);

x++

}

      Есть и другой способ применения цикла. Например, мы можем вывести в консоль какое-то текстовое сообщение по символам. Давайте добавим еще две переменных:

let helloString = "Привет, Аня!"

let count = 0;

while(count < helloString.length) {

console.log(helloString[count]);

count++;

}

*для справки: внутри цикла 'while' можно размещать оператор 'if', который так же как и обычно будет проверять некие условия и воплнять какие-то действия. Здесь представлено выведение в консоль всех чисел, кратных пяти.

let count = 1;

while(count <= 30) {

if(count % 5 === 0) {

console.log(сount);

}

count++

}

Цикл For

      Цикл 'for' являет собой более удобный в записи и восприятии вариант цикла 'while'. Всё дело в том, что все данные для цикла (в том числе даже объявление переменной) записываются прямо в строке самого цикла 'for', в круглых скобках. На примере предыдущей операции рассмотрим принцип его работы:

for(count = 1; count <= 10; count++) {

console.log(count);

}

      Для лучшего понимания, давайте и здесь, с помощью цикла 'for' устроим перебор символа строки. Теперь используем не 'count' переменную, а переменную 'i'. Переменная 'i' в реальной жизни в циклах 'for' используется практически постоянно. То есть, в цикле 'for' указывается одна буква для счетчика, так как эта переменная больше нигде не используется, ей не нужно присваивать имя, которое будет что-то описывать. Рассмотрим код:

let helloString = "Привет, Аня!";

for(i = 0; i < helloString.length; i++) {

console.log(helloString[i]);

}

*для справки: внутри цикла 'for' можно размещать оператор 'if', который так же как и обычно будет проверять некие условия и воплнять какие-то действия. Здесь представлено выведение в консоль всех чисел, кратных семи.

for(i = 1; i <= 30; i++) {

if(i % 7 === 0) {

console.log(i);

}

}

Функции

      Функции чем-то схожи с переменными. То есть, как говорилось выше, в переменную можно поместить какое-либо значение, а затем, в последующих сценариях работы программы, при запросе этой переменной, мы можем получить это значение. В функцияхможно хранить не значение, а целый код. И потом, обратившись к функции программы по имени, в любом месте программы, мы можем запустить этот кусок кода. Код организовывается следующим образом. Сначала пишется слово 'function', после которого всегда ставятся круглые скобки. Затем, как и в предыдущих примерах, открываются фигурные скобки, в которых записывается само тело функции. То есть тот код, который будет выполняться, когда мы будем обращаться к этой функции в другом месте программы по её имени. Если записать функцию подобно циклам или операторам, то код работать не будет (функция – название функции – круглые скобки – фигурные скобки – тело функции (к примеру, вывод чего-либо в консоль)). Потому что в таком случае мы не обращаемся к функции, а просто определяем её. То есть мы создали функцию, прописали её тело, то есть, внутренний код, который эта функция должна выполнять, но мы не обращаемся к этой функции, чтобы она начала свою работу.
      Чтобы запустить функцию (обратиться к ней), нужно просто прописать её имя, сразу после написать круглые скобки и обязательно поставить круглые скобки с точкой с запятой.
      Вот так будет выглядеть код:

function hello() {

console.log("Hello World!");

function();

}

      После чего функция полностью готова. Далее в коде, мы можем несколько раз обращаться к этой функции и код будет выполняться ровно столько раз, сколько мы обратимся к этой функции.
      Вы подумаете, зачем всё так усложнять? Можно же просто несколько раз прописать 'console.log()' с нужными нам данными и тогда всё будет работать точно так же. Но не всё так просто. Если мы пропишем другую функцию:

function complexHello() {

console.log("Привет, меня зовут Глеб. Мне 24 года. Я из Ульяновска.");

console.log("До свидания!");

}

complexHello();

      То есть, становится понятно, что чем длиннее и сложнее код, тем проще поместить его в некий "контейнер", в данном случае, в виде функции и выполнять его автоматизированно. Функция может содержать множество строк самого различного кода. То есть, принцип чем-то похож на контейнер 'div' из HTML, который мы наполняем каким-то содержимым, с которым в последствии можно работать, обратившись к нему, например, из CSS.

Параметры (аргументы) функции

      В предыдущей части мы выводили через функцию в консоль некий текст приветствия. Вызывая эту функцию, мы будем выводить в консоль один и тот же текст. Но мы можем модифицировать эту функцию так, чтобы мы могли передавать текст приветствия в качестве параметра функции и в консоль уже выводился бы тот текст, который мы туда (в консоль) передадим. Для этого мы передадим функцию параметра или аргумента. Вернемся к нашему примера с функцией 'complexHello' и в данном случае, в качестве параметра подходит 'text'. Соответственно, далее в 'console.log()' мы указываем не какую-то определенную строку текста, а, соответственно, этот параметр – 'text'. И теперь, вместо этого параметра, мы можем передавать функции 'console.log' любой текст. Код будет выглядеть следующим образом:

function complexHello() {

console.log(text);

}

complexHello("Привет, меня зовут Глеб. Мне 24 года. Я из Ульяновска.");

      В качестве параметра функции мы можем передавать не только текст. Например, мы можем создать функцию, вычисляющую квадрат какого-то числа. Для этого, как обычно, создадим функцию и присвоим ей параметр 'number'. После чего, поместим в тело этой фунции 'console.log(number);', которая будет выводить в качестве результата эту функцию. А затем, мы можем эту функцию вызвать и передавать ей значение цифры, квадрат которой требуется получить. Код будет выглядеть слуюбдующим образом:

function square(number) {

console.log(number * number);

}

square(2);

      Параметр, передаваемый в функцию, может быть не один. Например, давайте создадим другую функцию, вычисляющую площать прямоугольника. Площадь прямоугольника равна ширине умноженной на высоту. Поэтому, параметры функции мы так и назовем: 'width' и (через запятую) 'height'. После чего, в теле функции, как прописываем 'console.log(width * height)';. И далее мы можем вызывать эту функцию с различными параметрами сторон этого треугольника, например 2 и 3. Код будет выглядеть следующим образом:

function area(width, height) {

console.log("Площадь прямоугольника =" + width * height + " сантиметров квадратных");

}

area(2, 3);

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

function complexHello(helloText, name, age) {

console.log(helloText + " Меня зовут " + name + ". Мне " + age + " лет.");

}

complexHello("Здравствуйте!", "Иван", 46);

      Этот код позволяет подставлять в функцию различные параметры в реальном времени. То есть, мы можем несколько раз обращаться к функции, меня её параметры и выводить, к примеру, различные приветствия.

Возвращаемые значения функции

      В качестве примера давайте рассмотрим уже изученную выше функцию по рассчету площади прямоугольника. Эта функция, в качестве входного параметра, получает 'number', а затем умножает этот 'number' на себя же и выводит в консоль. То есть, функцию можно рассмотреть как некий черный язик: мы передаем что-то в этот ящик, а затем функция внутри себя как-то эту переданную информацию обрабатывает. Но что если мы хотим использовать далее в программе результат того, что выполнила функция? В рассматриваемом примере – это, например, квадрат значения 'number' – то есть, вычисление площади прямоугольника. Если мы пойдем по известному нам пути, попытаемся объявить переменную 'let x = square(2)' (square() от ранее расмотренной функции – квадрат числа), и пропишем отображение в консоли. В этом случае, первая строка с переменной работать будет, то есть, будет вычисляться квадрат от числа 2, так как работает функция. Но вот 'console.log(x)' будет выводить значение 'undefined'. То есть, мы присвоили значение переменной 'x', но эта функция в данном случае не возвращает никакого значения – она просто проделывает какую-то работу. Но можно сделать и так, чтобы данные после работы функции выдавались как выходные. Делается это очень просто:

function square(number) {

return number * number;

}

      После прописывания 'return' нам становится доступно присвоение рузультата работы функции какой-то другой переменной.
      Есть еще один сценарий использования функции внутри другой функции. В данном случае функции 'square'. Создадим новую функцию, которая посредствам вычислений будет сообщать нам, большой ли квадрат. В качестве параметра бы будем использовать сторону квадрата 'side'. Внутри функции объявим переменную 'squareArea', которая посредствам функции будет заниматься вычислением площади квадрата – возведением стороны квадрата в квадрат. Поэтому эту переменную мы можем приравнять к уже объявленной функции, которая этим занимается – 'square' со значением 'side'. Ниже мы можем использовать оператор 'if', который будет выяснять: если площадь квадрата больше установленного нами значения, то квадрат большой. И если да, то эта функция будет возвращать 'true'. А в другом случае, соответственно, 'false'. А после выведем в консоль функцию, с параметром, к примеру "2": 'console.log(isSquareBig(2))'; Код будет выглядеть следующим образом:

function square(number) {

return number * number;

}

function isSquareBig(side) {

let squareArea = square(side);

if(squareArea > 100) {

return true;

} else {

return false;

}

}

console.log(isSquareBig(2));

Statements vs. Expressions

      Есть два способа создания функции. Первый способ мы уже рассмотрели, он называется Statement или объявление функции. То есть, запись в форме 'function название_функции() {}'. Но есть второй способ – способ создания функции в выражении – Expression. Для наглядности давайте создадим реальную функцию и посмотрим, как её можно реализовать двумя способами. В функции мы будем передавать два параметра: название и вид животного и в зависимости от того, какое это животное, мы будем выводить в консоль имя этого животного и звук, который оно издает. То есть, если мы введем параметры "Имя 'Ричард'" и "Вид 'собака'", то в консоль должно выводиться "Ричард гавкает". Код в первом случае будет выглядеть следующим образом:

function animalVoice(animal, animalName) {

if(animal === "dog") {

return animalName + " гавкает.";

} else if(animal === "cat") {

return animalName + " мяукает.";

} else if(animal === "pig") {

return animalName + " хрюкает.";

} else {

return animalName + " издает какие-то звуки.";

}

}

console.log(animalVoice("dog", "Ричард"));

      А вот второй способ – Expression:

let animalVoice = function(animal, animalName) {

if(animal === "dog") {

return animalName + " гавкает.";

} else if(animal === "cat") {

return animalName + " мяукает.";

} else if(animal === "pig") {

return animalName + " хрюкает.";

} else {

return animalName + " издает какие-то звуки.";

}

}

console.log(animalVoice("dog", "Ричард"));

      Как видно из кода – работа функции в обоих споосбах идентична. Единственное отличие, что в дальнешем функционально может пригодиться в программе – это то, что при обявлении функции как переменной, эту функцию можно обнулить, если присвоить этой переменной другое значение.

Различные примеры реализации функций

      В первом примере мы рассмотрим, как создать функцию, вычисляющую, является ли число нечетным или нет. Если число нечетное, то в консоль выводится 'true', а если четное, то 'false'. Код будет выглядеть следующим образом:

function isNumberOdd(number) {

if(number % 2 === 0) {

return false;

} else {

return true;

}

}

*для справки: для лучшего понимания оператора '%', строка 'if(number % 2 === 0)' буквально означает, что "если, при делении на "2" переменной 'number' остаток равен "0", то...

*для справки: кроме того, у обращения к функциям есть два варианта. На примере консоли первый вариант будет выглядеть так: 'let x = isNumberOdd(11)';, а затем вывести в консоль, соответственно 'console.log(x);'. И второй вариант: 'console.log(isNumberOdd(11));'.

      А еще, в программировании существует такое понятие как 'рефакторинг'. Сразу написать идеальный код бывает довольно сложно, поэтому написанный код часто можно многократно улучшить, оптимизировав его. На примере ранее описанной функции 'isNumberOdd', можно показать, насколько сильно можно укоротить код:

function isNumberOdd(number) {

return % 2 !== 0;

}

      То есть, сначала будет вычисляться значение логического выражения после 'return' и если остаток от деления % 2 НЕ равен нулю (неравенство обозначается оператором '!=='), то будет возвращаться 'true'.

      Во втором примере мы посмотрим на функцию, вычисляющую факториал числа:

function factorial(naturalNumber) {

if(naturalNumber < 0) {

return 0;

}

let result = 1;

for(i = 1; i <= naturalNumber; i++) {

result = result * i;

}

return result;

}

      Смотря на код выше, давайте разберемся, как работает эта функция.
      В начале проверяется, ввел ли пользователь корректное значение. То есть, ввел ли пользователь натуральное число, чтобы факториал сработал. Например, мы можем договориться, что если пользователь ввел отрицательное значение, то мы возвращаем из функции значение 0. Так как сам фактировал не может возвращать 0, следовательно, возвращенный 0 будет сигнализировать о том, что пользователь ввел некорректное значение.
      Далее к самому факториалу. Сначала 'i = 1', точно так же, как и объявленная переменная 'result = 1'. То есть, исходя из логики работы цикла, переменной 'result' будет присвоено значение 1 * 1, что будет равняться единице.
      Если передать в параметр функции значение 3, то 'i < 3', следовательно, запускается цикл. Так как из-за 'i++' цикл продолжается, следовательно, i = 2. В 'result' находится 1, 1 * 2 = 2, после чего 'result' присваивается 2. Далее снова идет проверка в цикле. i всё еще меньше заданного значения функции 3, поэтому снова срабатывает 'i++' и теперь i = 3. В 'result' всё еще находится 22 * 3 = 6. Число 6 присваивается 'result', после чего снова срабатывает i++ и i теперь равна 4 и в этом случае мы выходим из цикла, так как 4 > 3, где 3 – установленное значение функции. И в самом конце мы возвращаем 'result'.

      В третьем примере рассмотрим, как с помощью функции JavaScript можно автоматически менять текстовые символы. Для примера возьмем функцию, которая будет заменять все пробелы на символы нижнего подчеркивания – _.

function changeSpaceToUnderscore(text) {

let resultText = text.replace(/ /g, "_");

return resultText;

}

      Здесь всё довольно просто. Мы создаем функцию с параметром 'text'. Затем, внутри этой функции, мы объявляем переменную 'resultText', которая равна параметру объявленной функции 'text', но с методом 'replace()', который в JavaScript и занимается заменой символов. После метода 'replace' в скобках между двумя слешами указывается то, что мы хотим заменить, после чего обязательно ставится символ 'g' и после запятой в кавычках указывается то, НА ЧТО мы хотим заменить.

Область видимости переменных

      В JavaScript есть два типа областей видимости переменных:

  • Local Scope
  • Global Scope

      Каждая функция создает новую область видимости. Понятие области видимости включает в себя некую доступность или видимость переменных. Эта область видимости определяет доступность переменных вне других конструкций программы.
      К примеру, переменные определённые внутри некой функции не будут доступны за её пределами. Но это не работает для переменных, определенных снаружи относительно тела функции. В этом случае мы не только можем обращаться к внешним функциям, но и менять их значения. Такие переменные, декларированные за пределами каких-либо структур, называются глобальными. Внутри же функции предпочтение всегда отдается локальным одноименным переменным.

*для справки: именно из-за понятия области видимости для циклов 'for' и подобных структур, условия рекомендовано прописывать в формате переменной, как, например, 'for(let i = 1; i < 10; i++) {}'. Всё потому что в случае, если объявить в цикле 'i' без ключевого слова 'let', то в коде будет создаваться переменная глобального типа. Это, как можно понять, может серьезно повлиять на ход выполнения программы, если этой переменной случайно присвоится какое-то иное значение.

Массивы

      Массивы – это одна из структур данных, которые существуют в языке JavaScript. Итак, что же это такое?
      Есть такой способ. К примеру, у нас есть несколько цветов. Чтобы хранить значения этих цветов, как уже делали прежде, мы можем использовать переменные:

let color1 = "красный";

let color2 = "оранжевый";

let color3 = "желтый";

let color4 = "зеленый";

let color5 = "голубой";

let color6 = "синий";

let color7 = "фиолетовый";

      Итак, у нас есть семь цветов радуги – семь переменных. Но проблема в том, что эти переменные никак не связаны друг с другом. То есть, мы никак не отображаем, что все эти семь цветов относятся к цветам радуги. И именно в таком случае, когда нам нужно собрать какие-то данные в единую структуру, как в случае с цветами радуги, нам и приходят на помощь массивы. Массивы данных создаются следующим образом:

let rainbowColors = ["красный", "оранжевый", "желтый", "зеленый", "голубой", "синий", "фиолетовый"];

      И теперь все цвета собраны воедино и мы можем обращаться к этим значениям по одному имени – по имени rainbowColors.
      Обращаться затем к этому массиву данных можно следующим образом(для примера возьмем консоль): consol.log(rainbowColors[2, 3]);. В квадратных скобках указывается индекс эелемента в массиве, то есть, его порядковый номер. Индексируются массивы начиная с нуля.
      Для примера этот вывод в консоль можно скомбинировать еще и со строкой: 'console.log("Небо " + [4] + " цвета");'.
      Можно не только считывать данные из элемента массива, но и менять значения этих элементов. То есть, к примеру, если мы хотим изменить цвет "красный" на "оранжевый", то мы можем сделать следующее: 'rainbowColors[0] = "оранжевый";'.
      Ровно так же можно вывести в консоль (или куда-либо еще) все элементы массива при помощи указания его имени: 'console.log(rainbowColors);'.
      Так же можно не только изменять какие-то эелементы в массиве, но и добавлять в него новые. Но что делать, если мы не знаем, что у нас только семь эелементов в массиве, а высчитать из них последний было бы затруднительно? Сделать это можно указать свойство массива '.length'. Это свойство равно количеству элементов, а именно: 'rainbowColors[rainbowColors.length] = "темно-синий";'. Есть и другие способы создания массивов.
      Второй споосб создать массив выглядит следующим образом: 'let emptyArray = [];'. При такой записи создается пустой массив, в которые затем можно поместить значения.
      Еще одна, не слишком распространенная форма создания массива – это: 'let emptyArray = new Array();' – осуществляется, как можно видеть, с помощью обращения к функции 'array'. Повторюсь, такой способ не распространен.
      Конечно же, массивы могут хранить не только строки, они могут хранить в себе любые значения. Можно так же создать массив с числами: 'let numbers = [1, 5, 3, 2];'. Более того, JavaScript позволяет добавлять в массив значения разных типов: 'let anyItems = [32, "Hello!", null]';.

Методы массивов

      Есть спаренные методы, такие как 'push/pop', 'shift/unshift', и есть одиночные indexOf, 'slice'. Это основные методы для работы с массивами. По этой ссылке можно перейти на сайт W3Schools и подробнее прочесть о самых разных методах для работы с массивами данных – их очень много. Но в основном используются те методы, речь о которых пойдет далее.
      Начнем с метода Push. Создадим массив: 'let names = ["Вася", "Саша", "Игорь", "Олег"];'. Далее, если мы хотим изменить массив, а именно, добавить в него какой-то элемент, мы можем воспользоваться либо технологией, описанной выше, либо прибегнуть к методу Push. Выглядит это следубщим образом (всопроизведем это как полноценный код):

let names = "Вася", "Саша", "Игорь", "Олег"];

names.push("Вячеслав");

      После чего, с помощью такого метода записи, в массив (в конец) будет добавлен новый эелемент.
      Так же метот push может возвращать значения. Вообще, метот – это, своего рода, функция. И мы можем извлечь это значение. Это можно реализовать следующим образом:

let names = "Вася", "Саша", "Игорь", "Олег"];

let x = names.push("Вячеслав");

console.log(names);

console.log(x);

      При этом console.log();' в виде переменной 'x' будет выводить число, означающее длину массива.       Противоположностью метода push является метод pop. Метод pop удаляет последний элемент в массиве. Он так же способен возвращать значения, но он возвращает не количество элементов, а значение того элемента, который он удалил, то есть последнего. Код для удаления из массива последнего элемента выглядит так: 'names.pop();'.       Следующая пара методов – shift и unshift. По той же самой логике, что и предыдущие два массива, они используются для работы с элементами в начале массива. Метод unshift добавляет элемент, метод shift удаляет.       Следующий метод – indexOF. Он нужен для определения индекса элемента массива. Записывается следующим образом: 'names.indexOf("Игорь");'. Как можно заметить, в качестве параметра этот метод принимает в себя конкретный элемент массива, а после чего возвращает его индекс. Если мы укажем какой-то элемент, которого нет в массиве, то будет возвращено значение -1. То есть, если нужно определить, существует ли введенный элемент в массиве, то это можно легко сделать при помощи этого метода. Есть еще один момент. Если в массиве присутствует два одинаковых элемента, то дудет возвращено значение 0. Мы можем использовать метод indexOf, к примеру, в следующий логике:

let toyota = ["Camry", 2018, "sedan", "black", true];

let isSedan = toyota.indexOf("sedan") === -1 ? console.log("Тип кузова - не седан") : console.log("Тип кузова - седан");

      В этом случае метод indexOf проверяет в массиве, есть ли там характеристика автомобиля – седан. Если же такого элемента массива нет, то возвращается значение -1, что исходя из работы тернарного оператора, интерпретируется как false и срабатывает описанный вывод в консоль, что машина не является седаном.       Последний метод, который мы рассмотрим – это метод slice. Метод slice позволяет скопировать часть какого-то массива и присвоить её другой переменной, то есть создать другой массив из уже существующего. Например, let cars = ["Honda", "Toyota", "Peugeot", "Opel", "Mersedes", "BMW"];. И к примеру, мы хотим выбрать из этого массива только немецкие марки автомобилей, то есть, Opel, Mersedes и BMW. Для этого мы можем создать новый массив: 'let germanCars = cars.slice(3, 5)';. В параметре метода в круглых скобках указываются индексы эелементов, с которого мы начинаем "резать" массив, чтобы забрать его кусок и второй индекс, которым мы заканчиваем.

Объекты

      В JavaScript есть еще одна структура для хранения данных – это объекты. Пример массивов из предыдущей главы может хранить как данные одинакового типа (строки), так и данные разных типов (строки, числа, boolean, undefined, null). Этот способ храннеия данных, по большому счету, валиден (корректен), однако не слишком удобен: чтобы получить доступ к какому-либо элементу из массива, нам нужно точно знать, на какой позиции расположено то или иное свойство. Поэтому для множетсва типов даннных, которые принадлежат к какому-то объекту, в JavaScript и существует тип хранения данных объекты. В коде объекты записываются следующим образом 'let carToyota = {}';. В фигурных скобках перечисляются свойства объекта. Но они будут сохраняться не по их индексу, а по так называемому ключу (строке). Соответсвенно, в объекте есть ключ и его значение, по которому считывается информация. Более развернуто посмотрим на код:

let carToyota = {

model: "Camry",

year: "2010",

carBody: "sedan",

color: "black",

hasAirbag: true

}

      Далее мы можем обращаться к элементу объекта при помощи похожей записи, что мы рассматривали выше, только в этот раз используется не индекс, а название свойства обекта. На примере консоли: 'console.log(carToyota["year"]);'. Но для обращения к свойству объекта не обязательно используется метод обращения, как к массиву – для этого есть специальная запись: 'carToyota.year';. Это обращение к объекту по его ключу. То есть теперь нам не важно знать, на каком месте расположено то или иное свойство. Мы даже можем менять их местами – на результат это никак не повлияет. Есть небольшое отличие между двумя типами записей. В первом случае, когда элемент указывается в квадратных скобках, мы можем использовать переменную. Например, если мы создадим переменную с каким-либо свойством из массива, а затем обратимся к ней, то всё сработает корректно:

let x = "Camry";

console.log(carToyota[x]);

      Но если мы обратимся к 'x' в формате записи 'console.log(carToyota.x)', то в результате мы получим значение 'undefined'. В этом случае будет разыскиваться свойство с названием 'x', а не назначенная переменная.       В объектах точно так же можно менять одни свойства на другие. Например, цвет: 'carToyota.color = "red";.       Как и массив, объект точно так же можно вызвать. Например, в консоль: 'console.log(carToyota);'.
      Для объектов так же существует не один способ их создания. В первом способе, который мы рассмотрели выше, мы сразу прописываем все поля. Но есть второй cпособ:

let carMazda = {};

carMazda.year = 2018;

carMazda.color = "blue";

carMazda.model = "CX7";

carMazda.carBody = "crossover";

      И еще один способ, как и при создании массивов – при помощи функции. Код выглядит следующим образом:

let carOpel = new Object();

carOpel.body = "Hatchback";

carOpel.year = 2018;

carOpel.color = "blue";

Массивы или объекты?

      Так что же выбрать? Какие данные лучше отображать в массивах, а какие в объектах?
      В массивах лучше хранить данные одного вида (типа), то есть однообразные данные. Конечно, не воспрещается хранить в массивах и разнообразные данные, однако сопосб массивов для этих целей не представляется удобным. К примеру, массив с различными "цветами", где, конечно же, будут только цвета и ничего больше: let colors = ["red", "orange", "yellow", "white", "blue"];. Если же мы хотим сохранять данные разных типов (как в выше описанном примере с автомобилем), то лучше использовать способ объектов. Как например, информация о человеке:

let personIvan = {

firstName: "Иван",

lastName: "Иванов",

age: 24,

isMarried: false,

}

      Но кроме того, и массивы и объекты могут хранить в себе другие массивы и/или объекты. Например, массив 'numbers' (числа), может хранить в себе какие-то массивы с какими-то числами: 'let numbers = [[1,2,3], [4,5,6], [7,8,9,10]];'. А далее, чтобы обратиться к этому массиву, к примеру, через консоль, нужно сначала указать индекс массива в массиве, а затем индекс самого элемента в выбранном массиве: 'condole.log(numbers[1][2]);'.
      Обекты с массивами можно конфигурировать по-разному. К примеру, объекты могут содеражть в себе массивы. Вернемся к нашему примеру с 'personIvan':

let personIvan = {

firstName: "Иван",

lastName: "Иванов",

age: 24,

isMarried: false,

pets: ["cat", "dog", "humster"]

}

      А чтобы обратиться к одному из элементов массива, нужно: 'console.log(personIvan.pets[1]);'.
      Обекты могут хранить массивы, а массивы могут хранить объекты. К примеру, мы хотим сделать базу данных о продавцах автомобилей:

let sellers = [

{

firstName: "Иван",

firstName: "Иванов",

regDate: "09.08.2019",

hasDiscount: false,

age: 25

},

{

firstName: "Gleb",

firstName: "Glebov",

regDate: "01.01.2010",

hasDiscount: true,

age: 34

}

]

      То есть, как можно заметить, у нас есть массив и внутри этого массива есть два объекта (можно создавать сколько угодно объектов). Как же нам обратиться к полям этих объектов? Есть два споосба. Мы можем обраться ко всему объекту, к примеру, в консоли: 'console.log(sellers[1]);'. Или мы можем обратиться только к какой-то конкретной строке: 'console.log(sellers[1].hasDiscount);'.       В реальной жизни мы можем создавать базы данных, а затем обращаться к конкретным элементам в них. Например, создать базу данных об автомобилях в автосалоне, а затем вывести только те автомобили, которые были проданы. Для этого, собственно, создадим базу данных. А затем создадим цикл, где будет высчитываться длина выводимой информации. Выглядеть это будет следуюющим образом:

let cars = [

{

carProd: "Mersedes",

carModel: "SL900",

color: "black",

carYear: 2020,

isSelled: true

},

{

carProd: "Toyota",

carModel: "Camry",

color: "blue",

carYear: 2019,

isSelled: true

},

{

carProd: "BMW",

carModel: "X7",

color: "white",

carYear: 2021,

isSelled: false

},

{

carProd: "Audi",

carModel: "A8L",

color: "black",

carYear: 2022,

isSelled: false

}

];

for(let i = 0; i < cars.length; i++) {

if(cars[i].isSelled === false) {

console.log(cars[i]);

}

}

      Для работы с массивами можно использовать не только цикл for. Так же можно использовать цикл forEach (от англ. для каждого), код выглядит следующим образом:

cars.forEach(function(car) {

if(car.isSelled === false) {

console.log(car);

}

})

Методы объектов

      Внутри объектов можно прописывать функции, выполняющие те или иные действия. Например, вычисление скидки в зависимости от длительности регистрации пользователя. Рассмотрим это используя вышеприведенный пример с продавцами автомобилей. Если пользователь зарегистрирован на сайте меньше двух лет, то он не имеет никакой скидки. Если от двух до пяти лет, то у него есть скидка 20%, а если больше пяти, то 30%. И далее вызвать метод этого объекта в консоль. Код будет выглядеть следующим образом:

let carSeller1 = {

firstName: "Игорь",

lastName: "Курушин",

regYear: 2017,

hasDiscount: true,

discountCalculation: function(year) {

let discount;

let numberOfYears = 2022 - year;

if(numberOfYears <= 2) {

discount = 0;

} else if(numberOfYears > 2 && numberOfYears <= 5) {

discount = 20;

} else if(numberOfYears > 5) {

discount = 30;

}

return discount;

}

}

console.log(carSeller1.discountCalculation(2019));

'this' в методе объекта

       Как можно заметить, в выше рассмотренном методе функции мы используем значение, которое можно получить из самого объекта. В данном примере внутриобъектной функции, мы используем параметр 'year', то есть год регистрации пользователя. Но так как в самом объекте уже есть свойство с годом регистрации, то нам необязательно использовать для функции параметр 'year'. Мы можем обратиться к обратиться непосредственно к свойству 'regYear' внутри объекта через функцию. К этому свойству объекта внутри функции мы можем обратиться используя ключевое слово 'this'. Выглядеть в этом случае и объект, и функция будут почти полностью идентично, поэтому не будем переписывать рассмотренный выше. Отметим только, что теперь параметр функции указываться не будет – скобки после слова 'function' будут оставаться пустыми, а объявленная нами переменная 'numberOfYears' будет теперь выглядеть так:
      'let numberOfYears = this.regYear';.
      Теперь, чтобы получить результат выполнения функции, не нужно искусственно прописывать в коде вызова консоли параметр функции – функция будет брать данные для своей работы непосредственно из свойства объекта, то есть, из года регистрации пользователя.
      Но мы можем пойти и еще дальше. Например, если выше описанный объект имеет свойство discount, в котором эта скидка указывается, например, по умолчанию скидка будет равна 0. А далее в коде мы можем объявить переменную 'discount' и присвоить ей значение выше описанной функции с методом 'this' и далее мы можем переменной 'carSeller1.discount' присвоить значение переменной 'discount'. То есть, мы присваиваем полю discount в объекте, значение, которое мы вычисляем с помощью выше описанной функции:

let discount = carSeller1.discountCalculation();

carSeller1.discount = discount;

      Но можно записать еще короче и сделать так, чтобы код обращался к объекту (carSeller1), затем к его свойству (discount) и отождествлял его с объектом (carSeller1), затем функцией (discountCalculation();). А затем вывести в консоль весь объект. В этом случае, будет выведен весь объект, а в нём автоматически прописываться вычисленный функцией процент скидки, в зависимости от года регистрации на сайте:

carSeller1.discount = carSeller1.discountCalculation();

      Но можно пойти еще дальше по пути оптимизации. Для этого мы можем больше не использовать 'return' в функции, а обратиться к полю объекта discount. Сделать это можно с помощью 'this.discount = discount;'. То есть, мы присваиваем свойству значения discount присваиваем значение внутренней переменной 'discount'. Теперь мы можем не присваивать полю ничего дополнительного – весь функционал будет осуществляться внутри объекта. Присвоение свойству discount нового значения при помощи свойства regYear. Итак, весь код для справки будет выглядеть так, для лучшего понимания, снова запишем:

let carSeller1 = {

firstName: "Игорь",

lastName: "Курушин",

regYear: 2010,

discount: 0,

calculateDiscount: function() {

let discount;

let numberOfYears = 2022 - this.regYear;

if(numberOfYears <= 2) {

discount = 0;

} else if(numberOfYears > 2 && numberOfYears <= 5) {

discount = 20;

} else if(numberOfYear > 5) {

discount = 30;

}

this.discount = discount;

}

}

carSeller1.calculateDiscount();

console.log(carSeller1);

DOM

       Как можно понять, JavaScript нужен, конечно, совсем не для того, чтобы выполнять какие-то игрушечные абстрактные задачи вроде выведения в консоль вычисления площади прямоугольника или содержимого массивов. JavaScript нужен для взаимодействия, а главное – управления HTML и CSS содержимым на веб-странице. Делается это с помощью понятия DOM, что означает Document Object Model (от англ. Объектная Модель Документа).

DOM. Селекторы

       Для доступа к различным HTML-элементам с помощью стандарта DOM точно так же, как и в случае с CSS используются селекторы. Существует несколько видов селекторов:

  • document.getElementById();
  • document.getElementsByClassName();
  • document.getElementsByTagName();
  • document.querySelector();
  • document.querySelectorAll();

      Начнем с первого селектора – 'document.getElementById();'. С помощью этого селектора, к примеру, можно заполнить любой тег на странице, которых до этого был пустым, допустим, параграф, где написано - "Привет, Мир!". Поскольку, как можно заметить, если попытаться развернуть и перевести название селектора (это будет "Получить элемент по ID"), то этому параграфу нужно своевременно (до выполнения кода), присвоить ID, по которому этот код будет выполняться. Выглядеть код будет так:
      'document.getElementById("paragraph").innerHTML = "Привет, Мир!";'.



      Следующий селектор 'ducument.getElementByClassName();' – находит все элементы по имени указанного класса. То есть, мы можем присвоить HTML-элементам какие-то классы, а затем этот селектор способен возвращать их для дальнейшей с ними работы, например, изменения/добалвения контента. Проще говоря, этот селектор занимается примерно тем же, что и классы в HTML – собирает в себя другие элементы, объединяя в группу. Принцип его работы состоит только в том, чтобы собрать по HTML-коду все эелементы с прописанным (указанным) в селекторе классом, а затем возвратить (передать) эту информацию для дальнейшей работы кому-нибудь другому. Схема применения может выглядеть следующим образом:

<!DOCTYPE html>

<html lang="ru">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>DOM</title>

</head>

<body>

<h2>Поиск HTML элементов по имени класса</h2>

<p>Привет, Мир!</p>

<p class="intro">DOM очень полезен.</p>

<p class="intro">Этот пример демонстрирует метод getElementByClassName.</p>

<p id="demo"></p>

<script>

let x = document.getElementByClassName("intro");

document.getElementById("demo").innerHTML = 'Первый параграф (индекс 0) с классом="intro": ' + x[0].innerHTML;

</script>

</body>

</html>

*для справки: метод '.innerHTML' отвечает за отображение выбранного HTML-элемента. С помощью него, к примеру, можно обратиться, то есть прочесть и/или вывести контент любого тега и/или заменить его.

      Принцип работы этого кода довольно прост. В HTML мы создаем два параграфа заполненные текстом с классом 'intro' и один пустой параграф с id 'demo'. Далее мы объявляем переменную 'x' и присваиваем ей значение в виде 'document.getElementByClassName("intro");', то есть переменная 'x' теперь представляет тот контент, который входит в класс 'intro'. Как и все прочие перечисления индексов элементов в JS, селекторы при работе с DOM не стали исключением и тоже отсчитываются от ноля. Далее мы вставляем в пустой параграф с id 'demo' текст 'Первый параграф (индекс 0) с классом="intro": ' с помощью 'document.getElementById("demo")' и приплюсовываем ко всему этому переменную 'x[0]' с индексом 0, так как у нас два параграфа с классом 'intro', а исчисляются индексы, как говорилось выше, начиная от ноля, а затем вставляем всё это в тот же пустой параграф.
      Выглядит запутано, но глядя на код выше и вчитываясь в это запутанную инструкцию (пусть даже придется прочесть не один раз), всё непременно будет ясно.



      Следюущий селектор в нашем списке – это document.getElementByTagName();. Этот селектор по принципу своего действия очень похож на предыдущий, но с одним, как можно догадаться по названию, отличием: он находит в документе HTML-теги. Можно сказать, что у этого и предыдущего селектора буквально один и тот же принцип действия, только в этот раз мы бы подставляли не класс, а название тега: параграф, заголовок и/или другие.



      Следующий селектор выбора элементов – 'document.querySelector();'. Этот селектор работает уже не с HTML-тегами, а с селекторами CSS. Как говорилось выше, JS позволяет работать (манипулировать/взаимодействовать) не только с HTML, но и CSS. К примеру, если у нас есть заголовок в HTML с id 'header', то с помощью этого селектора мы можем обратиться к нему точно так же, как в CSS, то есть: 'ducument.querySelector("#header");'. Это актуально и в случае обращения к классу. Важно отметить, что при выборе селектором 'querySelector' класса будут выбираться не все элементы с соответсвующими классами, а только первое совпадение.
      Чтобы выбрать все элементы с одинаковыми нужными нам классами или тегами, существует вариация селектора 'querySelector''querySelectorAll'.

DOM. Изменение контента

      Рассмотрим, как можно манипулировать полученными с помощью селекторов объектами.
      Как уже говорилось выше, есть способ обратиться к содержимому HTML-элемента. Это делается с помощью свойства '.innerHTML'. Но есть и второй способ – это свойство '.textContent'. В чем же разница? Разница в том, что свойство '.innerHTML' занимается не только отображением "сухого" текста, то есть, буквально содержимого тега, а вообще всего, что касается этого тега. То есть, если рассмотреть принцип его работы на примере, допустим, тега 'ul' – неупорядоченного списка – то как результат работы свойства '.innerHTML' (его возвращения), мы получим всю структуру тега 'ul' с его дочерними элементами, текстом и всем прочим (к примеру, тегом strong). Свойство '.textContent' же занимается буквальным отображением тектсового содержимого, где не будет ничего, кроме текста, который содержит тег, к которому совершено обращение. По этой причине, при изменении текста с помощью свойства '.innerHTML' нужно указывать не только текст, но и сам тег, текст внутри которого требуется изменить.

DOM. Изменение стилей

       Изменение стилей с помощью DOM и JS провернуть довольно просто. Допустим, в HTML документе у нас есть заголовок, у этого заголовка есть id="header". Чтобы изменить его стиль с помощью JS, код будет выглядеть следующим образом (для удобства запишем функцию с методом (селектором) как переменную):

let h1 = document.getElementById("header");

h1.style.color = "red";

      Этим кодом мы через JS обратились по id к заголовку и стилизовали его, сделав его цвет красным.
      Кроме того, исходя из концепции DOM, JS позволяет добавлять не сущестовавшие ранее классы. Для этого существует метод '.classList.add("навзание_нового_класса");'. У добавления/создания чего-либо, конечно, есть и обратное действие, для этого есть метод'.classList.remove("название_удаляемого_класса");'.       Еще один метод, который часто используют для добавления/удаления классов – это '.classList.toggle("название_класса");'. Этот метод работает как некий переключатель – при первом срабатывании он "включает" новый класс, создавая его, при втором, соответственно, "выключает", удаляя.

*для справки: разумеется, используя все перечисленные методы для добавления и/или удаления классов, нужно использовать селекторы обращения к элементам. То есть, используя один из представленных выше методов, полная конструкция будет выглядеть так: 'document.getElementById("некий_id").classList.toggle("некий_класс");'.

DOM. Изменение атрибутов

       Концепцию манипуляции с атрибутами было бы удобно рассмотреть с точки зрения такого явления в веб-разработке, как "Image Gallery" – галереи изображений. То есть, некой структуры (блока) на сайте, который включает в себя серию (набор) неких изображений, относящихся к тематике сайта. Эти изображения по нажатию, например, на некую кнопку перелистывания, требуется каким-то образом менять. Для этого и применяется методика, описываемая далее.
      Итак, для начала, как можно вспомнить из начала этой "инструкции" тома по HTML, нам нужно добавить на страницу некую фотографию, а лучше – набор фотографий. Пусть это будет пять фотографий котов.

      ПОДЦЕПИТЬ КОГДА-НИБУДЬ КАКУЮ-НИБУДЬ ГАЛЕРЕЮ ИЗОБРАЖЕНИЙ ДЛЯ КОТОВ!!! И теперь, с помощью JS, мы можем воздействовать на эти изображения. Для начала нам нужно с помощью одного из уже известных селекторов обратиться к этим изображениям:

let cats = document.querySelector("#cats");

cats[0].getAttribute("src");

cats[0].setAttribute("src", "img/cat2.jpeg");

      Как видно из кода, с помощью объявленной переменной 'cats' и индекса (порядкового номера) "0" мы обращаемся к атрибуту 'src' первого изображения и получаем его. Затем мы меняем значение этого атрибута с помощью метода '.setAttribute', у которого используется не только значение 'src', но и то значение, которое требуется заменить. В данном случае, это путь к новому изображению – 'img/cat2.jpeg'.
      Точно так же, мы можем менять и любой другой атрибут, к примеру атрибут ссылки – тега 'a':

let link = document.querySelector("#link");

link[0].setAttribute("href", "http://ya.ru");

      В этом случае, если у нас есть некая ссылка с ID "link", у которой уже будет прописын некий URL, то он будет заменен на тот, что мы прописали, то есть на ya.ru.

DOM. Events

       Что такое "events"? Events в переводе с англиского – события. То есть, мы можем изменять объекты DOM структуры с помощью JS по ккаким-то событиям. Схема орагнизации реакции на какие-либо события выглядит следующим образом. Для начала нам, конечно, нужно выбрать какой-то элемент, с которым мы и будем работать. Затем, нужно добавить так называемого Event Listener – прослушивателя события. Он через точку записывается после обращения к элементу, а после него в круглых скобках и кавычках пишется, непосредственно событие. Самое распространенное, к примеру 'click'. Вторым елементом указывается функция, в которой мы пишем код, который будет запускаться, когда будет кликнут выбранный нами элемент. Ну а дальше всё как обычно из принципа работы функции. К примеру, изменим цвет заголовка на красный. Рассмотрим это на практике. Допустим, у нас есть эелемент заголовка – h1 с id "test". Код JS будет выглядеть следующим образом:

let h1 = document.getElementById("test");

h1.addEventListener("click", function() {

this.style.color = (this.style.color == 'black') ? 'red' : 'black';

});

Тестовый заголовок меняющий цвет по нажатию!

      Для одного элемента мы можем устанавливать несколько Event Listener.
      Точно такой же функционал, как и со сменой цвета заголовка из примера выше, мы можем цеплять и, к примеру, к кнопкам. Для наглядности и простоты, кнопка тоже будет менять цвет. По нажатию она будет менять цвет фона всей страницы! А код будет выглядеть следующим образом (HTML-код мы поместим в синюю рамку, а JS-код в красную):

<button id="button_test">Сменить цвет!</button>

let button = document.getElementById("button_test");

let isButtonApplied = false;

button.addEventListener("click", function() {

if(isButtonApplied === false) {

ducument.querySelector("body").style.background = "black";

isButtonApplied = true;

} else if (isButtonApplied === true) {

document.querySelector("body").style.background = "#F0F0F2";

isButtonApplied = false;

}

});

Финал JS. Игра на реакцию на web-странице

       Внимательно смотрите за кодом, как обычно HTML-код мы разместим внутри синей рамки, JS-код в красной, а CSS будет в зеленой:

<div id="shape"></div>

<h3>Время реакции <span id="reactionTime"></span></h3>

#shape {

width: 150px;

height: 150px;

background-color: green;

dysplay: none;

position: relative;

}

let startTime = new Date().getTime();

function getRandomColor() {

let letters = "0123456789ABCDEF".split('');

let color = "#";

for(let i = 0; i < 6; i++) {

color += letters[Math.floor(Math.random() * 16)];

}

return color;

}

let makeShapeVisible = function() {

let shape = document.getElementById("shape");

let top = Math.random() * 400;

let left = Math.random() * 700;

let width = Math.random() * 200 + 50;

shape.style.top = top + "px";

shape.style.left = left + "px";

shape.style.width = width + "px";

if(Math.random() > 0.3) {

shape.style.borderRadius = "50%";

shape.style.borderBottom = "0";

shape.style.backgroundColor = getRandomColor();

} else if(Math.random() >= 0.3 && Math.random() <= 0.7) {

shape.style.borderRadius = "0";

shape.style.backgroundColor = getRandomColor();

shape.style.borderRadius = "0";

} else if(Math.random() > 0.7) {

shape.style.left = "0";

shape.style.left = "0";

shape.style.borderLeft = "50px solid transparrent";

shape.style.borderReft = "50px solid transparrent";

shape.style.borderBottom = "100px solid " + getRandomColor();

shape.style.backgroundColor = "transparrent";

}

shape.style.dysplay = "block";

startTime = new Date().getTime();

}

setTimeout(makeShapeVisible, Math.random() * 1000);

document.getElementById("shape").onclick = function() {

let shape = document.getElementById("shape");

shape.style.dysplay = "none";

let finishTime = new Date().getTime();

let reactionTime = (finishTime - startTime) / 1000;

document.getElementById("reactionTime").innerHTML = reactionTime + " секунд";

setTimeout(makeShapeVisible, Math.random() * 1000);

}

Время реакции











Том IV. jQuery

Общие положения

       jQuery – это библиотека, построенная на основе языка JavaScript. То есть, весь код, написанной на этой библиотеке, соответственно, написан на этом языке. В целом, библиотеки в языках программирования – это сборники подпрограмм или объектов, используемых для разработки программного обеспечения. То есть, дополнительные средства, добавляющие функционал и/или упрощающие манипуляции с кодом программы. Говоря еще проще: библиотека – это набор из каких-то кусков кода, которые были написаны другими программистами для общего пользования. И подключая эти куски кода к коду нашей программы, мы можем значительно повысить функционал и/или упростить его реализацию.
      Для того, чтобы использовать библиотеку jQuery, её необходимо сначала подключить к веб-странице. Один из популярных вариантов сделать это – с помщью сайта 'googleapis'. Для этого мы просто вставляем в тег 'head' ссылку на внешний источник:
      <script>src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"</script> – это и есть внешняя ссылка для подключения библиотеки.
      Код с помощью jQuery записывается следующим образом: в начале всегда пишется знак доллара – $, то есть это обращение (выбор) того, что мы указываем далее в скобках, к примеру весь HTML-документ или что-то другое. Далее пишется '.ready', то есть код будет выполняться тогда, когда документ будет готов – загружен. Далее пишется ключевое слово 'function()', после чего открываются фигурные скобки. Внутри фигурных скобок, соответственно, мы можем писать код, который будет выполняться после загрузки документа. Пример в коде ниже выполняет функцию выбора всех заголовков 'h3', при нажатии на которые у них будет меняться цвет фона. После обращений к заголовкам (после доллара) для того, чтобы действие выполнялось по клику, пишется .click, а затем снова 'function()':

$(document).ready(function() {

$("h3").click(function() {

$(this).css("background-color", "red");

});

});

Селектор

       Как можно вспомнить из главы выше, в JS существует несколько методов обращения к какому-либо элементу – селекторов. В jQuery всё выбирается при помощи одного селектора. Этот селектор уже был представлен в главе выше – это знак '$'. Таким образом можно обращаться к любому объекту (элементу) в HTML. Будть до заголовки, списки или все элементы в списке ('$('h3');'). Но что делать, если нам нужно обратиться к какому-то конкретному элементу, например, в том же списке? Это делается с помощью такого же селектора, но в круглых скобках последовательно указывается интересующий нас эелемент. К примеру, у нас есть два списка, один неупорядоченный, другой упорядоченный. Но нам нужно взаимодействовать только с элементами из упорядоченного списка. Выглядеть код будет так: '$('ol li')'. Точно так же мы можем обратиться к элементами мы можем и по ID. Делается это так: $('#ваш_ID'). Та же схема актуальна и для класса.

Метод css()

       Как вы могли заметить, в главе об общих положениях использовался метод .css. Этот метод, как можно догадаться, позволяет взаимодействовать с элементами на уровне стилей. То есть, если мы создаем какой-то элемент в HTML с ID:

<h3 id="header">Заголовок</h3>

      Затем мы можем задать этому эелементу какой-то стиль с помощью jQuery при помощи метода .css:

$(#header).css('bacgroundColor', 'red');

      Как можно заметить, такой метод записи обращений к стилям гораздо короче, чем при помощи селекторов в JS. Но это не единственное и не самое главное приимущество. Дело в том, что мы в одном методе вызова CSS можем поменять сразу несколько свойств. Делается это при помощи объекта:

let testStyle = {

color: "green",

background: "yellow",

border: "1px solid red"

};

      Теперь этот созданный объект с набором стилей можно применить. Запись при этом будет чрезвычайно простой:

$('h3').css(testStyle);

      Для сравнения и лучшего понимания, можно рассмотреть, как бы выглядел бы код для изменения цвета элементов списка, но уже без применения jQuery, а на обычном JS:

let colors = document.querySelectorAll('h3');

for(let i = 0; i < colors.length; i++) {

colors[i],style.color = 'blue';

};

      А вот так с помощью jQuery:

$('ul li').css('blue');

Метод text()

       При помощи метода .text() можно получать и/или устанавливать любой текст. Этот метод вполне можно рассмтаривать как версию метода '.textContent' в JS. У метода .text() есть особенность: он выбирает не только текст в выбранном элементе, но и текст во всех потомках выбранного элемента. Работа этого метода так же проста, как и работа предыдущего метода. К примеру, если нам нужно получить текстовый контент какого-либо элемента, то код будет выглядеть так:

$('h3').text();

      Если же нам нужно изменить текстовое содержимое в выбранном элементе, то код будет выглядеть так:

$('h3').text('Новый текст');

*для справки: у jQuery существует очень большое множетсво самых различных методов, уместить описание которых в эту инструкцию задача непростая да и не рациональная. Поэтому, я вижу рациональным оставить ссылку на официальный сайт jQuery, где есть подробное описание каждого из всех методов с инструкциями и примерами в виде кода. Ссылка находится здесь.

Метод html()

       Метод jQuery .html() по своему принципу одинаков с методом из ванильного JS .innerHTML. Но, как и многие остальные манипуляции с помощью jQuery, этот метод позволяет проще взаимодействовать с HTML документом, изменяя его. К примеру, если в списке мы хотим заменить все его элементы на элементы ссылок, то код бы выглядел таким образом:

$('li').html('<a href="http://google.com">Сайт Google</a>');

*для справки: важным уточнением было бы то, что если в HTML присутствует какой-то элемент <input>, то с помощью jQuery этот элемент необходимо распознавать при помощи метода .text(), а не при помощи '.html()'. Это делается с целью безопасности, защищая сайт от "терроризма". Дело в том, что знающий программирование пользователь может отослать какой-либо JS код в поле input, дав какие-то инструкции и таким образом легко повредить сайт.

Метод attr()

       Как можно догадаться из названия, метод .attr() используется в jQuery для манипуляции с атрибутами в HTML, подобно методу .getAttribute из ванильного JS. Рассматривать подробнее этот метод не вижу смысла, но за одним исключением, которое удобно рассмотреть на примере работы с элементами <img>. Это вариация выбора элементов, с помощью "порядкового" селектора. То есть, если мы поместили в HTML ряд изображений, но нам нужно изменить параметры только одного из них, с помощью jQuery это можно сделать так:

$('img:first').attr('src', 'какой-то_другой_атрибут');

Метод val()

       Атрибут value используется в HTML в различных элементах. К примеру, при применении этого атрибута к элементу списка <li>, можно установить порядковый номер этого элемента. То есть, если установить, к примеру, "100", можно начинать отсчет именно с этого значения. Но с точки зрения jQuery гораздо полезнее получать value, например, из элемента <input>, чтобы узнать, что ввел пользователь в поле. Делается это следующим образом:

$('input').val();

      Соответственно, для установления нового значения, круглые скобки просто заполняются необходимым содержимым. В случае элемента <input> это делается, например, для очистки поля ввода для другого пользователя после того, как какой-то пользователь что-то ввел туда. Делается это точно так же, только в круглых скобках указывается пустая строка.

Методы манипуляции классами

       Базовые методы манипуляции классами в jQuery так же не отличаются от методов из ванильного JS и похожи названиями: '.addClass()', '.removeClass()' и '.toggleClass()'. Как можно заметить, эти методы одинковы с методами JS после обращения к .classList. На примере того же списка, для автоматического добавления классов к его элементам с помощью jQuery можно использовать такой код:

$('li:lt(3)').addClass('Первые_три_элемента');

      Как вы могли заметить, в параметре селектора при обращении к элементам списка есть еще один "подселектр". Эта запись позволяет выбрать последовательность элементов, чей индекс меньше установленного. Напомню, отсчет ведется от ноля. Соответственно, в этом примере выбираются все эелементы от 0 до 2.       Обратным от селектора :lt() существует селектор :gt(). Он выбирает все эелементы, чей индекс больше установленного.       Все остальные манипуляции с классами абсолютно идентичны с ванильным JS, описывать их мы не будем.

Метод click()

       Точно так же, как и в ванильном JS, у jQuery есть набор методов, которые позволяют реагировать на какие-то события. Опять же, полное и развернутое описание каждого из них кажется мне не слишком рациональным, поэтому ссылку на полный список с подробным описанием на сайте jQuery я оставлю здесь.
      Для наглядности снова обратимся к нашему ненумерованному списку. К примеру, нам нужно сделать так, чтобы при нажатии на первый элемент из списка, в браузере выводился alert. Код будет выглядеть следующим образом:

$('li').first().click(function() {

alert('Вы кликнули на первый эелемент!');

});

      Разумеется, точно так же мы можем выбрать несколько элементов, без уточнения .first() или подобных.

Метод keypress()

       Эта глава не только о самом методе .keypress(), но и об остальных методах, касающихся отслеживания нажатий клавиш на клаваиатуре, таких как .keydown() и keyup(). Метод .keydown() включается сразу после того, как клавиша буквально нажата. Метод .keyup() включается сразу после того как клавиша отпущена. keypress() включается как бы между этими состояними, но есть и существенное отличие, которое состоит в том, что методы .keyup() и .keydown() будут активированы, если, к примеру, нажать сочетание клавиш Shift + 'буква' – чтобы написать большую букву, а метод .keypress() будет активирован тогда, когда будет нажата большая буква. Важным уточнением было бы то, что все эти методы работают только в том случае, если в браузере есть элемент <input> и они с ним взаимодействуют. К примеру, можно написать код, который бы присылал alert сообщение, если была нажата любая клавиша (перед этим, разумеется, представим, что на страницу был добавлен элемент <input>):

$('input').keypress(function() {

alert('Вы нажали клавишу!');

});

      Обычно в коде требуется определить, какая именно клавиша была нажата. И если была нажата нужная нам клавиша, то в этом случае мы запускаем код. То есть, что чаще всего используется в том же эелементе <input>, если пользователь ввел какое-то содержимое в этот элемент, то удобнее всего было бы отправить весь заполненный материал при помощи клавиши Enter. Для этого нам нужно "слушать" событие нажатия именно этой клавиши. Для примера возьмем тот же код, но теперь в параметре исполняемой функции необходимо обозначить переменную 'event'. Как мы объясним программе, какую именно клавишу нам "слушать"? Для этого в JS предусмотрена система с кодами клавишь. То есть, у каждой из клавишь на клавиатуре есть свой собственный уникальный код, прописав который, мы можем взаимодействовать далее. У клавиши Enter код "13", по нажатию на которую мы будем выводить сообщение в консоль:

$('input').keypress(function(event) {

if(event.which === 13) {

concole.log('Вы нажали клавишу ENTER!');

};

});

Метод on()

       Метод .on() является универсальной заменой всем event-методам, таким, как к примеру .click() или .keypress(). В этом случае, чтобы реагировать, например, на клик и менять цвет вона заголовка, код бы выглядел так:

$('h3').on('click', function() {

$(this).css('background', 'red');

});

      Еще один сценарий, при котором можно использовать метод .on() это наведение мыши на какой-то объект. За это отвечает параметр 'mouseenter'. Обратным от эффекта этого параметра выступает параметр 'mouseleave'.

Эффекты

       В jQuery есть эффекты. Например, эффект плавного исчезновения какого-то элемента. Допустим, если мы хотим плавно убирать заголовки по клику, то код будет выглядеть таким образом:

$('h3').on('click', function() {

$(this).fadeOut("slow");

});

      Длинтельность эффекта можно регулировать как словами (в примере выше), так и милисекундами.
      Разумеется, обратным от эффекта .fadeOut является .fadeIn, он работает ровно по такому же принципу. Однако для удобства в jQuery существует метод .fadeToggle, который работает неким переключателем.
      Блок эффектов довольно важен для технического украшения и привлекательности страницы. Поэтому здесь я так же оставлю ссылку на официальный сайт с документацией jQuery, где описаны все эффекты.

Приложение "Список покупок"

      Думаю, было бы не слишком рационально размещать в этой текстовой инситрукци целое приложение-список покупок, поэтому мы напишем его на отдельной странице. Здесь же я расскажу только о том, как всё это работает. Здесь мы развернем описание кода JS и jQuery.

      

Перейти на эту страницу можно по этой кнопке: Перейти к списку!


      Итак. В jQuery есть отдельный метод, позволяющий реагировать на нажатие только непосредственно на тот элемент, на которое произошло нажатие, без распространения на родительские элементы. Делается это с апомощью метода '.stopPropagation()'. Для его работы необходимо задать параметр функции. Далее, чтобы распространить нажатие выше, нужно применить метод .parent(). Но что же делать с тем, что при добавлении пользователем новых эелементов, старые эелементы никуда не деваются? То есть, пользователь может добавить в список огромное количество различных пунктов, а они так и будут постоянно висеть. Для этого существует метод .remove(), который удаляет из структуры HTML документа выбранный элемент. Делается это с помощью callback-функции.
      Далее нам нужно через элемент <input> добавлять какой-то продукт в наш список. Делается это с помощью метода 'append()'. Выглядит код таким образом: '$('ul').append(<li></li>)'. Ну а что бы произошло непосредственное добавление текста из input, то нужно прибавить переменную (внимательно следите за кодом ниже).
Дописать полное описание принципа работы списка покупок!

Том V. Bootstrap

Общие положения

      Bootstrap – это популярный фрэймворк (библиотека), которая удобно, быстро и эффективно позволяет создавать адаптивные веб-страницы как для десктопного отображения, так и для мобильного. При подключении Bootstrap к странице, он вносит ряд изменений в стили, которые не соотносятся с настоящими стилями этой страницы. По этой причине я вижу рациональным для демонстрации работы Bootstrap сделать отдельную, внешнюю веб-страницу.

Перейти на неё можно по кнопке далее: Перейти к Bootstrap!


      Так же мне бы хотелось дополнительно с акцентировать внимание на том, что лично я в применении технологий Bootstrap не вижу фундаментального смысла. Если вы достаточно хорошо знакомы с технологиями CSS, а именно CSS Grid и CSS Flex, то это позволит вам создавать столь же адаптивные веб-старницы, но еще и более глубокой и гибкой их настройкой. В этом томе описания этой технолгии будут описаны элементы, которые лично для меня кажутся уж слишком ограничивающими, превращающие разработчика в ребенка, который в погоне за скоростью не способен самостоятельно указать даже цвет текста. В виду всего этого, описание этого фреймворка будет весьма сжатым и в [описании] будет множетсво ссылок на внешние статьи учебников, так как мне не хотелось бы тратить на это время. Если же вас заинтересует данная технология, то о ней всегда можно прочесть гораздо более исчерпывающее руководство, опять же, на том W3Schools.

Responsive Design

      Итак, как мы уже условились, ключ к красивому, а главное функциональному сайту кроется в его адаптивности, а именно, адаптивная (responsive) разметка элементов. То есть, разметка, реагирующая на различные размеры экранов устройств, на которых осуществляется загрузка веб-страницы.
      Прежде всего, основная задача для реализации подобного функционального поведения лежит на контейнернерах. В Bootstrap контейнерами называются элементы <div> с классом 'container', которые содержат внутри себя какой-то элемент. Контейнеры являются основными и самыми необходимыми элементами в Bootstrap, если используется grid-система (установленная по умолчанию).

*для справки: grid-система – это некая сетка размещения элементов на веб-странице. То есть, весь экран веб-сайта разбивается на колонки, а элементы внутри них способны автоматически подстраиваться друг под друга. В целом, css grid-view во многом помогает в дизайне веб-страниц тем, что серьзено упрощает размещение элементов.

      К примеру, с помощью техники grid-css и технологий Bootstrap мы можем разместить у себя на странице три адаптивных колонки текста одинаковой ширины, которые будут менять своё расположение в зависимости от размера экрана. Делаться это будет с помощью такого кода:

<div class="container">

<div class="row">

<div class="col-sm">

Одна из трех колонок

</div>

<div class="col-sm">

Одна из трех колонок

</div>

<div class="col-sm">

Одна из трех колонок

</div>

</div>

</div>

Grid

      Grid-cистема построена с помощью flexbox свойств и позволяет создавать до 12ти колонок по ширине страницы. Если использовать все 12 колонок нет необходимости, их можно группировать вместе, для создания более широкого пространства для контента. Как говорилось выше, grid-система адаптивна, то есть, чувствительна к ширине – колонки переустанавливаются (перераспределяются) автоматически, в зависимости от ширины экрана устройства.       В Bootstrap есть набор классов, которые позволяют использовать и настраивать grid-систему, их всего пять и это:

  • .col- – используется для очень маленьких девайсов, ширина экрана которых меньше 576px;
  • .col-sm- – используется для маленьких устройств, ширина экрана которых равна или больше 576px;
  • .col-md- – ширина экрана равна или больше 768px;
  • .col-lg – большие устройства, ширина которых равна или больше 992px;
  • .col-xl- – очень большие девайсы, ширины которых равна или больше 1200px;

      Классы, описанные выше, могут комбинироваться. Подводя итог, структура Bootstrap Grid выглядит следующим образом: сначала размещаются элементы <div> класса ''raw, то есть, строки, а в этих эементах <div> уже, соответсвенно, располагать колнки разных классов, описанных в списке выше. Прописывать полное название классов не обязательно, Bootstrap может делать это автоматически, выставляя нужную ширину колонок. То есть, если установлено два элемента в контейнере с классом '.raw', то ширина колонок будет выставлена в 50%, если три то 33.33% и так далее.
      Если нужно работать НЕ автоматически, то запись класса, внутри контейнера с классом 'raw' будет выглядеть так: '<div> class="col-*-*"', где первая звездочка означает значение адаптивности, то есть, тот элемент, который мы указывали в списке выше (к примеру, -sm). Вторая звездочка отображает число колонок, которое может изменяться, от одной до двенадцати для каждой строки.
      По подробнее остановившись на основных контейнерах для Bootstrap скажу, что есть два их типа: уже описанный '.container' – предоставляет фиксированную ширину контейнера и '.container-fluid' – предоставляет ширину контейнера, который заполняет всю ширину экрана.

Topography

      Topography – это оформление контента, в Bootstrap для этого есть установки по умолчанию:

  • Для текста по умолчанию используется размер 16px, высота строки 1.5 и семейство шрифтов – Helvetica New, Helvetica, Arial, sans-serif;
  • У всех элементов <p> свойство margin-top установлено на '0', а свойство margin-bottom на 1rem (то есть, 16px);
  • У элементов заголовков:
    • Заголовок h1 имеет значение в 2.5rem (40px);
    • Заголовок h2 имеет значение в 2rem (32px);
    • Заголовок h3 имеет значение в 1.75rem (28px);
    • Заголовок h4 имеет значение в 1.5rem (24px);
    • Заголовок h5 имеет значение в 1.25rem (20px);
    • Заголовок h6 имеет значение в 1rem (16px);

      Так же для заголовков можно использовать класс .display- (со значением от одного до шести) и с помощью него задавать размер и толщину текста для заголовка. Кроме того, при работе с заголовками можно использовать HTML элемент <small>, который позволяет создавать текст второстепенного значения прямо внутри заголовка – текст будет немного меньше и тоньше.
      Элемент <mark> добавляет желтоватый фон для текста, так, будто его выделяет неких маркер светлого оттенка. Элемент <abbr> добавляет тексту нижнее подчеркивание точками.

 вы можете подробнее прочесть про различные классы Bootstrap Topography на сайте W3Schools.

      Так же Bootstrap позволяет использовать набор классов для добавления цветов текста. Если вы хоть немного значете CSS, то смысла в настолько глубоком применении Bootstrap на своей веб-странице я не вижу.


 тоже на сайте W3Schools вы можете прочесть про все классы, позволяющие работать с цветами в Bootstrap.

      Там же можно прочесть и про классы, позволяющие задать цвет фона. Подробнее про то, как может выглядеть текст с применением подобных классов, а так же про применение других классов, задающих оформление, смотрите по ссылке Bootstrap из главы "Общие положения".

Nav Bar

      Nav Bar'ом в пользовательском интерфейсе называют панель навигации. Эту панель вы запросто можете встреить на практически любом сайте. Более того, даже на странице инструкции, котороую вы сейчас читаете, в верхней её части есть такая панель. Bootstrap позволяет устанавливать быстро установить панель навигации на свой сайт, к тому же, она будет адаптивной. Её код можно в HTML-файле старницы Bootstrap по ссылке выше и скопировать оттуда, но так же увидеть здесь, на картинке:

      Ну а сейчас я расскажу, как же тут всё работает.
      Всё начинается с семантического элемента <nav>, который по своей сути является тем же самым, что и контейнер <div>. Поэтому и семантический – для логического "понимательного" выделения элементов. Далее в этом элементе, как и в наших предыдущих примерах, встречаются классы. После тега <nav>, соответственно, идет класс, определяющий сам компоненет навигационной строки, который так и называется – navbar. Следующий класс – navbar-expand-lg – класс, позволяющий создавать адаптивную разметку. Если вы перейдете на страницу Bootstrap, то можете попробовать всячески сверачивать окно браузера и увидеть, что навигационная панель сворачивается в так называемое "бургер-меню". Следующие два класса – navbar-light и bg-light – используются для настройки цветовой гаммы. Этими цветами можно управлять по той же схеме, что и в предыдущей главе, о чем подробнее можно прочесть на сайте Bootstrap. Кроме того, цвета можно задавать и вручную, для этого можно просто прописать style="background-color: 'цвет'.

      Следующий класс – navbar-brand – используется для размещения лого веб-сайта, но в данном примере там размещено просто слово "Navbar".

      Здесь описаны базовые классы для работы с панелью навигации. Для более подробного ознакомления со всеми остальными классами, можно посетить сайт Bootstrap. Но на самом деле, классы названы довольно наглядно, поэтому я бы рекомендовал попытаться самостоятельно исследовать их, скопировав код к себе в редактор.

Формы и таблицы

      Если вы к моменту прочтения этого текста уже пытались стилизовать формы или таблицы с помощью CSS, то вы понимаете, что делается это совсем не в две строки кода. У Bootstrap есть функционал, который позволяет делать это очень быстро и легко. Начнем с кода простой формы, где есть только строка электронной почты и пароля. Такие формы часто используются не для регистрации, а для входа пользователя на сайт:

      

      

      В Bootstrap, конечно же, есть и более сложные формы, которые используются для регистрации. Более подробно о них можно прочесть на сайте Bootstrap, найдя статью "Forms".

To Be Continued...
//документ в разработке//


      Конечно, абсолютно всю информацию бывает весьма сложно уместить на какую-то примитивную веб-страницу, тем более, учитывая уровень навыков того, кто в данный момент её создает. Поэтому предлагаю выход!
      В этом списке представлены некоторые внешние интернет-ресурсы, где можно найти остальную, безграничную информацию по фронтенд/бэкэнд разработке, полный объем которой простому смертному невозможно уместить на одной web-странице:

  1. Это   HTML5 Book – справочник не только по HTML5, но и по CSS, а так же JavaScript;
  2. А это  MDN – популярный во всём мире ресурс-форум для web-development'a;
  3. Здесь  очень известный и очень мощный справочник по web-dev'у – этоW3Schools;

Нижнее оглавление