Skip to content

Пресет иконок

Используйте любые иконки на чистом CSS для UnoCSS.

Исходный код

СОВЕТ

Рекомендуется к прочтению: Иконки на чистом CSS

Для использования иконок следуйте следующим соглашениям:

  • <prefix><collection>-<icon>
  • <prefix><collection>:<icon>

Например:

html
<!-- Базовая иконка якоря из Phosphor icons -->
<div class="i-ph-anchor-simple-thin" />
<!-- Оранжевый будильник из Material Design Icons -->
<div class="i-mdi-alarm text-orange-400" />
<!-- Большой логотип Vue -->
<div class="i-logos-vue text-3xl" />
<!-- Солнце в светлой теме, Луна в тёмном режиме, из Carbon -->
<button class="i-carbon-sun dark:i-carbon-moon" />
<!-- Twemoji смеха, превращающийся в слезы радости при наведении -->
<div class="i-twemoji-grinning-face-with-smiling-eyes hover:i-twemoji-face-with-tears-of-joy" />
Наведите курсор

Посмотреть все доступные иконки.

Установка

bash
pnpm add -D @unocss/preset-icons @iconify-json/[the-collection-you-want]
bash
yarn add -D @unocss/preset-icons @iconify-json/[the-collection-you-want]
bash
npm install -D @unocss/preset-icons @iconify-json/[the-collection-you-want]
bash
bun add -D @unocss/preset-icons @iconify-json/[the-collection-you-want]

Мы используем Iconify в качестве источника данных иконок. Вам необходимо установить соответствующий набор иконок в devDependencies, следуя шаблону @iconify-json/*. Например, @iconify-json/mdi для Material Design Icons, @iconify-json/tabler для Tabler. Вы можете обратиться к Icônes или Iconify для просмотра всех доступных коллекций.

uno.config.ts
ts
import presetIcons from '@unocss/preset-icons'
import { defineConfig } from 'unocss'

export default defineConfig({
  presets: [
    presetIcons({ /* параметры */ }),
    // ...другие пресеты
  ],
})

СОВЕТ

Этот пресет включен в пакет unocss, вы также можете импортировать его оттуда:

ts
import { presetIcons } from 'unocss'

ИНФОРМАЦИЯ

Вы также можете использовать этот пресет отдельно, как дополнение к вашим существующим UI-фреймворкам, чтобы получить иконки на чистом CSS!

Если вы предпочитаете установить все наборы иконок, доступные на Iconify, за один раз (~130 МБ):

bash
pnpm add -D @iconify/json
bash
yarn add -D @iconify/json
bash
npm install -D @iconify/json
bash
bun add -D @iconify/json

Дополнительные свойства

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

ts
presetIcons({
  extraProperties: {
    'display': 'inline-block',
    'vertical-align': 'middle',
    // ...
  },
})

Переопределение режимов

По умолчанию этот пресет выбирает режим рендеринга автоматически для каждой иконки, основываясь на её характеристиках. Подробнее об этом можно прочитать в этом посте в блоге. В некоторых случаях вам может потребоваться явно задать режим рендеринга для каждой иконки.

  • ?bg для background-img — рендерит иконку как фоновое изображение
  • ?mask для mask — рендерит иконку как изображение-маску

Например, vscode-icons:file-type-light-pnpm — это иконка с цветами (svg не содержит currentColor), которая будет отрендерена как фоновое изображение. Используйте vscode-icons:file-type-light-pnpm?mask, чтобы отрендерить её как изображение-маску и игнорировать её цвета.

html
<div class="w-full flex items-center justify-center gap-x-4 text-4xl p-2 mt-4">
  <div class="i-vscode-icons:file-type-light-pnpm" />
  <div class="i-vscode-icons:file-type-light-pnpm?mask text-red-300" />
</div>

Настройка коллекций и резолверов иконок

Вы можете предоставлять коллекции через @iconify-json/[нужная-вам-коллекция], @iconify/json или использовать свои собственные, используя опцию collections в вашей конфигурации UnoCSS.

Браузер

Для загрузки коллекций iconify следует использовать @iconify-json/[нужная-вам-коллекция], а не @iconify/json, так как файл json очень большой.

