Руководство по HTML/CSS/JavaScript
Правила и руководства оформления, форматирования HTML, СSS и JavaScript кода. Его цель — повысить качество кода и облегчить совместную работу и поддержку инфраструктуры.
От переводчика
Приветствую всех снова, меня зовут Максим Иванов, и сегодня я подготовил перевод, который, возможно, окажется для вас полезным. Бенджамин Де Кук (Benjamin De Cock), разработчик из Бельгии, собрал некоторые указания по оформлению кода, которые позиционируют себя как лучшие практики по написанию HTML, CSS, JS. Конечно, существует множество рекомендаций, например, есть хороший гайдлайн от Google, наверное, есть еще что-то, однако, если следовать хотя бы некоторым из них, то можно надеяться, что ваш код станет лучше. В отдельных случаях следование этим гайдлайнам не полезно, а совсем наоборот. В общем и целом, все зависит от вашего опыта и виденья дела, если вы новичок, то скорее вам будет полезно оценить то, что пишут другие и в обществе считается верным, если вы гуру, то наверное вам и не нужны гайдлайны, которые написаны непонятно кем на ваш взгляд. Итак, приступим.
HTML
CSS
- Точка с запятой
- Блочная модель
- Потоки
- Позиционирование
- Селекторы
- Специфичность
- Переопределения
- Наследование
- Лаконичность
- Англоязычные обозначения
- Вендорные префиксы
- Анимация
- Единицы измерения
- Цветовая модель
- Отрисовка
- Хаки
JavaScript
- Производительность
- Независимость от внешнего состояния
- Нативность
- Принудительное сравнение
- Циклы
- Аргументы
- Использование метода apply
- Использование метода bind
- Методы высшего порядка
- Композиции
- Кэширование
- Переменные
- Условия
- Итератор
- Объект как ассоциативный массив
- Каррирование
- Читабельность
- Повторное использование кода
- Зависимости
HTML
Семантика
HTML5 предоставляет нам достаточное количество элементов, направленных на точное семантическое описание документа или содержимого. Поэтому, убедитесь в том, что у вас все хорошо с лексикой.
Blog post
Published: 21st Feb, 2015
…
Blog post
Published:
…
Убедитесь, что вы поняли семантику элементов, которые вы используете в своем коде. Очень плохо использовать семантические элементы не по назначению или не в том месте, если бы вы просто оставались нейтральными к этим этим семантическим элементам.
Лаконичность
Старайтесь кратко писать код. Забудьте о своих старых привычках, перетекающих из XHTML.
Contact Contact me
Contact Contact me
Читабельность
Читабельность вашего кода не должна иметь второстепенный характер. Конечно, вы не обязаны быть экспертом по оптимизации (WCAG) для того, чтобы наверняка улучшить свой сайт, однако, уже прямо сейчас вы можете начать немедленно исправлять мелочи, которые в итоге помогут сделать ваш код лучше, например:
— использовать атрибут alt правильно
— связывайте имена (links) и элементы (buttons) и называйте их по смыслу ( — это зверство)
— не полагайтесь на название цветов, в качестве информации
— явно связывайте определенной меткой и элемент формы
Язык документа
Определении языка и кодировки символов не является обязательным, однако рекомендуется всегда объявлять их на уровне документа, даже если они указаны в заголовках HTTP. Приоритетной кодировкой символов является UTF-8.
Привет, мир. Привет, мир.
Эффективность
Если нет уважительных причин добавлять загрузку скриптов до контента, старайтесь прописывать скрипты в конце документа, тем самым ваши скрипты не будут блокировать рендеринг страницы. Если у вас очень тяжелые таблицы стилей, старайтесь разбить их на несколько и загружать по отдельности, так чтобы первичный контент был сразу отрисован. Очевидно, чем больше файлов, тем больше HTTP запросов, два запроса, конечно, медленнее, чем один, но в нашем случае, важным фактором будет являться скорость отображения нужного контента.
Hello, world. .
Hello, world. .
CSS
Точка с запятой
В то время как точка с запятой является чисто технически разделителем правил, CSS всегда относится к точке запятой, как к оператору завершения.
/* плохо */ div < color: red >/* хорошо */ div
Box model
Блочная модель, в идеале, должно быть одинаковой для всего документа. Глобальное правило * это нормально, однако нужно помнить, что вы не можете изменить блочную модель у специфичных элементов.
/* плохо */ div < width: 100%; padding: 10px; box-sizing: border-box; >/* хорошо */ div
Потоки
Не меняйте стандартное поведение элемента, если вы можете обойтись без этого. Сохраняйте элементы в их классическом отображении в потоке документа. Например, удаление пробелов под изображением, не должно влиять на его отображение.
/* плохо */ img < display: block; >/* хорошо */ img
Аналогично, не вытаскивайте из основного потока элементы, если вы можете обойтись без этого.
/* плохо */ div < width: 100px; position: absolute; right: 0; >/* хорошо */ div
Позиционирование
Существует множество способов позиционирования элементов в CSS, однако старайтесь ограничивать себя свойствами представленными ниже. В порядке предпочтения:
display: block; display: flex; position: relative; position: sticky; position: absolute; position: fixed;
Селекторы
Минимизируйте сочетания селекторов связанных с DOM. Иногда, лучше добавить лишний класс элементу, который вы хотите найти, чем искать его через три структурных селектора: псевдо-класс, потомок, комбинатор.
/* плохо */ div:first-of-type :last-child > p ~ * /* хорошо */ div:first-of-type .info
Избегайте перегрузку селекторов.
/* плохо */ img[src$=svg], ul > li:first-child < opacity: 0; >/* хорошо */ [src$=svg], ul > :first-child
Специфичность
Не используйте значения и селекторы, которые нельзя переопределить. Минимизируйте использование id (идентификаторов) и избегайте правило !important
/* плохо */ .bar < color: green !important; >.foo < color: red; >/* хорошо */ .foo < color: red; >.foo.bar
Переопределения
Переопределение стилей селекторов затрудняет отладку. Избегайте этого, если можете.
/* плохо */ li < visibility: hidden; >li:first-child < visibility: visible; >/* хорошо */ li + li
Наследование
Не дублируйте определения селекторов, стили которых и так могут передаваться по наследству.
/* плохо */ div h1, div p < text-shadow: 0 1px 0 #fff; >/* хорошо */ div
Лаконичность
Пусть ваш код будет немногословным. Старайтесь избегать использование несколько свойств в том месте, где это вовсе не нужно.
/* плохо */ div < transition: all 1s; top: 50%; margin-top: -10px; padding-top: 5px; padding-right: 10px; padding-bottom: 20px; padding-left: 10px; >/* хорошо */ div
Англоязычные обозначения
Предпочтительно использовать английскую математику.
/* плохо */ :nth-child(2n + 1) < transform: rotate(360deg); >/* хорошо */ :nth-child(odd)
Вендорные префиксы
Не используйте устаревшие префиксы. Если вам действительно необходимо использовать их, в этом случае, добавляйте их перед стандартными.
/* плохо */ div < transform: scale(2); -webkit-transform: scale(2); -moz-transform: scale(2); -ms-transform: scale(2); transition: 1s; -webkit-transition: 1s; -moz-transition: 1s; -ms-transition: 1s; >/* хорошо */ div
Анимация
Иногда предпочтительнее использовать переходы (transitions), нежели анимацию (animations). Избегайте анимирование свойств в пользу opacity и transform.
/* плохо */ div:hover < animation: move 1s forwards; >@keyframes move < 100% < margin-left: 100px; >> /* хорошо */ div:hover
Единицы измерения
Используйте безразмерные значения. Старайтесь использовать rem, если вы рассчитываете все в относительных единицах. Предпочтительно использовать секунды, а не миллисекунды.
/* плохо */ div < margin: 0px; font-size: .9em; line-height: 22px; transition: 500ms; >/* хорошо */ div
Цветовая модель
Если нужна прозрачность, использовать rgba. В противном случае, всегда используйте шестнадцатеричный формат.
/* плохо */ div < color: hsl(103, 54%, 43%); >/* хорошо */ div
Отрисовка
Избегайте http-запросов, если ресурс легко воспроизводится с помощью CSS.
/* плохо */ div::before < content: url(white-circle.svg); >/* хорошо */ div::before
Хаки
Не используйте их.
/* плохо */ div < // position: relative; transform: translateZ(0); >/* хорошо */ div < /* position: relative; */ will-change: transform; >
JavaScript
Производительность
Легкочитаемый, выразительный и правильный код важнее производительности. На самом деле, JavaScript никогда не будет вашим узким местом в расчете на производительность. Лучше уделять внимание таким вещам, как сжатие изображений, оптимизация http-запросов и доступа к сети, перерасчет DOM-дерева. Если вы запомните хотя бы одну из рекомендаций в данной статье, опирайтесь на нее.
/* плохо (хотя и намного быстрее) */ const arr = [1, 2, 3, 4]; const len = arr.length; var i = -1; var result = []; while (++i < len) < var n = arr[i]; if (n % 2 >0) continue; result.push(n * n); > /* хорошо */ const arr = [1, 2, 3, 4]; const isEven = n => n % 2 == 0; // инициализация анонимной стрелочной функции const square = n => n * n; // синтаксис: (param1, param2, …, paramN) => expression const result = arr.filter(isEven).map(square);
Независимость от внешнего состояния
Старайтесь создавать свободные функции. Все функции и методы в идеале не должны нести никакого побочного характера, зависеть от внешних данных, и в итоге, они должны возвращать новые объекты, а не вносить изменения в существующие.
/* плохо */ const merge = (target, . sources) => Object.assign(target, . sources); merge(< foo: "foo" >, < bar: "bar" >); // => < foo: "foo", bar: "bar" >/* хорошо */ const merge = (. sources) => Object.assign(<>, . sources); merge(< foo: "foo" >, < bar: "bar" >); // =>
К прочтению:
1. Babeljs (пример в ES5): плохо vs хорошо
2. Остаточные параметры
Нативность
Полагайтесь на стандартные методы, как можно больше.
/* плохо */ const toArray = obj => [].slice.call(obj); /* хорошо */ const toArray = (() => Array.from ? Array.from : obj => [].slice.call(obj) )();
Принудительное сравнение
Лишние сравнения не имеют смысл, избегайте их.
/* плохо */ if (x === undefined || x === null) < /* . */ >/* хорошо */ if (x == undefined) < /* . */ >
Циклы
Не используйте циклы, так как они заставляют вас использовать изменяемые объекты. Полагайтесь на методы Array.prototype.
/* плохо */ const sum = arr => < var sum = 0; var i = -1; for (;arr[++i];) < sum += arr[i]; >return sum; >; sum([1, 2, 3]); // => 6 /* хорошо */ const sum = arr => arr.reduce((x, y) => x + y); sum([1, 2, 3]); // => 6
Если вы не можете использовать методы Array.prototype, используйте рекурсию.
/* плохо */ const createDivs = howMany => "); > >; createDivs(5); /* плохо */ const createDivs = howMany => [. Array(howMany)].forEach(() => document.body.insertAdjacentHTML("beforeend", " ") ); createDivs(5); /* хорошо */ const createDivs = howMany => "); return createDivs(howMany - 1); >; createDivs(5);
Вот общая функция Loop, делающая рекурсию проще в использовании.
Аргументы
Забудьте об arguments как об объекте. Остаточные параметры это всегда лучший вариант, потому что:
1. Передаваемое имя дает лучшее представление о том, что ожидает функция на входе
2. Остаточный параметр — это массив и он легок в использовании
/* плохо */ const sortNumbers = () => Array.prototype.slice.call(arguments).sort(); /* хорошо */ const sortNumbers = (. numbers) => numbers.sort();
К прочтению:
1. Babeljs (пример в ES5): плохо vs хорошо
2. Доступ к аргументам
Использование метода apply
Забудьте метода apply(). Вместо этого используйте оператор распространения (вызова функции).
const greet = (first, last) => `Hi $ $`; const person = ["John", "Doe"]; /* плохо */ greet.apply(null, person); /* хорошо */ greet(. person);
Использование метода bind
Не используйте bind(), когда есть более идиоматические подходы.
/* плохо */ ["foo", "bar"].forEach(func.bind(this)); /* хорошо */ ["foo", "bar"].forEach(func, this);
/* плохо */ const person = < first: "John", last: "Doe", greet() < const full = function() < return `$$`; >.bind(this); return `Hello $`; > > /* хорошо */ const person = < first: "John", last: "Doe", greet() < const full = () =>`$ $`; return `Hello $`; > >
К прочтению:
1. Babeljs (пример в ES5): плохо vs хорошо
2. bind(), а также итераторы в JavaScript
Методы высшего порядка
Избегайте вложенных функций там где это не нужно.
/* плохо */ const result = [1, 2, 3].map(num => String(num)); // => ["1", "2", "3"] /* хорошо */ const result = [1, 2, 3].map(String); // Приведение всех элементов к типу string
Композиции
Избегайте несколько вложенных вызовов функций. Используйте вместо них композицию.
const plus1 = a => a + 1; const mult2 = a => a * 2; /* плохо */ mult2(plus1(5)); // => 12 /* хорошо */ const pipeline = (. funcs) => val => funcs.reduce((a, b) => b(a), val); const addThenMult = pipeline(plus1, mult2); addThenMult(5); // => 12
К прочтению:
1. Babeljs (пример в ES5): плохо vs хорошо
Кеширование
Дорогостоящие операции с большими структурами данных непростительны, если вы не кешируете их.
/* плохо */ const contains = (arr, value) => Array.prototype.includes ? arr.includes(value) : arr.some(el => el === value); contains(["foo", "bar"], "baz"); // => false /* хорошо */ const contains = (() => Array.prototype.includes ? (arr, value) => arr.includes(value) : (arr, value) => arr.some(el => el === value) )(); contains(["foo", "bar"], "baz"); // => false
Переменные
Используйте const вместо let и let вместо var.
/* плохо */ var me = new Map(); me.set("name", "Ben").set("country", "Belgium"); /* хорошо */ const me = new Map(); me.set("name", "Ben").set("country", "Belgium");
Условия
Будьте привержены концепции IIFE’s (немедленно выполняемый функтор), используйте возвращаемые значения в условиях (if, else if, else и switch).
/* плохо */ var grade, result = 50; if (result < 50) grade = "bad"; else if (result < 90) grade = "good"; else grade = "excellent"; // grade = "good"; /* хорошо */ let result = 50; const grade = (() =>< if (result < 50) return "bad"; if (result < 90) return "good"; return "excellent"; >)(); // grade = "good";
Итераторы
Избегайте цикл перебора for. in
const shared = < foo: "foo" >; const obj = Object.create(shared, < bar: < value: "bar", enumerable: true >>); /* плохо */ for (var prop in obj) < if (obj.hasOwnProperty(prop)) console.log(prop); // =>bar > /* хорошо */ Object.keys(obj).forEach(prop => console.log(prop));
Разница между циклом и методом в том, что цикл перечисляет свойства и из цепочки прототипов.
Объект как ассоциативный массив
В то время как объекты можно законно использовать, как правило, ассоциативный массив (Map) лучше и мощнее. Если сомневаетесь, тогда точно используйте Map.
/* плохо */ const me = < name: "Ben", age: 30 >; var meSize = Object.keys(me).length; meSize; // => 2 me.country = "Belgium"; // можно meSize++; meSize; // => 3 /* хорошо */ const me = new Map(); me.set("name", "Ben"); me.set("age", 30); me.size; // => 2 me.set("country", "Belgium"); me.size; // => 3
Каррирование
Каррирование является мощной, но в свою очередь чужеродной парадигмой для многих разработчиков. Не злоупотребляйте.
/* плохо */ const sum = a => b => a + b; sum(5)(3); // => 8 /* хорошо */ const sum = (a, b) => a + b; sum(5, 3); // => 8
К прочтению:
1. Babeljs (пример в ES5): плохо vs хорошо
2. Каррирование и примеры
Читабельность
Не скрывайте намерения вашего кода, используя умные трюки.
/* плохо */ foo || doSomething(); /* плохо */ void function() < /* IIFE */ >(); /* плохо */ const n = ~~3.14; /* хорошо */ if (!foo) doSomething(); /* хорошо */ (function() < /* IIFE */ >()); /* хорошо */ const n = Math.floor(3.14);
Повторное использование кода
Не бойтесь создавать много мелких и многоразовых функций, они очень полезны.
/* плохо */ let last = arr[arr.length - 1]; /* плохо */ const product = (a, b) => a * b; const triple = n => n * 3; /* хорошо */ const first = arr => arr[0]; // => first(arr); const last = arr => first(arr.slice(-1)); // => last(arr); /* хорошо */ const product = (a, b) => a * b; const triple = product.bind(null, 3);
К прочтению:
1. Babeljs (пример в ES5): плохо vs хорошо
Зависимости
Минимизируйте зависимости стороннего кода, если вы не в курсе как он работает. Не нужно загружать всю библиотеку ради нескольких методов, которые легко воспроизводимы:
/* плохо */ var _ = require("underscore"); _.compact(["foo", 0])); _.unique(["foo", "foo"]); _.union(["foo"], ["bar"], ["foo"]); /* хорошо */ const compact = arr => arr.filter(el => el); const unique = arr => [. Set(arr)]; const union = (. arr) => unique([].concat(. arr)); compact(["foo", 0]); unique(["foo", "foo"]); union(["foo"], ["bar"], ["foo"]);
К прочтению:
1. Babeljs (пример в ES5): плохо vs хорошо
2. Путь JavaScript модуля и документация по библиотеке Underscore
JavaScript
JavaScript — это язык программирования, который даёт возможность реализовывать сложное поведение веб-страницы. Каждый раз, когда вы видите веб-страницу, она не только отображает статическое содержимое, но и делает большее — своевременно отображает обновление контента, выводит интерактивные карты, 2D/3D анимацию, прокручивает видео и т.д. — будьте уверены, здесь не обошлось без JavaScript.
Учебный план
Считается, что JavaScript сложнее изучить, чем связанные с ним технологии, наподобие HTML и CSS. Поэтому, перед изучением JavaScript, настоятельно рекомендуем сначала ознакомиться хотя бы с этими двумя технологиями. Начните с проработки следующих модулей:
- Начало работы с Веб
- Введение в HTML
- Введение в CSS
Имеющийся опыт программирования на других языках также может помочь в обучении.
После изучения основ JavaScript вы будете готовы к ознакомлению с более сложными темами, например:
- Углублённый курс JavaScript, изложенный в нашем Руководстве по JavaScript
- Программный интерфейс WebAPI
Модули
Этот раздел содержит следующие модули, проходить которые рекомендуется в порядке перечисления.
В нашем первом модуле, посвящённом JavaScript, мы сначала ответим на несколько главных вопросов, таких, как «Что такое JavaScript?», «На что он похож?» и «Что с его помощью можно сделать?», а затем перейдём к практике — расскажем, как писать и выполнять код на JavaScript. После чего подробнее рассмотрим некоторые ключевые конструкции JavaScript: переменные, строки, числа и массивы.
В этом модуле мы продолжим изучение главных составных частей JavaScript и обратим внимание на повсеместно встречающиеся типы конструкций: условные операторы, циклы, функции и события. В ходе обучения вы уже сталкивались с ними, но только мимоходом. Теперь мы поговорим именно о них.
Практически всё, что встречается в JavaScript, является объектом. Начиная с таких ключевых конструкций, как строки и массивы, и заканчивая интерфейсом взаимодействия с браузером, который построен поверх JavaScript. Вы даже можете создавать собственные объекты, заключая взаимосвязанные функции и переменные в готовые пакеты. Если вы хотите продолжить изучение языка и писать более эффективный код, то очень важно понять объектно-ориентированную природу JavaScript. Чтобы помочь вам в этом, мы представляем этот модуль. В нем мы подробно рассматриваем основы и синтаксис ООП (объектно-ориентированного программирования), показываем, как создавать свои объекты, и объясняем, что такое данные в формате JSON и как с ними работать.
При написании клиентского JavaScript для сайтов или приложений вы не обойдётесь без использования API — то есть интерфейсов для работы с различными функциями браузера или операционной системы, на которой работает сайт, или даже для работы с данными, получаемыми с других сайтов или сервисов. В этом модуле мы изучим, какие это API и как использовать некоторые наиболее распространённые API, которые вам будут часто попадаться во время разработки.
Решение общих проблем на JavaScript
Статья Использование JavaScript для решения общих проблем предоставляет ссылки к секциям контента, раскрывающих суть того, как использовать JavaScript для решения очень часто встречающихся проблем при создании веб-страницы.
Смотрите также
Главная точка входа к ядру JavaScript-документации на MDN — то место, где вы найдёте обширную справочную документация по всем аспектам языка JavaScript, и некоторые продвинутые учебники для опытных JavaScript-разработчиков.
Отличный ресурс для начинающих веб-разработчиков — изучайте JavaScript в интерактивной среде, с короткими уроками и интерактивными тестами с автоматизированной оценкой. Первые 40 уроков бесплатно, а полный курс доступен за небольшую разовую плату.
Изучайте JavaScript бесплатно с курсом с открытым исходным кодом EXLskills, который знакомит вас со всем необходимым, чтобы начать создавать приложения в JS.
Великолепная серия видеоуроков по математике от Keith Peters, которую необходимо понимать каждому эффективному программисту
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 3 авг. 2023 г. by MDN contributors.
Как писать в css js
Вставляет код JavaScript на страницу или подключает внешние файлы скриптов.
Время чтения: меньше 5 мин
Открыть/закрыть навигацию по статье
- Кратко
- Пример
- Как понять
- Как пишется
- Атрибуты
- Подсказки
- Ещё примеры
- На практике
- Алёна Батицкая советует
- Почему принято размещать со стилями внутри , а перед закрывающим тегом








