sjaakp/yii2-icon

Yii2 中的原始 SVG 图标

安装次数: 4,580

依赖者: 4

建议: 0

安全性: 0

星标: 1

关注者: 1

分支: 0

开放性问题: 0

类型:yii2-extension

1.2.1 2024-02-25 15:39 UTC

This package is auto-updated.

Last update: 2024-08-25 16:49:07 UTC


README

Raw SVG symbols in Yii2

Latest Stable Version Total Downloads License

在您的网站上嵌入像 Font Awesome 这样的图标,最好的方法可能是使用 裸 SVG 作为 SVG 符号。图标的 SVG 代码嵌入在页面中。因此,无需下载额外的字体文件,也不需要在页面加载时运行 JavaScript,浏览器将以尽可能快的速度渲染图标。

然而,这需要更多的编码。直到现在;因为现在有了 yii2-icon。这为 Yii 2.0 提供了一个辅助类,可以减轻基于裸 SVG 符号的图标负担。

yii2-icon 的演示 在此yii2-icon 的 GitHub 页面 在此

安装

使用 Composer 以常规方式安装 yii2-icon。将以下内容添加到您的 composer.json 文件的 require 部分

"sjaakp/yii2-icon": "*"

或者运行

composer require sjaakp/yii2-icon

您可以手动通过 下载 ZIP 格式的源代码 来安装 yii2-icon

设置

为了使 yii2-icon 正常工作,您的网站上还需要安装一些图标集合。在许多情况下,这将通过 npm 安装,其他集合(特别是 FontAwesome Free)通过 Composer 安装。有关详细信息,请参阅图标提供者的网站。

在任何情况下,必须定义一个名为 'icons' 的应用程序参数。该参数应描述图标文件的位置。值可以是,最好是 Yii2 别名

例如,对于通过 composer 安装的 FontAwesome Free,这将如下所示

'@vendor/fortawesome/font-awesome/svgs/{family}/{name}.svg'

  • {family} 将被替换为图标家族(如 'regular''solid''thin')。
  • {name} 将被替换为图标名称(如 'bicycle''chess-queen''arrow-down')。
  • {phosphor} 将被替换为符合 Phosphor Icons 期望的图标家族和图标名称的组合。

图标家族和名称可以在图标提供者的网站上找到。

另一个例子,对于通过 npm 安装的 FontAwesome Pro,应用程序参数 'icons' 应该是

'@app/node_modules/@fortawesome/fontawesome-pro/svgs/{family}/{name}.svg'

设置应用程序参数的首选方法是将它添加到主站点配置的 'params' 部分(通常是 web.php 或配置目录中的 config/main.php)。'params' 部分可能看起来像这样

'params' => [
    'adminEmail' => 'info@example.com',
    'supportEmail' => 'support@example.com',
    'icons'  => '@vendor/fortawesome/font-awesome/svgs/{family}/{name}.svg',
    // ... probably more parameters ...
],

如果未设置应用程序参数 'icons'yii2-icon 将引发错误。

接下来,应修改站点的主体布局视图(可能是 'views/layouts/main.php')。在 body 部分的顶部,yii2-icon 的类 Icon 需要渲染 SVG 符号。主要布局视图的开始部分应该看起来像这样

<?php

use ...
use sjaakp\icon\Icon;

//...
?>
...
<html ...>
<head> ... </head>
<body class=" ... ">
    <?php $this->beginBody() ?>
    <?= Icon::symbols($this) ?>

    // ...

使用 yii2-icon

如果一切设置正确,您可以在任何视图中渲染图标。例如,要渲染 regular 家族的图标,只需使用类似以下内容

<?= Icon::regular('bicycle') ?>

对于其他家族也是如此

<?= Icon::solid('heart') ?>
<?= Icon::light('bell') ?>

如果图标集合没有家族,例如 Bootstrap Icons,则可以使用以下方式渲染图标

<?= Icon::icon('camera') ?>

样式

图标可以使用 HTML 选项进行扩展,如下所示

<?= Icon::regular('bicycle', [ 'class' => 'blue' ]) ?>

默认情况下,yii2-icon 包括 FontAwesome 样式类,即使对于其他字体集合也是如此。这意味着诸如 fa-lgfa-rotate-90 等类将直接生效。例如

<?= Icon::solid('rotate', [ 'class' => 'fa-spin' ]) ?>

类 Icon

yii2-icon 的所有功能都封装在一个抽象类 sjaakp\icon\Icon 中。它只包含抽象函数

  • renderIcon($fam, $name, $options = []) - 渲染来自家族 $fam 的名为 $name 的图标。返回 HTML。
  • symbols($view) - 在 视图 $view(最好是一个 布局)中渲染符号表。返回 HTML。
  • reset() - 重置从应用程序参数 'icons' 中获取的 yii2-icon 的状态。在多个图标集合的情况下可能很有用。

所有其他函数调用 都将被转换为对 renderIcon 的调用,其中函数名将是 $fam 的值。因此,像以下这样的函数调用

Icon::regular('bicycle', [ <options> ]);

将被解释为

Icon::renderIcon('regular', 'bicycle', [ <options> ]);

图标的渲染方式

假设我们有一个包含 <?= Icon::solid('mug-hot', [ 'class' => 'fa-rotate-90' ]) ?> 的页面。它将被渲染为

<body>
    <svg xmlns="http://www.w3.org/2000/svg"> <!-- invisible symbol table -->
        <symbol ...><path d="..."/></symbol>
        <symbol id="i-solid-mug-hot" viewBox="0 0 512 512"><path d="M400 192H32C14.25 192 ..."/></symbol>
        <symbol ...><path d="..."/></symbol> <!-- more symbols -->
    </svg>

    ...
    <!-- lots of other HTML -->
    ...

    ... <svg class="fa-rotate-90 svg-inline--fa">
            <use href="#i-solid-mug-hot"></use>
        </svg> ...

    ...

</body>

注意

如果符号表之后渲染图标,则主布局文件中的图标可能无法渲染。避免此问题的方法之一是将图标分配给 PHP 变量,如下所示

<?php
/* views/layouts/main.php */

use ...
use sjaakp\icon\Icon;

$iconHouse = Icon::solid('house');

//...
?>
...
<html ...>
<head> ... </head>
<body class=" ... ">
    <?php $this->beginBody() ?>
    <?= Icon::symbols($this) ?>

    // ...

    Render house icon: <?= $iconHouse ?>.

    // ...

高级设置

除了图标 SVG 文件位置的描述之外,应用程序参数 'icons' 的值还可以是具有以下成员的数组

  • location - 图标 SVG 文件的位置,如前所述。必须提供。
  • faCss - 可选。Icon 是否注册 Font Awesome 样式 CSS。默认:true
  • template - 可选。用于形成图标 HTML id 的家族和名称的模板。默认和示例:'i-{family}-{name}'
  • iconClass - 可选。分配给图标的 CSS 类。默认:'svg-inline--fa'

一些图标资源

(注意:'@node''@app/node_modules' 的别名。)