{"componentChunkName":"component---src-templates-post-js","path":"/html-css/rukovodstvo-po-rabote-s-peremennimy-v-css/","result":{"pageContext":{"slug":"rukovodstvo-po-rabote-s-peremennimy-v-css","content":"\n<p>В этой статье вы узнаете основы применения переменных в CSS, их области использования, ограничения и нюансы взаимодействия с JavaScript, включая интерактивные примеры.</p>\n\n\n\n<p class=\"author\"><em>Эта статья является переводом —&nbsp;</em><a href=\"https://nearsoft.com/blog/css-variables-guide/\"><em>CSS Variables Guide</em></a></p>\n\n\n\n<p id=\"91d5\">Итак, откройте свой Codepen с нового проекта, чтобы быть готовым всё лично протестировать и пощупать.</p>\n\n\n\n<p id=\"5b83\">Практически все языки программирования поддерживают переменные, но не CSS. Изначально он их и не поддерживал, нууу, до этого момента.</p>\n\n\n\n<p id=\"0e71\">На самом деле, это скорее кастомные CSS свойства, чем “переменные”. Да, название технически неверное, но цепляет и даёт понимание.</p>\n\n\n\n<h2 id=\"0201\"><strong>CSS — это кромешный беспорядок</strong></h2>\n\n\n\n<p id=\"c32d\">Любой, кто когда-либо работал с CSS, знает то, как тяжело держать код в порядке.</p>\n\n\n\n<p id=\"aa5b\">Для примера, использовать одни и те же значения в разных правилах это боль в плане поддержки и к тому же высока вероятность вызвать ошибку, например такую как опечатку и т.п. Множество раз мы предпочитали верить на слово нашему текстовому редактору и его замечательной функции “найти и заменить,” и это работало, правда одно время. Но чем больше проект, тем проще сделать изменение которое приведет к беспорядку, особенно в каком-нибудь ну уж самом неожиданном месте.</p>\n\n\n\n<h2 id=\"e160\"><strong>Но о чем всё это?</strong></h2>\n\n\n\n<p id=\"7065\">Вы уже наверное подумали о переменных в CSS? Но зачем они, если они уже есть в моем любимом препроцессоре?</p>\n\n\n\n<p id=\"7ab8\">Да, есть инструменты которые могут нам помочь в неких повторяющихся задачах. Препроцессоры такие как SASS и Stylus поддерживают переменные. Это делает нас более эффективными во время разработки и поддержки широкомасштабных приложений. Тем не менее, их недостаток в том, что довольно сложно произвести изменения во время выполнения кода.</p>\n\n\n\n<p id=\"df8b\">Препроцессоры компилируют всё в стандартный CSS код. Альтернативой могла бы быть генерация кода динамически, как требуется. Но это было бы в конечном итоге довольно затруднительным процессом и к тому же очень медленным.</p>\n\n\n\n<h2><strong>Причины для использования CSS переменных</strong></h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Понятный код</p><p>Возможность делать изменения в больших проектах максимально просто</p><p>Избежание опечаток</p><p>Возможность делать изменения во время работы</p></blockquote>\n\n\n\n<h2 id=\"cfc7\"><strong>Что это за кастомные CSS свойства?</strong></h2>\n\n\n\n<p id=\"9647\">По своей сути было добавлено две функции. Первая это возможность выставлять произвольные значения свойствам с полностью костомизируемыми именами. И функция var(), чтобы получать значения этих свойств.</p>\n\n\n\n<p>Вот простой пример:</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>:root {\n    --brand-color: #666;\n}\n\n#main {\n    color: var(--brand-color);\n}\n\n:root {\n    --brand-color: #666;\n}\n \n#main {\n    color: var(--brand-color);\n}</code></pre>\n\n\n\n<p>В котором&nbsp;<code>–-brand-color</code>&nbsp;это свойство, которое определяется значением&nbsp;<code>#666</code>. А&nbsp;<code>var()</code>&nbsp;это функция, которая позволяет нам получать доступ к значению, которое было предварительно определено, выдавая в результате&nbsp;<code>color: #666;</code>.</p>\n\n\n\n<h2 id=\"ca00\"><strong>Синтаксис</strong></h2>\n\n\n\n<p id=\"0a43\">Синтаксис довольно простой. Все свойства должны начинаться с двойного тире <code>( — — )</code></p>\n\n\n\n<p id=\"ff05\">Свойства чувствительны к реестру, таким образом&nbsp;<code>—-brand-color&nbsp;</code>является уже отличным от&nbsp;<code>—-Brand-color</code>, который в свою очередь отличается от&nbsp;<code>--Brand-Color</code>.</p>\n\n\n\n<p id=\"29ee\">Я знаю, возможно вы сейчас думаете, что синтаксис довольно непривлекателен и вы будете правы. Но двойное тире нужно для того, чтобы была некая <em>ретро-совместимость</em> с браузерами, которые до сих пор не поддерживают эти функции.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"232\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2020/12/1_zA90sS8-TQX_u_di19oTYQ.jpeg\" alt=\"\" class=\"wp-image-72\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2020/12/1_zA90sS8-TQX_u_di19oTYQ.jpeg 700w, https://stasonmars.ru/wp/wp-content/uploads/2020/12/1_zA90sS8-TQX_u_di19oTYQ-300x99.jpeg 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<h2 id=\"5332\"><strong>Каскадирование/Область видимости</strong></h2>\n\n\n\n<p id=\"c95b\">Мы можем определять свойства, как «локальные» так и  «глобальные». Переменные доступны в области видимости элементов, где они определены. Все элементы потомки имеют доступ к родительским свойствам, но не наоборот.</p>\n\n\n\n<p id=\"26a2\">Кастомные свойства следуют тем же правилам, что и каскадные стили. Мы можем определить тоже свойство на разных уровнях, например:</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>:root { --text-color: green; }\n\ndiv { --text-color: blue; }\n\n.error { --text-color: red; }\n\n* {\n  color: var(--text-color);\n}\n\n&lt;p>I'm green because got my color from root&lt;/p>\n\n&lt;div>I got blue from div selector&lt;/div>\n\n&lt;div class=\"error\">\n    I'm red because the .error.\n    &lt;p>Another red here because inheritance!&lt;/p>\n&lt;/div></code></pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" width=\"369\" height=\"126\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2020/12/Screenshot-2020-12-17-at-18.23.09.png\" alt=\"\" class=\"wp-image-73\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2020/12/Screenshot-2020-12-17-at-18.23.09.png 369w, https://stasonmars.ru/wp/wp-content/uploads/2020/12/Screenshot-2020-12-17-at-18.23.09-300x102.png 300w\" sizes=\"(max-width: 369px) 100vw, 369px\" /></figure></div>\n\n\n\n<p id=\"05fe\">Обратите внимание, что&nbsp;<code>:root</code>&nbsp;самый верхний элемент, эквивалентен глобальной области видимости. Тоже самое имя свойства может быть назначено с другим значением элементу потомку. Интересно, не так-ли?</p>\n\n\n\n<p id=\"f5ca\">Мы также можем изменять значения с помощью медиа запросов:</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>:root {\n  --gutter: 10px 0;\n}\n\nmain {\n  padding: var(--gutter);\n  display: flex;\n  flex-flow: wrap;\n  background-color: green;\n}\n\n@media (min-width: 600px) {\n  :root {\n    --gutter: 16px;\n  }\n}\n\narticle {\n  padding: var(--gutter);\n  background-color: yellow;\n  height: 1rem;\n  margin-bottom: 1rem;\n  width: 100%;\n}\n\narticle:last-of-type {\n  margin-bottom: 0;\n}\n\n&lt;main>\n  &lt;article>&lt;/article>\n  &lt;article>&lt;/article>\n  &lt;article>&lt;/article>\n&lt;/main></code></pre>\n\n\n\n<p><a href=\"https://codepen.io/tonymtz/pen/jZaBov\">Пример</a></p>\n\n\n\n<p id=\"00a7\">Самые известные CSS препроцессоры не дадут вам определять переменные в медиа запросах. Внезапненько, да?</p>\n\n\n\n<p id=\"c8fb\">Тут даже можно определять свойства из уже существующих.</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>:root {\n    --brand-color: red;\n    --header-text-color: var(--brand-color);\n}\n\n:root {\n    --brand-color: red;\n    --header-text-color: var(--brand-color);\n}</code></pre>\n\n\n\n<p id=\"60a4\">Примите во внимание, что это не работает с Microsoft Edge 15 из-за неизвестного бага.</p>\n\n\n\n<p id=\"91d4\">Хоть это и мягко говоря не рекомендуется, но вы можете определять свойства в тэгах стилей,&nbsp;<code>&lt;html style = \" --color: red;\"&gt;</code>.</p>\n\n\n\n<h2 id=\"1a7b\"><strong>Var()</strong></h2>\n\n\n\n<p id=\"cdfc\">Как написано на&nbsp;<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/var\">MDN</a>, функция&nbsp;<code>var()</code>&nbsp;имеет такой синтаксис,</p>\n\n\n\n<p id=\"4fc4\"><code>var( &lt;custom-property-name&gt;[, &lt;declaration-value&gt;]? )</code></p>\n\n\n\n<p id=\"8a4e\">Где&nbsp;<code>custom-property-name</code>&nbsp;это название свойства, которое вы определяете. Если оно неверное или не существует,&nbsp;<code>declaration-value</code>&nbsp;будет использовано вместо него.</p>\n\n\n\n<p id=\"ed92\">Мы может объявлять больше одного разделенных запятой свойств, как в случае с&nbsp;<code>font-family</code>.</p>\n\n\n\n<p id=\"5b23\">Будьте осторожны с запятыми. Для примера, чтобы указать более двух свойств для padding, сделайте это как тут:</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>.foo {\n  padding: var(--gutter, 10px 0 0 5px);\n}</code></pre>\n\n\n\n<p><code>--gutter</code>&nbsp;это основное значение, а «<code>10px 0 0 5px</code>» используется если&nbsp;<code>-- gutter</code>&nbsp;имеет неверное значение или вообще не существует.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"232\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2020/12/1_CRU_h7Uecl6aIV-CQ-FtDg.jpeg\" alt=\"\" class=\"wp-image-74\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2020/12/1_CRU_h7Uecl6aIV-CQ-FtDg.jpeg 700w, https://stasonmars.ru/wp/wp-content/uploads/2020/12/1_CRU_h7Uecl6aIV-CQ-FtDg-300x99.jpeg 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<h2 id=\"9bc2\"><strong>Ограничения</strong></h2>\n\n\n\n<p id=\"caa7\">Само&nbsp;<code>var()</code>&nbsp;не поддерживает вставление в строки или их связывание.</p>\n\n\n\n<p id=\"ea41\">В отличие от препроцессоров,&nbsp;<code>var()</code>&nbsp;не может быть использована, чтобы определять имена свойств.</p>\n\n\n\n<p id=\"68f9\">Если вы хотите пойти немного глубже, вы можете детально обратить внимание на CSS синтаксис.</p>\n\n\n\n<h2 id=\"3313\"><strong>Циклические зависимости</strong></h2>\n\n\n\n<p id=\"366b\">Допустимо реализовывать зависимости между свойствами, как в примере ниже.</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>:root {\n  --main-color: #c06;\n  --accent-background: linear-gradient(to top, var(--main-     color), white);\n}</code></pre>\n\n\n\n<p>Но циклические зависимости недопустимы. Вот пример:</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>:root {\n  --one: #c06;\n  --two: #ccc;\n  --one: calc(var(--two) + 20px);\n  --two: calc(var(--one) — 20px);\n}</code></pre>\n\n\n\n<p>В этом случае, как&nbsp;<code>-one</code>, так и&nbsp;<code>-two</code>&nbsp;рассматривались бы как неверные. Их изначальные значения не переписаны и остаются такими же, таким образом они бы имели свои изначальные значения вместо указанных.</p>\n\n\n\n<h2 id=\"beeb\"><strong>Указываем значения с помощью calc()</strong></h2>\n\n\n\n<p id=\"7639\">Функция&nbsp;<code>calc()</code>&nbsp;используется для выполнения вычислений и определения CSS значений. На данный момент она поддерживается всеми современными браузерами.</p>\n\n\n\n<p id=\"2235\">Вы можете комбинировать её с&nbsp;<code>var()</code>, чтобы указывать значения на лету.</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>header {\n  --gutter: 20;\n  padding: calc(var(--gutter) * 1px);\n}</code></pre>\n\n\n\n<p>В этом случае,&nbsp;<code>--gutter</code>&nbsp;указан, как единичный знак с цифровым значением&nbsp;<code>20</code>. Но padding нужна единица измерения (такая как&nbsp;<code>px</code>). Так как вы не можете связывать строки, вы можете вместо этого умножить на «<code>1px</code>», для того, чтобы искусственно подправить значение.</p>\n\n\n\n<h2 id=\"0f42\"><strong>Работа с JavaScript</strong></h2>\n\n\n\n<p id=\"55e7\">Чтобы получить значение кастомного свойства в JavaScript, используйте&nbsp;<code>getPropertyValue()</code>&nbsp;метод из&nbsp;<a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration\">CSSSTyleDeclaration</a>.</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>&lt;style>\n    :root {--brand-color: cyan; }\n    p { color: var(--brand-color); \n&lt;/style>\n\n&lt;p>This text is cyan&lt;/p>\n\n&lt;script>\n    const styles = getComputedStyle(document.documentElement);\n    const colorValue = styles.getPropertyValue('--brand-color');\n    // colorValue = 'cyan';\n&lt;/script>\n\n&lt;style>\n    :root {--brand-color: cyan; }\n    p { color: var(--brand-color); }\n&lt;/style>\n \n&lt;p>This text is cyan&lt;/p>\n \n&lt;script>\n    const styles = getComputedStyle(document.documentElement);\n    const colorValue = styles.getPropertyValue('--brand-color');\n    // colorValue = 'cyan';\n&lt;/script>\n</code></pre>\n\n\n\n<p>С другой стороны, чтобы определить свойство, мы используем&nbsp;<code>setProperty()</code>&nbsp;метод:</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>&lt;style>\n    :root {--brand-color: cyan; }\n    p { color: var(--brand-color); }\n&lt;/style>\n\n&lt;p>This text is red&lt;/ p>\n\n&lt;script>\n    document.documentElement.style.setProperty ('--brand-color', 'red');\n&lt;/script>\n\n&lt;style>\n    :root {--brand-color: cyan; }\n    p { color: var(--brand-color); }\n&lt;/style>\n \n&lt;p>This text is red&lt;/ p>\n \n&lt;script>\n    document.documentElement.style.setProperty ('--brand-color', 'red');\n&lt;/script>\n</code></pre>\n\n\n\n<p>Вы также можете определять значения свойств из значений других, используя старого друга&nbsp;<code>var()</code>&nbsp;с&nbsp;<code>setProperty()</code>:</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>&lt;style>\n    :root {\n        --brand-color: cyan;\n        --secondary-color: yellow;\n    }\n&lt;/style>\n\np { color: var (--brand-color); }\n\n&lt;p>I'm yellow!&lt;/p>\n\n&lt;script>\n    document.documentElement.style.setProperty ('--brand-color', 'var (--secondary-color)');\n&lt;/script>\n\n&lt;style>\n    :root {\n        --brand-color: cyan;\n        --secondary-color: yellow;\n    }\n&lt;/style>\n \np { color: var (--brand-color); }\n \n&lt;p>I'm yellow!&lt;/p>\n \n&lt;script>\n    document.documentElement.style.setProperty ('--brand-color', 'var (--secondary-color)');\n&lt;/script>\n</code></pre>\n\n\n\n<h2><strong>Поддержка на данный момент</strong></h2>\n\n\n\n<p>Кастомные свойства на данный момент поддерживаются&nbsp;<a href=\"https://caniuse.com/#feat=css-variables\">большинством браузеров</a>.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"332\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2020/12/Screenshot-2020-12-17-at-18.49.52-1024x332.png\" alt=\"\" class=\"wp-image-75\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2020/12/Screenshot-2020-12-17-at-18.49.52-1024x332.png 1024w, https://stasonmars.ru/wp/wp-content/uploads/2020/12/Screenshot-2020-12-17-at-18.49.52-300x97.png 300w, https://stasonmars.ru/wp/wp-content/uploads/2020/12/Screenshot-2020-12-17-at-18.49.52-768x249.png 768w, https://stasonmars.ru/wp/wp-content/uploads/2020/12/Screenshot-2020-12-17-at-18.49.52.png 1301w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" /></figure>\n\n\n\n<p>У Microsoft Edge 15 есть проблемы. Следующие баги выявлены:</p>\n\n\n\n<p id=\"b728\"><a href=\"https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12143022/\">Игнорирование вложенных расчетов</a></p>\n\n\n\n<p id=\"50ea\"><a href=\"https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11676012/\">Анимации с кастомными свойствами могут покрашить браузер</a></p>\n\n\n\n<p id=\"1d9b\"><a href=\"https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11495448/\">Вы не можете использовать эти свойства с псевдо-элементами</a></p>\n\n\n\n<p></p>\n","type":"html-css","date":"2020-12-17T16:55:34.000Z","acf":{"seo_desc":"В этой статье вы узнаете основы применения переменных в CSS, их области использования, ограничения и нюансы взаимодействия с JavaScript, включая интерактивные примеры.","pub_date":"2018-04-18","keywords":"CSS переменны, CSS variables, руководство по CSS переменным, как использовать CSS переменные","tags":"CSS, CSS переменные"},"title":"Руководство по работе с переменными в CSS","id":"29bf9c41-b5de-52ac-8f7c-c4675ee65e5a","excerpt":"<p>В этой статье вы узнаете основы применения переменных в CSS, их области использования, ограничения и нюансы взаимодействия с JavaScript, включая интерактивные примеры.</p>\n","featured_media":{"source_url":"https://stasonmars.ru/wp/wp-content/uploads/2020/12/DglYtvO7Bn0-14.jpg"},"interesting":[{"title":"Улучшаем производительность веб-шрифтов на реальном примере","slug":"uluchshaem-proizvoditelnost-web-shriftov-na-realnom-primere","type":"html-css"},{"title":"Как применять вариативные шрифты в реальном мире","slug":"kak-primenyat-variativnie-shrifty-v-realnom-mire","type":"html-css"},{"title":"7 примеров использования CSS переменных","slug":"7-primerov-ispolzovaniya-css-peremennyh","type":"html-css"}]}},"staticQueryHashes":["3576131997","63159454"]}