Шпаргалка по Pandas

Series Структура/объект Series представляет из себя объект, похожий на одномерный массив (питоновский список, например), но отличительной его чертой является наличие ассоциированных меток, т.н. индексов, вдоль каждого элемента из списка. Такая особенность превращает его в ассоциативный массив или словарь в Python. У объекта Series есть атрибуты через которые можно получить список…

подробнее

Элементы и стили (примеры)

Пример сайта: HTML разметка:

CSS:

  Логотипы вставляют с помощью тега img, так как логотип — это содержательное, а не декоративное изображение. Есть ошибочный подход, когда логотип вставляют фоном, например, у тега h1. Фон предназначен для вставки декоративных изображений. На всех страницах сайта, кроме главной, логотип оборачивают в ссылку, которая…

подробнее

Akka Stream принцип работы и создание своих элементов

Данная статья посещена вопросам работы потока Akka Stream в целом и вопросу создание своих элементов для графов в частности. Изначально планировалось разобраться только с вопросом создания своего элемента графа с нужными свойствами, но параллельно получились отсылки к тому как поток работает. Сначала два слова о том из чего состоит Akka…

подробнее

Пример Instagram на JS

Небольшой аналог Instagram.

В процессе мы создадим несколько фильтров, которые будут применяться к фотографии в блоке .photo. Переключатели фильтров мы разместим в блоке .toggle-controls, а само переключение будет работать на JavaScript. Cначала подготовим разметку для нашего будущего фотоприложения.

Теперь давайте создадим первый набор фильтров для класса .walden. Набор фильтров применится к большой фото и к переключателю.

Давайте добавим заготовку для ещё одного переключателя. Класс для второго фильтра будет называться toaster.

Затем «отрепетируем» переключение фильтра без использования JavaScript. Для этого пока будем менять HTML-код вручную. При переключении фильтра происходит два события:

Первое. В переключателе класс active перемещается на текущий фильтр:

Второе. У блока с большим фото меняется класс текущего фильтра:

Мы «переключили» текущий фильтр, а чтобы увидеть его эффект, зададим его стили.

Этот фильтр будет делать фото ещё винтажнее, чем walden: сделает его малоконтрастным, с яркими цветами, небольшим поворотом по цветовому кругу и эффектом сепии.

Всё готово для «оживления» интерфейса с помощью JavaScript. HTML-код Кекстаграма приведён в исходное состояние: фильтр ещё не выбран и к фото не применён.

Сначала включим фильтр toaster и применим его к фотографии. Для этого:

1. Найдём элемент списка с классом toaster и сохраним его в переменную control. var control = document.querySelector('li.toaster');

2. Найдём элемент с классом photo и сохраним его в переменную photovar photo = document.querySelector('.photo');

3. Теперь к элементу списка, хранящемуся в переменной control, добавим класс activecontrol.classList.add('active');

4. А к блоку большой фотографии, она уже в переменной photo, добавим класс toaster: photo.classList.add('toaster');

Теперь попробуйте повторить это сами. Обратите внимание, что при добавлении класса с помощью classList.add точка в начале строки не пишется.

На предыдущем шаге мы «включили» фильтр toaster из исходного состояния, а сейчас переключим его на walden. Для этого:

1. Снова найдём элемент списка с классом toaster, сохраним его в переменную toasterControl и удалим у него класс active, добавленный ранее: var toasterControl = document.querySelector('li.toaster'); toasterControl.classList.remove('active');

2. Найдём элемент списка с классом walden, сохраним его в переменную waldenControl и добавим ему класс active: var waldenControl = document.querySelector('li.walden'); waldenControl.classList.add('active');

3. Найдём элемент с классом photo и сохраним его в переменную photo. var photo = document.querySelector('.photo');

4. Удалим у фото класс toaster и добавим класс walden: photo.classList.remove('toaster'); photo.classList.add('walden');

Разберёмся подробнее в том коде, который мы написали. Вот один из фрагментов:

var toasterControl обозначает, что мы создаём переменную с именем toasterControl.

document – это специальная переменная, в которой хранится корневой элемент HTML-документа, будем называть его просто «документ». В нём хранятся все остальные теги.

querySelector – это метод документа, который по указанному селектору ищет и возвращает первый найденный элемент, подходящий под селектор. В этом методе можно использовать любые CSS-селекторы, уже знакомые вам.

