Обходной путь для переменных CSS в IE?

В настоящее время я разрабатываю веб-приложение в Outsystems, в котором мне нужно настроить CSS, в котором я использую переменные. Мне нужно гарантировать, что приложение работает в кросс-браузерном режиме, в том числе в Internet Explorer. IE не поддерживает переменные CSS, как вы можете видеть на рисунке ниже из этого источника.

Поскольку я должен использовать переменные CSS, есть ли обходной путь для использования переменных в IE?

5 ответов

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

body {
  --text-color: red;
}

body {
  color: red /* default supported fallback style */
  color: var(--text-color); /* will not be used by any browser that doesn't support it, and will default to the previous fallback */
}

Это решение невероятно избыточно и "почти" побеждает назначение переменных css... НО это необходимо для совместимости браузера. Это, по сути, сделает бесполезными переменные css, но я умоляю вас по-прежнему использовать их, потому что это послужит важным напоминанием о том, что на эти значения есть ссылки в другом месте, и их необходимо обновлять во всех случаях, иначе вы забудете обновить все связанные Возникновение "цвета", и тогда у вас есть противоречивый стиль, потому что соответствующие значения CSS не синхронизированы. Переменная будет больше служить комментарием, но очень важной.

Существует полифилл, который обеспечивает почти полную поддержку переменных CSS в IE11:
https://github.com/nuxodin/ie11CustomProperties
(я автор)

Сценарий использует тот факт, что IE имеет минимальную поддержку настраиваемых свойств, где свойства можно определять и считывать с учетом каскада.
.myEl {-ie-test:'aaa'} // only one dash allowed! "-"
затем прочтите его в javascript:
getComputedStyle( querySelector('.myEl') )['-ie-test']

Из README:

особенности

  • обрабатывает динамически добавленный html-контент
  • обрабатывает динамическое добавление, -элементы
  • цепочка --bar:var(--foo)
  • отступать var(--color, blue)
  • : focus,: target,: hover
  • js-интеграция:
    • style.setProperty('--x','y')
    • style.getPropertyValue('--x')
    • getComputedStyle(el).getPropertyValue('--inherited')
  • Встроенные стили: <div ie-style="--color:blue"...
  • каскадные работы
  • наследство работает
  • до 3k (min+gzip) и без зависимостей

Демо:

https://rawcdn.githack.com/nuxodin/ie11CustomProperties/b851ec2b6b8e336a78857b570d9c12a8526c9a91/test.html

В случае, если кто-то сталкивается с этим, имеет аналогичную проблему, где я сделал это так.

a {
  background: var(--new-color);
  border-radius: 50%;
}

Я добавил цвет фона перед переменной, поэтому, если он не загружается, он возвращается к гексу.

a {
  background: #3279B8;
  background: var(--new-color);
  border-radius: 50%;
}

Да, если вы обрабатываете настраиваемые свойства корневого уровня (IE9+).

Из README:

особенности

  • Преобразование пользовательских свойств CSS в статические значения на стороне клиента
  • Текущие обновления значений времени выполнения как в современных, так и в устаревших браузерах
  • Трансформирует <link>, <style>, а также @import CSS
  • Преобразует относительный url() пути к абсолютным URL
  • Поддерживает цепные и вложенные var() функции
  • Поддерживает var() резервные значения функции
  • Поддерживает веб-компоненты / shadow DOM CSS
  • Автообновление в режиме просмотра включено <link> а также <style> изменения
  • Доступны модули UMD и ES6
  • Включены определения TypeScript
  • Легкий (6k мин +gzip) и не требует зависимостей

Ограничения

  • Поддержка настраиваемых свойств ограничена :root а также :host декларации
  • Использование var() ограничено значениями свойств (согласно спецификации W3C)

Вот несколько примеров того, с чем может справиться библиотека:

Настраиваемые свойства корневого уровня

:root {
    --a: red;
}

p {
    color: var(--a);
}

Связанные настраиваемые свойства

:root {
    --a: var(--b);
    --b: var(--c);
    --c: red;
}

p {
    color: var(--a);
}

Вложенные настраиваемые свойства

:root {
    --a: 1em;
    --b: 2;
}

p {
    font-size: calc(var(--a) * var(--b));
}

Резервные значения

p {
    font-size: var(--a, 1rem);
    color: var(--b, var(--c, var(--d, red))); 
}

Трансформирует <link>, <style>, а также @import CSS

<link rel="stylesheet" href="/absolute/path/to/style.css">
<link rel="stylesheet" href="../relative/path/to/style.css">

<style>
    @import "/absolute/path/to/style.css";
    @import "../relative/path/to/style.css";
</style>

Преобразует веб-компоненты / теневую DOM

<custom-element>
  #shadow-root
    <style>
      .my-custom-element {
        color: var(--test-color);
      }
    </style>
    <div class="my-custom-element">Hello.</div>
</custom-element>

Для полноты: спецификации w3c

Надеюсь это поможет.

(Бесстыдная самореклама: Проверить)

В "нормальном" CSS пока нет способа, но посмотрите на sass/scss или менее.

вот пример scss

$font-stack:    Helvetica, sans-serif;
$primary-color: #333;

body {
  font: 100% $font-stack;
  color: $primary-color;
}
body {
  --text-color : red; /* --text-color 정의 */
}    

body {
   color: var(--text-color, red); /* --text-color 정의되지 않으면 red로 대체됨 */
}

body {
   color: var(--text-color, var(--text-color-other, blue);
   /* --text-color, --text-color-other 가 정의되지 않으면 blue로 대체됨 */
}

Создайте отдельный файл.css для своих переменных. Скопируйте / вставьте содержимое файла variable.css в конец файла main.css. Найдите и замените все имена переменных в файле main.css на шестнадцатеричный код для этих переменных. Например: Ctrl-H, чтобы найти var(- myWhiteVariable) и заменить на #111111.

Примечание: если вы сохраните:root{ } в файле main.css и просто закомментируете его, вы можете использовать его для отслеживания этих шестнадцатеричных кодов позже, если вы хотите обновить свои запасные цвета.

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

Например:

  • в globals.js
export const COLORS = {
  yellow: '#F4B400',
  yellowLight: '#F4C849',
  purple: '#7237CC',
  purple1: '#A374EB',
}
  • в вашем файле
import { COLORS } from 'globals'

а затем просто используйте COLORS.yellow, COLORS.purple, так далее.

Я рекомендую установить переменные css в качестве переменных s as s, а затем использовать интерполяцию s as s для визуализации цвета в ваших элементах.

:root {    
    --text-color: #123456;
}

$text-color: var(--text-color);

body {
    color: #{$text-color};
}

Если я не ошибаюсь, есть обходной путь, селектор CSS #ID. Который должен работать для IE > 6, я думаю.. Так что вы можете

.one { };
<div class="one">

должен работать как

#one {};
<div id="one">
Другие вопросы по тегам