Бандлер

При использовании бандлеров вы можете предоставлять коллекции с помощью динамических импортов, чтобы они собирались как асинхронные чанки и загружались по запросу.

ts
import presetIcons from '@unocss/preset-icons/browser'

export default defineConfig({
  presets: [
    presetIcons({
      collections: {
        carbon: () => import('@iconify-json/carbon/icons.json').then(i => i.default),
        mdi: () => import('@iconify-json/mdi/icons.json').then(i => i.default),
        logos: () => import('@iconify-json/logos/icons.json').then(i => i.default),
      }
    })
  ]
})

CDN

Или, если вы предпочитаете загружать их из CDN, вы можете указать опцию cdn (начиная с v0.32.10). Мы рекомендуем esm.sh в качестве CDN-провайдера.

ts
presetIcons({
  cdn: 'https://esm.sh/'
})

Кастомизация

Вы также можете предоставить свои собственные коллекции, используя CustomIconLoader или InlineCollection, например, используя InlineCollection:

ts
presetIcons({
  collections: {
    custom: {
      circle: '<svg viewBox="0 0 120 120"><circle cx="60" cy="60" r="50"></circle></svg>',
      /* ... */
    },
    carbon: () => import('@iconify-json/carbon/icons.json').then(i => i.default as any),
    /* ... */
  }
})

И затем вы можете использовать это в вашем html: <span class="i-custom:circle"></span>

Node.js

В Node.js пресет будет автоматически искать установленный набор данных iconify, поэтому вам не нужно регистрировать коллекции iconify.

Вы также можете предоставить свои собственные коллекции, используя CustomIconLoader или InlineCollection.

FileSystemIconLoader

Кроме того, вы также можете использовать FileSystemIconLoader для загрузки ваших пользовательских иконок из файловой системы. Вам потребуется установить пакет @iconify/utils как dev dependency.

unocss.config.ts
ts
import fs from 'node:fs/promises'
// вспомогательные функции загрузчика
import { FileSystemIconLoader } from '@iconify/utils/lib/loader/node-loaders'
import { defineConfig, presetIcons } from 'unocss'