Метод querySelector не всегда может найти элемент и тогда переменная остаётся пустой. Чтобы проверить, что в переменной есть элемент и с ним можно работать, используется условный оператор if.

У элементов, которые мы находим с помощью querySelector, есть свойство classList, в котором хранится список классов элемента.

Список классов можно изменять, удаляя или добавляя в него классы с помощью методов add и remove свойства classList.

Теперь немного отдохнём от JavaScript и создадим ещё один фильтр.

Вернёмся к JavaScript и немного улучшим наш код. Посмотрите эти строчки: var control = document.querySelector('li.toaster'); photo.classList.add('toaster');

Название фильтра toaster в коде повторяется два раза, Карл. Чтобы «переключить» фильтр, придётся поменять код в двух местах. А это лишняя работа!

Избавимся от дублирования. В начале кода создадим переменную с названием фильтра: var filterName = 'toaster'; В метод поиска элементов мы передаём строку li.toaster. Чтобы получить такую же строку из переменной, воспользуемся операцией «склеивания» строк: 'li.' + filterName // результат: 'li.toaster'

В коде для поиска переключателя заменим строку на выражение с переменной:

Внутри photo.classList.add находится такое же значение, как и в переменной, поэтому просто заменяем строку на переменную:

Продолжим улучшать наш JavaScript. Теперь упакуем весь код, отвечающий за переключение фильтров, в функцию. Это позволит проще его использовать и изменять.

Функция создаётся выражением, начинающимся с ключевого слова function. Например, в этом коде мы создаём функцию для суммирования чисел c именем sum:

У функции есть набор параметров, в нашем случае это переменные a и b, и тело, которое выполняется при вызове функции. Тело функции заключается в фигурные скобки. Количество параметров может быть любым, их может и не быть вовсе.

Обернём наш код для переключения фильтров в функцию toggleFilter, у которой будет один параметр — filterName. А затем вызовем функцию с разными названиями фильтра в качестве параметра.

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

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

Если же вызвать созданную функцию несколько раз подряд с разными параметрами: toggleFilter('toaster'); toggleFilter('kelvin'); То активными станут сразу несколько переключателей, а к фотографии применятся несколько фильтров одновременно.

У HTML-элементов есть возможность создавать специальные атрибуты, в которых можно хранить вспомогательную информацию и легко передавать её в JavaScript. Такие атрибуты начинаются с префикса data-.

При этом data-атрибуты валидны и никак не влияют на отображение элементов в браузере.

Давайте добавим переключателям data-атрибуты data-filter, в которых будем хранить название каждого фильтра.

Чтобы с помощью JavaScript считать значение data-атрибутов, нужно использовать свойство dataset. Пример:

В свойстве dataset HTML-элемента хранятся все значения его data-атрибутов. Обратиться к ним можно по названию data-атрибута, удалив из названия приставку data-.

Добавлять содержимое в HTML-элемент через JavaScript можно с помощью свойства innerHTML:

Присвоенная свойству innerHTML строка заменяет всё содержимое HTML-элемента. В этой строке можно использовать любой HTML-код.

Если нужно совершить несколько однотипных действий, то можно использовать цикл for. Вот его синтаксис:

Ранее мы использовали метод querySelector, который возвращает только один элемент: первый элемент, соответствующий селектору.

Другой метод querySelectorAll возвращает все элементы, соответствующие селектору.

С помощью for удобно перебирать найденные элементы:

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

Лучше найти все переключатели внутри списка и перебрать их с помощью цикла. И внутри цикла задавать название каждому переключателю.

Начнём исправлять ошибки в функции переключения фильтров, которые возникают, когда она запускается несколько раз.

Первая ошибка заключается в том, что все переключатели подсвечиваются как активные. Причина в том, что внутри функции класс active добавляется текущему переключателю, но не удаляется у ставших неактивными.

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

На предыдущем шаге мы уже находили все переключатели и сохраняли их в переменную controls: var controls = document.querySelectorAll('.toggle-controls li'); Теперь мы можем использовать эту переменную внутри функции — добавить в начало функции ещё один цикл, который пройдётся по всем переключателям и удалит у них класс.

Ошибку с выделением активного переключателя исправили. Осталась вторая ошибка: фильтр на большой фотографии применяется неправильно. Причина — лишние классы фильтров у большой фотографии. Вот что происходит с HTML, когда функция переключения вызывается несколько раз: <div class="photo walden toaster kelvin"></div>

