{"componentChunkName":"component---src-templates-post-js","path":"/html-css/zachem-ispolzovat-pravilo-supports/","result":{"pageContext":{"slug":"zachem-ispolzovat-pravilo-supports","content":"\n<p>С ростом поддержки свойства определения поддержки функционала в CSS, под названием&nbsp;<code>@supports</code>, я понял, что это могло бы быть клёвой идеей взять и немного углубиться в эту тему, рассказав про неё как можно больше информации.</p>\n\n\n\n<p class=\"author\"><a rel=\"noreferrer noopener\" href=\"https://dommagnifi.co/2017/03/06/the-case-for-or-against-the-supports-rule.html\" target=\"_blank\"><em>Адаптированный перевод The Case for (or against) the CSS @supports rule</em></a></p>\n\n\n\n<p id=\"f023\">Итак, вот быстрое описание того, что же свойство&nbsp;<code>@supports</code>&nbsp;всё таки делает. По своей сути,&nbsp;<code>@supports</code>&nbsp;работает как обычный медиа запрос, но детектит определенный функционал, вместо размеров&nbsp;<code>viewport</code>, меида типов и т.д. Более менее, но это функция запроса. Использование <code>@supports</code> в браузерах, которые поддерживают его (Все, кроме IE11 и ниже в этом направлении), дает нам возможность проверять, поддерживается ли определенный функционал браузером или нет. Если да, то последующие CSS правила будут применены, а если браузер не поддерживает какое-либо свойство, то оно будет проигнорировано без какого-либо вреда для верстки.</p>\n\n\n\n<p id=\"da66\">Теоретически, тут суть в том, чтобы дать нам возможность условно применять CSS, основываясь на поддержке его функционала самим браузером. У меня есть четкое представление об этом, но в поисках материала для этого поста, мне было немного сложно найти примеры для этого правила, которые реально заслуживают внимания. Давайте посмотрим на некоторые простые сценарии, которые пришли мне на ум в первую очередь.</p>\n\n\n\n<h2 id=\"5395\"><strong>@supports(display: flexbox)</strong></h2>\n\n\n\n<p id=\"3453\">Итак, ваш коллега только что отправил вам отличный дизайн. Хороший сеточный шаблон. Настало время размять свои CSS мускулы и применить немного&nbsp;<code>flexbox</code>. Но нет! Аккаунт менеджеры только что сообщили вам, что вам нужна поддержка IE9. Хороший выстрел, ребята) Давайте разыграем сценарий, который бы имел место быть с&nbsp;<code>@supports</code>. Давайте применим классический кейс с&nbsp;<code>flexbox</code>. У вас есть несколько предметов (класс&nbsp;<code>.thing</code>) c заголовком и описанием внутри. Текст описания варьируется по длине и вам надо убедиться в том, что все&nbsp;<code>.thing</code>&nbsp;одной высоты, вне зависимости от длины контента. Может что-то типа этого нам подойдет?</p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container\">\n<pre class=\"wp-block-code css\"><code>.thing {\n    border: 2px solid #efefef;\n    margin: 10px;\n    padding: 20px;\n\n    // Fallback for IE9 if browser\n    // doesn't support flexbox.\n    float: left;\n    width: calc(33.333333% - 20px);\n\n    h2 {\n      color: #2b2b2b;\n    }\n\n    .description {\n      font-size: 1rem;\n    }\n  }\n\n  // Insert fanciness here\n  @supports (display: flexbox) {\n    .thing-wrapper {\n      align-items: stretch;\n      display: flex;\n      justify-content: center;\n    }\n\n    .thing {\n      flex: 0 1 33.333333%;\n    }\n  }</code></pre>\n</div></div>\n</div></div>\n\n\n\n<p id=\"8767\">Отлично! Это выглядит как отличный пример использования&nbsp;<code>@supports</code>. У нас есть процентная ширина и флоаты, примененные к .thing, а также фолбэк, если не поддерживается&nbsp;<code>flexbox</code>!</p>\n\n\n\n<p id=\"5e6d\">Однако, давайте поиграем в адвоката дьявола и посмотрим, что же нас остановило от использования такого подхода:</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>.thing-wrapper {\n    align-items: stretch;\n    display: flex;\n    justify-content: center;\n  }\n\n  .thing {\n    border: 2px solid #efefef;\n    flex: 0 1 33.333333%;\n    margin: 10px;\n    padding: 20px;\n\n    //IE9 support\n    float: left;\n    width: calc(33.333333% - 60px);\n\n    h2 {\n      color: #2b2b2b;\n    }\n\n    .description {\n      font-size: 1rem;\n    }\n  }</code></pre>\n\n\n\n<p><code>.thing-wrapper</code>&nbsp;свойства будут проигнорированы, так как IE9 просто не воспримет их, а&nbsp;<code>float</code>&nbsp;и&nbsp;<code>width</code>&nbsp;свойства будут проигнорированы в новых браузерах из-за применения&nbsp;<code>display: flex</code>. Сейчас, в организационном плане, возможно было бы хорошим тоном откинуть старые свойства, которые не поддерживают старые браузеры. Но в функциональном плане, выгода кажется слегка ограниченной.</p>\n\n\n\n<h2 id=\"bef2\"><strong>Привет операторам</strong></h2>\n\n\n\n<p id=\"872e\">Давайте возьмем ещё один пример. Правило&nbsp;<code>@support</code>&nbsp;также принимает несколько дополнительных операторов:&nbsp;<code>not</code>,&nbsp;<code>and</code>&nbsp;и&nbsp;<code>or</code>. Вы можете связать эти операторы, чтобы улучшить свои результаты. Для примера, вы можете указать правилу&nbsp;<code>@supports</code>&nbsp;запускаться когда браузер не поддерживает CSS свойство.</p>\n\n\n\n<p id=\"398e\">Давайте, к примеру, попробуем новые модные CSS переменные. Если браузер не поддерживает CSS переменные, то мы запустим CSS код, который компенсирует это.</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>@supports not (--color-1: #c0ffee) {\n    .coffee {\n      color: #c0ffee;\n    }\n  }</code></pre>\n\n\n\n<p id=\"eb61\">Простой пример, но он успешно делает свою работу. Что мы хотим тут сказать, так это то, что если браузер не поддерживает использование CSS переменных, то мы применяем цвет прямо к диву&nbsp;<code>.coffee</code>. Это звучит очень круто, но сейчас нам надо рассмотреть примет ли браузер этот код, даже поддерживая правило&nbsp;<code>@supports</code>. Если браузер не поддерживает правило&nbsp;<code>@supports</code>, с которого мы начинаем, этот отрезок кода будет пропущен и наш <code>div</code> .<code>coffee </code>не получит стилизации, которую мы ему выдали.</p>\n\n\n\n<p id=\"3cf0\">Для уточнения, CSS переменные не поддерживаются в EDGE v14. Однако&nbsp;<code>@supports</code>&nbsp;да. Следовательно, этот код будет работать! Что кстати великолепно, это определенно выглядит идеальным примером использования в этом случае.</p>\n\n\n\n<h2 id=\"08bb\"><strong>Дополнительные сценарии</strong></h2>\n\n\n\n<p id=\"c692\">Постарайтесь остаться непредвзятым как я после этих двух кейсов, я пробежался по нескольким другим сценариям, которые я не стал так описывать, как предидущие два.</p>\n\n\n\n<p id=\"5f62\">Я пытался найти некую выгоду в использовании правила для CSS&nbsp;<code>keyframes</code>, которая закончилась также как и в первом примере c&nbsp;<code>flexbox</code>. Я проверил новое свойство&nbsp;<code>display: flow-root</code>, это аккуратное свойство, которое замещает уже застоявшийся&nbsp;<code>clearfix</code>. Это был отличный кейс для оператора not, почти как и с нашим примером по теме CSS переменных. И в конце я проверил кейс с использованием CSS 3D трансформаций. И также как и с&nbsp;<code>flexbox</code>&nbsp;примером, выявил те же проблемы.</p>\n\n\n\n<h2 id=\"d1c4\"><strong>TL;DR</strong></h2>\n\n\n\n<p id=\"8178\">И под конец, конечно же&nbsp;<code>@supports</code>&nbsp;правило было бы фантастикой во былые времена, когда поддержка браузеров для разного CSS представляла собой невероятный беспорядок. Но сегодня, разработчики браузеров начинают поддерживать новые свойства чуть ли не одновременно. И даже если нет, то применяется не та логика, как в JavaScript. Если браузер не понимает CSS свойство, то он его пропускает и идет дальше. По факту, нет ощутимой выгоды в использовании&nbsp;<code>@supports</code>, пока что. Есть определенно хорошие кейсы его применения и оператора not. Особенно в старых версиях Edge, который не поддерживает такие фишки, как CSS переменные. Однако, для меня,&nbsp;<code>@supports</code>&nbsp;правило кажется скорее косметическим и дает ясный способ организации CSS свойств, которые необходимы для вашего нынешнего проекта, следуя его рекомендациям, которые могут не позволить вам использовать эти свойства в полной мере.</p>\n","type":"html-css","date":"2020-08-17T14:14:38.000Z","acf":{"seo_desc":"@supports работает как обычный медиа запрос, но детектит определенный функционал, вместо размеров viewport, меида типов и т.д. ","pub_date":"2018-05-17","keywords":"Как работает @supports, @supports CSS,  работа с @supports в CSS","tags":"CSS, @supports"},"title":"Зачем использовать правило @supports","id":"6e413258-accf-59e0-9ea5-7fecc5e34ce1","excerpt":"<p>С ростом поддержки свойства определения поддержки функционала в CSS, под названием @supports, я понял, что это могло бы быть клёвой идеей взять и немного углубиться в эту тему, рассказав про неё как можно больше информации.</p>\n","featured_media":{"source_url":"https://stasonmars.ru/wp/wp-content/uploads/2020/08/DglYtvO7Bn0-1.jpg"},"interesting":[{"title":"Viewport единицы в CSS","slug":"viewport-edinitsy-v-css","type":"html-css"},{"title":"Прокачиваем навыки работы с CSS селекторами","slug":"prokachivaem-naviki-raboty-s-css-selectorami","type":"html-css"},{"title":"Великолепный hover эффект с CSS переменными","slug":"velikolepnyi-hover-effect-s-css-peremennimy","type":"html-css"}]}},"staticQueryHashes":["3576131997","63159454"]}