export default defineConfig({
  presets: [
    presetIcons({
      collections: {
        // ключ как имя коллекции
        'my-icons': {
          account: '<svg><!-- ... --></svg>',
          // загрузка пользовательской иконки лениво (lazy)
          settings: () => fs.readFile('./path/to/my-icon.svg', 'utf-8'),
          /* ... */
        },
        'my-other-icons': async (iconName) => {
          // ваш пользовательский загрузчик здесь. Делайте всё, что хотите.
          // например, загрузка с удалённого сервера:
          return await fetch(`https://example.com/icons/${iconName}.svg`).then(res => res.text())
        },
        // помощник для загрузки иконок из файловой системы
        // файлы в `./assets/icons` с расширением `.svg` будут загружены по их имени файла
        // вы также можете предоставить колбэк трансформации для изменения каждой иконки (опционально)
        'my-yet-other-icons': FileSystemIconLoader(
          './assets/icons',
          svg => svg.replace(/#fff/, 'currentColor')
        )
      }
    })
  ]
})

ExternalPackageIconLoader

С версии @iconify/utils v2.1.20 вы можете использовать другие пакеты для загрузки иконок от других авторов, используя новый хелпер createExternalPackageIconLoader.

ВНИМАНИЕ

Внешние пакеты должны включать файл icons.json с данными icons в формате IconifyJSON, который можно экспортировать с помощью Iconify Tools. Для получения более подробной информации см. Экспорт набора иконок в виде JSON-пакета.

Например, вы можете использовать an-awesome-collection или @my-awesome-collections/some-collection для загрузки ваших пользовательских или сторонних иконок:

unocss.config.ts
ts
import { createExternalPackageIconLoader } from '@iconify/utils/lib/loader/external-pkg'
import { defineConfig, presetIcons } from 'unocss'

export default defineConfig({
  presets: [
    presetIcons({
      collections: createExternalPackageIconLoader('an-awesome-collection')
    })
  ]
})

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

unocss.config.ts
ts
import { createExternalPackageIconLoader } from '@iconify/utils/lib/loader/external-pkg'
import { defineConfig, presetIcons } from 'unocss'
import { FileSystemIconLoader } from 'unplugin-icons/loaders'

export default defineConfig({
  presets: [
    presetIcons({
      collections: {
        ...createExternalPackageIconLoader('other-awesome-collection'),
        ...createExternalPackageIconLoader('@my-awesome-collections/some-collection'),
        ...createExternalPackageIconLoader('@my-awesome-collections/some-other-collection'),
        'my-yet-other-icons': FileSystemIconLoader(
          './assets/icons',
          svg => svg.replace(/^<svg /, '<svg fill="currentColor" ')
        )
      }
    })
  ]
})

Кастомизация иконок

Вы можете кастомизировать все иконки, используя опцию конфигурации customizations.

Доступные функции кастомизации:

  • transform: трансформирует исходный svg, применяется только при использовании пользовательской коллекции иконок (коллекции iconify исключены).
  • customize: изменяет значения кастомизации иконок по умолчанию.
  • iconCustomizer: изменяет значения кастомизации иконок по умолчанию.

Для каждой загруженной иконки кастомизации будут применяться в следующем порядке:

  • применение transform к исходному svg, если предоставлен и используется пользовательская коллекция иконок
  • применение customize со значениями кастомизации по умолчанию, если предоставлен
  • применение iconCustomizer с кастомизациями из customize, если предоставлен

Глобальная трансформация пользовательских иконок

При загрузке ваших пользовательских иконок вы можете трансформировать их, например, добавив атрибут fill со значением currentColor:

ts
presetIcons({
  customizations: {
    transform(svg) {
      return svg.replace(/#fff/, 'currentColor')
    }
  }
})

С версии 0.30.8 функция transform предоставляет имена collection (коллекции) и icon (иконки):

ts
presetIcons({
  customizations: {
    transform(svg, collection, icon) {
      // не применять fill к этим иконкам в этой коллекции
      if (collection === 'custom' && icon === 'my-icon')
        return svg
      return svg.replace(/#fff/, 'currentColor')
    }
  }
})

Глобальная кастомизация иконок

При загрузке любой иконки вы можете кастомизировать общие свойства для всех из них, например, настроить одинаковый размер:

ts
presetIcons({
  customizations: {
    customize(props) {
      props.width = '2em'
      props.height = '2em'
      return props
    }
  }
})

Кастомизация иконки/коллекции

Вы можете кастомизировать каждую иконку, используя опцию конфигурации iconCustomizer.

iconCustomizer имеет приоритет над конфигурацией.

iconCustomizer будет применен к любой коллекции, то есть к каждой иконке из custom загрузчика, inlined (встроенной) в custom collections или из @iconify.

Например, вы можете настроить iconCustomizer, чтобы изменить все иконки для коллекции или отдельные иконки в коллекции:

ts
presetIcons({
  customizations: {
    iconCustomizer(collection, icon, props) {
      // кастомизация всех иконок в этой коллекции
      if (collection === 'my-other-icons') {
        props.width = '4em'
        props.height = '4em'
      }
      // кастомизация этой конкретной иконки в этой коллекции
      if (collection === 'my-icons' && icon === 'account') {
        props.width = '6em'
        props.height = '6em'
      }
      // кастомизация этой иконки @iconify в этой коллекции
      if (collection === 'mdi' && icon === 'account') {
        props.width = '2em'
        props.height = '2em'
      }
    }
  }
})

Директивы

Вы можете использовать директиву icon() в вашем CSS, чтобы получить метаданные иконки.

css
.icon {
  background-image: icon('i-carbon-sun');
}

ПРЕДУПРЕЖДЕНИЕ

icon() зависит от @unocss/preset-icons и будет использовать его конфигурацию; убедитесь, что вы добавили этот пресет.

Подробнее о директиве icon() см. Директивы.

Опции

scale

  • Тип: number
  • По умолчанию: 1

Масштаб относительно текущего размера шрифта (1em).

mode

Режим генерируемых CSS-иконок.

СОВЕТ

  • mask — использовать цвет фона и свойство mask для монохромных иконок
  • bg — использовать фоновое изображение для иконок, цвета статические
  • auto — умный выбор режима между mask и bg для каждой иконки на основе её стиля

prefix

  • Тип: string | string[]
  • По умолчанию: 'i-'

Префикс класса для сопоставления правил иконок.

extraProperties

  • Тип: Record<string, string>
  • По умолчанию: {}

Дополнительные CSS-свойства, применяемые к сгенерированному CSS.

warn

  • Тип: boolean
  • По умолчанию: false

Выдавать предупреждение при отсутствии совпадений иконок.

iconifyCollectionsNames

  • Тип: string[]
  • По умолчанию: undefined

Дополнительные коллекции @iconify-json для использования. Эту опцию следует использовать, когда появляются новые коллекции @iconify-json, не перечисленные в именах коллекций пресета иконок по умолчанию.

collections

  • Тип: Record<string, (() => Awaitable<IconifyJSON>) | undefined | CustomIconLoader | InlineCollection>
  • По умолчанию: undefined

В среде Node.js пресет будет автоматически искать установленный набор данных iconify. При использовании в браузере эта опция предоставляется для обеспечения набора данных с пользовательским механизмом загрузки.

layer

  • Тип: string
  • По умолчанию: 'icons'

Слой правил.

customizations

  • Тип: Omit<IconCustomizations, 'additionalProps' | 'trimCustomSvg'>
  • По умолчанию: undefined

Пользовательские кастомизации иконок.

autoInstall

  • Тип: boolean
  • По умолчанию: false

Автоматически устанавливать пакеты с исходниками иконок при обнаружении использования.

ПРЕДУПРЕЖДЕНИЕ

Только в среде node, в browser эта опция будет проигнорирована.

unit

  • Тип: string
  • По умолчанию: 'em'

Пользовательская единица измерения иконки.

cdn

  • Тип: string
  • По умолчанию: undefined

Загружать иконки из CDN. Должен начинаться с https:// и заканчиваться /.

Рекомендуется:

  • https://esm.sh/
  • https://cdn.skypack.dev/

customFetch

  • Тип: (url: string) => Promise<any>
  • По умолчанию: undefined

Пресет использует ofetch как загрузчик по умолчанию. Вы также можете использовать пользовательскую функцию fetch для предоставления данных иконки.

processor

  • Тип: (cssObject: CSSObject, meta: Required<IconMeta>) => void
  • По умолчанию: undefined
ts
interface IconMeta {
  collection: string
  icon: string
  svg: string
  mode?: IconsOptions['mode']
}

Процессор для объекта CSS перед преобразованием в строку. См. пример.

Продвинутая очистка пользовательских наборов иконок

При использовании этого пресета с вашими пользовательскими иконками рассмотрите возможность использования процесса очистки, аналогичного тому, который выполняется Iconify для любых наборов иконок. Все необходимые инструменты доступны в Iconify Tools.

Вы можете ознакомиться с этим репозиторием, где данный пресет используется в проекте на Vue 3: @iconify/tools/@iconify-demo/unocss.

Прочитайте статью Cleaning up icons (Очистка иконок) от Iconify для получения более подробной информации.

Вопросы доступности

При использовании иконок важно учитывать всех ваших потенциальных пользователей. Некоторые из них могут использовать программы чтения с экрана (скринридеры), и им понадобится альтернативный текст, чтобы понять, что означает иконка. Вы можете использовать атрибут aria-label, чтобы предоставить описание иконки:

html
<a href="/profile" aria-label="Profile" class="i-ph:user-duotone"></a>

Если иконка является чисто декоративной и не требует текстовой альтернативы, вы можете использовать aria-hidden="true", чтобы скрыть её от программ чтения с экрана:

html
<a href="/profile">
  <span aria-hidden="true" class="i-ph:user-duotone"></span>
  My Profile
</a>

Существует множество других техник для предоставления подсказок программам чтения с экрана; например, пресет Wind3 включает sr-only для визуального скрытия элементов, сохраняя их доступными для скринридеров.

В интернете можно найти хорошие ресурсы по доступности иконок. Поскольку CSS-иконки ведут себя как шрифтовые иконки, вы можете использовать те же методы, что и для них.

Благодарности

Распространяется по лицензии MIT.