Чтобы исправить ошибку, надо удалять классы фильтров у блока фотографии при каждом переключении. Но класс photo удалять нельзя. Классы фильтров мы знаем, ведь они хранятся в data-атрибутах переключателей.

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

И ещё одна важная деталь. Переменная photo теперь используется в самом начале функции, поэтому мы вынесем строчку поиска переменной из функции в самый верх кода: var controls = document.querySelectorAll('.toggle-controls li'); var photo = document.querySelector('.photo');

А внутри функции переменную photo надо удалить. Заодно мы ускорим работу скрипта, избавившись от ненужного поиска элемента .photo, который происходил при каждом переключении фильтра.

В предыдущих шагах мы подготовили функцию для переключения фильтров и запускали её из JavaScript-кода. Сейчас мы сделаем так, чтобы пользователь сам мог менять фильтры, щёлкая по переключателям мышкой.

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

В этом фрагменте кода мы сделали следующее:

  1. Нашли элемент списка и у него вызвали метод addEventListener.
  2. Указали отслеживать событие click или «щелчок мыши».
  3. Для щелчков указали функцию-обработчик без названия, внутри которой вызвали функцию переключения фильтров.

Метод addEventListener был вызван у одного элемента, поэтому будут обрабатываться события только этого элемента. Первый параметр задаёт тип события, второй — функцию-обработчик.

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

Поэтому, чтобы обрабатывать щелчки по всем переключателям, лучше воспользоваться циклом. Тем более, что цикл по всем переключателям у нас уже есть.

А чтобы сократить код в цикле, создадим новую функцию:

Функция clickControl принимает найденный элемент и добавляет ему обработчик щелчков мыши, в котором вызывается функция переключения фильтра. Название фильтра для функции переключения берётся из data-атрибута самого элемента.

Благодаря clickControl нам нужно добавить только одну строчку в цикл, чтобы все переключатели заработали:

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

1. Изменим обработчик внутри clickControl:

2. Изменим параметр у toggleFilter, теперь это не строка, а элемент:

3. В toggleFilter передаётся переключатель и искать его уже не надо, удаляем лишний код

4. Название фильтра для фото теперь берём из data-атрибута переключателя:

А теперь вы самостятельно сделаете последний штрих! При загрузке страницы должен быть выбран фильтр по умолчанию. Для этого нужно в конце кода добавить новую переменную, сохранить в неё нужный переключатель и с этой переменной вызвать функцию переключения.

  1. Менять левую координату ползунка-разделителя, чтобы он двигался вправо или влево.
  2. Менять ширину блока с изображением-оригиналом так, чтобы граница фотографий оставалась под ползунком.

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

Чтобы изменить CSS-свойство элемента в скрипте, нужно обратиться к свойству styleэлемента. Например: var element = document.querySelector('.photo-original'); element.style.width = '10px';

В этом коде элементу задаётся ширина 10px.

С помощью element.style можно и получать, и изменять значения свойств.

Но названия свойств в JavaScript не всегда совпадают с их названиями в CSS. Например, CSS-свойство left совпадает с style.left, но CSS-свойство baсkground-color уже отличается: style.backgroundColor.

Результат:

HTML:

CSS:

JS script:

JS separator:

Просто пример:

HTML:

CSS:
JS:

Создание форм из моделей¶

Класс ModelForm Если вы создаете приложение, управляемое базой данных, скорее всего, у вас будут формы, которые тесно связаны с моделями Django. Например, у вас может быть модель BlogComment, и вы хотите создать форму, которая позволяет людям отправлять комментарии. В этом случае было бы излишним определять типы полей в вашей форме,…

подробнее

Django Forms

HTML-формы HTML форма – это набор элементов внутри <form> … </ form>, которые позволяют посетителю выполнять такие действия, как ввод текста, выбор параметров или управление объектами и т. д., а затем отправлять эту информацию обратно на сервер. Некоторые из этих элементов интерфейса формы – поля ввода текста или флажки –…

подробнее

Python волшебные методы “__getattr__”, “__getattribute__” и другие

За обращение к атрибутам метода отвечают методы класса (это протокол обращения к атрибутам): __getattribute__ __getattr__ __setattr__ __delattr__ Первые два метода отвечают за доступ к атрибутам по чтению. При этом отдельный метод __getattr__ позволяет перехватывать доступ только к не существующим атрибутам.  При этом можно считать, что при доступе на чтение к…

