предисловие
На самом деле эта статья пишется подряд почти полгода, а основная часть пишется давно, но по разным причинам не публиковалась. Во-первых, основная цель написания этой статьи: я часто использую много значков при работе с интерфейсными и внутренними проектами.Это было хорошо в начале, но по мере того, как проект будет продолжаться, он станет очень сложно добавлять значки каждый раз, когда я его модифицирую.Это хлопотно, и я всегда чувствую, что это недостаточно элегантно, поэтому я начинаю задаваться вопросом, какой простой и удобный рабочий процесс существует?
История развития
Для начала поговорим об истории развития фронтенд-иконок.
древние временаКогда я впервые начал свою стажировку, большинство иконок были реализованы с помощью img. Постепенно я обнаружил, что на изображение img приходится большая часть запрошенных ресурсов страницы, поэтому для оптимизацииimage sprite
Это так называемое изображение спрайта, которое объединяет несколько изображений в одно изображение, а затем использует фоновую позицию css для отображения различных значков значков. Но у этого также есть большая проблема, и обслуживание сложно. Каждый раз, когда вы добавляете значок, вам нужно изменить исходное изображение, и вы можете случайно сделать ошибку и повлиять на ранее расположенное изображение, и как только вы измените изображение спрайта, кеш изображения станет недействительным, и вы не знаете как сохранить его с течением времени.
библиотека шрифтовПостепенно в проекте практически не используются локальные изображения, а для реализации иконок страниц используются некоторые библиотеки шрифтов. распространен какFont Awesome,тоже очень удобен в использовании,но у него есть фатальный минус,что его действительно неудобно находить.Нужно много глаз каждый раз находить иконку,и кастомизация ее тоже очень недружественная.Его иконка Есть всего 675 иконок в библиотеке, что немного, но все равно часто бывает, что нужную иконку не найти. Конечно, это можно терпеть для стартапов без особой погони за пользовательским интерфейсом. Но по мере того, как компания растет, все больше и больше людей указывают пальцем на переднюю часть, сумасшедшие дизайнеры, они скажут нет! Иконка такая уродливая, это оскорбление их звания старшего дизайнера! Но, к счастью, сейчасiconfont.
iconfontГалерея с открытым исходным кодом, сделанная отцом Али, также есть специальныеgithub issue(Хотя я не отвечал на один из своих вопросов более полугода/(ㄒoㄒ)/~~), количество иконок по-прежнему поражает, не только библиотеки иконок с открытым исходным кодом сотен компаний, но и различные Он также поддерживает индивидуальное создание библиотек значков, поэтому, независимо от того, являетесь ли вы начинающей компанией или компанией с высокими требованиями к дизайну, он может помочь вам решить болевые точки, связанные с управлением значками. В общем, все, что вы хотите~
три позы
unicode
Изначально мы использовалиunicode
формате, его основными особенностями являютсяПреимущество
- Лучшая совместимость, поддержка ie6+
- Поддерживает динамическую настройку размера значков, цвета и т. д. по шрифту.
недостаток
- Многоцветные значки не поддерживаются
- Отображение шрифтов в разных браузерах устройств будет немного отличаться.В разных браузерах или системах отображение текста отличается, и на его положение и размер отображения могут влиять CSS, такие как размер шрифта, высота строки, расстояние между словами. , и т.д. Атрибут влияет, и это влияние сложнее настроить
Инструкции:Первый шаг: введение пользовательского шрифта `font-face
@font-face {
font-family: "iconfont";
src: url('iconfont.eot'); /* IE9*/
src: url('iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('iconfont.woff') format('woff'), /* chrome, firefox */
url('iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */
}
Шаг 2. Определите стиль, в котором используется иконочный шрифт.
.iconfont {
font-family:"iconfont" !important;
font-size:16px;
font-style:normal;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
}
Шаг 3: Выберите соответствующий значок и получите код шрифта, примените его к странице.
<i class="iconfont"></i>
Изображение эффекта:
На самом деле его принцип тоже очень прост, т. е. через@font-face
Внедрить пользовательские шрифты (фактически библиотеку шрифтов), которая предусматривает
Эта соответствующая форма длинная. По сути, это похоже на «цветочные штаны», отличающиеся разными настройками шрифта.
Однако очевидны и его недостатки.unicode
Написание не интуитивное, и смысл неясен. только смотреть
этоunicode
Вы совершенно не представляете, что это значит. Тогда естьfont-class
.
font-class
По сравнению с использованием Юникода он имеет следующие характеристики:
- Хорошая совместимость, поддержка ie8+
- По сравнению с семантикой Юникода запись более интуитивно понятна. Легко сказать, что это за значок.
Инструкции:Шаг 1: Скопируйте код класса шрифта, созданный в рамках проекта:
../font_8d5l8fzk5b87iudi.css
Шаг 2: Выберите соответствующий значок и получите имя класса, которое будет применяться к странице:
<i class="iconfont icon-xxx"></i>
Изображение эффекта:
Его основной принцип на самом делеunicode
то же самое, он просто делает еще один шаг, изменяя исходный
Это написание заменено на.icon-QQ
, который записывается в атрибуте before каждого классаunicode
, избавляет от проблем с человеческим письмом. Такие как.icon-QQ:before { content: "\e604"; }
относительноunicode
Его модификация более удобна и интуитивно понятна. Но есть и большая яма.Раньше арендодатель использовал две группы в проектеfont-class
Из-за отсутствия пространства имен все классы помещены в.iconfont
Под пространством имен возникали различные лавинные проблемы при выходе в сеть, и оно долгое время модифицировалось, так что используйтеfont-class
Обязательно обратите внимание на проблему пространства имен.
symbol
По мере того, как злой браузер XX постепенно сходит с исторической сцены, использование svg-icon постепенно становится основным и рекомендуемым методом. Статьи по теме см. в статье Чжан Синьсюй.Будущее должно быть жарким: внедрение технологии SVG Sprite
- Поддержка многоцветных значков, больше не ограниченных одним цветом.
- Поддерживает настройку стиля с помощью размера шрифта и цвета шрифтов.
- Поддержка ie9+
- Анимации могут быть реализованы с помощью CSS.
- Уменьшите количество HTTP-запросов.
- Вектор, масштаб без искажений
- Детальный контроль над каждой частью значка SVG
Инструкции:Шаг 1: Скопируйте код символа, созданный в рамках проекта:
引入 ./iconfont.js
Шаг 2: Добавьте общий код css (введите один раз):
<style type="text/css">
.icon {
width: 1em; height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
Шаг 3: Выберите соответствующий значок и получите имя класса, примените его к странице:
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-xxx"></use>
</svg>
Преимущество использования svg-icon в том, что мне никогда не нужно отправлятьwoff|eot|ttf|
Эти многие библиотеки шрифтов запрашиваются, и все мои SVG могут быть включены в HTML.
svg
а такжеicon-font
Плюсы и минусы, мы можем пойти и посмотреть. PS: это на самом деле используется здесьSVG Sprite
Технология. Простое понимание - это похожее на svg изображение, похожее на спрайт. Он использует символы для обозначения значков svg один за другим в svg. Таким образом, когда мы встречаем один и тот же svg на странице, нам не нужно рисовать еще один. , и использовать его напрямую.<use xlink:href="#icon-QQ" x="50" y="50" />
Его можно использовать, а конкретные подробности можно найти в статье в начале этой статьи.Будущее должно быть жарким: внедрение технологии SVG Sprite, в следующих статьях, потрогаю руками и расскажу как сделать самомуSVG Sprite
.
Создайте компонент icon-component
Теперь, когда у нас есть значок, следующим шагом будет элегантное его использование в наших собственных проектах. Следующий код основан на экземпляре vue (ps: реагировать тоже очень просто, принципы схожи)
//components/Icon-svg
<template>
<svg class="svg-icon" aria-hidden="true">
<use :xlink:href="iconName"></use>
</svg>
</template>
<script>
export default {
name: 'icon-svg',
props: {
iconClass: {
type: String,
required: true
}
},
computed: {
iconName() {
return `#icon-${this.iconClass}`
}
}
}
</script>
<style>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
//引入svg组件
import IconSvg from '@/components/IconSvg'
//全局注册icon-svg
Vue.component('icon-svg', IconSvg)
//在代码中使用
<icon-svg icon-class="password" />
Он просто инкапсулируетIcon-svg
Компоненты, мы можем просто и элегантно использовать значки в наших проектах Vue.
дальнейшее обновление
Но как сильному front-end разработчику как мы можем быть довольны этим!В настоящее время есть еще фатальный недостаток,т.svg-sprite
Все через иконный шрифтiconfont.js
Сгенерировано.
- Во-первых, это фрагмент кода, который использует js для генерации svg, все иконки оченьНе интуитивный.
- Во-вторых, нельзянагрузка по требованию, не может быть динамически сгенерирован на основе тех svg, которые мы используем
svg-sprite
. - Плохая настройка, обычно экспортируемый svg содержит много бесполезной информации, такой как исходная информация редактора, комментарии и т. д. Обычно содержит другое содержимое, которое не влияет на результат рендеринга или может быть удалено.
-
добавить недружественный, если у меня есть пользовательские значки svg, как я могу сопоставить оригинал
iconfont
объединены вместе? В настоящее время его можно загрузить только наiconfont
Очень громоздко поместить его в библиотеку проекта с оригинальной иконкой, а потом скачать заново.
Использование svg-спрайта
Дальше будем делать своиsvg-sprite
. использовать здесьsvg-sprite-loaderЭтот артефакт представляет собой загрузчик веб-пакетов, который может упаковывать несколько svg вsvg-sprite
.
Давайте покажем, какvue-cli
На основе преобразования, добавляяsvg-sprite-loader
.
мы обнаруживаемvue-cli
будет использоваться по умолчаниюurl-loader
обработайте svg, он будет помещен в/img
каталог, так что в это время мы представляемsvg-sprite-loader
Какие-то конфликты возникнут.
//默认`vue-cli` 对svg做的处理,正则匹配后缀名为.svg的文件,匹配成功之后使用 url-loader 进行处理。
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
}
Есть два решения.Самое простое это можно убрать svg теста,чтобы svg не обрабатывался.Конечно,это очень недружелюбно.
- Вы не можете гарантировать, что все ваши svg используются в качестве значков, некоторые действительно могут использоваться только в качестве ресурсов изображения.
- Нет никакой гарантии, что некоторые сторонние библиотеки, которые вы используете, будут использовать svg.
Поэтому самый безопасный и разумный подход — использовать webpackexcludeа такжеinclude,Позволятьsvg-sprite-loader
Просто разберитесь с SVG, ниже вы указываете папку,url-loaer
Обрабатывать только все svg кроме этой папки, что отлично решает проблему предыдущих конфликтов.
код показывает, как показано ниже
Это настроено, просто введите имя класса после импорта svg
import '@/src/icons/qq.svg; //引入图标
<svg><use xlink:href="#qq" /></svg> //使用图标
Одно это все еще очень неэлегантно.Если у меня в моем проекте сотня иконок, мне нужно вручную вводить их одну за другой!Лень — первая продуктивность программистов! ! !
автоматический импорт
Сначала мы создаем папку, предназначенную для размещения значков, таких как:@/src/icons
Поместите все ICON в эту папку.
После этого мы будем использовать Webpackrequire.context. много людей дляrequire.context
Это может быть незнакомо, простое объяснение
require.context("./test", false, /.test.js$/); Эта строка кода перейдет в тестовую папку (без подкаталогов), чтобы найти все имена файлов, начинающиеся с
.test.js
Файл, оканчивающийся на требуемый файл. Грубо говоря, мы можем импортировать соответствующий файловый модуль через обычное сопоставление.
require.context имеет три параметра:
- directory: указывает каталог, который нужно получить
- INSEBDIRECTIONES: вы проверяете подкаталог
- regExp: регулярное выражение для сопоставления файлов
Поняв это, мы можем написать это, чтобы автоматически ввести@/src/icons
Все значки ниже
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)
После этого мы можем добавлять, удалять и изменять иконку прямо на соответствующую иконку в папке, вам не нужно ни о чем беспокоиться, она будет сгенерирована автоматически.svg symbol
.
Дальнейшая оптимизация собственного svg
Сначала давайте посмотрим на это阿里iconfont
Как экспортированный svg выглядит на сайте?
Правильно, хотя содержимое svg, экспортируемое веб-сайтом iconfont, довольно упрощено, вы обнаружите, что в нем по-прежнему много бесполезной информации, вызывающей ненужную избыточность. Даже svg, экспортируемый веб-сайтом iconfont, похож на этот, не говоря уже о svg, экспортированном дизайнерами, которые больше озабочены тем, красивый интерфейс или нет. к счастьюsvg-sprite-loader
Принимая это во внимание, в настоящее время он получает только содержимое пути в svg и не получает никакой другой информации. Сгенерируйте svg, как показано ниже:
Но любая избыточная информация, которую вы создаете в пути, не будет обработана. как записка или что-то
На данный момент мы собираемся использовать другую полезную вещь —svgo
SVG files, especially exported from various editors, usually contain a lot of redundant and useless information such as editor metadata, comments, hidden elements, default or non-optimal values and other stuff that can be safely removed or converted without affecting SVG rendering result.
Он поддерживает десятки оптимизаций, очень мощный, 8K + STAR тоже достаточно, чтобы объяснить проблему.
Подробную информацию о работе см.официальная документация Отличная статья Чжан Синьсюй(Да, это снова эта большая статья, может быть, это большой парень!) Эта статья не будет расширяться.
напиши в конце
Вышеизложенное описывает историю развития использования иконок во внешних проектах.
В общем, это одна и та же фраза,Подходит лучше всего. Выбирая в предыдущей дискуссии vue react или angular, я лично считаю, что каждый фреймворк имеет свои особенности и применимые бизнес-сценарии, поэтому все рекомендации и обсуждения, которые не объединяют бизнес-сценарии, являются слепыми бб. . . Как упоминалось выше, существует пять сценариев использования значков во внешнем интерфейсе.Font Awesome
Не использовать его не потому, что это плохо, а потому, что он не подходит для бизнес-сценариев.Если в вашей команде нет выделенного дизайнера или настройка значка не высока, вы можете использовать его.Font Awesomegithub имеет более 50 000 звезд, что свидетельствует о его признании сообществом. Например, у вашего проекта повышенные требования к адаптации под младшие браузеры, а вы все равно насильно используете svg в качестве значка значка, значит, вы действительно боретесь с собой. Таким образом, нет абсолютного преимущества или недостатка во всех решениях.Решение, которое подходит для вашего бизнес-сценария, решает ваши реальные проблемы и повышает эффективность вашей разработки, является хорошим решением.
Чжанкэн
Методы, описанные в этой статье,vue-element-adminПолный пример можно найти в .vue-element-admin
Также выпустил новую версию и поддерживающуюкитайский документ(Я буду блевать кровью, когда документ будет действительно написан) Независимо от того, используете ли вы этот проект или нет, рекомендуется взглянуть. Это должно быть полезно для вашего проекта Vue. Использование и недостатки приветствуются.
Бесплатно для владельцакруг.
Серия статей:
- Взявшись за руки, вы попадете на задний план с vue серии 1 (базовая)
- Рука об руку, перенесемся на задний план с vue series 2 (разрешения на вход)
- Рука об руку, отведи тебя за кулисы с vue series 3 (настоящий бой)
- Рука об руку, вы можете использовать четвертую серию vue background (vueAdmin — минималистичный фоновый базовый шаблон)
- Взявшись за руки, отведите вас за кулисы с Vue Series 5 (новая версия v4.0)
- Взявшись за руки, вы инкапсулируете компонент vue.
- Прикоснитесь к своей руке, чтобы элегантно использовать значок
- Из рук в руки, возьму вас с собой, чтобы использовать webpack4 в разумной позе (включено)
- Из рук в руки, возьмите вас за использование webpack4 в разумной позе (ниже)