Old code mu
Old code mu
Бесплатные вебинары по HTML и CSS
Анимация на CSS для чайников
В данном вебинаре рассказывается о том, как работать с анимацией на CSS. Подробно разбираются все свойства и подводные камни. Рекомендуется тем, кто еще не сталкивался с этой темой на практике и имеет о ней смутное представление или вообще никакого.
Плавные переходы transition на CSS
В данном вебинаре разбираются плавные переходы transition на CSS. Эффекты, которые можно создать с помощью плавных переходов просто радуют глаз (ваш и пользователя вашего сайта): к примеру, можно сделать так, чтобы по наведению на ссылку она плавно меняла свой цвет за определенное время, а не мгновенно, как это сделано на большинстве сайтов.
Обычные и 3d трансформации на CSS
В данных видео содержатся записи двух вебинаров: по обычным трансформациям CSS и по 3D трансформациям.
Продвинутая работа с селекторами CSS
Посмотрев данный вебинар, вы научитесь продвинутой работе с селекторами CSS.
Свойство display
В вебинаре рассказывается про работу со свойством display и особенно со значением inline-block. Данный вебинар рекомендуется тем, кто не знает, что такое блочные и строчные элементы, как поставить список из li в линию, как убрать отступы между inline-block элементами.
Свойство float. Сравнение с display: inline-block
В данном вебинаре рассказывается про работу со свойством float, разбираются отличия от свойства display в значении inline-block.
Основы работы с flexbox на CSS
Псевдоклассы и псевдоэлементы CSS
В данном вебинаре рассказывается про работу с псевдоклассами и псевдоэлементами CSS.
Продвинутая работа с градиентами на CSS
В данном вебинаре рассказывается про границу в виде картинки или градиента на CSS, которую можно сделать с помощью свойства border-image.
Задачи на работу с анимацией на CSS
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Движение
Повторите страницу по данному по образцу (движение повторится 3 раза):
Вы можете открыть этот пример в отдельной вкладке браузера.
Бесконечное движение
Повторите страницу по данному по образцу (движение будет бесконечным):
Вы можете открыть этот пример в отдельной вкладке браузера.
Смена фона
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Движение по квадрату
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Движение по квадрату и смена фона
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Движение туда-сюда
Повторите страницу по данному по образцу (здесь движение реализовано через 3 ключевые точки: 0%, 50%, 100%):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (здесь движение реализовано через animation-direction: alternate):
Вы можете открыть этот пример в отдельной вкладке браузера.
Индикатор
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Пауза
Вы можете открыть этот пример в отдельной вкладке браузера.
Вы можете открыть этот пример в отдельной вкладке браузера.
Падающий мячик
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Практика JavaScript для новичков
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Даны 3 инпута и кнопка. По нажатию на кнопку получите числа, стоящие в этих инпутах и запишите их сумму в четвертый инпут.
Дан инпут. В него вводится число. По потери фокуса найдите сумму цифр этого числа.
Дан инпут. В него вводятся числа через запятую. По потери фокуса найдите среднее арифметическое этих чисел (сумма делить на количество).
Дан инпут. В него вводится ФИО через пробел. По потери фокуса запишите фамилию, имя и отчество в отдельные инпуты.
Дан инпут. В него вводится ФИО через пробел. ФИО вводится с маленькой буквы. Сделайте так, чтобы по потери фокуса инпутом, введенные фамилия, имя и отчество автоматически стали записанными с большой буквы (в том же инпуте).
Дан инпут. В него вводится текст. По потери фокуса узнайте количество слов в этом тексте.
Дан инпут. В него вводится текст. По потери фокуса узнайте количество символов в самом длинном слове в этом тексте.
Дан инпут. В него вводится дата в формате 31.12.2016. По потери фокуса в этом же инпуте поставьте эту дату в формате 2016-12-31.
Дан инпут. В него вводится год рождения пользователя. По нажатию на кнопку выведите в абзац ниже сколько пользователю лет.
Дан инпут. В него вводится дата в формате 31.12.2016. По потери фокуса узнайте день недели (словом), который приходится на эту дату.
Дан инпут. В него вводится слово. По нажатию на кнопку проверьте то, что это слово читается с начала и с конца одинаково (например, мадам).
Дан инпут. В него вводится число. Проверьте по вводу, что это число содержит внутри себя цифру 3.
Даны N абзацев и кнопка. По нажатию на кнопку запишите в конец каждого абзаца его порядковый номер.
Даны N абзацев с числами. По нажатию на кнопку выведите эти числа в инпут через запятую в порядке возрастания.
Даны ссылки. По загрузке страницы добавьте в конец каждой ссылки ее href в круглых скобках.
Даны ссылки. По загрузке страницы, если ссылка начинается с http://, то добавьте ей в конец стрелку → (делается так: →).
Даны N абзацев с числами. По нажатию на любой абзац запишите в него квадрат числа, которое в нем находится.
Даны картинки. По нажатию на любую картинку увеличьте ее в 2 раза.
Даны N картинок размера 30px. По нажатию на картинку под ними эта картинка появляется размером в 50px.
Дан инпут. Выделите любой текст на странице. По окончанию выделения этот текст должен записаться в этот инпут.
Даны абзацы с числами. По нажатию на кнопку найдите абзац, в котором хранится максимальное число, и сделайте его красного цвета.
Дан инпут. Даны абзацы. Пусть в этот инпут записывается суммарное количество нажатий по этим абзацам.
Дан инпут с числом. Сделайте так, чтобы каждую секунду в нем появлялся квадрат того числа, которое в нем записано.
Дан инпут и кнопка. По нажатию на кнопку сгенерируйте случайную строку из 8-ми символов и запишите в инпут.
Модифицируйте предыдущую задачу так, чтобы был еще один инпут, в котором задается длина случайной строки.
Модифицируйте предыдущую задачу так, чтобы был еще один инпут, в котором задаются символы, из которых формируется эта случайна строка. Символы задаются без всяких разделитетей, в одну строку.
Дан абзац. Сделайте так, чтобы каждую секунду он менял свой цвет с красного на зеленый и наоборот.
Даны инпуты с числами. Произвольное количетсво, пусть три. В первый инпут запишите 1, через секунду во второй инпут запишите 2, еще через секунду в третий инпут 3, потом через секунду в первый инпут запишите 4, во второй 5 и так далее до бесконечности.
Дана ссылка. Дан чекбокс. По нажатию на ссылку меняйте состояние чекбокса с отмеченного на неотмеченное и наоборот.
Даны чекбокс. Дана кнопка. По нажатию на кнопку сделайте все чекбоксы отмеченными.
Спросите у пользователя какой язык (html, css, js, php) он знает с помощью радио кнопочек. Выведите этот язык в абзац.
Спросите у пользователя какие языки (html, css, js, php) он знает с помощью чекбоксов. Выбранные языки должны выводится в абзац ниже через запятую.
Дан инпут. Даны li. В инпут пишется номер. Сделайте так, чтобы по вводу числа, li с заданным номером покрасился в красный цвет.
Дан блок с кнопкой ‘закрыть блок’. По нажатию на эту кнопку блок должен исчезнуть. Кнопка размещается внутри блока и должна исчезнуть вместе с ним. Блоков может быть любое количество, каждый из них закрывает своя кнопка.
В инпут через запятую вводятся страны. По нажатию на кнопку сделайте так, чтобы эти страны записались в ul под инпутом (каждая страна отдельный li).
В инпут вводится страна и нажимается Enter. По нажатию на Enter сделайте так, чтобы введенные страны записывались в абзац под инпутом через запятую. То есть по каждому нажатию Enter в абзац будут добавляться все новые и новые страны.
На странице есть дивы. В них есть текст. Обойдите все дивы и обрежьте тот текст, который в них стоит так, чтобы он стал длиной 10 символов. И добавьте троеточие в конец обрезанного текста
Дана таблица с числами. По нажатию на кнопку найдите ячейку, в которой хранится максимальное число, и сделайте ее фон красным.
Дана таблица с числами. По нажатию на кнопку в инпут под таблицей выведите эти числа через запятую в порядке возрастания.
Дана таблица с числами. По нажатию на кнопку в последний ряд таблицы в каждую ячейку запишите сумму чисел в столбце таблицы, расположенном над определенной ячейкой.
Дана таблица с числами. По нажатию на ячейку она активируется и становится красного цвета. Активировать можно много ячеек. Под таблицей кнопка. По нажатию по этой кнопке в абзац ниже выведите сумма активированных ячеек. Реализуйте кнопку ‘сбросить активированные ячейки’.
Реализуйте раскрывающийся список. По умолчанию есть список стран (ul), по нажатию на страну внутри li со страной появляется список городов.
Сделайте селекты день, мес, год. Сделайте так, чтобы не корректную дату нельзя было выбрать (например, 30 февраля нельзя, а 30 марта можно или 29 февраля можно, но только в високосный год).
Реализуйте генератор таблиц, ширина и высота таблиц задается в двух инпутах (например, таблица 5 на 10 ячеек).
Дан список и кнопка. По нажатию на кнопку посортируйте пункты списка по возрастанию.
Дан ряд ссылок. Сделайте так, чтобы по нажатию на ссылку она становилась с красным фоном. По нажатию на другую ссылку выделение первой ссылки снимается и выделяется та, на которую мы нажали. В абзац ниже пишите текст активной ссылки.
Основы работы с JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
В этом уроке мы разберем работу с данными на языке JavaScript.
Строки и числа
Самыми простыми типами данных в JavaScript являются строки и числа.
Переменные
Одним из самых главных и распространенных объектов в программировании является переменная.
Имя переменной должно состоять из английских букв: больших или маленьких, а также цифр и знака_подчеркивания.
В JavaScript при объявлении переменной обязательно должно быть написано ключевое слово var:
Операция присваивания
Очень важным элементом программирования является операция присваивания. Пример присваивания:
Комментарии
В коде JavaScript, так же, как и в HTML и CSS, можно оставлять комментарии. Они могут быть многострочными и однострочными:
Комментарии игнорируются браузером при выполнении кода, в них можно оставлять какие-либо пометки или временно закрывать код от исполнения, чтобы потом его при необходимости вернуть (откомментировать).
Функция alert
В JavaScript существует специальная функция alert, которая позволяет вывести какой-либо текст в окно браузера в виде диалогового окошка.
Следующий код выводит на экран заданный текст:
Нажмите на эту ссылку, чтобы увидеть такое окошко.
А в следующим коде переменной text присваивается фраза, а затем содержимое этой переменной выводится на экран:
Математические операции
В JavaScript между числами можно совершать различные математические операции:
Получение определенного символа строки
В JavaScript можно получить доступ к определенному символу строки по его номеру таким образом: a[n] – n-ный символ строки (учтите, что нумерация идет с нуля):
Сложности с операцией присваивания
Очень часто новички не понимают, что присваивание отличается от обычного равенства. Посмотрите следующий пример:
С точки зрения математики запись a = a + 2 абсурдна, но не с точки зрения программирования.
Операции инкремента и декремента
Операция a++ или ++a – увеличивает переменную a на единицу. Эта операция называется инкремент.
Операция a— или —a – уменьшает переменную a на единицу. Эта операция называется декремент.
Давайте посмотрим, в каких случаях проявляется разница между ++a и a++.
Пусть у нас есть код alert(++a) и код alert(a++).
Мы уже рассматривали код, который демонстрирует сложности с операцией присваивания:
В данном случае мы присваиваем переменной a ее текущее значение, увеличенное на 2. Однако JavaScript позволяет записать этот код еще короче с помощью оператора +=:
Специальные значения
Значения undefined и null
Значение null обозначает ‘ничего’. К примеру, мы можем присвоить переменной значение null в знак того, что там ничего не лежит.
Значения true и false
К примеру, на вопрос ‘вам уже есть 18 лет?’ в можете ответить да, то есть true, или нет, то есть false.
Значение NaN
Функция prompt
Кроме функции alert, которая выдает диалоговое окошко, существует функция prompt, которая не только выдает окошко с текстом, но и позволяет получить от пользователя какой-либо текст.
Этот текст можно записать в переменную и затем выполнить над ним какие-либо операции.
В следующем примере мы спросим имя пользователя, запишем его в переменную name и с помощью функции alert выведем на экран:
Нажмите на эту ссылку, чтобы запустить код примера.
Функция confirm
Эта функция вызывает окошко с вопросом, на который нужно ответить пользователю, и двумя кнопками для ответа: с кнопкой ‘ОК’ и с кнопкой ‘Отмена’.
В следующем примере функция confirm выведет диалоговое окно с вопросом ‘Вам уже есть 18 лет?‘.
Нажмите на эту ссылку, чтобы запустить код примера.
Типизация переменных
Что будет, если попробовать перемножить, к примеру, число и строку, вот так: 3 * ‘3’? В результате вы получите число 9. Это значит, что JavaScript автоматически осуществляет преобразование типов при необходимости, вам не нужно за это переживать.
Однако, есть нюанс: если мы попытаемся сложить строку и число, то JavaScript сложит их как строки, а не как числа, вот так: ‘3’ + 3 получится строка ’33’, а не число 6.
В случае, например, с умножением JavaScript понимал, что нельзя перемножить строки, поэтому строки переводил в числа и перемножал их. А случай со сложением можно трактовать двояко: складывать как строки или как числа (плюс-то используется как для сложения строк, так и чисел).
Второй вариант такой: можно сказать яваскрипту, что мы хотим явно преобразовать строку к числу. Это делается с помощью функции Number, вот так: Number(‘3’) + 3. В результате получится 6, а не ’33’.
К числам могут преобразовываться не только строки, но и любые другие типы данных, например true тоже можно преобразовать к числу таким образом: Number(true).
Можно преобразовывать и к другим типам с помощью функций Boolean, String и других подобных.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Учебник jQuery для новичков от Трепачёва Дмитрия
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
В данном уроке мы с вами начнем изучать библиотеку jQuery. Для работы с ней вы должны владеть хотя бы минимальными навыками JavaScript.
Что такое jQuery?
Код jQuery выглядит намного компактнее и проще для написания.
Подключение jQuery
Для начала его нужно скачать jQuery с официального сайта. Затем положить полученный файл в папку с вашим сайтом и подключить его таким образом:
После подключения можно начинать писать код с использованием этой библиотеки.
Видео для тех, кто ничего не понял
Здесь скоро появится видео по подключению jQuery.
Начало работы с jQuery
Работа с библиотекой jQuery осуществляется с помощью универсальной функции $, которая для краткости состоит всего лишь из одного символа.
После доллара следует писать круглые скобки (это же функция), в которых указываются параметры (обычно один параметр), примерно вот так: $(параметр).
Чаще всего с помощью доллара $ получают группу HTML элементов по CSS селектору.
Давайте получим все элементы с классом .www:
А теперь получим только абзацы с классом p.www:
А теперь получим элемент с id, равным www:
Как вы видите, используются обычные CSS селекторы, подобно методу querySelectorAll. Только querySelectorAll появился гораздо позже, чем jQuery, и обладает меньшими возможностями (зато работает быстрее).
Наборы jQuery
Обратите внимание на переменную elems:
В нее запишется группа выбранных элементов, так называемый набор элементов jQuery.
Вы можете одновременно менять все элементы набора jQuery (в отличие от querySelectorAll никаких циклов не требуется).
В принципе, переменная elems чаще всего и не нужна, так как jQuery позволяет применять полезные функции прямо к набору, в виде методов.
К примеру, вот так мы получим все элементы с классом .www и поставим им красный цвет:
Почти все методы jQuery возвращают набор, к которому этот метод был применен, что позволяет выстраивать цепочки методов любой длины.
Давайте получим все элементы с классом .www, поставим им красный цвет, и сменим их текст на ‘новый текст’:
Основы работы с PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
В этом уроке мы разберем работу с данными на языке PHP.
Строки и числа
Самыми простыми типами данных в PHP являются строки и числа.
Переменные
Одним из самых главных и распространенных объектов в программировании является переменная.
Имя переменной должно состоять из английских букв: больших или маленьких, а также цифр и знака_подчеркивания.
В PHP перед переменной обязательно должен быть написан знак доллара $:
Операция присваивания
Очень важным элементом программирования является операция присваивания.
С помощью присваивания мы можем положить в переменную результат какой-либо операции, например, строку или число, а затем достать эти данные в нужном нам месте и воспользоваться ими.
Комментарии
К коде PHP, так же, как и в HTML и CSS, можно оставлять комментарии, которые будут проигнорированы PHP при выполнении программы.
Их обычно используют для того, чтобы оставлять какие-либо пометки в коде или временно убрать какие-то строки кода, которые вам мешают, а потом иметь возможность быстро их вернуть обратно.
Комментарии могут быть многострочными и однострочными:
Функции
В программировании есть такое понятие, как функции. В отличии от переменных, которые хранят внутри себя некоторые данные, функции выполняют операции над этими данными.
Функция отличается от переменной тем, что перед именем функции не ставится знак доллара (он нужен только для переменных), а также тем, что у нее после названия стоят круглые скобки ( ), внутри которых через запятую можно перечислять параметры.
Например, в PHP есть стандартная функция sqrt(), которая параметром принимает число, а возвращает квадратный корень этого числа.
Давайте найдем корень из 25 и запишем в переменную $a:
Функция echo
В PHP существует специальная функция echo, которая позволяет вывести какой-либо текст в окно браузера. В отличие от других функций, после echo не требуются круглые скобки ().
Следующий код выводит на экран заданный текст:
А в следующим коде переменной $text присваивается фраза, а затем содержимое этой переменной выводится на экран:
Математические операции
Чтобы понять, как с ними работать, посмотрите на следующий пример:
Можно сначала записать числа в переменные, а потом уже проводить операции с переменными:
А можно также одновременно производить операции и с числами, и с переменными:
Специальные значения
В PHP, как и в других языках программирования, существуют ключевые слова для некоторых специальных значений.
Значения true, false
К примеру, на вопрос ‘вам уже есть 18 лет?’ в можете ответить да, то есть true, или нет, то есть false.
Эти значения называются логическими.
Значение null
Функция var_dump
Бывают ситуации, когда нам нужно посмотреть содержимое переменной, чтобы понять, почему наш код работает не так, как мы хотели. Обычно на помощь приходит функция echo, однако, бывают ситуации, когда echo не работает.
Например, если переменная является пустой строкой », то выведя ее содержимое на экран с помощью echo, мы ничего не увидим.
Для решения описанных выше проблем следует использовать функцию var_dump(), которая предназначена для отладки кода и позволяет выводить значения переменных и их тип.
С помощью этой функции мы можем увидеть, что переменная пуста, можем подсчитать количество пробелов по краям строки, можем увидеть, что переменная логическая и имеет значение true или false (об этих значениях чуть позже).
Пример использования var_dump():
PHP внутри HTML
PHP код можно вставлять внутрь HTML кода:
Сложение строк в PHP
В PHP, в отличие от многих других языков, строки складываются с помощью знака «точка»:
Получение определенного символа строки
В PHP можно получить доступ к определенному символу строки по его номеру таким образом: $a[n] – n-ный символ строки (учтите, что нумерация идет с нуля):
Сложности с операцией присваивания
Очень часто новички не понимают, что присваивание отличается от обычного равенства. Посмотрите следующий пример:
Операции инкремента и декремента
Операция $a++ или ++$a – увеличивает переменную $a на единицу. Эта операция называется инкремент.
Операция $a— или —$a – уменьшает переменную $a на единицу. Эта операция называется декремент.
Давайте посмотрим, в каких случаях проявляется разница между ++a и a++.
Пусть у нас есть код echo ++a и код echo a++.
Мы уже рассматривали код, который демонстрирует сложности с операцией присваивания:
В данном случае мы присваиваем переменной $a ее текущее значение, увеличенное на 2. Однако PHP позволяет записать этот код еще короче с помощью оператора +=:
Существует также операция .=:
Типизация переменных
Что будет, если попробовать сложить, к примеру, число и строку, вот так: 3+’3′? В результате вы получите число 6. Это значит, что PHP автоматически осуществляет преобразование типов при необходимости, вам не нужно за это переживать.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на основы языка PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Перед решением задач изучите теорию к данному уроку.
Примеры решения задач
Задача
Задача. Создайте переменную $var и присвойте ей значение ‘hello’. Обращаясь к отдельным символам этой строки выведите на экран символ ‘h’, символ ‘e’, символ ‘o’.
Задача
Задача. Напишите скрипт, который считает количество секунд в часе.
Если нам нужно получить количество секунд в сутках, то умножим еще и на 24 (так как в сутках 24 часа):
Задача
Задачи для решения
Работа с переменными
Создайте переменную $a и присвойте ей значение 3. Выведите значение этой переменной на экран.
Создайте переменные $a=10 и $b=2. Выведите на экран их сумму, разность, произведение и частное (результат деления).
Создайте переменные $c=15 и $d=2. Просуммируйте их, а результат присвойте переменной $result. Выведите на экран значение переменной $result.
Создайте переменные $a=10, $b=2 и $c=5. Выведите на экран их сумму.
Создайте переменные $a=17 и $b=10. Отнимите от $a переменную $b и результат присвойте переменной $c. Затем создайте переменную $d, присвойте ей значение 7. Сложите переменные $c и $d, а результат запишите в переменную $result. Выведите на экран значение переменной $result.
Работа со строками
Создайте переменную $text и присвойте ей значение ‘Привет, Мир!’. Выведите значение этой переменной на экран.
Создайте переменные $text1=’Привет, ‘ и $text2=’Мир!’. С помощью этих переменных и операции сложения строк выведите на экран фразу ‘Привет, Мир!’.
Создайте переменную $name и присвойте ей ваше имя. Выведите на экран фразу ‘Привет, %Имя%!’. Вместо %Имя% должно стоять ваше имя.
Создайте переменную $age и присвойте ей ваш возраст. Выведите на экран ‘Мне %Возраст% лет!’.
Обращение к символам строки
Создайте переменную $text и присвойте ей значение ‘abcde’. Обращаясь к отдельным символам этой строки выведите на экран символ ‘a’, символ ‘c’, символ ‘e’.
Дана произвольная строка, например, ‘abcde’. Поменяйте первую букву (то есть букву ‘a’) этой строки на ‘!’.
Создайте переменную $num и присвойте ей значение ‘12345’. Найдите сумму цифр этого числа.
Практика
Напишите скрипт, который считает количество секунд в часе, в сутках, в месяце.
Создайте переменную, присвойте ей число. Возведите это число в квадрат (это значит нужно умножить его само на себя). Выведите его на экран.
Работа с присваиванием и декрементами
Переделайте этот код так, чтобы в нем использовалась операция .=. Количество строк кода при этом не должно измениться.
Переделайте этот код так, чтобы в нем использовались операции ++ и —. Количество строк кода при этом не должно измениться.
Введение в ООП на JavaScript в стиле ES6
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
ООП расшифровывается как объектно-ориентированное программирование. Давайте разбираться, что это такое и зачем это нужно.
Что такое ООП
Каждая машина имеет какие-то характеристики. К примеру, у нее есть количество колес, есть цвет и вид кузова, количество бензина в баке и так далее. Эти характеристики называются свойствами объекта.
Давайте начнем
Давайте разберем ООП в JavaScript на примере игры, в которой по полю ездят танчики и стреляют друг в друга. При попадании в танчик у него уменьшается количество брони, пока он не взорвется.
Давайте уже приступим к написанию кода, на примере которого вы поймете преимущества ООП.
Классы и объекты
Давайте напишем класс Tank, у которого будет 2 метода: moveTo (переместисьВ) и fireTo (стельниВ). Реализацию методов пока не пишем, это просто заготовки:
Пока у нас написан только класс, то есть по сути мы сделали чертеж танка, но самого танка у нас нет. Сделаем его. Новый объект создается с помощью команды new, написанной перед названием класса:
Давайте теперь создадим новый танк и вызовем метод moveTo, чтобы танк переместился в нужную точку:
Давайте сделаем два танка и каждый из них переместим в заданную точку:
Свойства объекта
Как вы уже знаете, кроме методов объектов, есть еще и свойства. Пусть у каждого созданного танка будет еще и свойство ammunition. В нем мы будем хранить количество снарядов танка.
Давайте создадим новый танк и в момент создания положим в него 10 снарядов:
При создании танка мы следующей строчкой на лету создали ему свойство ammunition. Теперь это свойство доступно внутри любого метода класса вот так: this.ammunition:
Давайте при каждом выстреле будем уменьшать количество снарядов на один:
Метод в методе
Для этого также, как и при работе со свойствами, к методам следует обратиться через this, вот так: this.moveTo() и this.fireTo:
Конструктор
Помните, как мы задавали количество снарядов в танке при создании:
Исправить это проблему нам поможет метод-конструктор. Этот метод имеет стандартное название constructor и вызывается автоматически в момент создания объекта (когда мы пишем new).
Давайте создадим танк и в момент создания выведем что-нибудь алертом на экран:
Так же, как и в остальные методы, в конструктор можно передавать параметры. Давайте передадим в него параметр message и выведем его содержимое алертом на экран:
Теперь каждый созданный танк будет иметь 10 снарядов уже в момент создания. Убедимся в этом:
А еще лучше давайте сделаем параметр, в который будем передавать количество снарядов в момент создания танка, вот так:
Для этого в конструкторе напишем параметр ammunition, вот так: constructor(ammunition). Этот ammunition будет содержать в себе десятку, которую мы передаем в момент создания.
Для этого давайте запишем содержимое переменной ammunition в свойство ammunition, вот так: this.ammunition = ammunition.
Вспомогательные методы
У нас уже есть некоторый код танчика. С помощью этого кода мы можем создать танк, положить в него нужно количество снарядов, а также пострелять с помощью метода fireTo.
Давайте реализуем вспомогательный метод canFire(), который будет проверять, не закончились ли снаряды:
Приватные методы
Чтобы исключить такие ситуации, следует запретить вызывать вспомогательные методы и свойства снаружи класса. В этом случае вы легко сможете править их, не задумываясь о том, что сломаете что-то снаружи.
Такой подход называется инкапсуляция. Говорят, что мы инкапсулируем вспомогательные методы и свойства внутри класса.
Как же этого добиться?
в других языках программирования перед такими методами и свойствами указывается команда private в знак того, что это приватные (то есть недоступные извне) свойства.
В современном JavaScript такой команды нет, но она возможно появится в дальнейшем. В этом случае поступают так: всем методам и свойствам, который не должны быть видны снаружи, в начале названия пишется подчеркивание (знак _).
Давайте переименуем метод canFire в _canFire:
Ничего не понятно толком?
Не переживайте:) Перечитайте еще раз и идите на следующий урок. Там я буду показывать применение ООП на практике. В текущем уроке ваша задача: просто посмотреть на основные понятия, чтобы вам было проще на следующих уроках.
Работа с HTML таблицами
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Начиная с этого урока, я больше не буду приводить структуру всей страницы, считайте, что мы всегда работаем внутри тега body.
В HTML таблицы создаются по похожему принципу. Там тоже есть столбцы и строки с ячейками, однако HTML код таблиц при первом взгляде может показаться непривычным.
Изучите внимательно следующий пример с таблицей (тегу table добавлен атрибут border, который задает границу таблице и ее ячейкам):
Так код будет выглядеть в браузере:
Ячейка 1 | Ячейка 2 | Ячейка 3 |
Ячейка 4 | Ячейка 5 | Ячейка 6 |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Кроме тегов td существуют также теги
Так код будет выглядеть в браузере:
Имя | Фамилия | Зарплата |
---|---|---|
Иван | Иванов | 200$ |
Николай | Сидоров | 1000$ |
По умолчанию текст в ячейках th будет жирный и расположен по центру (это поведение можно поменять, но об этом позже).
Вы обратили внимание на то, что между ячейками есть некоторое расстояние, из-за которого видно то, что каждая ячейка имеет свою границу? Это расстояние регулируется атрибутом cellspacing. При этом, если мы не напишем этот атрибут, то его значение будет совсем не ноль (в этом случае все ячейки слиплись бы друг с другом). То есть, атрибут cellspacing по умолчанию имеет некоторое ненулевое значение, из-за которого ячейки не слипаются (это расстояние равно нескольким пикселям).
Давайте посмотрим на примере. Сейчас я увеличу отступ между ячейками до 10 пикселей:
Так код будет выглядеть в браузере:
Имя | Фамилия | Зарплата |
---|---|---|
Иван | Иванов | 200$ |
Николай | Сидоров | 1000$ |
То, что cellspacing имеет некоторое значение по умолчанию, зачастую может мешать вам. В этом случае следует просто поставить его в ноль.
В HTML5 этот атрибут считается устаревшим (но он по-прежнему придает отступ по умолчанию). Вместо него следует использовать специальное CSS свойство, о котором мы поговорим попозже.
Атрибут cellpadding задает отступ между текстом и границей ячейки. В следующем примере я поставлю значение этого атрибута в 20px и теперь текст отойдет от границы ячеек:
Так код будет выглядеть в браузере:
Имя | Фамилия | Зарплата |
---|---|---|
Иван | Иванов | 200$ |
Николай | Сидоров | 1000$ |
Для сравнения привожу то, как таблица будет выглядеть по умолчанию:
Имя | Фамилия | Зарплата |
---|---|---|
Иван | Иванов | 200$ |
Николай | Сидоров | 1000$ |
Этот атрибут, так же, как и cellspacing, считается устаревшим в HTML5.
Давайте обнулим cellpadding и cellspacing и посмотрим, что станет с таблицей в этом случае:
Так код будет выглядеть в браузере:
Имя | Фамилия | Зарплата |
---|---|---|
Иван | Иванов | 200$ |
Николай | Сидоров | 1000$ |
Как вы видите, в данном случае ячейки таблицы слиплись, однако все равно заметно, что каждая ячейка имеет свою границу (то есть границы сейчас двойные). Вы сможете поправить это, когда изучите язык CSS.
Посмотрите на пример их применения:
Так код будет выглядеть в браузере:
Имя | Фамилия | Зарплата |
---|---|---|
Иван | Иванов | 200$ |
Николай | Сидоров | 1000$ |
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на основы языка JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Примеры решения задач
Задача
Задача. Создайте переменную str и присвойте ей значение ‘abcde’. Обращаясь к отдельным символам этой строки выведите на экран символ ‘a’, символ ‘b’, символ ‘e’.
Задача
Задача. Напишите скрипт, который считает количество секунд в часе.
Если нам нужно получить количество секунд в сутках, то умножим еще и на 24 (так как в сутках 24 часа):
Задача
Решение: заменим все подходящие места на сокращенную форму записи. К примеру, вместо num = num + 12 можно написать num += 12, а вместо num = num + 1 будет num++. Результат переделки будет выглядеть так:
Задачи для решения
Работа с переменными
Создайте переменную num и присвойте ей значение 3. Выведите значение этой переменной на экран с помощью метода alert.
Создайте переменные a=10 и b=2. Выведите на экран их сумму, разность, произведение и частное (результат деления).
Создайте переменные c=15 и d=2. Просуммируйте их, а результат присвойте переменной result. Выведите на экран значение переменной result.
Создайте переменные a=10, b=2 и c=5. Выведите на экран их сумму.
Создайте переменные a=17 и b=10. Отнимите от a переменную b и результат присвойте переменной c. Затем создайте переменную d, присвойте ей значение 7. Сложите переменные c и d, а результат запишите в переменную result. Выведите на экран значение переменной result.
Работа со строками
Создайте переменную str и присвойте ей значение ‘Привет, Мир!’. Выведите значение этой переменной на экран.
Создайте переменные str1=’Привет, ‘ и str2=’Мир!’. С помощью этих переменных и операции сложения строк выведите на экран фразу ‘Привет, Мир!’.
Создайте переменную name и присвойте ей ваше имя. Выведите на экран фразу ‘Привет, %Имя%!’.
Создайте переменную age и присвойте ей ваш возраст. Выведите на экран ‘Мне %Возраст% лет!’.
Функция prompt
Спросите имя пользователя с помощью методы prompt. Выведите с помощью alert сообщение ‘Ваше имя %имя%’.
Спросите у пользователя число. Выведите с помощью alert квадрат этого числа.
Обращение к символам строки
Создайте переменную str и присвойте ей значение ‘abcde’. Обращаясь к отдельным символам этой строки выведите на экран символ ‘a’, символ ‘c’, символ ‘e’.
Создайте переменную num и присвойте ей значение ‘12345’. Найдите произведение (умножение) цифр этого числа.
Практика
Напишите скрипт, который считает количество секунд в часе, в сутках, в месяце.
Создайте переменную, присвойте ей число. Возведите это число в квадрат. Выведите его на экран.
Работа с присваиванием и декрементами
Переделайте этот код так, чтобы в нем использовались операции ++ и —. Количество строк кода при этом не должно измениться.
Работа с базами данных SQL в PHP для новичков
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Что такое база данных
Это могут быть тексты страниц, списки пользователей с их логинами и паролями, каталоги продукции и другое.
База данных состоит из таблиц. Что такое таблица вы знаете из жизни: это строки и столбцы. А на пересечении строк и столбцов располагаются ячейки.
В базах данных столбцы часто называют полями.
PhpMyAdmin
Для редактирования баз данных часто пользуются программой PhpMyAdmin.
Видео на PhpMyAdmin
Задачи на PhpMyAdmin
Давайте откроем PhpMyAdmin и приступим к изучению его интерфейса.
Чтобы вам было проще с ним освоится, сделайте следующие практические задачи:
AUTO_INCREMENT
Обратите внимание на то, что мы создали поле id и поставили ему галочку AUTO_INCREMENT. Это очень важный шаг!
Теперь при вставке новой записи (строки) в таблицу это поле будет заполняться автоматически уникальным номером.
При этом если мы удалим строку с каким-то id (например 1), то такого id больше никогда не будет.
Зачем нужно поле id?
Затем, чтобы мы всегда могли обратиться к конкретной строке по ее id, например с целью удаления или редактирования.
Типы переменных
В SQL довольно много типов переменных, но чаще всего приходится пользоваться следующими:
Как работать с mySQL через PHP
Работа с БД из PHP осуществляется всего лишь с помощью трех функций:
Далее подробнее про каждую из функций.
Устанавливаем соединение с БД
Данный материал есть также в виде видео: https://youtu.be/J8GFuyA_k_8
Прежде, чем начать работать с базой данных из PHP, нужно установить соединение с сервером, на котором эта база находится.
Делается это с помощью функции PHP mysql_connect, которая принимает 3 параметра: имя хоста (сервера), имя пользователя, под которым мы работаем с базой и пароль для этого пользователя.
Давайте установим соединение с базой данных:
Посылаем запросы к базе данных
Это относиться к командам SELECT, UPDATE, FROM, DELETE, WHERE и другим такого рода.
Конечно, синтаксической ошибки не будет, если вы напишите их маленькими буквами, но принято большими.
Отлавливаем ошибки базы данных
Многие начинающие зачастую не умеют отлавливать ошибки, которые вернула база данных.
Чтобы вывести ошибки, следует пользоваться конструкцией or die ( mysqli_error($link) ), которую необходимо добавлять к каждому запросу к БД.
Таким образом вы сразу будете получать сообщения об ошибках синтаксиса SQL. Обратите внимание на то, что на рабочем сайте эти конструкции следует удалять, чтобы пользователи и тем более хакеры не видели ошибок БД.
Проблемы с кодировками
Чтобы не было проблем с кодировками следует придерживаться простых правил:
Начнем практиковаться
Сейчас мы с вами начнем изучить SQL запросы на практике. Для этого нам понадобится тестовая таблица в базе данных, заполненная некоторыми данными. Сейчас мы с вами ее сделаем и заполним.
Итак, создайте свою первую базу данных с помощью PhpMyAdmin.
Назовите ее «test».
Создайте в этой базе новую таблицу.
Назовите ее «workers» (англ. работники).
В ней создайте 4 столбца (столбцы по другому называются поля):
Ее заполните тестовыми данными, как показано в таблице ниже (этот шаг обязателен, так как дальше все задачи будут по этой таблице):
id | name | age | salary |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Петя | 25 | 500 |
3 | Вася | 23 | 500 |
4 | Коля | 30 | 1000 |
5 | Иван | 27 | 500 |
6 | Кирилл | 28 | 1000 |
Тестируем работоспособность
Просто скопируйте этот код и запустите его у себя:
В таком случае проверьте все еще раз, уберите последовательно все ошибки PHP, если таковые есть.
Как достать результат
После того, как мы сделали запрос к базе, в переменной $result будет лежать результат этого действия.
Однако лежит он не в той форме, которая нам нужна в PHP, а в той форме, в которой его прислала нам база.
Достать результат в нормальном виде (в массиве) можно с помощью следующего кода:
Как работает последняя строка?
Функция mysqli_fetch_assoc считывает последовательно каждую строку результата, который прислала нам база.
В цикле for мы считываем построчно результат из базы.
А результат из БД будет лежать в нормальном виде в массиве $data.
Учебник по фреймворку React
Учебник по React
Учебник Angular 1.5.8
React является одним из самых популярных JavaScript фреймворков. Фреймворк представляет собой заготовку, которая помогает вам писать код.
Кроме того: так как все проекты на фреймворке следуют одному и тому же соглашению, то любой другой человек сможет с легкостью разобраться в вашем коде и допилить что-либо в сделанном вами проекте.
Примером SPA может служить социальная сеть, работа с почтой и так далее.
Перед изучением React
Перед чтением данного учебника изучите уроки по работе с контекстом и учебник по ООП на классах в стиле ES6 в JavaScript. Это обязательно, без этого вы ничего не поймете.
Введение в React
Перед чтением также советую посмотреть вебинар по React, который является введением в этот фреймворк. Вебинар вы найдете по следующим ссылкам: 1, 2, 3, 4, 5, 6, 7, 8.
Подключение React
Самым популярным транспойлером является Babel. Им мы и будем пользоваться.
На самом деле реальные проекты на React требуют некоторого знания nodejs и npm. Мы пока не будем с этим заморачиваться, потому что мне хотелось бы, чтобы вы сразу начали писать код.
Для самого простого запуска React нужно подключить такую кучку скриптов:
После подключения этих скриптов мы можем выполнять наш ES6 код в теге script с типом text/babel (это важно: не text/javascript, как мы привыкли):
Задачи на работу с основными HTML тегами и атрибутами
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
На заголовки, жирность, курсив
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На списки
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На заголовки, абзацы и списки
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Связанные ссылками страницы
Повторите 3 страницы и свяжите их ссылками друг с другом: страница 1, страница 2, страница 3.
На картинки
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Разные полезные темы JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
В данном уроке мы разберем разные полезные темы JavaScript: работу с выделением, работу с формами.
Работа с формами
Можно получить все HTML формы на странице через document.forms. В результате мы получим массив форм, будто он был получен с помощью getElementsByTagName (точнее это будет не массив, а псевдомассив (или коллекция) элементов).
Мы можем, к примеру, обратиться к любой форме, как к энному элементу массива, например, к форме с номером 0:
HTML код станет выглядеть так:
А можем перебрать все формы с помощью цикла:
HTML код станет выглядеть так:
Кроме того, к формам можно обращаться по имени вместо номера. Это имя задается в атрибуте name тега
Работа с HTML тегами и атрибутами
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Сейчас мы с вами займемся изучением основных тегов. Начнем с того, какие теги являются обязательными на странице, формируя ее структуру.
Как выглядит этот пример в браузере смотрите по данной ссылке.
Думаю, после того, как вы прочитали про основную структуру страницы, у вас по-прежнему остается некоторое недопонимание, как все это выглядит на практике. Поэтому я снял специальное видео, в котором покажу вам, как сделать вашу первую HTML страницу и запустить ее в браузере (в нем я также расскажу про title страницы, про кодировки, про оформление кода). Посмотрите его и только потом переходите к дальнейшему чтению:
Абзац создается с помощью тега
Так код будет выглядеть в браузере:
Это еще один абзац.
И еще один абзац.
Заголовки создаются с помощью тегов
Все заголовки по умолчанию жирные и имеют разный размер (это можно поменять через CSS, но об этом позже). Смотрите пример:
Основы работы с DOM в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
В данном уроке мы разберем основы работы с событиями, атрибутами и getElementById на языке JavaScript.
Начнем мы с того, что научим наш код реагировать на действия пользователя сайта. Например, пользователь нажмет куда-либо мышкой, а наш код в ответ должен будет обработать это нажатие и вывести на экран какую-либо информацию.
В JavaScript существует несколько способов работы с событиями. Мы начнем с самого простого из них.
Основы работы с событиями
Значением атрибута с событием служит JavaScript код. В следующем примере по нажатию мышкой на кнопку выполнится функция alert:
А сейчас по клику на элемент выполнится функция func:
Можно выполнить не одну функцию, а несколько:
С этим можно бороться несколькими способами: можно сменить внешние кавычки на одинарные onclick=’alert(«!»)’, можно также заэкранировать внутренние кавычки обратным слешем onclick=»alert(\»!\»)» или же просто перенести JavaScript код из атрибута в функцию, а в атрибуте оставить только имя функции onclick=»func()».
Таблица атрибутов для событий
Работа с getElementById
Сейчас мы с вами научимся получать элементы HTML страницы и проводить с ними различные манипуляции (мы сможем менять, к примеру, их текст и цвет и многие другие полезные вещи).
Пусть у нас на странице есть тег с атрибутом id в значении test. Запишем ссылку на этот тег в переменную elem. Для этого мы должны воспользоваться методом getElementById, который получает элемент по его id.
Эта запись произойдет по клику на кнопку, которой мы задали атрибут onclick. По нажатию на эту кнопку сработает функция func, которая найдет на HTML странице элемент с id равным test и запишет ссылку на него в переменную elem:
Теперь в переменной elem у нас лежит ссылка на элемент с атрибутом id в значении test. Сама переменная elem является объектом.
Давайте посмотрим, как это происходит на практике.
Основы работы с атрибутами HTML через JavaScript
Сейчас мы будем считывать и изменять атрибуты тегов. Пусть у нас опять даны инпут с id равным test и кнопка, по клику на которую будет запускаться функция func:
Внутри функции func мы получим наш инпут по его id и запишем ссылку на него в переменную elem:
Можно не только считывать значения атрибутов, но и изменять их. Чтобы, к примеру, поменять значение атрибута value, нужно просто присвоить его конструкции elem.value:
HTML код станет выглядеть так (значение атрибута value станет www):
Таким же образом (цепочкой) можно производить и перезапись атрибутов:
А сейчас я не ввожу новую переменную и поэтому мне приходится вызывать getElementById два раза:
На мой взгляд, этот код стал сложнее, хотя и занимает на одну строчку меньше. Кроме того, если я захочу сменить значение id с test на, к примеру, www, мне придется делать это во многих местах, что не очень удобно.
Исключения: атрибуты class и for
Это слово является специальным в JavaScript и поэтому мы не можем просто написать elem.class, чтобы считать значение атрибута class. Вместо этого следует писать elem.className.
В следующем примере на экран выводится значение атрибута class:
Кстати, есть и другие атрибуты, которые называются иначе, чем свойство. Например, атрибуту for ( ) соответствует свойство с названием htmlFor.
Работа с this
Сейчас мы с вами будем работать со специальным объектом this, который указывает на текущий элемент (элемент в котором произошло событие). Причем указывает так, будто этот элемент уже получен методом getElementById.
Давайте посмотрим как работать с this и в чем удобство такого подхода.
Пусть у нас есть задача по нажатию на инпут вывести на экран содержимое его value.
Пока вы умеете делать только такое решение:
В принципе, это решение хорошее, но представим теперь, что у нас есть много инпутов и по нажатию на каждый нам нужно выводить его value.
В этом случае у нас получится что-то в таком роде:
Давайте упростим нашу задачу: будем передавать параметром функции id текущего элемента. И вместо большого количества функций все сведется к одной функции:
Итак, давайте наконец рассмотрим вариант решения задачи через this.
Сделаем так, что каждый инпут будет выводить свое содержимое по нажатию. Для этого параметром функции передадим объект this, вот так: func(this).
Наш this передается параметром функции и попадает в переменную elem. Этот elem ведет себя так, будто получен таким образом: var elem = document.getElementById(. ), но получать его таким образом не надо, там уже все готово и можно пользоваться. К примеру, elem.value указывает на value нашего инпута и так далее.
Итак, вот самое просто решение нашей задачи:
Основы работы с CSS
Можно также и не вводить переменную elem, а построить очень длинную цепочку:
Существует много CSS свойств, которые пишутся через дефис, например, font-size. В этом случае оно преобразуется в fontSize:
Обратите внимание на то, что свойство float является исключением (оно является специальным в JavaScript) и вместо него следует писать cssFloat:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Основы работы с массивами и объектами в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
А теперь представьте, что вам нужно вывести на экран название третьего месяца. С помощью 12-ти различных переменных это было бы проблематично, так как вам необходимо помнить названия всех переменных, в которые вы записали имена месяцев.
Поэтому для таких вещей был изобретен специальный тип данных. Он называется массив.
Массив создается с помощью квадратных скобок [ ]:
Пока созданный нами массив не содержит никаких данных. Заполним его названиями дней недели:
Каждое значение списка, который мы записали в массив (в нашем случае каждый день недели), называется элементом массива.
Элементы разделяются между собой запятой. После этой запятой можно ставить пробелы, а можно и не ставить.
Обратите внимание на то, что названия дней недели представляют собой строки и поэтому взяты в кавычки. Кроме строк в массиве можно хранить числа, и их в кавычки мы не берем:
Как вывести отдельный элемент массива
Предположим, мы хотим вывести на экран среду с помощью составленного массива дней недели.
Посмотрите и повторите пример:
Ассоциативные массивы (объекты)
В предыдущем примере, чтобы обратиться к нужному элементу массива, мы писали в квадратных скобках его порядковый номер (нумерация начинается с нуля, если вы уже забыли). Эти порядковые номера называются ключами массива.
То есть мы получали значение элемента массива по его ключу.
Поэтому в JavaScript можно указать ключи в явном виде – так, как нам нужно. Делается это с помощью объектов (в других языках программирования они называются ассоциативными массивами). Объекты создаются с помощью фигурных скобок , внутри которых пишутся элементы этого объекта в формате ключ: значение.
Давайте сделаем так, чтобы понедельник имел ключ 1, а не ноль, как было раньше (и всем остальным дням прибавим единицу):
Синтаксис здесь такой: ключ, затем идет двоеточие :, а потом значение.
Узнаем зарплату Васи:
Кроме того, кавычки вокруг строковых ключей можно и не ставить:
Однако, на такие ключи накладываются ограничения: они не должны начинаться с цифры, не должны иметь символ дефиса или символ пробела внутри.
Свойства объекта
В этом случае говорят, что мы обращаемся к свойству объекта.
При таком способе обращения на названия свойств (то есть ключей) накладываются ограничения: они не должны начинаться с цифры, не должны иметь символ дефиса или символ пробела внутри.
Как еще можно создать массив или объект
Вместо и [ ] можно пользоваться Object() и Array() соответственно (это просто альтернативный синтаксис).
Давайте создадим объект вторым синтаксисом:
Давайте создадим массив вторым синтаксисом:
Создание объекта через и через Object() эквивалентно, вы можете пользоваться тем способом, который вам удобнее.
А вот с массивом не все так просто. Разница между ними проявляется в случае, если вы хотите сделать массив, состоящий из одного элемента, который будет целым числом, вот так:
В этом случае получим не такой массив:
Это будет массив, состоящий из 10-ти пустых элементов (их значение будет undefined), а не массив из одного элемента 10, как мы хотели бы.
Заполнение массива
Также можно поступать и с объектами:
Многомерный массив
Элементы массива могут быть не только строками и числами, но и массивами. То есть у нас получится массив массивов или многомерный массив.
Давайте сделаем массив студентов students, который будет содержать два подмассива: студенты мужского пола и женского:
Чтобы вывести какой-либо элемент из многомерного массива следует писать уже не одну пару [ ], а две: students[‘boys’][0] – так мы выведем ‘Коля’.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Основы работы с массивами в PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
А теперь представьте, что вам нужно вывести на экран название третьего месяца. С помощью 12-ти различных переменных это было бы проблематично, так как вам необходимо помнить названия всех переменных, в которые вы записали имена месяцев.
Поэтому для таких вещей был изобретен специальный тип данных. Он называется массив.
Массив создается с помощью функции []:
Пока созданный нами массив не содержит никаких данных. Заполним его названиями дней недели (для краткости пишу две буквы каждого дня):
Каждое значение списка, который мы записали в массив (в нашем случае каждый день недели), называется элементом массива.
Элементы разделяются между собой запятой. После этой запятой можно ставить пробелы, а можно и не ставить.
Обратите внимание на то, что названия дней недели представляют собой строки и поэтому взяты в кавычки. Кроме строк в массиве можно хранить числа, и их в кавычки мы не берем:
Посмотреть содержимое массива с помощью echo мы, увы, не сможем. Попробуйте сделать так:
Вы увидите на экране слово Array вместо содержимого массива.
Для того, чтобы PHP вывел нам все элементы массива, нужно воспользоваться функцией var_dump:
Вот теперь мы действительно увидим все элементы нашего массива.
Запомните этот момент: для того, чтобы узнать, какие именно элементы хранятся в массиве, мы должны пользоваться функцией var_dump, а не echo.
Как вывести отдельный элемент массива
Итак, массив месяцев мы составили и даже научились смотреть на него функцией var_dump. Однако, полезного пока мало, так как var_dump используется для отладки кода и выводит весь массив целиком.
Предположим, мы хотим вывести на экран среду.
Посмотрите и повторите пример:
Ассоциативный массив
Чтобы обратиться к нужному элементу массива, мы писали в квадратных скобках его порядковый номер (нумерация начинается с нуля, если вы уже забыли). Эти порядковые номера называются ключами массива. То есть мы получали значение элемента массива по его ключу.
Поэтому в PHP можно указать ключи в явном виде – так, как нам нужно. Сделаем так, чтобы понедельник имел ключ 1, а не ноль, как было раньше (и всем остальным дням прибавим единицу):
Синтаксис здесь такой: ключ, затем идет стрелка =>, а потом значение.
Узнаем зарплату Васи:
Массивы, у которых явно указаны ключи, называются ассоциативными.
Хитрость с ключами
Когда мы делали ассоциативный массив дней недели, нам приходилось расставлять все ключи вручную. И все для того, чтобы нумерация началась не с нуля, а с единицы. Это было немного неудобно.
Напомню вам этот массив:
Если у второго элемента не будет ключа, PHP поставит его автоматически, причем следующий по порядку.
А следующим номером будет как раз-таки число 2, так как предыдущий элемент имел ключ 1 (неважно, что мы сами его поставили, а не PHP автоматически).
Давайте поправим наш массив:
Как еще можно создать массив
Объявление массива с помощью команды [] не является единственным способом его создания.
Можно просто присвоить значения элементам массива, не объявляя его через array (PHP нас поймет и сам создаст массив):
Естественно, ключи могут быть не только числовыми, но и текстовыми:
Кроме того, можно сделать так, что PHP сам добавит ключи (начиная с нуля и так далее). Для этого мы оставим квадратные скобки пустыми: $a[] = 1, а PHP сам добавит ключ. Пример:
Все способы создания массива
Итак, повторим все способы создания массива:
Многомерный массив
Элементы массива могут быть не только строками и числами, но и массивами. То есть у нас получится массив массивов или многомерный массив.
Давайте сделаем массив студентов $students, который будет содержать два подмассива: студенты мужского пола и женского:
Чтобы вывести какой-либо элемент из многомерного массива следует писать уже не одну пару [ ], а две: $a[‘boys’][0] – так мы выведем ‘Коля’.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Работа с продвинутыми свойствами CSS
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Изучите следующие CSS свойства: text-align-last.
Изучите следующие HTML теги и CSS свойства: pre, overflow, white-space.
Изучите следующие CSS свойства: opacity (обратите внимание на rgba при изучении).
Изучите следующие CSS свойства: text-shadow.
Изучите следующие CSS свойства: box-shadow.
Изучите следующие CSS свойства: cursor.
Изучите следующие CSS свойства: box-sizing.
Изучите работу со множественными фонами CSS3, смотрите свойство background.
Изучите следующие CSS свойства: background-size.
Изучите следующие CSS свойства: hyphens.
Изучите следующие CSS свойства: user-select.
Изучите следующие CSS свойства: display, visibility.
Изучите следующие CSS свойства: columns.
Изучите следующие функции CSS: calc, min, max, attr.
Изучите следующие CSS свойства: font-face.
Изучите следующие CSS свойства: border-image.
Изучите следующие CSS свойства: filter.
Изучите следующие CSS свойства: position: sticky.
Изучите следующие CSS свойства: object-fit.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Основы работы с ООП в PHP. Часть 1
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Сейчас мы с вами займемся изучением ООП в PHP.
Что такое объекты в жизни
Давайте рассмотрим пример из жизни, а потом перенесем его на PHP. Пусть у нас есть автомобиль. У него есть колеса, цвет, вид кузова, объем двигателя и так далее. Кроме того, водитель может отдавать ему команды: ехать, остановится, повернуть направо, налево и тп.
Можно говорить о том, что существует некоторый класс автомобилей, обладающий общими свойствами (у всех есть колеса и всем им можно отдавать команды).
Если бы мы программировали автомобиль, то можно было бы сделать что-то вроде такого:
Как оказалось, программировать в терминах объектов и классов достаточно удобно. Давайте посмотрим, как это делается в PHP.
Наши первые классы и объекты
Давайте теперь сделаем 2 юзера (объекта) ‘Коля’ и ‘Вася’, заполним их данными и выведем на экран сумму их возрастов:
Методы
Переменная $this указывает на объект класса и предназначена для использования внутри класса.
Итак, сделаем так, чтобы метод show возвращал имя юзера:
Сделаем что-нибудь полезное с методами
Разбираем public и private
Давайте теперь разберем, что делает ключевое слово public, которое мы писали перед всеми свойствами и методами.
Ключевое слово public указывает на то, что данные свойства и методы доступны извне (вне кода класса). В противоположность public есть ключевое слово private, которое указывает на то, что свойства и методы недоступны извне.
То же самое касается и свойств. Некоторые свойства выполняют чисто вспомогательную функцию, и не должны быть доступны вне класса, иначе мы их можем случайно поредактировать и сломать наш код.
Геттеры и сеттеры
Очень часто все свойства объекта делают приватными, а для доступа к ним реализуют специальные методы.
Аналогично поступим с возрастом и вот, что у нас получится:
Давайте теперь разбираться, зачем это нужно.
Во-первых, таким образом мы можем создавать свойства только для чтения. Например, возраст можно будет только получить через getAge, но нельзя будет поменять без setAge.
Такие методы, как мы реализовали, называются геттерами и сеттерами.
Рассмотрим private методы
Давайте для сеттера setAge реализуем вспомогательный private метод checkAge, который будет проверять возраст на корректность перед его установкой:
Метод __construct
Существует специальный встроенный метод __construct. Это метод (если мы его написали в коде) будет вызываться при создании объекта. Пример:
В __construct можно также передавать параметры:
Чем может быть полезен этот метод? Давайте, для примера, сделаем объект User, для которого в момент создания объекта будут указываться имя и возраст. Эти значение в дальнейшем нельзя будет поменять, а только прочитать (геттеры сделаем, а сеттеры нет):
Наследование
Наследование реализуется с помощью ключевого слова extends, вот так: class Worker extends User.
Вот реализация класса Worker:
Ключевое слово protected
Перегрузка и parent::
Пусть у нас есть класс Student, наследующий от класса User метод setAge. Предположим, что этот метод setAge от родителя нам чем-то не подходит и мы хотим написать свою реализацию в классе-потомке. Так можно делать (это называется перегрузка).
Давайте напишем студент свой setAge в классе Student. Наш setAge будет проверять то, что возраст студента меньше 25 лет:
Пусть мы затерли (перегрузили) метод родителя, но хотели бы использовать и его. То есть мы хотим иметь в классе Student свой метод setAge а также метод родителя setAge. В этом случае к методу родителя можно обратиться так: parent::setAge().
Давайте доработаем наш класс Student так, чтобы использовался метод setAge родителя (убираем некоторое дублирование кода таким образом):
На использование классов внутри других классов
Бывает такое, что мы хотели бы использовать методы одного класса внутри другого, но не хотели бы наследовать от этого класса.
Пусть, к примеру, у нас есть класс User, который хочет использовать класс работы с базами данных Db. Создадим внутри User новый объект класса Db, запишем его в любую переменную, например, в $this->db и будем спокойно использовать public методы и свойства класса Db:
Некоторая практика
Давайте напишем реализацию класса Db и класса User. Попробуйте сами разберитесь в этом коде:
Переменные названия свойств и методов
Названия свойств и методов можно хранить в переменной. К примеру, есть переменная $var, в которой лежит строка ‘name’. Тогда обращение $user->$var по сути эквивалентно обращению $user->name.
Иногда такие финты полезны.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Работа с датами в PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Для работы с датами в PHP применяются различные функции. Мы начнем изучение с функции time.
Функция time, формат timestamp
Функция time возвращает разницу в секундах между 1-го января 1970 года и текущим моментом времени. Такое представление даты называется форматом timestamp.
Зачем нужен timestamp?
Время в формате timestamp используется для того, чтобы найти разницу между датами в секундах.
С помощью функции time мы можем получить только текущий момент времени. Чтобы получить timestamp за любую дату следует использовать функцию mktime:
Функция mktime
Функция mktime работает аналогично функции time, но, в отличие от нее, принимает параметры: mktime(час, минута, секунда, месяц, день, год) (обратите внимание на то, что месяц и день переставлены местами ). Посмотрите примеры работы:
Полученная разница в секундах будет выглядеть так: 712255381 (обновите страницу и это число поменяется).
Вооружившись знаниями о том, что такое формат timestamp (он нам еще понадобится в дальнейшем), изучим более полезные функции для работы с датами, например, функцию date.
Функция date
Функция date выводит текущие дату и время в заданном формате.
Формат задается управляющими командами (английскими буквами), при этом можно вставлять любые разделители между ними (дефисы, двоеточие и так далее).
Примеры работы с date:
Второй параметр функции date
Функция date имеет второй необязательный параметр, который принимает момент времени в формате timestamp. Если передать этот параметр, то функция date отформатирует не текущий момент времени, а тот, который передан вторым параметром. Этот timestamp можно получить, к примеру, через mktime (но не обязательно):
Функция strtotime
Следующая полезная функция, которую мы разберем, называется strtotime.
К примеру, я могу передать ей строку ‘2025-12-31’ и функция сама разберет, где тут год, где месяц, а где день, и вернет эту дату в формате timestamp.
Все форматы можно посмотреть тут.
Следующий код вернет дату предыдущего понедельника:
Как добавить или отнять дату
Пример 1
Давайте создадим объект с датой за 2025 год, 12 месяц, 31 день, затем прибавим к ней 1 день и выведем в формате ‘день.месяц.год’
Результат выполнения кода:
Пример 2
Давайте создадим объект с датой за 2025 год, 12 месяц, 31 день, затем прибавим к ней 3 дня и выведем в формате ‘день.месяц.год’
Результат выполнения кода:
Пример 3
Давайте создадим объект с датой за 2025 год, 12 месяц, 31 день, затем прибавим к ней 3 дня и 1 месяц и выведем в формате ‘день.месяц.год’
Результат выполнения кода:
Пример 4
Давайте создадим объект с датой за 2025 год, 1 месяц, 1 день, затем отнимем от нее 1 день и выведем в формате ‘день.месяц.год’
Результат выполнения кода:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на позиционирование элементов на CSS
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
На абсолютное позиционирование
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На z-index
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На relative
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На fixed
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Основные CSS свойства
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Мы с вами разобрались с различными способами подключения CSS на HTML страницу в предыдущем уроке и теперь давайте начнем изучать различные CSS свойства.
Свойство color позволяет задать цвет текста. Цвет можно задавать следующими способами: английским словом, через решетку #, через rgb и некоторыми другими способами, которые мы пока не будем разбирать.
Давайте разберем указанные способы подробнее.
В следующем примере всем абзацам на странице задан красный цвет:
Так код будет выглядеть в браузере:
Абзац с текстом.
Первый способ задания цвета имеет некоторые недостатки. Во-первых, таким образом можно сделать не все оттенки цветов (все-таки количество названий ограничено, а оттенков можно придумать огромное множество). Во-вторых, невозможно помнить все названия цветов наизусть и, если нужен какой-то редкий цвет, приходится лазить по справочнику и искать его.
Поэтому в CSS существуют и более универсальные способы задать нужный вам цвет. Чтобы понять эти способы, для начала вам необходимо разобраться с тем, как получается нужный цвет на экране компьютера.
На самом деле отдельная точка экрана (пиксель) не может светиться всеми цветами, которые нужны, так как это технически было бы очень сложно. И на самом деле каждая точка экрана может светиться только тремя цветами: красным, зеленым и голубым. Причем одновременно и в разных пропорциях.
В CSS есть способ заставить пиксели светиться указанными тремя цветами в нужных нам пропорциях. Давайте его разберем:
Сами буквы rgb расшифровываются как red (красный), green (зеленый), blue (голубой).
Так код будет выглядеть в браузере:
Абзац с текстом.
А вот так мы получим чисто красный цвет (первое значение в 255, а все остальные нули):
Так код будет выглядеть в браузере:
Абзац с текстом.
Так получим чисто зеленый цвет:
Так код будет выглядеть в браузере:
Абзац с текстом.
Так код будет выглядеть в браузере:
Абзац с текстом.
Ну, а теперь я смешаю все три цвета в произвольных пропорциях. Смотрите, что получилось:
Так код будет выглядеть в браузере:
Абзац с текстом.
Чисто белый цвет:
Так код будет выглядеть в браузере:
Абзац с текстом.
Чисто черный цвет:
Так код будет выглядеть в браузере:
Абзац с текстом.
Принцип смешения цветов нужен вам только для понимания происходящих процессов, не стоит его сильно пугаться, если вы его не совсем поняли. Существуют специальные программы, которые позволяют выбрать любой оттенок любого цвета и получить его rgb. Вы будете только копировать нужные вам значения из программы и спокойно пользоваться, не задумываясь о смешении цветов. Об этом я расскажу вам в видео после того, как объясню третий способ работы с цветом.
В следующем примере абзац красится в красный цвет:
Так код будет выглядеть в браузере:
Абзац с текстом.
Видео по работе с пипеткой
В следующем видео я покажу вам, как определить цвет любого пикселя на экране с помощью специальных программ и получить его в нужном вам формате:
Тут скоро будет видео по работе с пипеткой.
Свойства width и height позволяют задать высоту и ширину элементу соответственно. Ширина и высота обычно измеряются в пикселях (обозначается px) или процентах (обозначается %) (можно измерять и других единицах, которые мы пока не будем разбирать).
В данном примере абзацу задана ширина и высота, а также граница, чтобы можно было увидеть, где заканчивается наш абзац (границу мы еще не проходили, пока не обращайте на нее внимание, чуть позже вы узнаете, как ее сделать):
Так код будет выглядеть в браузере:
Видео по работе с измерительными инструментами
Я уже упоминал, что, как и цвет пикселей на экране, размеры элементов в браузере также можно измерять специальными программами.
Как ими пользоваться, смотрите в следующем видео:
Тут скоро будет видео по работе с измерителем пикселей.
Свойство text-align позволяет задать выравнивание текста. Текст можно выравнять по левому краю (значение left), по правому (значение right), по центру (значение center) и одновременно и по правому, и по левому краю (значение justify).
Давайте посмотрим на примерах, что имеется ввиду.
Значение left
Давайте сделаем так, чтобы текст был выровнен по левому краю. Для этого нужно свойство text-align поставить в значение left:
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Значение right
Давайте теперь поставим текст по правому краю:
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Значение center
Поставим текст по центру:
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Значение justify
Ну, и наконец выровняем текст одновременно и по правому, и по левому краю:
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Так код будет выглядеть в браузере:
Это заголовок
Абзац с текстом.
Для сравнения привожу их вид по умолчанию:
Это заголовок
Абзац с текстом.
Так код будет выглядеть в браузере:
Абзац с текстом.
Свойство font-size позволяет задать размер текста. Размер задается в пикселях (обозначаются px), в пунктах (обозначаются pt), в процентах (обозначаются %) и с помощью некоторых других единиц, которые мы пока не будем разбирать.
С пикселями вы уже знакомы и даже знаете измерительные инструменты для этого. Давайте разберемся с тем, что такое пункты.
Значение в пунктах
Давайте зададим тексту абзаца шрифт в 20 пунктов:
Так код будет выглядеть в браузере:
Абзац с текстом.
Значение в процентах
Значение размера шрифта в процентах мы пока не будем разбирать, просто знайте, что такое есть. При необходимости смотрите страницу в справочнике CSS по размерам для единиц измерения.
Свойство font-family позволяет задать тип шрифта (тип часто называют семейством шрифта).
Поставим для всех абзацев шрифт Arial:
Так код будет выглядеть в браузере:
Абзац с текстом.
Также для решения данной проблемы поступают так: перечисляют несколько похожих шрифтов через запятую. Например, font-family: Georgia, «Times New Roman».
Когда браузер встречает первый шрифт в списке, он проверяет его наличие на компьютере пользователя. Если такого шрифта нет, берется следующий шрифт из списка и также анализируется на присутствие. Поэтому несколько шрифтов увеличивает вероятность, что хотя бы один из них будет обнаружен на клиентском компьютере.
Заканчивают список обычно ключевым словом, которое описывает тип шрифта (все шрифты относятся к какому-нибудь типу) — serif, sans-serif, cursive, fantasy или monospace. Если браузер не нашел ни одного из указанных шрифтов на компьютере пользователя, то он выберет один из шрифтов указанного типа.
Засечки являются отличительной особенностью шрифта, нет такого, чтобы был одновременно с засечками и без засечек. Arial с засечками будет уже какой-то другой шрифт, но никак не Arial.
Если в имени шрифта содержатся пробелы, например, Times New Roman, оно должно заключаться в одинарные или двойные кавычки.
Веб безопасные шрифты
Безопасным шрифтом можно назвать такой шрифт, который является стандартным для всех операционных систем. Поскольку о таком положении дел остается только мечтать, то абсолютно безопасных шрифтов не существует! Отдельные шрифты можно назвать безопасными с некоторыми оговорками. Вот они:
Значение | Описание |
---|---|
Arial | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. |
Arial Black | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. |
Comic Sans MS | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. |
Courier New | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. |
Georgia | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. |
Impact | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. |
Times New Roman | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. |
Trebuchet MS | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. |
Verdana | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. |
Свойство line-height задает межстрочный интервал.
При использовании свойства line-height вас может ожидать некоторый подвох: это свойство не задает промежуток между строками текста, как могло бы показаться, а задает высоту линии текста.
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Значением свойства line-height не обязательно должно служить число в некоторых единицах. Можно также просто написать число или дробь. В этом случае настоящее значение line-height можно будет найти, умножив его на значение font-size.
Преимущество такого способа задания line-height в том, что при изменении размера шрифта автоматически будет меняться и межстрочный интервал.
Существует специальное свойство font, которое можно использовать вместо многих свойств, которые мы уже разобрали. Такие свойства в CSS называются свойствами-сокращениями. Зачастую их использование гораздо удобнее вместо множества других свойств.
Свойство font имеет следующий синтаксис: курсив жирность размер_шрифта/интервал_между_строками семейство_шрифта. Обязательными являются «размер_шрифта» и «семейство_шрифта», порядок имеет значение.
Свойство font является свойством-сокращением.
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Свойство text-indent позволяет задать красную строку, то есть отступ первой строки текста (к примеру, в абзаце).
Давайте сделаем красную строку для абзацев:
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a dapibus magna, ac interdum nisl. Suspendisse eget fringilla nibh, eu commodo arcu. Donec lacinia tempor velit sed tincidunt. Aliquam porttitor nulla purus, vel vulputate ipsum faucibus sed. Phasellus sodales, lorem vel cursus vehicula, ante purus lacinia dui, interdum fringilla massa eros ut dui.
Свойство vertical-align позволяет задать выравнивание по вертикали. К сожалению, адекватным образом это выравнивание работает только для таблиц.
Значение top
Давайте сделаем так, чтобы по вертикали текст в ячейках таблицы был выровнен по верхнему краю:
Так код будет выглядеть в браузере:
Ячейка 1 | Ячейка 2 | Ячейка 3 |
Ячейка 4 | Ячейка 5 | Ячейка 6 |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Значение bottom
А теперь по нижнему краю:
Так код будет выглядеть в браузере:
Ячейка 1 | Ячейка 2 | Ячейка 3 |
Ячейка 4 | Ячейка 5 | Ячейка 6 |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Значение middle
Ну, а теперь по центру:
Так код будет выглядеть в браузере:
Ячейка 1 | Ячейка 2 | Ячейка 3 |
Ячейка 4 | Ячейка 5 | Ячейка 6 |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Работа с XML в PHP
Парсинг сайтов
Что такое API? Это набор функций, с помощью которых вы можете слать запрос этому сайту и получать нужный ответ. Вот этот ответ чаще всего приходит в формате XML. Поэтому давайте приступим к его изучению.
Работа с XML в PHP
Пусть у вас есть XML. Он может быть в строке, либо хранится в файле или отдаваться по запросу к определенному URL.
Пусть XML хранится в строке. В этом случае из этой строки нужно создать объект с помощью new SimpleXMLElement:
Если же XML хранится в файле или отдается по обращению к URL (что чаще всего и бывает), то следует использовать функцию simplexml_load_file, которая делает тот же объект $xml:
Приемы работы
В примерах ниже наш XML хранится в файле или по URL.
Пусть дан следующий XML:
Давайте получим имя, возраст и зарплату работника:
Корневой тег в XML может быть только один, так же, как и тег в обычном HTML.
Давайте чуть модифицируем наш XML:
В этом случае у нас получится цепочка обращений:
Работа с атрибутами
Пусть некоторые данные хранятся в атрибутах:
Теги с дефисами
В XML разрешены теги (и атрибуты) с дефисом. В этом случае обращение к таким тегам происходит так:
Перебор циклом
Пусть теперь у нас не один работник, а несколько. В этом случае мы можем перебрать наш объект с помощью цикла foreach:
Из объекта в нормальный массив
Если вам неудобно работать с объектом, вы можете преобразовать его в нормальный массив PHP с помощью следующего хитрого приема:
Больше информации
Парсинг на основе sitemap.xml
В итоге вы получаете список ссылок для парсинга, остается только зайти на них и спарсить нужным вам контент.
Подробнее об устройстве sitemap.xml читайте в википедии.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Минипроекты JavaScript для новичков
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
ВНИМАНИЕ Вместо задач этого урока вышел отдельный спец курс:
http://theory.phphtml.net/courses/javascript/practice/1/c.html
http://theory.phphtml.net/courses/javascript/practice/1/h.html
Меняйте число в адресе, будете попадать на следующий урок, всего 13 уроков (дз есть не везде).
ПЕРЕД этими уроками посмотрите урок на анонимные функции (он ниже по учебнику).
Задачи для решения
Реализуйте калькулятор. Должны быть кнопки цифр и операций. По нажатию на кнопку ‘=’ должен посчитаться результат. Совет: используйте фунцию eval.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Реализуйте игру крестики-нолики. Играет два человека, на одном поле по очереди.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Реализуйте тест, в котором показывается один вопрос, 5 чекбоксов для ответа (может быть несколько правильных ответов). Под чекбоксами ссылка ‘следующий вопрос’. По нажатию на эту ссылку вместо текущего вопроса показывается следующий. Когда вопросы заканчиваются, в последнем вопросе будет стоять ссылка не ‘следующий вопрос’, а ‘показать результат’.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Решите предыдущую задачу, но при условии, что баннер появлятся не по прокрутке, а через N секунд после захода пользователя на страницу.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Реализуйте квадратный календарик (как в винде).
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Реализуйте органайзер. Он представляет собой календарик, нажимая на даты которого можно увидеть список задач, запланированных на этот день.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Реализуйте аккордион (погуглите, что это).
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Дана таблица. В верхнем ряду th. Сделайте так, чтобы по нажатию на определенный th ряды таблицы сортировались по значениям этого столбца.
Образец того, что должно получится, он же ответ в исходном коде:
Вы можете открыть этот пример в отдельной вкладке браузера.
Практика по созданию горизонтальных и вертикальных менюшек
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Повторите страницы по образцу
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (li поставьте в ряд с помощью float):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (li поставьте в ряд с помощью inline-block):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Продвинутая работа с функциями JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
В данном уроке мы разберем анонимные функции и замыкания на языке JavaScript.
Режим use strict
В JavaScript существует специальный режим, по которому код будет выполнятся по современному стандарту ES5, а не по более старому (это по умолчанию).
Этот режим включается директивой «use strict»; или ‘use strict’; и ставится в начале скрипта:
Строгий режим можно активировать только для кода функции:
Исходный код функции и результат
Функция как переменная
Можно также создать безымянную функцию и записать ее в какую-то переменную:
Функциональные выражения и объявление функций
По сути это одно и то же, но есть существенная разница: функции, объявленные как Function Declaration, создаются до выполнения кода. Поэтому их можно вызвать до объявления, например:
А функциональные выражения создаются в момент выполнения кода и недоступны выше. Поэтому такой код выдаст ошибку:
Функциональные выражения
Особенности Function Declaration при use strict
Function Declaration при use strict видны только внутри блока, в котором объявлены. В данном случае функция func объявлена внутри ифа, но не будет видна снаружи:
Без use strict все будет нормально.
Передача функции по ссылке
Анонимные функции
Функции, не имеющие имени, называются анонимными. Такие функции бывают полезны в тех случаях, когда имя функции нам без надобности и нет смысла тратить время на придумывание этого имени.
Пример: пусть у нас есть переменная elem, в которой лежит ссылка на какой-то элемент. Привяжем в качестве события onclick анонимную функцию:
Тоже самое при addEventListener:
Функция как параметр другой функции
Пусть у нас даны 2 функции:
Сделаем третью функцию go, которая будет ожидать, что первым и вторым параметром ей передаются функции, которые возвращают какие-то числа.
Получается, что в функцию можно передавать параметрами другие функции, записывать их в переменные и использовать внутри.
А можем вообще использовать анонимную функцию, создаваемую в момент передачи параметра:
Функция в функции
Одну функцию можно объявить внутри другой. В этом случае внутренняя функция не будет доступна извне:
Функция, возвращающая функцию
Функция может возвращать другую функцию, например так:
Область видимости переменных
Давайте вспомним про область видимости переменных. Напомню, что внешняя переменная видна внутри функции:
Замыкания
Пусть у нас есть переменная num, определенная снаружи функции:
Обернем всю нашу конструкцию в функцию (назовем ее createCounter), а функцию func, которая у нас была ранее, сделаем анонимной и сделаем так, чтобы новая функция createCounter возвращала эту анонимную функцию:
Рассмотрим подробнее, что тут происходит: переменная num является локальной внутри функции createCounter, но при этом она доступна в анонимной функции (это мы видели в предыдущих примерах). В строчке var counter = createCounter() анонимная функция запишется в переменную counter. Получится, что у нас далее есть функция counter, внутри которой доступна переменная num из createCounter.
Давайте убедимся в этом:
Вызов функции на месте
При программировании иногда возникает задача сделать анонимную функцию и сразу ее вызвать в момент создания.
Зачем это нужно: те переменные и вспомогательные функции, которые мы объявим внутри нашей анонимной функции останутся локальными и не будут засорять своими именами глобальную область видимости.
Для вызова функции на месте хотелось бы сделать что-то в таком роде:
Однако, это не будет работать, так как на месте разрешен вызов только функциональных выражений. Поэтому необходимо сделать из нашей функции выражение, например, поставив перед ней плюс, такое уже будет работать:
Так тоже будет работать:
Но более принято брать такие функции в круглые скобки, вот так:
Давайте посмотрим, что же нам дает вызов функции на месте: сделаем внутри такой функции переменную message. Наша переменная будет доступна только внутри функции, и не будет доступна снаружи:
Иногда во избежания ошибок в начале ставится точка с запятой (ошибки могут возникнуть при сжатии файла минимизатором):
Задачи на продвинутые SQL запросы
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Перед решением задач изучите теорию к данному уроку.
Примеры решения задач
Задача
Задача. Выберите из таблицы workers записи с id равным 3, 5, 6, 10.
Задача
Задача. Выберите из таблицы workers записи с id равным 3, 5, 6, 10 и логином, равным ‘eee’, ‘zzz’ или ‘ggg’.
Задача
Задача. Выберите из таблицы workers записи c зарплатой от 500 до 1500.
Задача
Задача
Задача. Найдите в таблице workers минимальный возраст.
Задача
Задача. Найдите в таблице workers суммарный возраст.
Задача
Задача. Вставьте в таблицу workers запись с полем date с текущим моментом времени в формате ‘год-месяц-день часы:минуты:секунды’.
Задача
Задача. Вставьте в таблицу workers запись с полем date с текущей датой в формате ‘год-месяц-день’.
Задача
Задача. При выборке из таблицы workers запишите день, месяц и год в отдельные поля.
Задача
Задача. Выберите из таблицы workers записи, в которых минуты больше секунд.
Задача
Задача. При выборке из таблицы workers прибавьте к дате 1 год.
Задача
Задача. При выборке из таблицы workers отнимите от даты 1 год.
Задача
Задача. При выборке из таблицы workers прибавьте к дате 3 года, 4 месяца.
Задача
Задача. При выборке из таблицы workers прибавьте к дате 4 дня, 3 часа, 2 минуты, 1 секунду.
Задача
Задача. При выборке из таблицы workers прибавьте к дате 3 дня и отнимите 2 часа.
Задачи для решения
На IN
Выберите из таблицы workers записи с id равным 1, 2, 3, 5, 14.
Выберите из таблицы workers записи с login равным ‘eee’, ‘bbb’, ‘zzz’.
Выберите из таблицы workers записи с id равным 1, 2, 3, 7, 9, и логином, равным ‘user’, ‘admin’, ‘ivan’ и зарплатой больше 300.
На BETWEEN
Выберите из таблицы workers записи c зарплатой от 100 до 1000.
Выберите из таблицы workers записи c id от 3 до 10 и зарплатой от 300 до 500.
На AS
На DISTINCT
Выберите из таблицы workers все записи так, чтобы туда попали только записи с разной зарплатой (без дублей).
Получите SQL запросом все возрасты без дублирования.
На MIN и MAX
Найдите в таблице workers минимальную зарплату.
Найдите в таблице workers максимальную зарплату.
На SUM
Найдите в таблице workers суммарную зарплату.
Найдите в таблице workers суммарную зарплату для людей в возрасте от 21 до 25.
Найдите в таблице workers суммарную зарплату для id, равного 1, 2, 3 и 5.
На AVG
Найдите в таблице workers среднюю зарплату.
Найдите в таблице workers средний возраст.
На NOW, CURRENT_DATE, CURRENT_TIME
Выберите из таблицы workers все записи, у которых дата больше текущей.
Вставьте в таблицу workers запись с полем date с текущим моментом времени в формате ‘год-месяц-день часы:минуты:секунды’.
Вставьте в таблицу workers запись с полем date с текущей датой в формате ‘год-месяц-день’.
Вставьте в таблицу workers запись с полем time с текущим моментом времени в формате ‘часы:минуты:секунды’.
На работу с частью даты
Выберите из таблицы workers все записи за 2016 год.
Выберите из таблицы workers все записи за март любого года.
Выберите из таблицы workers все записи за третий день месяца.
Выберите из таблицы workers все записи за пятый день апреля любого года.
Выберите из таблицы workers все записи за следующие дни любого месяца: 1, 7, 11, 12, 15, 19, 21, 29.
Выберите из таблицы workers все записи за вторник.
Выберите из таблицы workers все записи за первую декаду любого месяца 2016 года.
Выберите из таблицы workers все записи, в которых день меньше месяца.
При выборке из таблицы workers запишите день, месяц и год в отдельные поля.
При выборке из таблицы workers создайте новое поле today, в котором будет номер текущего дня недели.
На EXTRACT, DATE
При выборке из таблицы workers запишите год, месяц и день в отдельные поля с помощью EXTRACT.
При выборке из таблицы workers запишите день, месяц и год в отдельное поле с помощью DATE в формате ‘год-месяц-день’.
На DATE_FORMAT
При выборке из таблицы workers выведите дату в формате ‘31.12.2025’.
При выборке из таблицы workers выведите дату в формате ‘2025% 31.12’.
На INTERVAL, DATE_ADD, DATE_SUB
При выборке из таблицы workers прибавьте к дате 1 день.
При выборке из таблицы workers отнимите от даты 1 день.
При выборке из таблицы workers прибавьте к дате 1 день, 2 часа.
При выборке из таблицы workers прибавьте к дате 1 год, 2 месяца.
При выборке из таблицы workers прибавьте к дате 1 день, 2 часа, 3 минуты.
При выборке из таблицы workers прибавьте к дате 1 день, 2 часа, 3 минуты, 5 секунд.
При выборке из таблицы workers прибавьте к дате 2 часа, 3 минуты, 5 секунд.
При выборке из таблицы workers прибавьте к дате 1 день и отнимите 2 часа.
При выборке из таблицы workers прибавьте к дате 1 день и отнимите 2 часа, 3 минуты.
На математические операции
При выборке из таблицы workers создайте новое поле res, в котором будет число 3.
При выборке из таблицы workers создайте новое поле res, в котором будет строка ‘eee’.
При выборке из таблицы workers создайте новое поле 3, в котором будет число 3.
При выборке из таблицы workers создайте новое поле res, в котором будет лежать сумма зарплаты и возраста.
При выборке из таблицы workers создайте новое поле res, в котором будет лежать разность зарплаты и возраста.
При выборке из таблицы workers создайте новое поле res, в котором будет лежать произведение зарплаты и возраста.
При выборке из таблицы workers создайте новое поле res, в котором будет лежать среднее арифметическое зарплаты и возраста.
Выберите из таблицы workers все записи, в которых сумма дня и месяца меньше 10-ти.
На LEFT, RIGHT, SUBSTRING
При выборке из таблицы workers получите первые 5 символов поля description.
При выборке из таблицы workers получите последние 5 символов поля description.
При выборке из таблицы workers получите из поля description символы со второго по десятый.
На UNION
Даны две таблицы: таблица category и таблица sub_category с полями id и name. Достаньте одним запросом названия категорий и подкатегорий.
На CONCAT, CONCAT_WS
При выборке из таблицы workers создайте новое поле res, в котором будут лежать одновременно зарплата и возраст (слитно).
При выборке из таблицы workers создайте новое поле res, в котором будут лежать одновременно зарплата и возраст (слитно), а после возраста будут идти три знака ‘!’.
При выборке из таблицы workers создайте новое поле res, в котором будут лежать одновременно зарплата и возраст через дефис.
При выборке из таблицы workers получите первые 5 символов логина и добавьте троеточие.
На GROUP BY
Найдите самые маленькие зарплаты по группам возрастов (для каждого возраста свою минимальную зарплату).
Найдите самый большой возраст по группам зарплат (для каждой зарплаты свой максимальный возраст).
На GROUP_CONCAT
Выберите из таблицы workers уникальные возраста так, чтобы для каждого возраста было поле res, в котором будут лежать через дефис id записей с таким возрастом.
На подзапросы
Выберите из таблицы workers все записи, зарплата в которых больше средней зарплаты.
Выберите из таблицы workers все записи, возраст в которых меньше среднего возраста, деленного на 2 и умноженного на 3.
Выберите из таблицы workers записи с минимальной зарплатой.
Выберите из таблицы workers записи с максимальной зарплатой.
При выборке из таблицы workers создайте новое поле max, в котором будет лежать максимальное значение зарплаты для возраста 25 лет.
При выборке из таблицы workers создайте новое поле avg, в котором будет лежать деленная на 2 разница между максимальным значением возраста и минимальным значением возраста в во всей таблице.
При выборке из таблицы workers создайте новое поле avg, в котором будет лежать деленная на 2 разница между максимальным значением зарплаты и минимальным значением зарплаты для возраста 25 лет.
На JOIN
Даны две таблицы: таблица category с полями id и name и таблица page с полями id, name и category_id. Достаньте одним запросом все страницы вместе с их категориями.
Даны 3 таблицы: таблица category с полями id и name, таблица sub_category с полями id и name и таблица page с полями id, name и sub_category_id. Достаньте одним запросом все страницы вместе с их подкатегориями и категориями.
Основы работы с селекторами CSS
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
В данном уроке мы с вами научимся более продвинутой работе с селекторами CSS.
Однако, чаще всего нам нужны более точные способы обращения: к примеру, мы хотим выбрать не все абзацы, а только некоторые из них.
Способы сделать это мы и будем изучать в данном уроке.
Однако, для начала разберем два тега, которые пригодятся нам в дальнейшем.
Тег div служит контейнером для других тегов. Сам по себе он ничего не делает, однако в него можно положить много разных тегов, например, абзацев и заголовков, а затем для всех них одновременно применить различные CSS свойства. Для примера покрасим содержимое тега div в красный цвет (используя атрибут style):
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
В настоящее время тег div является одним из основных строительных элементов на сайте. Вы еще столкнетесь с ним в дальнейшем много раз.
Давайте покрасим некоторый текст в красный цвет:
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet.
Мы с вами изучили два необходимых нам тега и теперь приступаем к изучению более сложной работы с селекторами.
Иногда может возникнуть следующая ситуация: вам нужно сделать одно и то же с разными тегами, например, покрасить все заголовки h2, h3 и абзацы в красный цвет. В этом случае вам придется написать что-то вроде такого:
Однако, существует способ сделать это немного короче: селекторы тегов можно объединять через запятую и CSS код применится к ним всем одновременно. Приведенный выше код можно переписать покороче таким образом:
Так код будет выглядеть в браузере:
Заголовок h2
Заголовок h3
Абзац с текстом.
Группировать через запятую можно любое количество селекторов тегов, пробел после запятой не имеет значения, можно без него, но с ним код более красивый.
Представим теперь ситуацию, когда мы хотим обратиться только к тем тегам i, которые находятся внутри абзацев, и не хотим трогать те теги i, которые находятся внутри заголовков h2.
Это делается с помощью так называемого контекстного селектора, который позволяет обращаться к тегам по их вложенности в другие теги.
Чтобы показать вложенность, между селекторами следует поставить пробел (этот пробел и есть знак контекстного селектора).
В следующем примере мы обратимся ко всем абзацам внутри div и покрасим их в красный цвет. Абзацы вне дива и другие элементы внутри дива (в нашем случае h2) красными не станут:
Так код будет выглядеть в браузере:
Заголовок h2 внутри тега div.
Абзац внутри тега div.
Абзац внутри тега div.
Абзац внутри тега div.
Абзац вне тега div.
Так код будет выглядеть в браузере:
Абзац с атрибутом id в значении «test».
Обычный абзац с текстом.
Обычный абзац с текстом.
А теперь атрибут id дадим конкретному диву и покрасим содержимое этого дива в красный цвет, обратившись к нему по его id:
Так код будет выглядеть в браузере:
Заголовок h2 внутри #test.
Заголовок h2 внутри #test.
Заголовок h2 внутри #test.
Абзац внутри #test.
Абзац внутри #test.
Абзац внутри #test.
А теперь совместим контекстный селектор (который пробел, показывающий вложенность) и id и сделаем так, чтобы только абзацы (но не заголовки h2 в данном случае) из #test стали красного цвета:
Так код будет выглядеть в браузере:
Заголовок h2 внутри #test.
Заголовок h2 внутри #test.
Заголовок h2 внутри #test.
Абзац внутри #test.
Абзац внутри #test.
Абзац внутри #test.
В примере ниже и абзацы, и заголовки имеют один и тот же класс test, который красит эти элементы в красный цвет:
Так код будет выглядеть в браузере:
Заголовок h2 с классом test.
Заголовок h2 с классом test.
Заголовок h2 с классом test.
Абзац с классом test.
Абзац с классом test.
Абзац с классом test.
Абзац без класса.
Бывают такие ситуации, когда разные теги имеют один и тот же класс. К примеру, у абзацев и заголовков h2 одновременно задан класс test. Вам может потребоваться выбрать только абзацы с классом test, не затрагивая заголовков h2 с этим же классом.
Так код будет выглядеть в браузере:
Заголовок h2 с классом test.
Заголовок h2 с классом test.
Заголовок h2 с классом test.
Абзац с классом test.
Абзац с классом test.
Абзац с классом test.
Абзац без класса.
Давайте теперь выберем только h2 с классом test:
Так код будет выглядеть в браузере:
Заголовок h2 с классом test.
Заголовок h2 с классом test.
Заголовок h2 с классом test.
Абзац с классом test.
Абзац с классом test.
Абзац с классом test.
Абзац без класса.
Так код будет выглядеть в браузере:
Заголовок h2 с классом test.
Заголовок h2 с классом test.
Заголовок h2 с классом test.
Абзац с классом test.
Абзац с классом test.
Абзац с классом test.
Абзац без класса.
Посмотрите следующее видео из заочного курса: скачайте его по данной ссылке (вам нужно именно про селекторы, пару видосов там лишние. Хотя они тоже лишними не будут) ).
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на работу с элементами страницы в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Примеры решения задач
Задача. Повторите поведение кнопки по нажатию на нее (она меняет текст в span):
Задача. Повторите поведение кнопки по нажатию на нее (она меняет span на тег b, не изменяя при этом текст внутри тега):
Решение: просто так заменить теги, не трогая их внутреннего содержимого, невозможно. В данном случае необходимо найти внутреннее содержимое тега span, а затем заменить этот span на тег b, внутри которого будет стоять то, что было внутри span. Чтобы тег span исчез совсем, нужно поменять его outerHTML, а не innerHTML (в этом случае тег b оказался бы внутри span, а это нам не нужно по условию задачи):
Задача. Дан HTML код (см. под задачей). Поменяйте содержимое абзацев на их порядковый номер в коде.
Решение: создадим кнопку, по нажатию на которую будет вызываться функция func, которая выполнит указанные в условии задачи действия:
Получим теперь элементы по имени тега и переберем их циклом, используя метод getElementsByTagName:
HTML код станет выглядеть так:
Задача. Дан HTML код (см. под задачей). Поменяйте содержимое элементов с классом zzz на их порядковый номер в коде.
Решение: создадим кнопку, по нажатию на которую будет вызываться функция func, которая выполнит указанные в условии задачи действия:
Получим теперь элементы по имени класса и переберем их циклом, используя метод getElementsByClassName:
HTML код станет выглядеть так:
Задача. Дан HTML код (см. под задачей). Поменяйте содержимое абзацев с классом zzz на их порядковый номер в коде.
Решение: создадим кнопку, по нажатию на которую будет вызываться функция func, которая выполнит указанные в условии задачи действия:
Получим теперь элементы с помощью селектора p.zzz (абзацы с классом zzz) и переберем их циклом, используя метод querySelectorAll:
HTML код станет выглядеть так:
Задачи для решения
Свойства innerHTML, outerHTML
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Метод getElementsByTagName
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Метод getElementsByClassName
Дан HTML код (см. под задачей). Поменяйте содержимое элементов с классом www на их порядковый номер в коде.
Метод querySelectorAll
Дан HTML код (см. под задачей). Поменяйте содержимое абзацев с классом www на их порядковый номер в коде.
Методы setAttribute, getAttribute, removeAttribute, hasAttribute
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Задачи
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (по ссылкам не переходите, нажмите на кнопку):
Вы можете открыть этот пример в отдельной вкладке браузера.
Закрепление пройденного
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (при нажатии на кнопку текст в каждом абзаце поменяется на порядковый номер абзаца):
Вы можете открыть этот пример в отдельной вкладке браузера.
Вы можете открыть этот пример в отдельной вкладке браузера.
Метод html
Работа с DOM
Работа с CSS
Добавление содержимого
Родители и потомки
Соседи
Разное
Работа с набором
Обход набора
Эффекты jQuery
Управление анимацией
Метод .html() позволяет изменить текст элемента и получить его текст вместе с тегами.
См. также метод text, который позволяет получить текст элемента без тегов.
См. также урок основы работы с jQuery для более полного понимания.
См. также JavaScript свойство innerHTML, с помощью которого можно сменить текст элемента на чистом JavaScript.
Синтаксис
Дополнительно
Начиная с jQuery1.4 метод html может применить заданную функцию к каждому элементу в наборе.
Имена переменных в функции могут быть любыми.
Текст каждого элемента поменяется на тот, который вернет функция конкретно для этого элемента.
Примеры
Пример
Давайте выведем на экран содержимое нашего абзаца:
Результат выполнения кода:
Пример
Давайте поменяем содержимое нашего абзаца:
HTML код станет выглядеть так:
Пример
Давайте поменяем содержимое нашего абзаца на текст с тегами:
HTML код станет выглядеть так:
Пример
Давайте каждому абзацу добавим в конце его порядковый номер в наборе:
Приемы работы с массивами на PHP
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Сейчас мы с вами разберем некоторые приемы при работе с обычными и многомерными массивами. Давайте приступим.
Заполнение массивов
Давайте заполним массив десятью иксами ‘x’. Для этого воспользуемся методом push:
Давайте теперь заполним массив числами от 1 до 10:
Можно не использовать push, а указать ключи напрямую:
Переворот массива
Переворот объекта
Давайте поменяем ключи и значения в объекте, например из
Подсчет количества элементов
Пусть дан массив [‘a’, ‘b’, ‘c’, ‘a’, ‘a’, ‘b’]. Давайте подсчитаем количество одинаковых элементов в этом массиве и сделаем результат в виде объекта
Только вместо ‘a’ следует подставлять текущий элемент массива, вот так: count[arr[i]]++. Давайте напишем окончательный код:
Пойдем дальше: то, что объекта count имеет изначальное значение
Перебор многомерных массивов
Пусть дан следующий двухмерный массив:
Давайте выведем все его элементы на экран. Для этого нам необходимо запустить два вложенных друг в друга цикла:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на основы работы с DOM в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Примеры решения задач
Задача. Повторите поведение кнопки по нажатию на нее:
Задача. Повторите поведение кнопки по нажатию на нее (она меняет текст в инпуте):
Задача. Повторите поведение кнопки по нажатию на нее (она выводит алертом содержимое инпута):
Задача. Повторите поведение кнопки по нажатию на нее (она выводит алертом содержимое инпута, возведенное в квадрат):
Задача. Повторите поведение кнопки по нажатию на нее (она осуществляет обмен содержимым между двумя инпутами, можете понажимать на нее несколько раз или вручную сменить содержимое инпутов):
Задача. Повторите поведение кнопки по нажатию на нее (поменяется ее текст):
Решение: в данной задаче воспользуемся кнопкой, созданной через input с атрибутом type в значении button, чтобы легко можно было сменить ее текст, обратившись к атрибуту value (в кнопке через тег button текст меняется через innerHTML, это тема следующего урока).
Решим задачу через this:
Задача. Повторите поведение кнопки по нажатию на нее (она меняет цвет текста в инпуте):
Можно не вводить промежуточную переменную input, а сразу поменять цвет:
Задача. Повторите поведение кнопок по нажатию на них (одна из них блокирует инпут с помощью атрибута disabled, а другая разблокирует):
Задачи для решения
События через атрибуты
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Метод getElementById и работа с атрибутами
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Работа с this
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Работа с CSS
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Задачи
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Закрепление пройденного
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Работа с конструкциями if-else, switch-case в PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Конструкция if-else
Для того, чтобы напрограммировать что-нибудь полезное, одних переменных далеко не достаточно. Нам нужен механизм, который позволит выполнять определенный код в зависимости от каких-либо условий.
То есть нам нужно иметь возможность спросить у PHP ‘Если’.
Например так: если эта переменная меньше нуля, то вывести ‘отрицательно’, иначе (то есть если она больше нуля) вывести ‘положительно’.
В PHP для таких вопросов предназначена конструкция if, которая позволяет выполнять определенный код при выполнении какого-либо условия:
Обратите внимание на то, что блок else не обязателен.
Логическое выражение представляет собой тот самый вопрос, который мы хотим задать PHP. Например, чтобы спросить ‘переменная $a больше нуля’ мы напишем так: $a > 0.
Сокращенный синтаксис
В случае, если в фигурный скобках if или else будет только одно выражение, можно эти фигурные скобки не писать:
Равенство по значению и типу
Для того, чтобы сравнить на равенство следует использовать оператор двойное равно ==, а не одиночное =, как можно было подумать.
Почему так? Потому что одиночное равно зарезервировано за присваиванием. Смотрите пример:
А следующий пример работать будет не так, как мы думаем:
Кроме оператора == существует еще и оператор ===. Их различие в том, что === сравнивает не только по значению, но и по типу, а == сравнивает только по значению.
Чтобы полностью разобраться в этом, внимательно изучите примеры:
Не равно
Все операции сравнения
Возможные операции сравнения, которые можно использовать внутри if:
Функция empty
Зачастую в веб-программировании возникает следующая проблема: необходимо проверить переменную на пустоту.
Переменная будет пустая, если она равна нулю, » (пустой строке), false или null (то есть не определена ранее).
Проверка на пустоту выполняется с помощью функции empty():
Функция isset
Аналогом empty является функция isset. Она проверяет существует ли переменная (то есть то, что она не равна null). Смотрите примеры:
Аналогично проверятся на НЕ существование (через !isset):
Несколько условий сразу: or и and
Иногда может быть нужно составить какое-то сложное условие, например, пользователь вводит месяц своего рождения и вам нужно проверить, что введенное число больше или равно 1 и меньше либо равно 12 (так как в году 12 месяцев).
Для этого существуют операторы and (логическое И) и or (логическое ИЛИ).
Работа с логическими переменными
Многие функции PHP в результате своей работы возвращают либо true (истина), либо false (ложь). Эти значения довольно удобны при своей работе, но новичкам бывает довольно сложно понять их.
Представим себе, что переменная $a равна true. В таком случае конструкцию if можно записать так:
Так как такие сравнения довольно распространены в PHP, то существует специальный прием, облегчающий работу (но не понимание, к сожалению).
Прием такой: конструкцию $a == true можно заменить на более простую: вместо if ($a == true) написать if ($a) и она будет работать аналогично.
Следует пользоваться второй конструкцией, так как она проще.
Также обратите внимание на следующие примеры:
Работа вместе с HTML
Однако, очень часто это может оказаться неудобным, особенно если размеры HTML кода очень большие. Поэтому можно воспользоваться следующим приемом с разрывом PHP:
Вложенные if
Одной конструкцией if здесь не обойтись, нужно использовать две таким образом, чтобы одна была внутри другой:
Конструкция elseif
Недостатком конструкции предыдущего примера является большое количество фигурных скобок. Поэтому была изобретена специальная конструкция elseif (пишется слитно!), которая представляет собой одновременно и else, и начало вложенного if:
Можно использовать несколько elseif, но злоупотреблять этим не стоит (лучше будет воспользоваться конструкцией switch-case, о которой ниже).
Несколько if
Решение: можно было бы воспользоваться вложенными ифами или elseif. Выглядело бы это примерно так:
Для таких случаев существует конструкция switch-case.
Конструкция switch-case
Конструкция switch-case представляет собой альтернативу if-else, ее рекомендуется использовать в случае множественного выбора (например, 10 различных языков, как в нашей задаче).
Изучите ее синтаксис:
Решим нашу задачу с тремя языками с помощью данной конструкции:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Основы работы с языком LESS
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Видео про работу с LESS
Итак, давайте посмотрим, как работать с LESS и что для этого нужно. Об этом я рассказываю в следующем видео:
Полезные ссылки
Примеры использования LESS
Ниже я привожу примеры использования LESS, о которых рассказываю в видео, чтобы вам не приходилось каждый раз пересматривать видео в поисках нужной вам вещи (пока без описаний, попозже может быть добавлю). Итак, вот они:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Результат выполнения кода:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на основы работы с массивами и объектами
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Примеры решения задач
Задача
Задача. Дан массив с элементами ‘Привет, ‘, ‘мир’ и ‘!’. Необходимо вывести на экран фразу ‘Привет, мир!’.
Разберем это решение: слово ‘Привет, ‘ хранится под номером 0, это значит, что для доступа к нему мы должны написать arr[0]. Для доступа к слову ‘мир’ мы должны написать arr[1], а arr[2] содержит в себе ‘!’. Далее с помощью оператора ‘+’ мы сложим три наши строки (‘Привет, ‘, ‘мир’ и ‘!’) в одну строку таким образом arr[0] + arr[1] + arr[2], и выведем на экран с помощью alert.
Задача
Задача. Решим немного другую задачу: дан массив с элементами ‘Привет, ‘, ‘мир’ и ‘!’. Необходимо записать в переменную text фразу ‘Привет, мир!’, а затем вывести на экран содержимое этой переменной.
Задача
Задача. Дан массив [‘Привет, ‘, ‘мир’, ‘!’]. Необходимо записать в нулевой элемент этого массива слово ‘Пока, ‘ (то есть вместо слова ‘Привет, ‘ будет ‘Пока, ‘).
Задача. Создайте ассоциативный массив (объект) заработных плат obj. Выведите на экран зарплату Пети и Коли.
Решение: Чтобы вывести зарплату Коли следует вывести значение элемента объекта с ключом ‘Коля’. Сделаем это:
Задача. Создайте массив arr с элементами 1, 2, 3, 4, 5 двумя различными способами.
Задача. Дан многомерный массив arr:
Выведите с его помощью слово ‘голубой’.
Решение: так как массив многомерный (в нашем случае двухмерный), то нам придется написать несколько квадратных скобок подряд. Поясню это по шагам. Давайте сделаем так:
Выведем теперь слово ‘красный’:
Задачи для решения
Работа с массивами
Создайте массив arr = [‘a’, ‘b’, ‘c’]. Выведите его на экран с помощью функции alert.
С помощью массива arr из предыдущего номера выведите на экран содержимое первого, второго и третьего элементов.
Создайте массив arr = [‘a’, ‘b’, ‘c’, ‘d’] и с его помощью выведите на экран строку ‘a+b, c+d’.
Создайте массив arr с элементами 2, 5, 3, 9. Умножьте первый элемент массива на второй, а третий элемент на четвертый. Результаты сложите, присвойте переменной result. Выведите на экран значение этой переменной.
Объекты (ассоциативные массивы)
Создайте объект obj. Выведите на экран элемент с ключом ‘c’ двумя способами: через квадратные скобки и как свойство объекта:
Создайте массив заработных плат obj. Выведите на экран зарплату Пети и Коли.
Пусть теперь номер дня недели хранится в переменной day, например там лежит число 3. Выведите день недели, соответствующий значению переменной day.
Многомерные массивы
Дан массив [ [1, 2, 3], [4, 5, 6], [7,8,9] ]. Выведите на экран цифру 4 из этого массива.
Дан объект . Выведите с его помощью слово ‘jQuery’.
Метод before
Работа с DOM
Работа с CSS
Добавление содержимого
Родители и потомки
Соседи
Разное
Работа с набором
Обход набора
Эффекты jQuery
Управление анимацией
Метод .before() добавляет текст перед заданным элементом. Также существует метод .insertBefore(), который работает аналогичным образом (отличие в способе применения, см. примеры).
См. также урок основы работы с jQuery для более полного понимания.
Синтаксис
Вставка текста перед элементом:
В методе insertBefore просто меняется местами текст и селектор:
Вот так перед выбранными элементами будет добавлен текст, который будет возвращен пользовательской функцией:
Текст также может быть не только обычным текстом, но и DOM элементом или объектом jQuery. В этом случае эти элементы переместятся со своей позиции в HTML коде.
Примеры
Пример
Давайте вставим текст перед заданным абзацем:
HTML код станет выглядеть так:
Пример
Давайте вставим текст с тегами перед заданным абзацем:
HTML код станет выглядеть так:
Пример
Решим предыдущую задачу с помощью метода .insertBefore():
HTML код станет выглядеть так:
Пример
Давайте поставим один абзац над другим (то есть вырежем абзац со старого места и поставим в новое):
Основы работы с jQuery
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Мы с вами научились получать группу элементов через jQuery и даже видели некоторые примеры работы с методами. Давайте теперь разберемся с ними более подробно.
Изменение текста элемента через jQuery
Решим следующую задачу: получим все элементы с классом .www и одновременно поменяем всем им текст на ‘. ‘.
Можно не выстраивать цепочку $(‘.www’).html(‘. ‘), а сначала записать набор элементов $(‘.www’) в переменную (я назвал ее elems), и затем уже к этой переменной применить метод .html(‘. ‘):
Есть соглашение, которым желательно пользоваться для удобства: названия переменных, которые содержат в себе обернутый набор jQuery, принято начинать с доллара. То есть в нашем случае нужно не elems, а $elems.
Давайте используем это в нашем примере:
Вывод текста элемента через jQuery
Метод .html() можно использовать не только для изменения текста элементов, но и для вывода его на экран. Давайте получим элемент и выведем алертом его текст:
В примере ниже мы получаем все абзацы с классом www и выводим алертом содержимое с помощью .html(), выведется только текст первого абзаца из полученных:
Работа с CSS через jQuery
Давайте получим все элементы с классом .www и поменяем их цвет на красный:
Как вы видите, jQuery дает различные варианты использования методов в зависимости от ваших предпочтений. Используйте то, что вам удобнее.
Цепочки команд jQuery
Напоминаю, что команды jQuery можно писать друг за другом в виде цепочки.
К примеру, давайте поставим всем элементам с классом www текст ‘. ‘ и красный цвет:
Селекторы jQuery
В дополнение к ним jQuery поддерживает нестандартные селекторы (псевдоклассы), которые позволяют расширить селекторы CSS.
С помощью :first-child мы найдем все li, которые являются первыми потомками своих родителей, а с помощью :first мы найдем первый li среди выбранных (так как выбирали мы все li, то по сути мы найдем первый li на странице).
То есть :first и другие подобные селекторы jQuery работают так: находят все элементы по заданному селектору, а затем берут первый элемент среди найденных.
Аналогичным образом работает :last, только он находит не первый элемент, а последний.
С помощью :even и :odd можно выбирать четные и нечетные элементы в наборе.
Еще полезные селекторы jQuery
Кроме селекторов по набору элементов, jQuery предоставляет нам некоторые другие полезные вещи, которых нет в CSS.
Псевдокласс :header
Например, псевдокласс :header выбирает одновременно все заголовки от h1 до h6.
Псевдокласс :has
Псевдокласс :has выбирает элементы по их содержимому. К примеру, можно выбрать так: все абзацы, внутри которых есть теги b:
Обратите внимание на то, что в примере выберется как первый абзац, так и второй, не смотря на то, что во втором абзаце тег b не лежит непосредственно внутри p, а лежит сначала в i.
Если же вам нужна непосредственная вложенность, то следует сделать так:
В этом случае будет выбран только первый абзац.
Псевдокласс :contains
Псевдокласс :contains выбирает элементы по наличию определенного текста в них.
В следующем примере мы выберем абзац, внутри которого есть слово «текст»:
С помощью :contains() элемент будет выбран, если строка присутствует непосредственно внутри него или если она находится внутри одного из его потомков.
Псевдоклассы :empty и :parent
Разница :parent и parent()
Кроме псевдокласса :parent существует еще и метод .parent(), который позволяет выбрать родителя элемента.
Давайте, например, найдем родителя тега b и поставим ему красный цвет:
Другие селекторы jQuery
Работа с each
Когда у нас есть группа элементов, полученных с помощью jQuery, мы можем вносить в них изменения только для всех элементов одновременно.
В этом случае нам поможет специальный метод .each(), который позволяет применить какую-либо функцию для всех элементов набора jQuery. При этом внутри этой функции мы сможем разделить элементы и поступить по-разному с каждым из них.
По сути .each() является циклом, в помощью которого можно перебрать все найденные элементы. Ссылка на тот элемент, по которому сейчас проходит цикл будет лежать в this.
В следующем примере мы получаем все элементы с классом .www и выводим на экран их содержимое. Как это делается: с помощью $(‘.www’) мы получаем нужные нам элементы, затем с помощью .each(test) мы к каждому полученному элементу применяем функцию test. Она сначала применится к первому абзацу, потом ко второму, к третьему и так далее.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Группировка ячеек HTML таблиц
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Сейчас мы с вами займемся объединением ячеек. Будем объединять их как по горизонтали, так и по вертикали.
Смотрите пример того, что у нас будет получаться:
Ячейка 1 | Ячейка 2 | |
Ячейка 4 | Ячейка 6 | |
Ячейка 7 | Ячейка 9 |
Таблица, с которой мы будем работать
Сначала я приведу таблицу без объединений, с которой мы будем работать дальше:
Так код будет выглядеть в браузере:
Ячейка 1 | Ячейка 2 | Ячейка 3 |
Ячейка 4 | Ячейка 5 | Ячейка 6 |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Ну, а теперь давайте займемся объединением ячеек нашей таблицы.
Расширим Ячейку1 на два столбца
Расширим Ячейку1 на два столбца, задав ей атрибут colspan в значении 2. При этом она вытеснит ячейки справа и таблица развалится:
Таблица развалилась (Ячейка3 вылезла справа):
Ячейка 1 | Ячейка 2 | Ячейка 3 | |
Ячейка 4 | Ячейка 5 | Ячейка 6 | |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Расширим Ячейку1 на два столбца без разваливания таблицы
Таблица больше не разваливается:
Ячейка 1 | Ячейка 2 | |
Ячейка 4 | Ячейка 5 | Ячейка 6 |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Расширим Ячейку1 на 3 столбца без разваливания таблицы
Расширим Ячейку1 на 3 столбца, задав ей атрибут colspan в значении 3. При этом удалим еще одну ячейку справа, чтобы таблица не развалилась:
Так код будет выглядеть в браузере:
Ячейка 1 | ||
Ячейка 4 | Ячейка 5 | Ячейка 6 |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Кроме атрибута colspan существует также аналогичный атрибут rowspan, который расширяет ячейки по вертикали.
Расширим Ячейку1 на два ряда
Расширим Ячейку1 на два ряда, задав ей атрибут rowspan в значении 2. При этом она вытеснит ячейки из ряда под ней и таблица развалится:
Таблица развалилась (Ячейка6 вылезла справа):
Ячейка 1 | Ячейка 2 | Ячейка 3 |
Ячейка 4 | Ячейка 5 | Ячейка 6 |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Расширим Ячейку1 на два ряда без разваливания таблицы
Чтобы поправить проблему с разваливанием таблицы из предыдущего примера, удалим одну из ячеек из второго ряда (и это не обязательно Ячейка4, которая находится непосредственно под нашей Ячейкой1, можно удалять любую, я удалил ячейку с номером 5):
Так код будет выглядеть в браузере:
Ячейка 1 | Ячейка 2 | Ячейка 3 |
Ячейка 4 | Ячейка 6 | |
Ячейка 7 | Ячейка 8 | Ячейка 9 |
Расширим Ячейку1 на 3 ряда без разваливания таблицы
Так код будет выглядеть в браузере:
Ячейка 1 | Ячейка 2 | Ячейка 3 |
Ячейка 4 | Ячейка 6 | |
Ячейка 7 | Ячейка 9 |
Расширим еще и Ячейку2 на 2 столбца
Расширим еще и Ячейку2 на 2 столбца в дополнение к первой ячейке. Для этого Ячейке2 добавим colspan в значении 2. При этом удалим Ячейку3, чтобы таблица не развалилась:
Так код будет выглядеть в браузере:
Ячейка 1 | Ячейка 2 | |
Ячейка 4 | Ячейка 6 | |
Ячейка 7 | Ячейка 9 |
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Работа с регулярками на JavaScript. Глава 1
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Метод replace
Первым параметром этого метода можно передавать не просто строку, а регулярное выражение. Посмотрите разницу:
Обратите внимание на слеши /, в которых стоит буква ‘a’. Эти слеши называются ограничителями регулярных выражений.
В регулярке можно указывать несколько модификаторов, их порядок значения не имеет.
Буквы, цифры, любой символ
В регулярных выражениях есть два типа символов: те, которые обозначают сами себя и символы-команды (специальные символы).
Буквы и цифры обозначают сами себя, а вот точка является специальным символом и обозначает ‘любой символ’. Смотрите примеры:
Далее посмотрите примеры с использованием спецсимвола ‘точка’:
Итак, запомните: буквы и цифры обозначают сами себя, а точка заменяет любой символ.
Операторы повторения символов (*,+,?)
Данные операторы действуют на тот символ, который стоит перед ними.
В данном случае шаблон поиска выглядит так: буква ‘x’, буква ‘a’ один или более раз, буква ‘x’.
В данном случае шаблон поиска выглядит так: буква ‘x’, буква ‘a’ ноль или более раз, буква ‘x’. По-другому можно сказать так: буквы ‘a’ или нет, или повторяется один или более раз.
Кроме очевидного варианта xax xaax xaaax, под шаблон также попадает подстрока ‘xx’, так как там нет буквы ‘a’ вообще (то есть 0 раз).
А ‘xbx’ не попал, так как там нет буквы ‘a’, но есть буква ‘b’ (ее мы не разрешили).
В данном случае шаблон поиска выглядит так: буква ‘x’, далее буква ‘a’ может быть или не быть, потом буква ‘x’.
Группирующие скобки
В предыдущих примерах операторы повторения действовали только на один символ, который стоял перед ними. Что делать, если мы хотим подействовать им на несколько символов?
Для этого существуют группирующие скобки ‘(‘ и ‘)’:
В данном случае шаблон поиска выглядит так: буква ‘x’, далее строка ‘ab’ один или более раз, потом буква ‘x’.
Экранировка спецсимволов
Предположим, что мы хотим сделать так, чтобы спецсимвол обозначал сам себя. Например, для того, чтобы найти по такому шаблону: буква ‘a’, затем плюс ‘+’, затем буква ‘x’. Следующий код будет работать не так, как хотелось бы:
Автор регулярки хотел, чтобы шаблон поиска выглядел так: буква ‘a’, затем плюс ‘+’, затем буква ‘x’.
А на самом деле он выглядит так: буква ‘a’ один или более раз, потом буква ‘x’.
Вот теперь шаблон поиска выглядит так, как надо: буква ‘a’, затем плюс ‘+’, затем буква ‘x’.
В данном примере шаблон выглядит так: буква ‘a’, затем точка ‘.’, затем буква ‘x’. Сравните со следующим примером (забыт обратный слеш):
Все подстроки попали под шаблон, так как незаэкранированная точка обозначает любой символ.
Список специальных символов и обычных
Часто возникает сомнение, является ли данный символ специальным. Некоторые доходят до того, что экранируют все подозрительные символы подряд. Однако, это плохая практика (захламляет регулярку обратными слешами).
Ограничение жадности
В данном примере шаблон поиска выглядит так: буква ‘a’, затем любой символ один или более раз, затем буква ‘x’.
В данном примере шаблон поиска выглядит так: буква ‘a’, затем любой символ один или более раз (с ограничением жадности), затем буква ‘x’.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Продвинутая работа с объектом Event на JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Сейчас мы с вами разберем некоторые продвинутые вещи при работе с объектом Event, а именно: всплытие и перехват, а также делегирование событий.
Всплытие событий
Представьте себе, что у вас есть несколько вложенных друг в друга блоков:
Когда вы кликаете на самый внутренний блок, событие onclick возникает сначала в нем, а затем срабатывает в его родителе, в родителе его родителя и так далее, пока не дойдет то тега body и далее до тега html (затем до document и до window).
И это логично, ведь кликая на внутренний блок, вы одновременно кликаете на все внешние.
Давайте убедимся в этом на следующем примере: у нас есть 3 блока, к каждому из них привязано событие onclick:
event.target
Пусть у нас есть два элемента: div и абзац p, лежащий внутри этого дива. Пусть onlick мы привязали в диву:
Когда мы кликаем на этот див, мы можем попасть по абзацу, а можем попасть в место, где этого абзаца нет.
Давайте привяжем событие onclick самому верхнему элементу (диву) и будем кликать на разные элементы: на div, на p, на span. С помощью event.target получим самый нижний элемент, в котором случилось событие и выведем его название с помощью tagName.
Прекращение всплытия
Итак, вы уже знаете, что все события всплывают до самого верха (до тега html, а затем до document, а затем до window). Иногда есть нужда это всплытие остановить. Это может сделать любой элемент, через который всплывает событие. Для этого в коде элемента следует вызвать метод event.stopPropagation().
Погружение
Кроме всплытия событий есть еще и погружение (по научному стадия перехвата). Это значит, что событие сначала идет сверху вниз (стадия перехвата), доходит до нашего элемента (стадия цели) и только потом начинает всплывать (стадия всплытия).
Вступление к делегированию
Представим себе ситуацию: пусть у нас есть ul с несколькими li. К каждой li привязано следующее событие: по нажатию на li ей в конец добавляется ‘!’.
Давайте реализуем описанное:
Пусть теперь у нас также есть кнопочка, по нажатию на которую в конец ul добавляется новая li с текстом ‘пункт’. Нас ждет сюрприз: привязанное событие не будет работать для новых li! Убедимся в этом:
Делегирование событий
При этом работоспособность нашего скрипта должна сохраниться: по-прежнему при клике на li ей в конец будет добавляться ‘!’. Только событие в новом варианте будет навешано на ul:
Итак, вот решение нашей задачи через делегирование:
Результат выполнения кода:
При этом наше решение будет работать автоматически даже для новых li, ведь событие навешено не на li, а на ul:
Наш код рабочий, однако не без недостатков. Давайте разберем эти недостатки и напишем более универсальное решение.
Универсальное делегирование событий
Недостаток нашего кода проявится в том случае, когда внутри li будут какие-то вложенные теги. В нашем случае пусть это будут теги i:
Проблема исправляется следующим образом (описанный способ не единственный, но самый простой): с помощью метода closest найдем ближайшую li, котоорая является родителем для event.target вот так: event.target.closest(‘li’).
Если же клик был на самой li, то и в event.target, и в event.target.closest(‘li’) будет лежать наша li.
Результат выполнения кода:
Дополнительные материалы
Рекомендую посмотреть тренинг по делегированию событий.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Метод parent
Работа с DOM
Работа с CSS
Добавление содержимого
Родители и потомки
Соседи
Разное
Работа с набором
Обход набора
Эффекты jQuery
Управление анимацией
Метод .parent() получает непосредственного родителя элемента.
См. также метод parents, который позволяет получить всех родителей элемента.
См. также метод children, который позволяет получить потомков элемента.
См. также урок работа с набором элементов jQuery для более полного понимания.
Синтаксис
Получение непосредственного родителя для элементов:
Можно также выбрать непосредственного родителя, только если он удовлетворяет заданному селектору:
Примеры
Пример
Давайте найдем элемент #test затем найдем его родителя с помощью .parent() и поставим ему текст ‘!’ с помощью html:
HTML код станет выглядеть так:
Пример
Основы работы со ссылками и границами
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
В данном уроке мы с вами продолжим изучать различные CSS свойства.
Чаще всего это свойство используются для отмены подчеркивания ссылок (они по умолчанию подчеркнуты).
Давайте посмотрим, какие значения может принимать свойство text-decoration.
Значение underline
Значение underline добавляет подчеркивание тексту:
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet.
Значение overline
Значение overline добавляет линию над текстом:
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet.
Значение line-through
Значение line-through добавляет линию, перечеркивающую текст:
Так код будет выглядеть в браузере:
Lorem ipsum dolor sit amet.
Значение none
Значение none отменяет все эффекты, обычно используется для отмены подчеркивания ссылок.
В следующем примере ссылка по умолчанию будет подчеркнута, а вторая ссылка с id=»link» будет без подчеркивания, так как мы ей зададим text-decoration в значении none:
Так код будет выглядеть в браузере:
Я думаю, что вы, посещая различные сайты в интернете, обращали внимание на то, что ссылки обычно реагируют на наведение мышкой на них. Такого эффекта можно добиться, задавая поведение ссылок в различных состояниях.
Конструкция :hover называется псевдоклассом. Псевдоклассы позволяют отлавливать разные состояния элементов.
Кроме :hover если еще псевдоклассы :link, которые отлавливают не посещенную ссылку, и :visited, которые отлавливают посещенную ссылку.
Есть еще и псевдокласс :active, который отлавливает следующее состояние: на элемент нажали мышкой, но еще не отпустили.
Так код будет выглядеть в браузере:
Псевдоклассы наследуют друг от друга. К примеру, если я уберу подчеркивание для состояния :link, то оно уберется для всех состояний.
Из-за наследования для корректной работы данные псевдоклассы следует размещать именно в таком порядке, как в примере: :link, :visited, :hover, :active (ненужные можно не писать). Этот порядок подчиняется следующему мнемоническому правилу: LoVe HAte.
Часто состояния :link и :visited объединяют вместе через запятую:
В таком случае можно их вообще и не указывать:
Наверняка на сайте у вас будут ссылки разных видов и, чтобы отличить их друг от друга, вы будете давать им разные классы или ложить в блоки с определенным id.
Давайте научимся обращаться к таким ссылкам.
Пусть у нас есть ссылки с классом .test и без него. Выберем только ссылки с этим классом:
Пусть у нас есть ссылки внутри блока с id test. Выберем только ссылки только из этого блока:
Если вам не очень понятно, как обращаться со ссылками, то специально для вас я снял следующее видео:
Здесь скоро появится видео по работе с состояниями ссылок.
Первые два свойства работают очевидным образом: border-color принимает цвета в том же формате, что и свойство color, а толщина границы может задаваться в любых единицах измерения (кроме процентов), чаще всего в пикселях.
А вот свойство border-style может принимать одно из нескольких значений: solid (сплошная линия), dotted (граница в виде точек), dashed (граница в виде черточек), ridge (выпуклая граница), double (двойная граница), groove (вогнутая граница), inset (рамка), outset (рамка) или none (отменяет границу).
Сделаем, к примеру, границу толщиной 3 пикселя, в виде точек, красного цвета:
Так код будет выглядеть в браузере:
Давайте теперь посмотрим на примерах, как выглядят различные типы границы.
Значение solid
Так код будет выглядеть в браузере:
Значение dotted
Так код будет выглядеть в браузере:
Значение dashed
Так код будет выглядеть в браузере:
Значение ridge
Так код будет выглядеть в браузере:
Значение double
Так код будет выглядеть в браузере:
Значение groove
Так код будет выглядеть в браузере:
Значение inset
Так код будет выглядеть в браузере:
Значение outset
Так код будет выглядеть в браузере:
Так же, как и для шрифтов, для границ тоже существует свойство-сокращение border, которое мы можем использовать вместо того, чтобы писать 3 разных свойства для толщины, цвета и типа границы. В свойстве border мы можем просто перечислить эти значения, их порядок при этом не важен. Смотрите пример:
Так код будет выглядеть в браузере:
Чаще всего гораздо удобнее пользоваться свойством-сокращением, чем отдельными свойствами.
Существуют также свойства-сокращения для отдельных сторон: border-left (левая граница), border-right (правая граница), border-top (верхняя граница), border-bottom (нижняя граница).
Давайте сделаем блоку только левую границу с помощью свойства border-left:
Так код будет выглядеть в браузере:
А теперь одновременно сделаем и левую, и правую границы:
Так код будет выглядеть в браузере:
Сейчас мы с вами научимся скруглять уголки у границ. Это избавит наши сайты от некоторой угловатости и придаст им плавность линий.
Уголки границ (и фона, который мы разберем ниже) скругляются свойством border-radius, которое принимает значение в пикселях или процентах (или других единицах CSS).
Давайте скруглим уголки блоку, задав ему скругление в 10px:
Так код будет выглядеть в браузере:
Имейте ввиду, что border-radius не входит в свойство-сокращение border, это разные свойства, хоть и имеют похожие названия.
Сейчас мы с вами научимся делать разные скругления для разных углов. Как это сделать: свойство border-radius может не только одно значение, но и два, три или четыре. Каждое значение будет задавать скругление для своего угла. Давайте посмотрим более подробно.
Четыре значения
Смотрите, что у нас получится:
Так код будет выглядеть в браузере:
Два значения
Смотрите на примере:
Так код будет выглядеть в браузере:
Три значения
Смотрите на примере:
Так код будет выглядеть в браузере:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Манипулирование элементами страницы через jQuery
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
В данном уроке разбирается работа с атрибутами, со свойствами, с продвинутыми селекторами jQuery.
Работа с атрибутами
В следующем примере мы получаем инпут по его id и выводим на экран значение его атрибута value:
А теперь запишем новое значение ‘www’ в этот же атрибут:
HTML код станет выглядеть так:
Удаление атрибута
Если вы хотите удалить какой-нибудь атрибут совсем, для этого следует использовать метод .removeAttr(имя атрибута). Давайте посмотрим, как он работает, на следующем примере:
Свойства
Давайте установим для инпута атрибут disabled:
HTML код станет выглядеть так:
А теперь, наоборот, уберем disabled:
HTML код станет выглядеть так:
Можно не только изменять значения таких атрибутов-свойств, но и считывать их:
value форм
Для работы с атрибутом value инпутов также можно использовать метод .val(), который позволяет считывать и записывать новые значения.
Давайте запишем новое значение ‘www’ в атрибут value:
HTML код станет выглядеть так:
А теперь давайте выведем текущее значение на экран:
Скорее всего это сделано для однотипности работы с формами.
Работа с классами
Напоминаю, что в атрибуте class в HTML коде можно писать несколько классов через пробел.
Метод .addClass() позволяет добавить класс элементу (или элементам), не затерев при этом другие классы. Класс, который вы хотите добавить в элемент, принимается параметром этого метода.
HTML код станет выглядеть так:
В следующем примере из атрибута class=»www zzz» удаляется класс zzz:
HTML код станет выглядеть так:
Существует также полезный метод .toggleClass(), который будет добавлять указанный класс, если его нет, и убирать его если он есть. Он может понадобится, чтобы по клику на одну и ту же кнопку с элементом страницы происходили периодические изменения.
Попробуйте запустите следующий код и убедитесь в этом (класс zzz делает курсив, чтобы показать, что toggleClass не будет мешать другим классам работать):
После первого нажатия HTML код станет выглядеть так (добавится класс red):
Оборачивание элементов
Теги можно оборачивать в другие теги, к примеру, если у нас есть абзацы, то мы их можем дополнительно обернуть в теги
К примеру, обернем все абзацы с классом www тегом
HTML код станет выглядеть так:
HTML код станет выглядеть так:
Давайте обернем наши абзацы дивом с классом zzz:
HTML код станет выглядеть так:
Можно наоборот, не обернуть элемент, а развернуть его (то есть убрать родителя) с помощью метода .unwrap().
В следующем примере у нас есть абзацы, которые находятся внутри тегов
HTML код станет выглядеть так:
Можно также оборачивать теги не снаружи, а внутри. Это делается с помощью метода .wrapInner(). Параметры он принимает таким же образом, как и .wrap(), только обернет не найденные теги, а текст внутри этих тегов.
В следующем примере обернем текст внутри абзацев с классом www в тег :
HTML код станет выглядеть так:
Можно оборачивать не каждый элемент по отдельности, а все найденные элементы вместе с помощью метода .wrapAll()
Давайте найдем все абзацы с классом www и обернем их всех в один тег
HTML код станет выглядеть так:
Учтите, что если оборачиваемые элементы стоят не рядом, то метод .wrapAll() сначала переместит элементы в одно место, а потом обернет их. Смотрите следующий пример:
HTML код станет выглядеть так:
Вставка элементов
Метод .prepend() позволяет добавлять текст в начало элементов:
HTML код станет выглядеть так:
Метод .append() позволяет добавлять текст в конец элементов:
HTML код станет выглядеть так:
Метод .before() позволяет добавлять текст в перед элементами:
HTML код станет выглядеть так:
Метод .after() позволяет добавлять текст в после элементов:
HTML код станет выглядеть так:
Следующие записи эквиваленты:
Есть также и другие эквивалентные методы. Вот они:
Методы .prepend() и .prependTo():
Методы .before() и .insertBefore():
Методы .after() и .insertAfter():
Замена элементов
Можно заменять одни элементы на другие с помощью метода .replaceWith(). Давайте заменим все абзацы с классом www на
HTML код станет выглядеть так:
Удаление элементов
Метод .remove() удаляет элементы навсегда:
HTML код станет выглядеть так:
А вот метод .detach() удаляет выбранные элементы с возможностью их восстановления.
Напоминаю, что доллар в переменной $elem написан в знак того, что в ней хранится набор jQuery.
Удаление содержимого элементов
С помощью метода .empty() можно удалить содержимое элементов (сами элементы никуда не деваются). Давайте, например, удалим содержимое всех абзацев:
HTML код станет выглядеть так:
Размеры элементов
Тут нужно разместить информацию о методах width, innerWidth, outerWidth height, innerHeight, outerHeight. Появится попозже.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Метод prop
Работа с DOM
Работа с CSS
Добавление содержимого
Родители и потомки
Соседи
Разное
Работа с набором
Обход набора
Эффекты jQuery
Управление анимацией
Метод .prop() позволяет получить и изменить свойство элемента.
См. также метод attr, который позволяет работать с атрибутами элементов.
Синтаксис
Проверка наличия свойства:
Изменение значения свойства:
Изменение значений нескольких атрибутов:
Дополнительно
Начиная с jQuery1.1 метод attr может применить заданную функцию к каждому элементу в наборе.
Имена переменных в функции могут быть любыми.
Значение атрибута каждого элемента поменяется на то, который вернет функция конкретно для этого элемента.
Изменения в jQuery1.6
Первое
Начиная с версии jQuery1.6, при попытке получить значение атрибута, которым элемент не обладает, метод attr вернет undefined.
В более ранних версиях, вместо этого возвращалась пустая строка.
Второе
Посмотрите разницу на примере атрибута disabled:
Авторизация через базы данных
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Поэтому авторизацию пользователей следует реализовывать с помощью базы данных (см. учебник SQL, если вы не умете работать с базами данных).
Как обычно, начнем с самого простого и будем постепенно усложнять.
Несколько пользователей, база данных
Для начала создайте с помощью PhpMyAdmin таблицу users в какой-нибудь тестовой базе данных.
Таблица users должна выглядеть так:
id | login (Логин) | password (Пароль) |
---|---|---|
1 | user | 12345 |
2 | admin | 54321 |
Следующий код реализует простую авторизацию на БД. Что в нем происходит?
Пользователь вводит логин и пароль в поле авторизации, эти данные приходят в скрипт, который делает SQL запрос в базу данных и на основании результата судит о том, авторизовать пользователя или нет:
Добавляем сессию
Что должно происходить, если пользователь ввел успешную пару логин-пароль?
Мы должны стартовать сессию и отметить в ней информацию о том, что пользователь авторизовался.
В принципе, можно на этом ограничится и ничего больше не писать в сессию.
Однако, удобно было бы в дальнейшем иметь в сессии информацию об имени пользователя и его id.
В реальных условиях это может быть еще какая-либо информация из базы: email, дата регистрации, количество сообщений и другое. Все зависит от того, какая информация может вам понадобится.
Дополним наш код:
Полностью код авторизации примет такой вид:
Если мы теперь захотим вывести фразу ‘Привет, имя_пользователя’, то это будет сделать несложно:
Неправильная пара логин-пароль
Зачем это нужно?
Затем, что хакеру сложнее было подобрать пару логин-пароль с помощью перебора.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Команда UNION
Основные запросы
Условия выборки
Группировка
Сложение строк
Несколько таблиц
Длина строк
Изменение строк
Поиск по строкам
Работа с пробелами
Работа с регистром
Информация
Условия
Полезное
Разное
Математические функции
Списки
Извлечение части даты
Получение даты и времени
Преобразование даты
Сложение дат
Тригонометрия
Отдельные символы
Системы счисления
Команда UNION объединяет данные из нескольких таблиц в одну при выборке.
При объединении количество столбцов во всех таблицах должно совпадать, иначе будет ошибка
Имена столбцов будут такие же, как в основной таблице, в которую добавляются данные из других таблиц.
Внимание: если не используется ключевое слово ALL для UNION, все возвращенные строки будут уникальными, так как по умолчанию подразумевается DISTINCT, который удаляет неуникальные значения.
См. также команду JOIN, которая объединяет связанные таблицы.
Синтаксис
С удалением дублей:
Без удаления дублей:
Можно объединять не две таблицы, а три или более:
Примеры
Все примеры будут по таблицам countries и cities, если не сказано иное.
id айди | name название |
---|---|
1 | Беларусь |
2 | Россия |
3 | Украина |
id айди | name название | country_id айди страны |
---|---|---|
1 | Минск | 1 |
2 | Минск | 1 |
3 | Москва | 2 |
4 | Киев | 3 |
Пример
В данном примере объединяются записи из двух таблиц:
SQL запрос выберет следующие строки:
id айди | name название |
---|---|
1 | Беларусь |
2 | Россия |
3 | Украина |
1 | Минск |
2 | Минск |
3 | Москва |
4 | Киев |
Пример
В данном примере отсутствует ключевое слово ALL, однако дубли не будут удалены, так как дублями считается полное совпадение строк:
SQL запрос выберет следующие строки:
id айди | name название |
---|---|
1 | Беларусь |
2 | Россия |
3 | Украина |
1 | Минск |
2 | Минск |
3 | Москва |
4 | Киев |
Пример
А вот теперь дубли будут удалены (из двух Минсков останется один), так как будет иметь место полное совпадение строк (потому что поле осталось одно, но это не обязательно):
SQL запрос выберет следующие строки:
name название |
---|
Беларусь |
Россия |
Украина |
Минск |
Москва |
Киев |
Пример
SQL запрос выберет следующие строки:
name название |
---|
Беларусь |
Россия |
Украина |
Минск |
Минск |
Москва |
Киев |
Пример
В данном примере демонстрируется работа условий WHERE в комбинации с UNION:
SQL запрос выберет следующие строки:
id айди | name имя |
---|---|
2 | Россия |
3 | Украина |
1 | Минск |
2 | Минск |
Пример
Имена колонок берутся из первой таблицы (то есть имена колонок таблиц, подключенных через UNION нигде себя не проявят):
SQL запрос выберет следующие строки:
country_id айди | country_name имя | |
---|---|---|
1 | Беларусь | |
2 | Россия | |
3 | Украина | |
1 | Минск | 1 |
2 | Минск | 1 |
3 | Москва | 2 |
4 | Киев | 3 |
Пример
Такой запрос выдаст ошибку, так как в таблицах не совпадает количество колонок:
Если нам очень надо забрать из какой-либо таблицы столько полей, что в другой таблице столько и нет, можно создавать дополнительные поля вручную.
К примеру, мы хотим забрать 3 поля из второй таблицы, а в первой таблице полей только 2. Решим эту проблему создав поле с именем country_id и содержимым 0 для первой таблицы (вот так: 0 as country_id):
Проблемы кроссбраузерности HTML и CSS
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Под кроссбраузерностью обычно понимают способность сайта выглядеть во всех браузерах одинаково (или одинаково хорошо).
Для того, чтобы сайт выглядел максимально одинаково во всех браузерах (современных + поддержка некоторых устаревших) необходимо знать различные приемы и особенности браузеров. Их изучением мы сейчас и займемся.
В настоящее время популярными являются следующие браузеры: Internet Explorer (сокращенно IE, браузер от компании Microsoft, встроен в Windows), Opera (норвежский браузер), Mozilla (она же Firefox), Google Chrome (браузер от компании Google), Safari (браузер от Apple). Браузеры в мобильных устройствах: Android, IOS.
Виды движков: Gecko (Mozilla/Firefox). Webkit (Safari, Google Chrome, Opera 14+, Android, IOS). Presto (Opera до 14 версии). Trident (Internet Explorer).
Обратите внимание на то, что Opera, начиная с 14 версии, перешла на движок Webkit.
В настоящее время Webkit распался на два движка Blink от Google Chrome и Opera 14+ и движок от Safari. Эти два движка по-прежнему поддерживают префикс -webkit, однако, их разделение уже можно наблюдать на некоторых CSS свойствах, например, hyphens
Браузера Internet Explorer официально больше не существует, последняя его версия 11-тая. Однако, фактически, этот браузер сменил название (но не движок) и теперь называется Edge.
В настоящее время среди браузеров сложилась следующая ситуация: до того, как свойство CSS появится в спецификации, браузеры могут реализовывать пробную версию этого свойства со специальной приставкой, которая называется вендорным префиксом (от слова vendors – разработчики, префикс разработчиков).
Как это выглядит, давайте посмотрим на примере свойства box-sizing (смена блоковой модели).
Это свойство начало поддерживаться только с Firefox 29, однако уже с версии Firefox 2 оно было доступно с префиксом -moz:
В CSS многие свойства имеют аналогичную реализацию: с префиксом и без него.
Обратите также внимание на то, что Opera с версии 14 перешла на Webkit и теперь для нее будет использоваться префикс -webkit, а префикс -o останется только для старых версий (до 14-той).
Есть следующее правило: свойства с префиксами пишутся до свойства без префикса. Это сделано затем, чтобы основное свойство затирало свойства с префиксами, так как браузер может поддерживать свойство как с префиксом, так и без него. А свойство с префиксом может работать с какими-либо проблемами.
В настоящее время некоторые браузеры решили отказаться от префиксов в связи с их неудобностью. И сейчас вместо них используют так называемые флаги. Свойства теперь внедряются в браузер, но по умолчанию отключены, однако их можно включить в настройках браузера, поставив соответствующий флажок в настройках. В настоящее время браузеры Google Chrome и Opera для новых свойств поддерживают именно эту модель.
Рекомендую специальный сервис caniuse.com, на котором можно посмотреть какие свойства уже можно использовать и нужно ли для них писать префиксы или нет.
После создания сайта его необходимо потестировать во всех популярных браузерах. Однако сделать это не так просто как кажется — мало того, что браузеры отличаются от версии к версии, так еще существуют различия между одной версией браузера в Windows и, к примеру, Linux. Понятно, что иметь такое количество браузеров просто невозможно.
На помощь приходят специальные сервисы, которые делают скриншоты сайта в различных версиях сайта.
Например, сервис browsershots.org- это веб-сервис, который делает скриншоты вашего сайта в разных операционных системах и браузерах. Это удобный, хоть и довольно медленный способ проверить свой сайт сразу во многих браузерах. Когда вы вводите адрес вашего сайта в строку для проверки, он ставится в очередь на тестирование. После этого скриншоты будут появляться на итоговой странице по очереди. Это может занять от 5 минут до 2 часов.
Существуют и другие подобные сервисы (гуглите).
По умолчанию браузеры добавляют отступы различным элементам: заголовкам h1-h6, абзацам p, спискам ol и ul и т.д.
Разные браузеры добавляют эти отступы по-разному, поэтому на стандартное поведение браузеров полагаться не стоит и следует создать так называемый файл сброса стилей reset.css.
Что должно входить в этот файл?
CSS Reset впервые был применен в 2004 году Эндрю Креспанисом (Andrew Krespanis). В своей статье он советовал использовать универсальный селектор (*) в начале CSS-файла, чтобы задать всем элементам нулевые отступы (margin и padding):
Такой подход имеет ряд преимуществ и недостатков.
Более продвинутый подход — использование сброса стилей всех необходимых элементов (установка нужных значений) без использования универсального селектора. Одним из популярных сбросов стилей такого типа является сброс от Эрика Мейера (Eric Meyer), смотрите его тут: сброс стилей от Эрика Мейера.
Советы и рекомендации
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на основы работы с массивами в PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Перед решением задач изучите теорию к данному уроку.
Примеры решения задач
Задача
Задача. Дан массив с элементами ‘Привет, ‘, ‘мир’ и ‘!’. Необходимо вывести на экран фразу ‘Привет, мир!’.
Разберем это решение.
Слово ‘Привет, ‘ хранится под номером 0, это значит, что для доступа к нему мы должны написать $arr[0].
Для доступа к слову ‘мир’ мы должны написать $arr[1], а $arr[2] содержит в себе ‘!’. Далее с помощью оператора ‘точка’ мы сложим три наши строки (‘Привет, ‘, ‘мир’ и ‘!’) в одну строку таким образом: $arr[0].$arr[1].$arr[2], и выведем на экран с помощью echo.
Задача
Задача. Решим немного другую задачу: дан массив с элементами ‘Привет, ‘, ‘мир’ и ‘!’. Необходимо записать в переменную $text фразу ‘Привет, мир!’, а затем вывести на экран содержимое этой переменной.
Задача
Задача. Дан массив [‘Привет, ‘, ‘мир’, ‘!’]. Необходимо записать в первый элемент (то есть элемент с номером ноль) этого массива слово ‘Пока, ‘ (то есть вместо слова ‘Привет, ‘ будет ‘Пока, ‘).
Задача. Создайте массив заработных плат $arr. Выведите на экран зарплату Пети и Коли.
Решение: чтобы вывести зарплату Коли следует вывести значение элемента массива с ключом ‘Коля’. Сделаем это:
Задача. Создайте массив $arr с элементами 1, 2, 3, 4, 5 двумя различными способами.
Задача. Дан многомерный массив $arr:
Выведите с его помощью слово ‘голубой’.
Решение: так как массив многомерный (в нашем случае двухмерный), то нам придется написать несколько квадратных скобок подряд. Поясню это по шагам. Давайте сделаем так:
Выведем теперь слово ‘красный’:
Задачи для решения
Работа с массивами
Создайте массив $arr=[‘a’, ‘b’, ‘c’]. Выведите значение массива на экран с помощью функции var_dump().
С помощью массива $arr из предыдущего номера выведите на экран содержимое первого, второго и третьего элементов.
Создайте массив $arr=[‘a’, ‘b’, ‘c’, ‘d’] и с его помощью выведите на экран строку ‘a+b, c+d’.
Создайте массив $arr с элементами 2, 5, 3, 9. Умножьте первый элемент массива на второй, а третий элемент на четвертый. Результаты сложите, присвойте переменной $result. Выведите на экран значение этой переменной.
Заполните массив $arr числами от 1 до 5. Не объявляйте массив, а просто заполните его присваиванием $arr[] = новое значение.
Ассоциативные массивы
Создайте массив $arr. Выведите на экран элемент с ключом ‘c’.
Создайте массив $arr. Найдите сумму элементов этого массива.
Создайте массив заработных плат $arr. Выведите на экран зарплату Пети и Коли.
Пусть теперь номер дня недели хранится в переменной $day, например там лежит число 3. Выведите день недели, соответствующий значению переменной $day.
Многомерные массивы
Создайте многомерный массив $arr. С его помощью выведите на экран слова ‘joomla’, ‘drupal’, ‘зеленый’, ‘красный’.
Работа с циклами foreach, for, while в PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Циклы используются для того, чтобы некоторый участок кода выполнился несколько раз подряд.
Делается это с помощью циклов.
Есть три вида циклов: foreach, while и for. Давайте разберемся, как с ними работать и чем они отличаются друг от друга.
Цикл foreach
Цикл foreach используется для прохождения по всем элементам массива.
После команды foreach() должны идти фигурные скобки <>. Код, который лежит в этих скобках, называется телом цикла.
Этот код будет выполняться столько раз, сколько проходов сделает цикл. А он сделает столько проходов, сколько элементов у нашего массива.
Итак, синтаксис цикла foreach выглядит так:
Давайте решим следующую задачу: пусть дан массив $arr с пятью элементами, выведем столбец этих элементов с помощью цикла foreach.
Будем при каждом проходе цикла выводить на экран (с помощью echo) текущий элемент массива (тот, что лежит в переменной $elem), и ставить после него тег br, чтобы получался столбец элементов, а не строка:
Если вам нужны только значения ассоциативного массива и не нужны ключи, то $ключ=> можно не писать:
Цикл foreach имеет альтернативный синтаксис:
Как и в случае с конструкцией if-else, мы можем разорвать скобки PHP внутри цикла, далее написать что-то на HTML и опять открыть скобки PHP – в этом случае HTML код внутри цикла повторится столько раз, сколько проходов сделает цикл (в случае foreach – это количество элементов массива):
Цикл while
Цикл while будет выполняться до тех пор, пока верно (истинно) выражение, переданное ему параметром. Смотрите синтаксис:
Давайте выведем с помощью цикла while столбец цифр от одного до пяти.
Для этого введем переменную $i, которую будем использовать для того, чтобы остановить наш цикл.
Как мы это сделаем: перед циклом поставим ей значение 1, а внутри цикла будем при каждом проходе цикла увеличивать ее на единицу. Сначала она будет 1, потом 2, потом 3 и так далее.
Цикл for
Цикл for является альтернативой while. Он более сложен для понимания, но чаще всего его любят больше, чем while, за то, что он занимает меньше строчек.
Его синтаксис выглядит так:
Авторизация через файлы
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Один пользователь, пароль в файле
При попытке обратится к нему, он будет выдавать поле ввода пароля.
Этот скрипт далеко не совершенен. Но не расстраивайтесь, сейчас мы его поправим!
Теперь наш скрипт стал немного удобнее!
И следующей нашей задачей является защита пароля от злоумышленника.
Защита пароля от злоумышленника
Замените текст на звездочки
Чтобы добиться такого эффекта, нужно для инпута с паролем указать атрибут type=’password’:
И теперь, даже если кто-то стоит у вас за спиной, он не сможет прочитать пароль с экрана.
Не используйте method=’GET’
Обратите теперь свое внимание на строку
Хешируем пароль. Функция md5
Что будет в случае, если злоумышленник получит доступ к нашему файлу? Он сможет посмотреть там наш пароль и впоследствии успешно авторизоваться.
Для защиты от такого были придуманы специальные функции хеширования. Они принимают пароль (и не только, вообще любую строку), а возвращают его хеш.
Пример хеша пароля md5(‘12345’): 827ccb0eea8a706c4c34a16891f84e7b.
По хешу никак нельзя восстановить пароль.
Потренируйтесь сами: найдите md5 от различных строк: ‘1234567890’, ‘пароль’, ‘юзер’.
Как использовать хеш
Получая пароль из формы авторизации мы должны обработать его функцией md5 и сравнить с тем хешем, который хранится у нас в файле.
Теоретически хеши различных строк могут совпадать, однако вероятность этого ничтожна.
Запускаем сессию
Весь написанный код хорош только в том случае, когда у нас на сайте есть только одна страничка, к которой мы хотим закрыть доступ.
Если таких страниц несколько, то мы столкнемся с неудобством: пароль придется вводить каждый раз, заходя на новую страницу.
Для решения этой проблемы следует использовать сессии PHP.
Причем, если раньше у нас был один файл на все, то теперь логичнее будет разбить код на несколько файлов.
Первый файл auth.php будет отвечать за авторизацию. Его обязанности:
Этот код на уже знаком и будет выглядеть примерно так:
Все остальные страницы сайта должны проверять авторизован ли пользователь и изменять свое поведение в зависимости от ответа.
Вот пример кода такой страницы:
Можно закрыть доступ не для всей страницы, а только для ее части.
Логаут
Авторизованный пользователь должен иметь возможность перестать им быть.
Для этого следует сделать ссылку ‘выйти’ (‘logout’ по-английски).
При переходе по этой ссылке должна выполниться функция session_destroy(), которая уничтожит все сессии ДАННОГО пользователя, тем самым закончив его авторизацию.
И он станет уже неавторизованным пользователем.
Создадим файл logout.php, при переходе на который происходит логаут:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на работу с HTML формами
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
На input и textarea
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На input с label
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На checkbox и radio
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На select
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На file
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На fieldset и legend
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На resize
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Задачи на регулярные выражения PHP. Часть 1
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
На ‘.’, символы
Дана строка ‘ahb acb aeb aeeb adcb axeb’. Напишите регулярку, которая найдет строки ahb, acb, aeb по шаблону: буква ‘a’, любой символ, буква ‘b’.
Дана строка ‘aba aca aea abba adca abea’. Напишите регулярку, которая найдет строки abba adca abea по шаблону: буква ‘a’, 2 любых символа, буква ‘a’.
Дана строка ‘aba aca aea abba adca abea’. Напишите регулярку, которая найдет строки abba и abea, не захватив adca.
Дана строка ‘aa aba abba abbba abca abea’. Напишите регулярку, которая найдет строки aba, abba, abbba по шаблону: буква ‘a’, буква ‘b’ любое количество раз, буква ‘a’.
Дана строка ‘aa aba abba abbba abca abea’. Напишите регулярку, которая найдет строки aa, aba, abba, abbba по шаблону: буква ‘a’, буква ‘b’ любое количество раз (в том числе ниодного раза), буква ‘a’.
Дана строка ‘aa aba abba abbba abca abea’. Напишите регулярку, которая найдет строки aa, aba по шаблону: буква ‘a’, буква ‘b’ один раз или ниодного, буква ‘a’.
Дана строка ‘ab abab abab abababab abea’. Напишите регулярку, которая найдет строки по шаблону: строка ‘ab’ повторяется 1 или более раз.
На экранировку
Дана строка ‘a.a aba aea’. Напишите регулярку, которая найдет строку a.a, не захватив остальные.
Дана строка ‘2+3 223 2223’. Напишите регулярку, которая найдет строку 2+3, не захватив остальные.
Дана строка ’23 2+3 2++3 2+++3 345 567′. Напишите регулярку, которая найдет строки 2+3, 2++3, 2+++3, не захватив остальные (+ может быть любое количество).
Дана строка ’23 2+3 2++3 2+++3 445 677′. Напишите регулярку, которая найдет строки 23, 2+3, 2++3, 2+++3, не захватив остальные.
Дана строка ‘*+ *q+ *qq+ *qqq+ *qqq qqq+’. Напишите регулярку, которая найдет строки *q+, *qq+, *qqq+, не захватив остальные.
Дана строка ‘*+ *q+ *qq+ *qqq+ *qqq qqq+’. Напишите регулярку, которая найдет строки *+, *q+, *qq+, *qqq+, не захватив остальные.
На жадность
Дана строка ‘aba accca azzza wwwwa’. Напишите регулярку, которая найдет все строки по краям которых стоят буквы ‘a’, и заменит каждую из них на ‘!’. Между буквами a может быть любой символ (кроме a).
Правильное использование пользовательских функций
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Сейчас мы с вами будем учиться правильному использованию пользовательских функций. Для этого мы разберем решения нескольких задач.
Новички чаще всего пытаются решить задачу просто кучей кода. Однако, это не совсем удобно. Удобнее всего выносить кусочки кода в отдельные функции. В этом случае вы получить набор простых функций, каждая из которых выполняет одно простое действие. Такие функции легко сделать, легко потестировать, легко поддерживать в дальнейшем. Также отдельные функции легко можно использовать для других задач и переносить между проектами. Давайте разбираться на задачах. Итак, задача.
Задача
Задача: пусть дан массив с числами, давайте запишем в новый массив только те элементы, сумма цифр в которых от 1 до 9.
Этот код можно переписать короче в одну строчку:
Давайте потестируем нашу функцию на каком-нибудь числе:
Можно переписать и короче:
Окончательное решение будет выглядеть так:
Задача
Давайте решим еще одну задачу: дан массив с числами, найдем сумму всех цифр из этих чисел.
Для решения этой задачей удобно воспользоваться функциями arraySum и getDigits, которые мы разработали при решении предыдущей задачи:
Советы по работе с функциями
Давайте функциям осмысленные имена
Старайтесь давать функциям осмысленные имена. Имя должно отражать то, что делает функция. Предположим, у нас есть функция, которая осуществляет валидацию (проверку правильности заполнения) формы.
Как лучше всего ее назвать? Как-нибудь так: validateForm. И напротив, имя validate или form не будет полностью отражать то, что делает эта функция.
В идеале вы должны посмотреть на имя функции и сразу определить то, что она делает, не заглядывая в ее код.
Не делайте их очень большими
Функции не должны быть многозадачными. Правило такое: одна функция должна выполнять только одну задачу.
Однако это неправильно. Лучше будет сделать две функции: одна проверяет, а вторая сохраняет.
Используйте функции внутри функций
Делайте ваши функции универсальными
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Команды ORDER BY, LIMIT, COUNT, LIKE в SQL
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
С помощью команды ORDER BY можно сортировать строки результата.
Выберем из нашей таблицы workers всех работников и отсортируем их по возрасту:
Если мы хотим обратный порядок сортировки, то следует написать:
LIMIT — ограничение количества
С помощью команды LIMIT мы можем ограничить количество строк в результате.
В следующем примере ограничим количество строк до двух:
Однако, это еще не все!
С помощью LIMIT можно выбрать несколько строк из середины результата!
В примере ниже мы выберем со второй строки, 5 штук:
LIMIT и ORDER вместе:
Команда COUNT — считаем количество
С помощью команды COUNT можно подсчитать количество строк в выборке.
Обратите внимание на распространенную ошибку с COUNT: конструкцию COUNT(*) следует писать слитно, без всяких пробелов, иначе не будет работать.
С помощью команды LIKE (англ. подобный) можно реализовать поиск. Посмотрите пример использования с комментарием:
Подробнее о возможностях этой команды смотрите здесь: LIKE.
Кавычки «
Обратите внимание на такой нюанс: следующий запрос работать не будет, так как имя таблицы from совпадает с командой FROM:
В таких случаях проблемные слова следует брать в косые кавычки, вот так:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Работа с циклами for и while в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Циклы используются для того, чтобы некоторый участок кода выполнился несколько раз подряд.
Делается это с помощью циклов.
Цикл while
Цикл while будет выполняться до тех пор, пока верно (истинно) выражение, переданное ему параметром. Смотрите синтаксис:
В принципе, цикл while может выполняться бесконечно (но это приведет к зависанию скрипта!), достаточно передать ему выражение, которое никогда не станет ложным. Например, так:
Давайте последовательно выведем с помощью цикла while числа от одного до пяти:
Для счетчиков принято использовать буквы i, j и k.
Цикл for
Цикл for является альтернативой while. Он более сложен для понимания, но чаще всего его любят больше, чем while за то, что он занимает меньше строчек.
Задачи на работу с псевдоклассами и псевдоэлементами CSS
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
На first-letter
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На first-line
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На selection
Повторите страницу по данному по образцу (выделите текст и повторите цвет и фон выделения):
Вы можете открыть этот пример в отдельной вкладке браузера.
На placeholder
Повторите страницу по данному по образцу (поставьте курсор в инпут и попробуйте что-нибудь ввести):
Вы можете открыть этот пример в отдельной вкладке браузера.
На focus
Вы можете открыть этот пример в отдельной вкладке браузера.
На after, before, content
Вы можете открыть этот пример в отдельной вкладке браузера.
Вы можете открыть этот пример в отдельной вкладке браузера.
На counter-increment
Повторите страницу по данному по образцу (в начале каждого абзаца вставлена автоматическая нумерация «Абзац №число. «):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (нумерация начинается с 8-ми):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (в середине нумерация начинается с начала):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (в середине нумерация имеет разрыв):
Вы можете открыть этот пример в отдельной вкладке браузера.
На nth
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (третий li покрашен в красный цвет):
Вы можете открыть этот пример в отдельной вкладке браузера.
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (каждая третья li покрашена в красный цвет):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (всегда выбрана предпоследняя li, независимо от их количества):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (выбрана и покрашена в красный цвет только та li, которая является единственной li своего родителя):
Вы можете открыть этот пример в отдельной вкладке браузера.
На checked
Повторите страницу по данному по образцу (красным цветом горит тот тег label, который находится после отмеченного чекбокса или радио):
Вы можете открыть этот пример в отдельной вкладке браузера.
На disabled, enabled
Вы можете открыть этот пример в отдельной вкладке браузера.
На empty
Повторите страницу по данному по образцу (пустая li имеет маркер и границу):
Вы можете открыть этот пример в отдельной вкладке браузера.
На not
Повторите страницу по данному по образцу (абзац без класса .test светится красным цветом):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (все li, кроме первой, покрашены в красный цвет):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (все li, кроме третьей, покрашены в красный цвет):
Вы можете открыть этот пример в отдельной вкладке браузера.
На lang
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На target
Повторите страницу по данному по образцу (при переходе по ссылке будет подсвечиваться соответствующий блок):
Вы можете открыть этот пример в отдельной вкладке браузера.
Работа с куки (cookie) в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Кроме того, с куками можно работать не только из JavaScript, но и из PHP (там это нужно, например, для хранения авторизации пользователя), см. работа с куками на PHP при необходимости.
В общем, куки достаточно полезная штука и с ее помощью можно сделать довольно много интересных вещей. Давайте разбираться, как работать с куками через JavaScript.
К сожалению, работа с куками в JavaScript реализована просто ужасно и без костылей тут не обойтись, а лучше просто использовать готовые библиотеки.
Итак, давайте приступим.
Основы работы с куками
К кукам, хранящимся в браузере, можно получить доступ с помощью document.cookie. С помощью этого свойства куки можно записывать и можно прочитывать.
Пример: ‘name=Вася; age=25’.
Чтобы записать в куки, нужно просто в document.cookie присвоить куку с ее именем:
Получение куки по ее имени
Итак, мы уже определи, что куки хранятся в виде простой строки, например, ‘name=Вася; age=25; salary=1000’. Получается, чтобы найти, к примеру, значение куки с именем age, его нужно достать из это строки каким-нибудь способом: к примеру функциями работы со строками или регулярными выражениями.
Дальнейшие рассуждения вам не будут понятны без знания регулярных выражений, см. вначале учебник по регулярным выражениям. Или просто пропустите эти рассуждения и пользуйтесь готовой функцией не вникая особо в ее суть.
Давайте попробуем написать регулярку, которая вытягивает значение куки с именем age:
Однако, эта регулярка не идеальна и при некоторых условиях может или не работать, или работать не правильно.
Нужно ее модифицировать и сказать, что кука заканчивается или точкой с запятой, или концом строки. Модифицируем: /age=(.+?)(;|$)/.
Давайте теперь введем несохраняющие скобки, чтобы не плодить лишних карманов: /(?:^|\s)age=(.*?)(?:;|$)/.
А теперь давайте реализуем функцию getCookie(), которая параметром будет принимать имя произвольной куки и возвращать ее значение. Вот эта функция:
Однако, у нас есть проблема: ведь в переменной name могут быть специальные символы (команды регулярных выражений), которые сломают нашу регулярку. Давайте заэкранируем все эти символы (заменим их на их же, но с экранирующем обратным слешем спереди):
С учетом этого исправления получим следующее:
Перепишем этот if в сокращенный вариант:
С учетом исправления получим следующий код:
Теперь учтем, что некоторые браузеры выполняют url кодирование кук и раскодируем их обратно с помощью decodeURIComponent:
Это и есть готовая функция для получения нужной вам куки (взята отсюда learn.javascript.ru/cookie, я просто чуть подправил регулярку и объяснил как она работает).
Дополнительные настройки кук
Это еще не все: у кук есть дополнительные настройки, которые чаще всего желательно указать.
Эти настройки указываются после пары ключ=значение, каждое – после точки с запятой. Как-то так:
Папка установки
Например: ваш сайт site.ru и вы, находясь на странице site.ru/folder/ установили куку. Так вот: эта кука будет доступна на странице site.ru/folder/, на странице site.ru/folder/subfolder/ и так далее, но не будет доступна, к примеру на странице site.ru/somefolder/.
Можно указать и конкретную папку, например path=/folder:
Домен установки
Следующая настройка domain задает домен, для которого установлена кука. По умолчанию это текущий домен (но не его поддомены). Можно указать, что кука доступна именно на поддомене. К примеру, наш домен site.ru, а куку мы установим для forum.site.ru:
Если указать специальную маску .site.ru, то кука будет доступна на сайте и всех его поддоменах:
Время жизни
Для этого применяется настройка expires, в которую следует задавать момент времени, до которого живет кука. Этот момент устанавливается в формате GMT. Этот формат можно получить так: используем объект Date, устанавливаем в любое время, а потом вызываем метод toUTCString.
Давайте установим время жизни куки +1 день от текущего момента:
Удаление кук
Куки удаляются интересным образом: нужно установить время их жизни в прошедшее время, ну или просто поставить его как -1. Давайте удалим нашу куку:
Библиотеки для работы с куками
Так как работа с куками в JavaScript реализована просто ужасно, существуют библиотеки, которые упрощают работу с ними. Изучите эти библиотеки самостоятельно: куки на чистом JavaScript и плагин jQuery.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Тренинг «Делегирование событий на JavaScript»
Дата выхода: 22.04.2017 в 10.00 по Москве (летом Москва = Минск = Киев).
В данном тренинге вы научитесь решать задачи на делегирование JavaScript.
Дан ul с несколькими li и кнопка. Сделайте так, чтобы по нажатию на кнопку в конец ul добавлялась новая li с текстом ‘пункт’. Задачу решите с помощью методов createElement и appendChild. Решение задачи выкладывайте в данную тему.
Дан div 200 на 200 пикселей. Сделайте так, чтобы по клику на этот div на экран выводились координаты места нажатия. Задача на основы работы с объектом Event. Решение задачи выкладывайте в данную тему.
Посмотрите следующее видео, а затем переходите к решению задач:
Задачи к блоку
Дан ul с несколькими li. По нажатию на любую li на экран должен вывестись ее текст. Дана кнопка. Сделайте так, чтобы по нажатию на эту кнопку в конец ul добавлялась новая li с текстом ‘пункт’. Сделайте так, чтобы вновь добавленные li также реагировали на нажатие. Задачу решите с помощью делегирования. Решение задачи выкладывайте в данную тему.
Посмотрите следующее видео, а затем переходите к решению задач:
Задачи к блоку
Посмотрите видео выше и доделайте решение предыдущей задачи в соответствии с этим видео. Решение задачи выкладывайте в данную тему.
Работа с элементами страницы в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
В данном уроке мы разберем работу с элементами страницы на языке JavaScript.
Работа с innerHTML, outerHTML
В прошлом уроке мы с вами учились считывать и записывать значения атрибутов, а теперь будем делать тоже самое, но уже со внутренним содержимым тегов. Это делается с помощью свойства innerHTML, которое можно считывать и перезаписывать, меняя тем самым содержимое тегов.
HTML код станет выглядеть так:
Можно записывать не только текст, но и теги и они будут работать (в нашем случае текст станет жирным):
HTML код станет выглядеть так:
Кроме свойства innerHTML существует также свойство outerHTML, которое перезаписывает не только внутренний текст тега, но и сам тег. Смотрите пример:
HTML код станет выглядеть так:
Как вы видите, наш абзац исчез и заменился на тег b.
Работа с getElementsByTagName
Во всех примерах выше мы с вами работали с методом getElementById, который получал только одно свойство по его атрибуту id. Однако существуют и другие способы получения свойств, к примеру, с помощью метода getElementsByTagName, который получает группу тегов по их имени. Например, можно получить все абзацы p или все заголовки h2.
Давайте поменяем текст всех трех абзацев:
HTML код станет выглядеть так:
В следующем примере мы сменим содержимое всех абзацев на страницы на ‘!’, воспользовавшись для этого циклом for:
HTML код станет выглядеть так:
Обращение к свойствам через свойства document
В следующем примере первый alert выведет null:
Работа с формами
Можно получить все HTML формы на странице через document.forms. В результате мы получим массив форм, будто он был получен с помощью getElementsByTagName (точнее это будет не массив, а псевдомассив (или коллекция) свойств).
Мы можем, к примеру, обратиться к любой форме, как к энному свойству массива, например, к форме с номером 0:
HTML код станет выглядеть так:
А можем перебрать все формы с помощью цикла:
HTML код станет выглядеть так:
Кроме того, к формам можно обращаться по имени вместо номера. Это имя задается в атрибуте name тега
Регистрация и авторизация вместе
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Добавляем хеширование паролей
Хранить пароли в открытом виде в базе данных весьма опасно. Злоумышленник может получить доступ к вашей базе и украсть все логины пользователей вместе с их паролями!
Чтобы этого избежать, на пути хакера следует поставить еще одну защиту: хеширование паролей.
Итак, давайте вспомним, как выглядела раньше таблица users:
id | login (Логин) | password (Пароль) |
---|---|---|
1 | user | 12345 |
2 | admin | 54321 |
Добавим теперь вместо паролей их хеши md5():
id | login (Логин) | password (Пароль) |
---|---|---|
1 | user | 827ccb0eea8a706c4c34a16891f84e7b |
2 | admin | 01cfcd4f6b8770febfb40cb906715822 |
Вы можете сами убедиться, глядя на второй вариант таблицы, что хакеру она ничего не скажет!
Теперь нужно доработать код авторизации и регистрации с учетом хеширования. Изменение в коде регистрации будут только тут:
Добавляем соль
На самом деле md5 не дает полной защиты от расшифровки.
В случае простого или очень популярного пароля хеш элементарно расшифровывается с помощью гугла.
Проверьте это сами: пароль для пользователя user был ‘12345’, а его хеш md5 – ‘827ccb0eea8a706c4c34a16891f84e7b’. Вбейте эту строку в гугл и вы сразу получите расшифровку пароля!
Сообщества хакеров часто собираются некоторой группой и запускают генерацию хешей md5 для всевозможных паролей. Для этого они запускают специальные скрипты на своих компьютерах, которые могут работать несколько дней!
Это серьезная проблема для защиты.
Проблема в том, что пользователи имеют тенденцию задавать простые пароли и с этим в принципе ничего не сделать.
Для решения проблемы простых паролей вводится специальная вещь, которая называется соль. Соль представляет собой случайную строку, которую мы добавляем к паролю пользователя. Это называется посолить пароль.
Строка добавляется при регистрации до того, как от пароля взят md5.
Теперь даже если пароль пользователя ‘12345’, то в базе он будет хранится уже соленым и хакер не сможет расшифровать этот пароль ни с помощью гугла, ни с помощью радужных таблиц!
Как сделать соль?
Соль должна представлять собой случайную строку, обычно из 8 символов. Случайный символ получается с помощью конструкции chr(mt_rand(33,126)).
Вот готовая функция для генерации соли:
Соль должна быть уникальная для каждого пользователя.
Соль следует хранить в базе данных, причем в открытом виде, так как она нам понадобится при авторизации.
Пароль, естественно, мы храним в виде хеша (пароль+соль).
Добавим в таблицу users соль (пароли уже посолены md5($password.$salt)):
id | login (Логин) | password (Соленый пароль) | salt (Соль) |
---|---|---|---|
1 | user | 827ccb0eea8a706c4c34a16891f84e7b | sdfLjgyl |
2 | admin | 01cfcd4f6b8770febfb40cb906715822 | sMtrnwpJ |
Различные варианты соления в известных движках:
Изменим код регистрации с учетом соли:
Поменяем теперь код авторизации.
Обратите внимание на то, что если раньше мы проверяли правильность пары логин-пароль с помощью SQL запроса, то теперь так не получится.
Мы должны найти пользователя с заданным логином с помощью SQL запроса (логин из формы авторизации) и далее в скрипте сравнить соленый пароль из базы с паролем из формы (его нужно будет посолить солью из базы):
Валидация при регистрации
При регистрации обязательно следует проверять данные, которые пользователь ввел в поля.
Логин, например, не должен быть меньше трех-четырех символов, а пароль вообще желательно ограничить минимум 6-ю символами (в целях безопасности).
Обратите на это внимание. Я это не показываю, дабы не усложнять примеры, но вам это необходимо будет реализовать в реальных условиях.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Сайты с задачами на русском?
Простой 3 комментария
хотелось бы больше практики. на русском.
Попробуйте позаниматься на Hexlet, у них помимо крутых курсов есть много практических задач и очень интересных.
А по-хорошему, английский должен быть must have, без него далеко не уедешь.
английский должен быть must have
Задачи на приемы работы с циклами на JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Пирамидки
С помощью цикла for сформируйте строку ‘123456789’ и запишите ее в переменную str.
С помощью цикла for сформируйте строку ‘987654321’ и запишите ее в переменную str.
С помощью цикла for сформируйте строку ‘-1-2-3-4-5-6-7-8-9-‘ и запишите ее в переменную str.
Нарисуйте пирамиду, как показано на рисунке, только у вашей пирамиды должно быть 20 рядов, а не 5:
С помощью двух вложенных циклов нарисуйте следующую пирамидку:
Нарисуйте пирамиду, как показано на рисунке, воспользовавшись циклом for:
Задачи на математические функции JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Работа с %
Даны переменные a = 10 и b = 3. Найдите остаток от деления a на b.
Работа со степенью и корнем
Возведите 2 в 10 степень. Результат запишите в переменную st.
Найдите квадратный корень из 245.
Дан массив с элементами 4, 2, 5, 19, 13, 0, 10. Найдите квадратный корень из суммы кубов его элементов. Для решения воспользуйтесь циклом for.
Работа с функциями округления
Найдите квадратный корень из 379. Результат округлите до целых, до десятых, до сотых.
Найдите квадратный корень из 587. Округлите результат в большую и меньшую стороны, запишите результаты округления в объект с ключами ‘floor’ и ‘ceil’.
Нахождение максимального и минимального числа
Работа с рандомом
Выведите на экран случайное целое число от 1 до 100.
Заполните массив 10-ю случайными целыми числами. ( Подсказка: нужно воспользоваться циклами for или while).
Работа с модулем
Даны переменные a и b. Найдите найдите модуль разности a и b. Проверьте работу скрипта самостоятельно для различных a и b.
Даны переменные a и b. Отнимите от a переменную b и результат присвойте переменной c. Сделайте так, чтобы в любом случае в переменную c записалось положительное значение. Проверьте работу скрипта при a и b, равных соответственно 3 и 5, 6 и 1.
Задачи
Дан массив arr. Найдите среднее арифметическое его элементов. Проверьте задачу на массиве с элементами 12, 15, 20, 25, 59, 79.
Задачи на работу с продвинутыми свойствами CSS
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
На letter-spacing, word-spacing, font-variant, text-transform
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На работу с таблицами
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На text-align-last
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На rgb, rgba, opacity
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На тени
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На cursor
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На text-decoration новый
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На множественные фоны
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Вы можете открыть этот пример в отдельной вкладке браузера.
На text-overflow
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На white-space, tab-size
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (везде стоит white-space: pre, вам нужно поставить правильный размер табуляции с помощью tab-size):
Вы можете открыть этот пример в отдельной вкладке браузера.
На word-break, word-wrap, overflow-wrap
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На hyphens
Повторите страницу по данному по образцу (в этой задаче в тексте расставлены переносы слов по слогам, работает не во всех браузерах):
Вы можете открыть этот пример в отдельной вкладке браузера.
На user-select
Повторите страницу по данному по образцу (в этой задаче текст нельзя выделить мышкой):
Вы можете открыть этот пример в отдельной вкладке браузера.
На градиенты
Повторите страницу по данному по образцу (линейный градиент):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (радиальный градиент):
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу (повторяющийся градиент):
Вы можете открыть этот пример в отдельной вкладке браузера.
На мультиколонки
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На font-face, google fonts
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На картинку границы
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На background-clip, background-origin
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
На filter
Повторите страницу по данному по образцу:
Вы можете открыть этот пример в отдельной вкладке браузера.
Задачи на конструкции if-else, switch-case в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Примеры решения задач
Задача
Задача. Если переменная a равна 10, то выведите ‘Верно’, иначе выведите ‘Неверно’.
Задача
Задача. В переменной min лежит число от 0 до 59. Определите в какую четверть часа попадает это число (в первую, вторую, третью или четвертую).
Задача
Переменная lang может принимать 2 значения: ‘ru’ ‘en’. Если она имеет значение ‘ru’, то в переменную arr запишем массив дней недели на русском языке, а если имеет значение ‘en’ – то на английском. Решите задачу через 2 if, через switch-case и через многомерный массив без ифов и switch.
Решение через 2 if:
Решение через switch-case:
Решение через многомерный массив:
Задачи для решения
Работа с if-else
Если переменная a равна ‘test’, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при a, равном ‘test’, ‘тест’, 3.
Если переменная a равна ‘1’ и по значению и по типу, то выведите ‘Верно’, иначе выведите ‘Неверно’. Проверьте работу скрипта при a, равном ‘1’, 1, 3.
Работа с логическими переменными
Работа с && (и) и || (или)
Если переменная a равна или меньше 1, а переменная b больше или равна 3, то выведите сумму этих переменных, иначе выведите их разность (результат вычитания). Проверьте работу скрипта при a и b, равном 1 и 3, 0 и 6, 3 и 5.
Если переменная a больше 2-х и меньше 11-ти, или переменная b больше или равна 6-ти и меньше 14-ти, то выведите ‘Верно’, в противном случае выведите ‘Неверно’.
На switch-case
Переменная num может принимать 4 значения: 1, 2, 3 или 4. Если она имеет значение ‘1’, то в переменную result запишем ‘зима’, если имеет значение ‘2’ – ‘весна’ и так далее. Решите задачу через switch-case.
Задачи
В переменной day лежит какое-то число из интервала от 1 до 31. Определите в какую декаду месяца попадает это число (в первую, вторую или третью).
В переменной month лежит какое-то число из интервала от 1 до 12. Определите в какую пору года попадает этот месяц (зима, лето, весна, осень).
Дана строка из 3-х цифр. Найдите сумму этих цифр. То есть сложите как числа первый символ строки, второй и третий.
Задачи на работу с таймерами в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Повторите страницы по образцу
Создайте отсчет от 0 до бесконечности:
Вы можете открыть этот пример в отдельной вкладке браузера.
Создайте отсчет с кнопкой остановки:
Вы можете открыть этот пример в отдельной вкладке браузера.
Создайте тикающие часики:
Вы можете открыть этот пример в отдельной вкладке браузера.
Создайте таймер обратного отсчета:
Вы можете открыть этот пример в отдельной вкладке браузера.
Создайте простой слайдер:
Вы можете открыть этот пример в отдельной вкладке браузера.
Вы можете открыть этот пример в отдельной вкладке браузера.
Вы можете открыть этот пример в отдельной вкладке браузера.
Создайте отсчет до полуночи:
Вы можете открыть этот пример в отдельной вкладке браузера.
Работа с метриками на JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Тестовый блок
Результат выполнения кода, если текста мало:
Результат выполнения кода, если текста много:
Все примеры ниже мы будем изучать по этому блоку или его модификациям.
Расширение элементов
Блок будет шириной не 200px, а 300:
Подводные камни при работе с CSS
Давайте в теперь поговорим о проблемах, которые возникают, если вы хотите прочитать значения CSS свойств через JavaScript вот таким образом: элемент.style.свойство.
Давайте посмотрим на примерах. Прочитаем ширину элемента, заданную через атрибут style:
А вот если мы захотим прочитать ширину, установленную через CSS (или в отдельном файле или через тег style), то у нас ничего не получится:
Функция getComputedStyle
Функция getComputedStyle позволяет получить значение любого CSS свойства элемента, даже из CSS файла.
Как она работает (внимание: не так как мы ожидаем): параметром функция принимает элемент, а возвращает объект, который содержит в себе все CSS свойства переданного элемента.
В следующем примере мы выведем все интересующие нас CSS свойства для нашего элемента:
Неточность getComputedStyle
Иногда функция getComputedStyle работает не совсем корректно с шириной и высотой. Это связано с тем, что padding и граница расширяют блок. В следующем примере блоку задана ширина 200px, а также граница и padding. Реальная ширина блока 300px, но getComputedStyle все равно выведет 200px:
То есть: получается, что getComputedStyle игнорирует расширение блока и показывает его размеры так, как будто этого расширения не было.
Вычисленные значения
Переходим к метрикам
Свойства clientLeft и clientTop
Посмотрим на следующем примере:
Свойства offsetWidth и offsetHeight
Свойства offsetWidth и offsetHeight содержат в себе полную ширину и высоту элемента с учетом расширения padding и границей. Давайте выведем эти метрики для нашего тестового элемента:
Свойства clientWidth и clientHeight
Свойства scrollLeft и scrollTop
Свойства scrollLeft и scrollTop содержат в себе информацию о том, на сколько элемент, имеющий полосу прокрутки, прокручен слева и сверху.
В следующем примере по клику на кнопку значение scrollTop (прокрутка сверху):
А в следующем примере мы будем прокручивать элемент на 100px от текущего положения:
Нажмите на кнопку, чтобы увидеть результат:
Свойства scrollWidth и scrollHeight
Следующее два свойства scrollWidth и scrollHeight содержат в себе полную ширину и высоту элемента с учетом прокрученной части.
Давайте изучим их работу на следующем примере: выведем полную высоту нашего тестового элемента:
Свойства scrollWidth и scrollHeight можно использовать для того, чтобы распахнуть элемент на его полную ширину или высоту.
Кроме того, для корректной работы из elem.scrollHeight следует вычесть верхний и нижний padding.
Итак, с учетом всего перечисленного распахнем элемент на полную высоту:
Свойство offsetParent
Свойство offsetParent содержит в себе родителя, относительно которого позиционируется элемент. Это будет тег body для статического позиционирования, ближайший позиционированный элемент для других типов позиционирования или ближайшая ячейка таблицы.
Свойства offsetLeft и offsetTop
Свойства offsetLeft и offsetTop содержат в себе позицию в пикселях левого верхнего угла блока относительно его offsetParent.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на отработку циклов и функций JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Отработка циклов
В следующих задачах вы должны вспомнить работу с циклами JavaScript.
Выведите с помощью цикла столбец чисел от 1 до 100.
Выведите с помощью цикла столбец чисел от 100 до 1.
Выведите с помощью цикла столбец четных чисел от 1 до 100.
Заполните массив 10-ю иксами с помощью цикла.
Заполните массив числами от 1 до 10 с помощью цикла.
Заполните массив 10-ю случайными числами (дробями) от 0 до 1 с помощью цикла. Дроби округляйте до двух знаков в дробной части.
Заполните массив 10-ю случайными числами от 1 до 10 с помощью цикла.
Дан массив с числами. С помощью цикла выведите только те элементы массива, которые больше нуля и меньше 10-ти.
Дан массив с числами. С помощью цикла найдите сумму элементов этого массива.
Дан массив с числами. С помощью цикла найдите сумму квадратов элементов этого массива.
Дан массив с числами. Найдите среднее арифметическое его элементов (сумма элементов, делить на количество).
Задачи на основы работы с селекторами CSS
Учебник HTML CSS
Практика
Продвинутый курс
Практика
Адаптив
Продвинутые вещи
Практика
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Придумайте селектор, который выберет абзацы
Придумайте селектор, который выберет все
внутри дивов
Придумайте селектор, который выберет все абзацы
из элемента с id=test.
Придумайте селектор, который выберет все
из элемента с id=test.
Выберите все элементы с классом bbb.
Выберите все элементы с классом bbb из элемента с id=test.
Выберите все абзацы
с классом bbb.
Выберите все абзацы
с классом bbb из элемента с id=test.
Выберите все элементы с классом bbb и элементы с классом xxx одновременно.
Выберите все абзацы
с классом bbb и
с классом xxx одновременно.
Выберите все абзацы
с классом bbb из id=test и все абзацы
с классом xxx из id=test одновременно.
Выберите все элементы из класса fff.
Выберите все абзацы
Выберите все абзацы
Выберите все элементы с классом bbb из класса fff.
Работа с конструкциями if-else, switch-case в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Конструкция if-else
Для того, чтобы напрограммировать что-нибудь полезное, одних переменных далеко не достаточно. Нам нужен механизм, который позволит выполнять определенный код в зависимости от каких-либо условий.
То есть нам нужно иметь возможность спросить у JavaScript ‘Если’.
Например так: если эта переменная меньше нуля, то вывести ‘отрицательно’, иначе (то есть если она больше нуля) вывести ‘положительно’.
В JavaScript для таких вопросов предназначена конструкция if, которая позволяет выполнять определенный код при выполнении какого-либо условия:
Обратите внимание на то, что блок else не обязателен.
Логическое выражение представляет собой тот самый вопрос, который мы хотим задать JavaScript. Например, чтобы спросить ‘переменная a больше нуля’ мы напишем так: a > 0.
Сокращенный синтаксис
В случае, если в фигурных скобках if или else будет только одно выражение, можно эти фигурные скобки не писать:
Равенство по значению и типу
Для того, чтобы сравнить на равенство следует использовать оператор двойное равно ==, а не одиночное =, как можно было подумать.
Почему так? Потому что одиночное равно зарезервировано за присваиванием. Смотрите пример:
А следующий пример работать будет не так, как мы думаем:
Кроме оператора == существует еще и оператор ===. Их различие в том, что === сравнивает не только по значению, но и по типу, а == сравнивает только по значению.
Чтобы полностью разобраться в этом внимательно изучите примеры:
Не равно
Все операции сравнения
Возможные операции сравнения, которые можно использовать внутри if:
Несколько условий сразу
Иногда может быть нужно составить какое-то сложное условие, например, пользователь вводит месяц своего рождения и вам нужно проверить, что введенное число больше или равно 1 и меньше либо равно 12 (так как в году 12 месяцев).
Для этого существуют операторы && (логическое И) и || (логическое ИЛИ).
Работа с логическими переменными
Многие функции JavaScript в результате своей работы возвращают либо true (истина), либо false (ложь). Эти значения довольно удобны при своей работе, но новичкам бывает довольно сложно понять их.
Представим себе, что переменная a равна true. В таком случае конструкцию if можно записать так:
Так как такие сравнения довольно распространены в JavaScript, то существует специальный прием, облегчающий работу (но не понимание, к сожалению).
Прием такой: конструкцию a == true можно заменить на более простую: вместо if (a == true) написать if (a) и она будет работать аналогично.
Следует пользоваться второй конструкцией, так как она проще.
Также обратите внимание на следующие примеры:
Вложенные if
Одной конструкцией if здесь не обойтись, нужно использовать две таким образом, чтобы одна была внутри другой:
Конструкция else if
Недостатком конструкции предыдущего примера является большое количество фигурных скобок.
Чтобы избавиться от них, можно пользоваться специальной конструкцией else if, которая представляет собой одновременно и else, и начало вложенного if:
Можно использовать несколько else if, но злоупотреблять этим не стоит (лучше будет воспользоваться конструкцией switch-case, о которой ниже).
Несколько if
Решение: можно было бы воспользоваться вложенными ифами или else if. Выглядело бы это примерно так:
Для таких случаев существует конструкция switch-case.
Конструкция switch-case
Данная конструкция представляет собой альтернативу if-else, ее рекомендуется использовать в случае множественного выбора (например, 10 различных языков, как в нашей задаче).
Изучите ее синтаксис:
Решим нашу задачу с тремя языками с помощью данной конструкции:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на отработку циклов и функций PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Отработка циклов
В следующих задачах вы должны вспомнить работу с циклами PHP.
Выведите с помощью цикла столбец чисел от 1 до 100.
Выведите с помощью цикла столбец четных чисел от 1 до 100.
Найдите с помощью цикла сумму чисел от 1 до 100.
Найдите с помощью цикла сумму квадратов чисел от 1 до 15.
Найдите с помощью цикла сумму корней чисел от 1 до 15. Результат округлите до двух знаков после дробной части.
Найдите с помощью цикла сумму тех чисел от 1 до 100, которые делятся на 7.
Заполните массив 10-ю иксами с помощью цикла.
Заполните массив числами от 1 до 10 с помощью цикла.
Заполните массив числами от 10 до 1 с помощью цикла.
Заполните массив 10-ю случайными числами от 1 до 10 с помощью цикла.
С помощью цикла создайте строку из 6-ти символов, состоящую из случайных чисел от 1 до 9.
Дан массив с числами. С помощью цикла найдите сумму элементов этого массива.
Дан массив с числами. С помощью цикла найдите сумму квадратов элементов этого массива.
Дан массив с числами. С помощью цикла найдите корень из суммы квадратов элементов этого массива. Результат округлите в меньшую сторону до целых.
Дан массив с числами. Найдите сумму тех элементов массива, которые больше 0 и меньше 10.
Дан массив с числами. Проверьте, что в нем есть 3 одинаковых числа подряд.
С помощью цикла сформируйте строку ‘1223334444. ‘ и так далее до заданного числа.
Дан многомерный массив (см. его под задачей). С помощью цикла выведите строки в формате ‘имя-зарплата’.
Заполните двумерный массив случайными числами от 1 до 10. В каждом подмассиве должно быть по 10 элементов. Должно быть 10 подмассивов.
Практика
Напишите свой аналог функции strrev. Решите задачу двумя способами.
Подсказка:
первый вариант решения: используйте функции split и array_reverse,
второй вариант решения: сделайте цикл, который будет брать символы с конца строки и формировать новую строку.
Практика на комбинации функций
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Перед решением задач изучите теорию к данному уроку.
В следующих задачах вы должны применить комбинацию стандартных функций PHP, чтобы решить задачу. Все функции вам известны, если вы делали задачи предыдущих уроков и проходили тесты.
Дан массив с числами. Найдите среднее арифметическое его элементов (сумма элементов делить на количество) не используя цикл.
Найдите сумму чисел от 1 до 100 не используя цикл.
Выведите столбец чисел от 1 до 100 не используя цикл.
Заполните массив 10-ю иксами не используя цикл.
Подсказка: используйте функцию array_fill.
Заполните массив 10-ю случайными числами от 1 до 10 так, чтобы они не повторялись. Цикл использовать нельзя.
Подсказка: используйте функции range и shuffle.
Подсказка: используйте функции range и array_product.
Дано число. Найдите сумму цифр этого числа не используя цикл.
Подсказка: используйте функции split и array_sum.
Дана строка. Сделайте заглавным последний символ этой строки не используя цикл.
Решение: перевернем строку, используем функцию ucfirst, затем перевернем строку обратно:
Дан массив с числами. Получите из него массив с квадратными корнями этих чисел не используя цикл.
Подсказка: используйте функции array_map и sqrt.
Заполните массив числами от 1 до 26 так, чтобы ключами этих чисел были буквы английского алфавита: [‘a’=>1, ‘b’=>2. ]. Сделайте это не используя цикл.
Дана строка с числами ‘1234567890’. Найдите сумму пар чисел: 12+34+56+78+90. Решите задачу, не используя цикл.
Подсказка: используйте функции str_split и array_sum.
Работа с пользовательскими функциями в PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Однако, с помощью стандартных функций невозможно сделать все, что нам требуется. На помощь приходит такой механизм PHP, как функции пользователя. С их помощью мы можем создавать свои функции, принцип работы которых аналогичен стандартным функциям PHP.
Зачем нужны пользовательские функции?
Очень часто при программировании возникает такая ситуация: некоторые участки кода повторяются несколько раз в разных местах. Пользовательские Функции нужны для того, чтобы убрать дублирование кода.
Кроме того, функции скрывают внутри себя какой-то код, о котором нам не приходится задумываться. Например, у нас есть функция saveUser(), которая сохраняет пользователя в базу данных. Мы можем просто вызывать ее, не задумываясь о том, какой код выполняется внутри функции. Это очень удобно. В программировании это называется инкапсуляцией.
Синтаксис функций пользователя
Сколько может быть параметров: один, несколько (в этом случае они указываются через запятую), ни одного (в этом случае круглые скобки все равно нужны, хоть они и будут пустыми).
Обратите внимание на фигурные скобки в примерах: в них мы пишем код, который выполняет функция. Общий синтаксис функции выглядит так:
Как вызвать функцию в коде?
Саму функцию мы можем вызвать в любом месте нашего PHP документа (даже до ее определения). Функция вызывается по ее имени. При этом круглые скобки после ее имени обязательны, даже если они пустые. Смотрите пример:
Подробнее о параметрах
В наших примерах мы вызывали функцию ‘hello()’ без параметров.
Давайте теперь попробуем ввести параметр, который будет задавать текст, выводимый нашей функцией:
Обратите внимание на переменную $text в нашей функции: в ней появляется то, что мы передали в круглых скобках при вызове функции.
Как PHP знает, что текст ‘Привет, Земляне!’ нужно положить в переменную $text? Мы сказали ему об этом, когда создавали нашу функцию, вот тут: ‘function hello(text)’.
Инструкция return
Чаще всего функция должна не выводить что-то через echo на экран, а возвращать.
Сделаем теперь так, чтобы функция не выводила что-то на экран, а возвращала текст скрипту, чтобы он смог записать этот текст в переменную и как-то обработать его дальше:
Частая ошибка с return
После того, как выполнится инструкция return – функция закончит свою работу. То есть: после выполнения return больше никакой код не выполнится.
Это не значит, что в функции должен быть один return. Но выполнится только один из них. Такое поведение функций является причиной многочисленных трудноуловимых ошибок.
Приемы работы с return
Существуют некоторые приемы работы с return, упрощающие код. Как сделать проще всего:
Теперь упростим нашу функцию, используя прием работы с return:
Обратите внимание на то, насколько упростился код. Плюсом также является то, что мы убрали лишнюю переменную $result.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Работа с набором элементов jQuery
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Сейчас мы с вами изучим методы jQuery для работы с набором элементов.
Мы с вами уже разбирали псевдоклассы jQuery, например, :not, который делает отрицание. Кроме этого псевдокласса существует также метод .not(), который осуществляет аналогичную операцию.
Сделаем это с помощью :not:
А теперь то же самое сделаем через .not():
Такую особенность можно и нужно использовать.
HTML код станет выглядеть так:
Собственно, такие методы (у которых есть аналогичный псевдокласс) и созданы для выстраивания цепочек такого рода. В простых случаях удобнее использовать псевдоклассы.
Метод slice
HTML код станет выглядеть так:
Обратите внимание на то, что slice(1, 5) первый элемент включает, а второй нет, то есть (1, 5) находит элементы с номером 1, 2, 3, 4, а элементы номер 0 и 5 не берет.
Фильтрация элементов
С помощью следующего метода .filter() в наборе можно оставить только те элементы, которые удовлетворяют определенному селектору.
HTML код станет выглядеть так:
Работа с соседями
Для примера найдем элемент #test и его соседу сверху поставим текст ‘!’:
HTML код станет выглядеть так:
А теперь выполним аналогичную операцию с соседом снизу:
HTML код станет выглядеть так:
Работа с родителями и потомками
В следующем примере мы найдем элемент #test затем найдем его родителя с помощью .parent() и поставим ему текст ‘!’:
Результат выполнения кода:
Поиск внутри найденного
Давайте теперь разберем метод .find(), который ищет элементы по заданному селектору внутри уже найденных (то есть по потомкам внутри найденных элементов).
Для примера найдем все теги
HTML код станет выглядеть так:
Добавление элементов в текущий набор
Иногда бывают ситуации, когда у нас уже есть набор методов, мы выполнили над ним какие-либо операции и теперь хотели бы добавить к этому набору еще элементов и выполнить над этим общим набором еще какие-нибудь операции. Это делается с помощью метода .add().
Давайте найдем все абзацы, поставим им текст ‘!’, затем добавим к найденным абзацам заголовки h2 с помощью .add() и одновременно для заголовков и абзацев поставим красный цвет:
Существует также похожий метод .andSelf(), который добавляет в текущий набор предыдущий.
HTML код станет выглядеть так:
Предыдущий набор
Иногда при построении цепочек jQuery есть необходимость вернуться к предыдущему набору. Это делается с помощью метода .end().
HTML код станет выглядеть так:
Клонирование элементов
Метод .clone() создает копии выбранных элементов страницы и возвращает их в виде объекта jQuery.
Результат выполнения кода:
Проверка наличия
Метод .is() проверяет, соответствует ли хотя бы один из выбранных элементов заданному селектору. Возвращает true или false.
Преобразование в массив
Метод .toArray() преобразует набор элементов jQuery в массив DOM элементов JavaScript. Это нужно для того, чтобы к этому массиву можно было применить методы и функции JavaScript, например, отсортировать этот массив с помощью sort или перевернуть его с помощью reverse.
Метод .toArray() преобразует набор элементов jQuery в обычный массив JavaScript.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на функции работы со строками в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Примеры решения задач
Задача. Дана строка ‘aaa@bbb@ccc’. Замените все @ на ‘!’ с помощью глобального поиска и замены.
Решение: в данном случае необходимо воспользоваться методом replace, который выполняет поиск и замену. Однако, при простом варианте использования, эта метод найдет и заменит только первое совпадение:
Чтобы заменить все совпадения, воспользуемся глобальным поиском с помощью регулярного выражения:
Задача. Дана строка ‘aaa bbb ccc’. Вырежите из нее слово ‘bbb’ тремя разными способами (через substr, substring, slice).
Решение: слово ‘bbb’ начинается с символа номер 4 (нумерация с нуля), а заканчивается символом номер 6. Воспользуемся указанными методами:
Задача. В переменной date лежит дата в формате ‘2025-12-31’. Преобразуйте эту дату в формат ’31/12/2025′.
Теперь, обращаясь к разным элементам массива по их ключам, сформируем нужную нам строку:
Задачи для решения
Работа с регистром символов
Дана строка ‘js’. Сделайте из нее строку ‘JS’.
Дана строка ‘JS’. Сделайте из нее строку ‘js’.
Работа с length, substr, substring, slice. Работа с indexOf
Дана строка ‘я учу javascript!’. Найдите количество символов в этой строке.
Дана строка ‘я учу javascript!’. Вырежите из нее слово ‘учу’ и слово ‘javascript’ тремя разными способами (через substr, substring, slice).
Дана строка ‘я учу javascript!’. Найдите позицию подстроки ‘учу’.
Дана переменная str, в которой хранится какой-либо текст. Реализуйте обрезание длинного текста по следующему принципу: если количество символов этого текста больше заданного в переменной n, то в переменную result запишем первые n символов строки str и добавим в конец троеточие ‘. ‘. В противном случае в переменную result запишем содержимое переменной str.
Работа с replace
Дана строка ‘Я-учу-javascript!’. Замените все дефисы на ‘!’ с помощью глобального поиска и замены.
Работа с split
Дана строка ‘я учу javascript!’. С помощью метода split запишите каждое слово этой строки в отдельный элемент массива.
Дана строка ‘я учу javascript!’. С помощью метода split запишите каждый символ этой строки в отдельный элемент массива.
В переменной date лежит дата в формате ‘2025-12-31’. Преобразуйте эту дату в формат ‘31.12.2025’.
Работа с join
Дан массив [‘я’, ‘учу’, ‘javascript’, ‘!’]. С помощью метода join преобразуйте массив в строку ‘я+учу+javascript+!’.
Задачи
Преобразуйте первую букву строки в верхний регистр.
Преобразуйте первую букву каждого слова строки в верхний регистр.
Преобразуйте строку ‘var_test_text’ в ‘varTestText’. Скрипт, конечно же, должен работать с любыми аналогичными строками.
Работа с таймерами в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
В данном уроке мы научимся работать с таймерами в JavaScript. Разобравшись с таймерами, вы сможете автоматически выполнять на странице какие-либо операции через заданный промежуток времени. К примеру, можно будет сделать слайдер картинок, в котором картинки будут меняться каждую секунду.
Для работы с таймерами в JavaScript используется метод setInterval, который запускает заданный код через определенные промежутки времени.
Метод setInterval
Давайте рассмотрим нужный для этого код. Пусть у нас дан инпут. Будем каждую секунду увеличивать значение его атрибута value на единицу:
Это нужно, так как атрибут всегда отдает строку, даже если там хранится число, как у нас, то есть elem.value вернет ‘1’, а не 1 (в самом начале таймера, когда в атрибуте еще 1). И получится, что elem.value + 1 это ‘1’+1, что дает ’11’, а не 2).
Если же написать parseInt, то в инпуте будет сначала 1, потом 2, потом 3 и так далее.
Остановка таймера
Вы уже знаете, как запустить таймер, давайте теперь научимся его останавливать. Для этого используется метод clearInterval, который принимает уникальный номер того таймера (созданного через setInterval), который нужно остановить.
Давайте посмотрим откуда берется этот номер:
То есть при создание таймера через setInterval мы можем узнать его номер, и потом передать его методу clearInterval, чтобы таймер остановился.
Метод setTimeout
Следующий метод, который нам нужен, называется setTimeout. Он позволяет сделать задержку перед запуском кода (эта задержка случится только один раз и код выполнится только один раз, в отличии от setInterval).
Практика по ООП в JavaScript
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Реализуйте на ООП игру «алхимия». Пример такой игры смотрите тут или тут.
Реализуйте на ООП игру «bubble shooter». Пример такой игры смотрите тут.
Реализуйте на ООП игру «морской бой» против компьютера.
Реализуйте на ООП игру «жизнь». Это не совсем игра, смотрите описание тут.
Реализуйте на ООП игру шашки против компьютера.
Реализуйте на ООП программу-напоминалку. Как она должна работать: вы записываете в специальное поле какие-то события, о которых вам нужно напомнить и в нужное время вкладка браузера с этой программой должна напомнить об этом событии звуком (погуглите работу с аудио на js).
Работа с компонентами в фреймворке React
Учебник по React
Учебник Angular 1.5.8
Сейчас мы с вами будем разбираться с компонентами в фреймворке React. Компоненты представляют собой способ удобно реализовать ваш скрипт, разбить его на независимые блоки, каждый из которых имеет свою зону ответственности.
Компоненты
Взглянем на любой сайт. Он состоит из набора независимых блоков: хедер, сайдбары, футер, контент. Можно сказать, что эти блоки и есть компоненты в том смысле, в котором подразумевается в React.
Если посмотреть на тот же хедер, что в нем можно выделить блок с логотипом, блок контактов, блок с меню и так далее. То есть компоненты могут состоять из других подкомпонентов и так далее.
Каждый компонент представляет собой класс. Обычно разработка начинается с главного компонента App, который содержит в себе остальные.
У каждого компонента могут быть свои стейты и каждый компонент имеет метод render, который возвращает результат работы этого компонента.
Давайте для примера сделаем компонент User, в стейте которого записаны имя и фамилия юзера, а результатом рендеринга является абзац с этим данными:
Соберем все вместе и запустим:
Результатом работы этого кода будет следующее:
Пропсы
Давайте теперь сделаем так, чтобы имя и фамилия нашего юзера хранились не в самом компоненте, а получались им извне.
Для этого при подключении компонента необходимо добавить атрибуты name и surname, вот так:
Таким образом, с помощью атрибутов можно передавать данные из родительского компонента в дочерний.
Конструкцию this.props в обиходе называют пропсом (по-русски переводится как свойство).
Давайте соберем все вместе и запустим:
Результатом работы этого кода будет следующее:
Преимущества компонентов
Преимущества компонентов проявляются, когда мы хотим вывести на экран не одного, а нескольких юзеров.
Давайте реализуем это: с помощью нашего компонента User выведем на экран несколько юзеров:
Результатом работы этого кода будет следующее:
Давайте сделаем это:
Добавим стейты
Пусть теперь данные юзеров хранятся в стейте компонента App. Поправим наш код с соответствии с этим:
Если вы запустите этот код, то визуально ничего не поменяется, но данные будут браться уже из стейта компонента App.
Компоненты в цикле
В предыдущем примере мы использовали несколько экземпляров одного компонента, вот так:
Давайте теперь сделаем то же самое, но так, чтобы за нас это сделал цикл.
Немного изменим стейт с массивом юзеров, вот так:
Давайте теперь сделаем цикл, который переберет наш массив с юзерами из this.state.users и сделает несколько экземпляров компонента User:
Если вы запустите этот код, то визуально ничего не поменяется, но компоненты будут формироваться с помощью цикла.
Выводы
Компоненты позволяют разделить данные и способ их отображения на экране. Это удобно и позволяет упростить дальнейшую поддержку нашего кода.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Задачи на ООП в PHP. Часть 1
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Перед решением задач изучите теорию к данному уроку.
Задачи для решения
Работа с классами и объектами
Выведите на экран сумму зарплат Ивана и Васи. Выведите на экран сумму возрастов Ивана и Васи.
Создайте 2 объекта этого класса: ‘Иван’, возраст 25, зарплата 1000 и ‘Вася’, возраст 26, зарплата 2000.
Выведите на экран сумму зарплат Ивана и Васи. Выведите на экран сумму возрастов Ивана и Васи.
На __construct
Создайте объект этого класса ‘Дима’, возраст 25, зарплата 1000. Выведите на экран произведение его возраста и зарплаты.
Наследование
Сделайте класс Worker, который наследует от класса User и вносит дополнительное private поле salary (зарплата), а также методы public getSalary и setSalary.
Создайте объект этого класса ‘Иван’, возраст 25, зарплата 1000. Создайте второй объект этого класса ‘Вася’, возраст 26, зарплата 2000. Найдите сумму зарплата Ивана и Васи.
Сделайте класс Student, который наследует от класса User и вносит дополнительные private поля стипендия, курс, а также геттеры и сеттеры для них.
Сделайте класс Driver (Водитель), который будет наследоваться от класса Worker из предыдущей задачи. Этот метод должен вносить следующие private поля: водительский стаж, категория вождения (A, B, C).
Практика
Передаваемые атрибуты могут быть любыми:
Для решения задачи сделайте private метод, который параметром будет принимать массив, например, [‘type’=>’text’, ‘value’=>’. ‘] и делать из него строку с атрибутами, в нашем случае type=»text» value=». «.
Пример создания формы с помощью нашего класса:
В результате получится следующая форма:
Создайте класс SmartForm, который будет наследовать от Form из предыдущей задачи и сохранять значения инпутов и textarea после отправки.
Сессия должна стартовать (session_start) в методе __construct.
Реализуйте класс Flash, который будет использовать внутри себя класс Session из предыдущей задачи (именно использовать, а не наследовать).
Этот класс будет использоваться для сохранения сообщений в сессию и вывода их из сессии. Зачем это нужно: такой класс часто используется для форм. Например на одной странице пользователь отправляет форму, мы сохраняем в сессию сообщение об успешной отправке, редиректим пользователя на другую страницу и там показываем сообщение из сессии.
Создайте класс-оболочку Db над базами данных. Класс должен иметь следующие методы: получение данных, удаление данных, редактирование данных, подсчет данных, очистка таблицы, очистка таблиц.
Создайте класс Log для ведения логов. Этот класс должен иметь следующие методы: сохранить в лог, получить последние N записей, очистить таблицу с логами.
Класс Log должен использовать класс Db из предыдущей задачи (именно использовать, а не наследовать).
Продвинутая работа с пользовательскими функциями
Учебник JavaScript
Практика
Работа с DOM
Практика
Некоторые продвинутые вещи
Рекомендованное ES6
Некоторые видео могут забегать вперед, тк к этому месту учебника мы прошли еще не весь ES6. Просто пропускайте такие видео, посмотрите потом.
Регулярки
Разное
Работа с канвасом
Практика
Контекст
Drag-and-Drop
Практика по ООП
Ваша задача: посмотрите, попробуйте повторить.
Практика
Promise ES6
Библиотека jQuery
Тк. jQuery устаревает, объявляю эти уроки не обязательными и выношу в конец учебника (так по уровню уроки середины учебника, если что). В перспективе переедет в отдельный учебник по jq.
Сейчас мы с вами разберем некоторые продвинутые вещи при работе с пользовательскими функциями, а именно: значения по умолчанию, область видимости, рекурсию.
Значения по умолчанию
Пусть у нас есть функция, которая возводит число в квадрат:
Давайте с ее помощью возведем в квадрат число 3:
Эту особенность можно использовать для указания значений по умолчанию. Под ним понимается следующее: если параметр не передан, то вместо него возьмется заданное значение.
Давайте сделаем так, чтобы, если мы не передали параметр num, то по умолчанию бралось значение 3. То есть мы хотим, чтобы функция работала так:
Второй способ заключается в использовании логического ||, работу с которым мы разбирали в уроке приемы работы с логическими значениями:
Второй способ считает, что параметр отсутствует, если передана пустая строка, 0, или вообще любое значение, которое в логическом контексте является false.
В функцию можно передавать несколько параметров и часть из них (с конца) сделать необязательными, присвоив им значение по умолчанию:
Область видимости переменных
В программировании существует такое понятие как область видимости переменной. Оно обозначает те места кода, в которых переменная имеет то значение, которое мы ей присвоили.
В следующем примере переменная внутри функции не видна снаружи, она является локальной внутри функции:
А сейчас та переменная test, которая находится вне функции, это не та переменная test, которая находится внутри нее:
Сейчас мы забыли написать var внутри функции и случайно затерли глобальную переменную (такая особенность может привести к трудноуловимым ошибкам, поэтому всегда ставьте var):
Еще раз напомню: переменная внутри функции не видна снаружи:
А теперь мы забыли написать var перед переменной и она видна снаружи:
Строгий режим
Забыв поставить var, можно случайно затереть глобальную переменную, что является источником трудноуловимых ошибок. Поэтому рекомендуется включать так называемый строгий режим командой ‘use strict’;, которая пишется в начале скрипта.
В следующем примере мы забыли поставить var и затерли глобальную переменную test:
А если включить строгий режим, то скрипт просто выдаст ошибку, которую мы сможем заметить в консоли:
Глобальные переменные через window
Давайте еще раз поговорим про глобальные переменные: все переменные, написанные вне функций, являются глобальными, то есть потенциально видны в любом месте.
Однако, это еще не все: все глобальные переменные являются свойствами объекта window:
Такую особенность можно использовать для обмена данными между функциями:
Если не вызывать первую функцию, то код window.test = ‘Тест!’ не сработает (он срабатывает только в момент вызова func1()):
Рекурсия
Посмотрите также новый видеоурок на рекурсию, там этот материал раскрыт подробнее: https://youtu.be/-2RiM6tRk-Q
Давайте разберемся с этим понятием на следующем примере: выведем все элементы массива с конца с помощью рекурсии (для примера, цикл тут эффективнее).
Для этого мы будем использовать метод pop, который забирает из массива последний элемент (массив при этом уменьшается). Затем будем проверять, осталось ли что в массиве с помощью empty.
Если осталось, опять запускаем эту же функцию last, которая забирает последний элемент, проверяет осталось ли что в массиве и запускает саму себя при необходимости:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Источники:
- http://old.code.mu/tasks/css/rabota-s-animaciej-na-css.html
- http://old.code.mu/tasks/javascript/practice/praktika-javascript-dlya-novichkov.html
- http://old.code.mu/books/javascript/base/osnovy-yazyka-javascript-dlya-novichkov.html
- http://old.code.mu/books/javascript/jquery/
- http://old.code.mu/books/php/base/osnovy-yazyka-php-dlya-novichkov.html
- http://old.code.mu/tasks/php/base/osnovy-yazyka-php-dlya-novichkov.html
- http://old.code.mu/books/javascript/oop/
- http://old.code.mu/books/css/rabota-s-html-tablicami-dlya-novichkov.html
- http://old.code.mu/tasks/javascript/base/osnovy-yazyka-javascript-dlya-novichkov.html
- http://old.code.mu/books/php/sql/
- http://old.code.mu/books/advanced/javascript/react/
- http://old.code.mu/tasks/css/rabota-s-osnovnymi-html-tegami-i-atributami-dlya-novichkov.html
- http://old.code.mu/books/javascript/dom/raznye-poleznye-temy-javascript.html
- http://old.code.mu/books/css/rabota-s-osnovnymi-html-tegami-i-atributami-dlya-novichkov.html
- http://old.code.mu/books/javascript/dom/osnovy-raboty-s-dom-v-javascript.html
- http://old.code.mu/books/javascript/base/osnovy-raboty-s-massivami-i-objektami-v-javascript.html
- http://old.code.mu/books/php/base/osnovy-raboty-s-massivami-v-php.html
- http://old.code.mu/books/css/rabota-s-prodvinutymi-svojstvami-css.html
- http://old.code.mu/books/php/oop/osnovy-raboty-s-objektno-orientirovannym-programmirovaniem-v-php-1.html
- http://old.code.mu/books/php/base/rabota-s-datami-v-php.html
- http://old.code.mu/tasks/css/pozicionirovanie-elementov-na-css.html
- http://old.code.mu/books/css/osnovnye-css-svojstva-dlya-novichkov.html
- http://old.code.mu/books/advanced/php/parsing/rabota-s-xml-v-php.html
- http://old.code.mu/tasks/javascript/practice/miniproekty-javascript-dlya-novichkov.html
- http://old.code.mu/tasks/css/praktika-po-sozdaniyu-gorizontalnyh-i-vertikalnyh-menyushek.html
- http://old.code.mu/books/javascript/advanced/prodvinutaya-rabota-s-funkciyami-javascript.html
- http://old.code.mu/tasks/php/sql/prodvinutye-sql-zaprosy.html
- http://old.code.mu/books/css/osnovy-raboty-s-selektorami-css-dlya-novichkov.html
- http://old.code.mu/tasks/javascript/dom/rabota-s-elementami-stranicy-v-javascript.html
- http://old.code.mu/jquery/html.html
- http://old.code.mu/books/javascript/base/priemy-raboty-s-massivami-na-javascript.html
- http://old.code.mu/tasks/javascript/dom/osnovy-raboty-s-dom-v-javascript.html
- http://old.code.mu/books/php/base/rabota-s-konstrukciyami-if-else-switch-case-v-php.html
- http://old.code.mu/books/css/osnovy-raboty-s-yazykom-less-dlya-novichkov.html
- http://old.code.mu/tasks/javascript/base/osnovy-raboty-s-massivami-i-objektami-v-javascript.html
- http://old.code.mu/jquery/before.html
- http://old.code.mu/books/javascript/jquery/osnovy-raboty-s-jquery.html
- http://old.code.mu/books/css/gruppirovka-yacheek-html-tablic-dlya-novichkov.html
- http://old.code.mu/books/javascript/regular/rabota-s-regulyarnymi-vyrazeniyami-v-javascript-glava-1.html
- http://old.code.mu/books/javascript/dom/prodvinutaya-rabota-s-objektom-event-na-javascript.html
- http://old.code.mu/jquery/parent.html
- http://old.code.mu/books/css/osnovy-raboty-so-ssylkami-i-granicami-cherez-css-dlya-novichkov.html
- http://old.code.mu/books/javascript/jquery/manipulirovanie-elementami-stranicy-cherez-jquery.html
- http://old.code.mu/jquery/prop.html
- http://old.code.mu/books/php/auth/avtorizaciya-cherez-bazy-dannyh-na-php.html
- http://old.code.mu/sql/union.html
- http://old.code.mu/books/css/problemy-krossbrauzernosti-html-i-css.html
- http://old.code.mu/tasks/php/base/osnovy-raboty-s-massivami-v-php.html
- http://old.code.mu/books/php/base/rabota-s-ciklami-foreach-for-while-v-php.html
- http://old.code.mu/books/php/auth/avtorizaciya-cherez-fajly-na-php.html
- http://old.code.mu/tasks/css/rabota-s-html-formami-dlya-novichkov.html
- http://old.code.mu/tasks/php/regular/rabota-s-regulyarnymi-vyrazeniyami-v-php-glava-1.html
- http://old.code.mu/books/javascript/base/pravilnoe-ispolzovanie-polzovatelskih-funkcij-javascript.html
- http://old.code.mu/books/php/sql/nekotorye-prodvinutye-komandy-sql.html
- http://old.code.mu/books/javascript/base/rabota-s-ciklami-for-i-while-v-javascript.html
- http://old.code.mu/tasks/css/rabota-s-psevdoklassami-i-psevdoelementami-css.html
- http://old.code.mu/books/javascript/advanced/rabota-s-kuki-v-javascript.html
- http://old.code.mu/trainings/2/delegirovanie-sobytij-na-javascript.html
- http://old.code.mu/books/javascript/dom/rabota-s-elementami-stranicy-v-javascript.html
- http://old.code.mu/books/php/auth/registraciya-i-avtorizaciya-polzovatelej-na-php.html
- http://qna.habr.com/q/724237?from=questions_similar
- http://old.code.mu/tasks/javascript/base/priemy-raboty-s-ciklami-na-javascript.html
- http://old.code.mu/tasks/javascript/base/rabota-s-matematicheskimi-funkciyami-v-javascript.html
- http://old.code.mu/tasks/css/rabota-s-prodvinutymi-svojstvami-css.html
- http://old.code.mu/tasks/javascript/base/rabota-s-konstrukciyami-if-else-switch-case-v-javascript.html
- http://old.code.mu/tasks/javascript/dom/rabota-s-tajmerami-v-javascript.html
- http://old.code.mu/books/javascript/dom/rabota-s-metrikami-na-javascript.html
- http://old.code.mu/tasks/javascript/practice/praktika-na-otrabotku-ciklov-i-funkcij-javascript.html
- http://old.code.mu/tasks/css/osnovy-raboty-s-selektorami-css-dlya-novichkov.html
- http://old.code.mu/books/javascript/base/rabota-s-konstrukciyami-if-else-switch-case-v-javascript.html
- http://old.code.mu/tasks/php/practice/praktika-na-otrabotku-ciklov-i-funkcij-php.html
- http://old.code.mu/tasks/php/base/praktika-na-kombinacii-standartnyh-funkcij-php.html
- http://old.code.mu/books/php/base/osnovy-raboty-s-polzovatelskimi-funkciyami-v-php.html
- http://old.code.mu/books/javascript/jquery/rabota-s-naborom-elementov-jquery.html
- http://old.code.mu/tasks/javascript/base/rabota-so-strokovymi-funkciyami-v-javascript.html
- http://old.code.mu/books/javascript/dom/rabota-s-tajmerami-v-javascript.html
- http://old.code.mu/tasks/javascript/oop/praktika-po-oop-v-javascript.html
- http://old.code.mu/books/advanced/javascript/react/rabota-s-komponentami-v-frejmvorke-react.html
- http://old.code.mu/tasks/php/oop/osnovy-raboty-s-objektno-orientirovannym-programmirovaniem-v-php-1.html
- http://old.code.mu/books/javascript/base/prodvinutaya-rabota-s-polzovatelskimi-funkciyami-v-javascript.html
- Okayceci feel u перевод
- Old world blues fallout new vegas