подробнее

MODX сменить путь к админке

1. Первым действием заходим в файловый менеджер, либо через FTP, либо через хост. (без разницы) и меняем имя папки manager на admin к примеру. 2. Переходим в папку /core/config/ и там будет лежать файл config.inc.php открываем его любым текстовым редактором. 3. Вначале кстати идёт подключение к Вашей БД. Дальше ищем $modx_manager_path и $modx_manager_url (обычно строчка № 38-42). И меняем manager на admin…

подробнее

Настройки DJANGO ADMIN FORM

Для редактирование данных из админки создается наследник класса admin.ModelAdmin. Данный класс необходимо зарегистрировать и связать с моделью данных через вызов метода admin.site.register(<Класс модели данных>, <Класс админки>) или через декоратор @admin.register(<Класс модели данных>). Если в начале такого класса разместить комментарий в “”” Название страницы “”” – то это будет название для…

подробнее

HTML5

несколько важных фактов об HTML5:

  • HTML5 обратно совместим с HTML4.
  • HTML5 не цельная спецификация, а набор модулей разной степени готовности.
  • Многие модули HTML5 имеют хорошую поддержку во всех текущих браузерах.
  • HTML5 с нами надолго.

Это означает, что HTML5 можно использовать уже сейчас. Для этого достаточно задать такой тип документа:

А теперь пара новых тегов:

  • header — хедер сайта или раздела;
  • footer — футер сайта или раздела.

Да-да, это те самые хедер и футер, которые обычно верстались дивами с классами header или footer. Они были настолько распространены, что для них было решено создать собственные теги.

Хедер — это не только привычная шапка сайта с логотипом и меню, он может использоваться и как «шапка» какой-нибудь статьи или раздела сайта. Конечно, в случае со статьёй хедер называют не «шапкой», а вводной частью, в которой могут содержаться заголовки, оглавление и так далее.

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

А раз теги неуникальные, то и стилизовать их лучше с помощью классов.

Если вы не хотите использовать классы для шапки и подвала сайта, то можете использовать селекторы body > header и body > footer. Эти селекторы не повлияют на хедеры и футеры, вложенные более глубоко.

Другое дело новый тег main, который обозначает основное содержание сайта и по спецификации может использоваться на странице только один раз. Для его стилизации никакие классы не нужны.

Раньше почти все разделы верстались на дивах. Но в HTML5 добавили сразу два новых тега для разметки разделов:

  • section — смысловой или логический раздел документа;
  • article — самостоятельный и независимый раздел документа.

Чтобы не было путаницы, разберём где и когда использовать разные контейнеры:

  • div — контейнер общего назначения, не обязательно смысловой. Дивы используются для разметки мелких блоков, создания сетки и декоративных эффектов.
  • section — более крупный логический контейнер, объединяющий содержание по смыслу. Например, блок «О компании», список товаров, раздел личной информации в профиле и так далее.
  • article — самостоятельный, цельный и независимый раздел документа. Этот раздел можно в неизменном виде использовать в различных местах, в том числе и на других сайтах. Примеры: статья, пост в блоге, сообщение на форуме и так далее.

В HTML5 добавили специальный элемент для навигационных блоков — тег nav.

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

Простейший способ использовать такой шрифт — найти его в специальном сервисе по названию, получить там код подключения шрифта, вставить этот код в свою вёрстку и использовать шрифт, как обычно, с помощью свойства font-family.

Подобных сервисов с бесплатными шрифтами достаточно много. Один из самых известных — это Google Fonts. А вот похожий русскоязычный сервис: webfont.ru.

При использовании веб-шрифтов не забывайте указывать так называемые «фоллбэчные» шрифты — стандартные шрифты, которые будут отображаться, если веб-шрифт либо недоступен, либо не поддерживается старым браузером пользователя. Для этого нужно всего лишь перечислить их через запятую после нестандартного шрифта: font-family: "PT Sans", "Arial", sans-serif;

Технически подключение веб-шрифтов производится с помощью CSS-правила @font-face.

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

Более подробно о технических тонкостях подключения шрифтов можно прочитать в серии статей на webfont.ru: первая часть и вторая часть.

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

  1. Берут файл шрифта (например, .ttf) и конвертируют в веб-формат в сервисе наподобие Font Squirrel (для кириллических шрифтов надо указать дополнительные параметры конвертации).
  2. Затем сконвертированные файлы шрифта размещают у себя на сервере.
  3. И подключают шрифт с помощью @font-face.

aside — это дополнительное содержание, не связанное напрямую с основным. Ещё такие блоки часто называют «сайдбарами» или боковыми панелями.

Так как пост — это цельный, законченный и самостоятельный фрагмент информации, то для его разметки идеально подойдёт тег article.

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

Это означает, что у нашего поста будет своя собственная структура (шапка, подвал, разделы) и иерархия заголовков, которая будет начинаться с заголовка первого уровня.

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

Пример реализации

Стилистика:

HTML:

В HTML5 добавили специальный тег для обозначения даты и времени — time. У этого тега есть атрибут datetime — для указания даты в машиночитаемом формате ISO 8601.

С помощью <time> можно описывать даты одновременно и для человека, и для машины, например: <time datetime="2014-04-20">Вчера</time> мы готовили курс к публикации.

Браузер отображает только содержимое тега, а содержимое datetime не отображается. Человек увидит только слово «вчера», а машина прочитает атрибут и получит дату в нужном ей формате.

Один из новых тегов — это <figure>.

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

Обычно каждый такой материал сопровождает разъясняющий комментарий или «легенда». Для обозначения этого комментария и предназначен ещё один новый тег — <figcaption>, который размещается первым или последним элементом внутри <figure>. Пример: <figure> схема, график, диаграмма и так далее <figcaption>Легенда</figcaption> </figure>

Для вставки видео предназначен тег video. Его основные атрибуты:

  • width и height – задают ширину и высоту видео
  • controls – пустой атрибут, при наличии которого отображается панель управления видео
  • preload – задаёт режим предзагрузки видео, имеет 3 возможных значения:
    • none — не загружать ничего;
    • metadata — загрузить служебную мета-информацию (длительность, первый кадр и т.д.);
    • auto — можно загрузить всё видео.
    • значение по умолчанию зависит от браузера
  • src – задаёт адрес видеофайла
  • autoplay – пустой атрибут, при наличии которого воспроизведение видео начинается автоматически
  • poster – задаёт адрес картинки-обложки, которая отображается, когда видео еще не загрузилось или не воспроизводится

У тега video есть атрибут src, в котором можно указать адрес видеофайла, но мы почему-то его не использовали. Всё дело в том, что в текущий момент существует несколько форматов видео, каждый из которых хорошо поддерживается лишь некоторыми браузерами. Вот три самых распространённых формата и их поддержка: MPEG-4/H.264OGG/Theora и WebM. Поэтому мы должны в видео указывать адреса файлов во всех этих форматах (и конвертировать исходное видео в эти форматы, конечно). Делается это с помощью тегов source:

В атрибуте src указывается адрес видеофайла, а в атрибуте type его тип (также там могут указываться и кодеки). Браузер из списка видеофайлов выбирает первый, который может проиграть и загружает его. Атрибут type не является обязательным, так как браузер умеет сам определять тип и кодеки, но указывая тип явно, мы помогаем ему не ошибиться.

Для вставки аудио предназначен тег audio. Его основные атрибуты:

  • controls – пустой атрибут, при наличии которого отображается панель управления
  • preload – задаёт режим предзагрузки видео, имеет 3 возможных значения:
    • none — не загружать ничего;
    • metadata — загрузить служебную мета-информацию (длительность и т.д.);
    • auto — можно загрузить всё.
    • значение по умолчанию зависит от браузера
  • src – задаёт адрес видеофайла
  • autoplay – пустой атрибут, при наличии которого воспроизведение видео начинается автоматически

У звуковых файлов с поддержкой форматов дела обстоят лучше, чем у видео. Для охвата большинства современных браузеров, достаточно использовать всего два формата: MP3 и OGG. И снова мы не можем указать только один файл в атрибуте src у тега audio. Мы должны так же, как и в случае с видео, перечислить адреса звуковых файлов в разных форматах с помощью тегов source:

В HTML-формах есть специальная кнопка, которая сбрасывает введённые значения и возвращает изначально установленные. Это поле ввода с типом reset.

Помимо кнопок отправки формы или сброса введенных значений, существуют и «просто кнопки». При щелчке на такую кнопку никаких действий не происходит, а все необходимые действия обычно задаются при помощи JavaScript.  <input type="button" value="Кнопка">

В качестве кнопки отправки формы можно использовать изображение.

Для этого у тега input нужно указать тип image.

Аналогично обычным изображениям на сайте у кнопки-изображения есть еще два атрибута:

src адрес изображения
alt альтернативный текст, отображаемый в том случае, если изображение не загружено

Кнопка-изображение работает аналогично кнопке submit, но на сервер дополнительно передаются координаты точки, по которой был произведен щелчок.  <input type="image" alt="Войти" src="/assets/course74/enter.png">

Помимо тега input для добавления кнопок можно использовать тег button. Он расширяет возможности создания кнопок. Внутри тега button можно размещать любые HTML-элементы, в том числе изображения. <button>Календарь <img src="/assets/course74/calend.png" alt=""></button>  Если в атрибуте type тега button указать значение submit или reset, то кнопка будет отправлять данные на сервер или сбрасывать введенные значения. По умолчанию значение атрибута type – submit.

новые возможности форм, большая часть которых была добавлена в HTML5.

Чтобы указать, что поле обязательно для заполнения, нужно добавить ему пустой атрибут required: При попытке отправить форму с незаполнеными обязательными полями браузер выведет всплывающее предупреждение.

В форму заказа важно включить поле даты доставки. А для выбора даты из календаря существует новый тип поля ввода — date. При клике на данное поле в форме всплывает календарик. Если браузер не поддерживает поле для ввода даты, то вместо него отображается обычное текстовое поле. Но иногда нужно указывать дату в других форматах, и для этого существуют дополнительные «временные» типы полей, например, time для выбора времени.

поля с типами date и time, но существуют и другие типы полей для ввода дат:

datetime выбор даты с указанием времени (c учетом временной зоны)
datetime-local выбор даты с указанием времени (без учета временной зоны)
week выбор порядкового номера недели в году и года
month выбор месяца и года

Если браузер не поддерживает поле для ввода месяца, то вместо него отображается обычное текстовое поле.

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

Пример:

Связывание текстового поля и списка осуществляется при помощи атрибута list у тега input — значение list должно быть таким же, как значение атрибута id у списка.

Если тег input имеет специфический тип, например email или другие, которые будут рассмотрены далее в курсе, то в списке отображаются только корректные для данного типа значения.

Для ввода числовых значений существует специальный тип поля ввода number. Рядом с полем браузер автоматически подставляет две стрелочки для увеличения и уменьшения числового значения. При помощи вспомогательных атрибутов min и max можно установить верхнюю и нижнюю границу допустимых значений. А атрибут step устанавливает величину шага изменения значения. Также стоит отметить, что поле ввода числа, как и некоторые другие поля, которые будут рассмотрены дальше, по-особому ведёт себя в мобильных браузерах: например, при фокусе на такое поле появляется клавиатура, позволяющая вводить соответствующие символы.

поле поиска <input type="search">  Это поле почти не отличается от обычного текстового поля. В некоторых браузерах внутри него появляется крестик для сброса введённого значения.

При загрузке страницы можно сообщить браузеру в какое поле установить курсор по умолчанию. Для этого используется пустой атрибут autofocus. <input type="text" autofocus>  Автофокус улучшает процесс работы с формами, ведь пользователь избавляется от лишних щелчков мышки, там где они не нужны, а может сразу начинать вводить текст в поле. Обратите внимание, что такой атрибут должен быть только один на странице.

Для этой цели подходит тип поля range. Такое поле выглядит как шкала с ползунком и позволяет выбрать число из некоторого интервала значений. <input type="range" min="1" max="10"> Атрибуты min и max устанавливают нижнюю и верхнюю границу допустимых значений. А атрибут step устанавливает величину шага изменения значения.

Тег <output> представляет собой область, куда выводятся какие-либо результаты вычислений, обычно полученные при помощи JavaScript.  <output name="sum">[значение по умолчанию]</output> Значение по умолчанию при этом можно не задавать, тогда область вывода будет пустой.

Для группировки полей используется тег fieldset.

По умолчанию браузеры отображают результат в виде рамки вокруг этой группы полей, но при помощи CSS можно изменить его внешний вид. Также для каждой группы можно добавить её заголовок. Для этого внутрь тега fieldset надо поместить тег legend:

Чтобы добавить автоматическую проверку формата номера в поле, используем атрибут pattern, в котором с помощью регулярного выражения опишем требуемый формат.  <input type="text" pattern="[0-9]{3}-[0-9]{5}" name="passport" required>

Новый тип поля tel появился в HTML5 и отвечает за ввод телефонных номеров.

У полей, в которые вводятся текстовые значения (textarea, разные типы input и т.д.) есть возможность вывести подсказку. Для этого используется специальный атрибут placeholder: <input type="text" placeholder="Текст подсказки"> Текст подсказки выводится внутри текстового поля, а при вводе значения — автоматически убирается.

В HTML5 добавлены два типа полей email и url, предназначенные для ввода электронной почты и адреса сайта. Особенностью этих полей является то, что они автоматически проверяют формат введённых данных. Внешне эти поля не отличаются от обычных текстовых полей, но обладают важной особенностью, которая очень полезна на мобильных устройствах. Когда вы начинаете заполнять такое поле на мобильнике, там автоматически переключается раскладка клавиатуры. Например, для email отобразятся латинские символы, цифры, знак @ и некоторые другие.

В HTML5 добавили новый тип color, предназначенный для полей выбора цвета. При клике на такое поле появляется окно с возможностью выбрать цвет из палитры. Если браузер не поддерживает поле для выбора цвета, то вместо него отображается обычное текстовое поле.

Так как список выбора может быть довольно большой, в теге select используем возможность объединять option в группы. Обычно это используется для большей наглядности и удобства поиска нужного варианта. Для формирования группы используется тег optgroup. Атрибут label этого тега определяет заголовок группы.

Вложенность групп не ограничена, внутрь каждой группы можно вложить другие группы. Аналогично можно группировать элементы и в списках со множественным выбором.

Иногда возникают ситуации, когда какие-то поля требуется сделать недоступными для редактирования. Есть два способа: использование атрибута readonly и использование атрибута disabled.

Атрибут readonly не дает пользователю изменять поле (вводить новый текст, модифицировать существующий). Введенное значение можно выделить и скопировать. Данные из этого поля отправляются на сервер.

Атрибут disabled не дает пользователю изменять поле (вводить новый текст, модифицировать существующий). Нельзя поставить фокус в это поле, введенное значение нельзя выделять и копировать. Данные из этого поля НЕ отправляются на сервер.

Браузер может запоминать значения, вводимые в текстовые поля. При вводе первых букв текста выводится список сохранённых ранее значений, из которого можно выбрать подходящее. Параметрами автозаполнения можно управлять используя атрибут autocomplete. Он может принимать два значения on и off. Первое включает автозаполнение, второе — отключает. Отключение автозаполнения обычно используется из соображений безопасности, например, чтобы не сохранялись пароли, номера банковских карт и т.д.

При нажатии клавиши Tab браузер передает управление (фокус) от одного элемента к другому в том порядке, в котором они были объявлены на странице. Этим порядком можно управлять при помощи атрибута tabindex<input type="text" tabindex="3"> В качестве значения может использоваться любое целое положительное число. Значения выстраиваются последовательно и переход между элементами происходит от меньшего значения к большему. Значения меньше нуля игнорируются.

Но из-за плохого интернета форму часто не удавалось отправить и введённая заметка терялась. Как справиться с этой довольно часто встречающейся проблемой, когда введённые в форму данные теряются? Для этого можно использовать одну из новинок HTML5 — localStorage. Эта технология относится к JavaScript, а не к HTML или CSS, но промолчать о ней мы не можем. Суть localStorage или «локального хранилища» заключается в том, что в него можно записывать данные, которые будут сохраняться в браузере. Эти данные не исчезнут даже если вы закроете браузер и откроете его снова или уйдете со страницы и потом вернётесь на неё. Получается, что можно сохранять данные из формы в хранилище при работе с формой, а при загрузке страницы проверять хранилище на наличие данных, и если они есть, то подставлять их в форму. Таким образом можно предотвратить потерю данных при работе с формами.

Заметьте, что в исходном коде задания тег <textarea> пуст, поэтому данные в форму могут попасть только из хранилища. Можете даже провести эксперимент: закрыть браузер, запустить его, открыть это задание, раскомментировать скрипт и убедиться, что сохранённый текст появится вновь. Подробнее о localStorage и других возможностях HTML5, которые позволяют улучшить опыт взаимодействие с формами, вы можете прочитать в одноимённой статье в блоге Алексея Симоненко.