65.9K
CodeProject 正在变化。 阅读更多。
Home

Advanced CSS3: pseudo-icons made of HTML5 div Elements

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.59/5 (9投票s)

2015年4月16日

CPOL

6分钟阅读

viewsIcon

42967

CSS3 技术利用 HTML5 div 元素生成紧凑的伪图形

引言

这种先进的 HTML5/CSS3 技术曾在物联网(IoT,即“万物互联”)竞赛提交的文章《enRoute:纽约市实时公交跟踪 Web 应用》[1] 中被简要讨论过,该文章描述了一个实时纽约市公交监控 Web 应用。

紧凑、可扩展且灵活的解决方案

由于城市公交跟踪应用 [1] 的实时性,最大程度地减少 Web 数据流量(入站/出站)至关重要,因此非常希望避免使用任何图形文件,并将数据通信仅限于文本。正如一句古老的谚语所说:“一图胜千言”,但它也重达数千字节(这部分被省略了)。即使是高度压缩的格式,图像文件也可能比整个文本通信数据包大一个数量级或更多。

理想情况下,实时数据通信交换应仅包含文本;不向客户端传输图形文件。为了实现一些美学增强,某些图形图像可以作为 Unicode 字符提供:使用它们将以最佳方式解决问题。如果没有合适的 Unicode 字符可用,另外两个选项将是创建自定义图形图像文件(从大小/灵活性角度来看不佳),或者应用高级 CSS3 技术,该技术在许多情况下能够产生令人满意的紧凑型伪图标图形增强。与使用图形文件相比,通过 CSS3 语句(而不是图像编辑)实现的“可扩展性和易于修改性”是该方案的附加优势,如下文所述。

背景

下面展示了用于为实时城市公交跟踪应用程序 [1] 生成公交车伪图标的原始 CSS 技术

列表 1. 由 HTML5 div 和 CSS3 制成的公交车“伪图标”(原始解决方案)

<!DOCTYPE html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>BUS ICON</title>
    <style type="text/css">
        /* BUS ICON: SIZE 16PX, COLOR-BLUE */
        .b16 {
            width:12px;
            height:14px;
            border-top: 2px solid #000099;
            border-left: 2px solid #000099;
            border-right: 2px solid #000099;
            border-top-left-radius: 4px;
            border-top-right-radius: 4px;
            background:#f0f0f0;
        }
        .b16 .b {
            width:100%;
            height:4px;
            margin-top:4px;
            border-top: 2px solid #000099;
            border-bottom: 2px solid #000099;
            background:#ffff00;
        }
        .b16 .b .bb {
            background:#000099;
            width:6px;
            margin:0 auto;
            height:4px;
        }
    </style>
</head>
<body>
    <!-- BUS ICON 16px -->
    <div class="b16"><div class="b">
    <div class="bb"></div></div></div>
</body>
</html>

与列表 1 对应的“CSS3 合成”的公交车伪图标如下所示

""

图 1:由 HTML5 <div> 元素和 CSS3 样式技术制成的公交车伪图标

可以通过这一行简单的代码将所需的公交车伪图标添加到 HTML5 文档中

<div class="b16"><div class="b">
<div class="bb"></div></div></div>

除了数字占用空间小之外,这种紧凑的解决方案还提供了与图形文件相比的巨大灵活性:可以通过仅修改 HTML5/CSS3 中的几行代码来轻松更改颜色主题和整体外观,而无需在每次需要更改时进行图像编辑。该技术通过高级使用 CSS3 的 :before:after 伪元素进一步扩展。

Using the Code

下面列表所示的是允许通过使用 :before:after 伪元素来创建公交车“伪图标”的优化 CSS3 样式技术

列表 2. 公交车伪图标:带 CSS3 伪元素的 HTML5 div (更优化的解决方案)

 /* BUS ICON, HEIGHT 12PX */
.b12
{
    width                   : 8px;
    height                  : 10px;
    border-top              : 2px solid #000099;
    border-left             : 2px solid #000099;
    border-right            : 2px solid #000099;
    border-top-left-radius  : 3px;
    border-top-right-radius : 3px;
    background              : none;
    display                 : inline-block;
    vertical-align          : middle;
}

.b12:before
{
    content                 :'';
    display                 : block;
    height                  : 2px;
    margin-top              : 3px;
    border-top              : 2px solid #000099;
    border-bottom           : 2px solid #000099;
    background              : #ffff00;
}

.b12:after
{
    content                 :'';
    display                 : block;
    background              : #000099;
    width                   : 4px;
    height                  : 4px;
    margin                  : -5px auto;
}
/*circle to use w/b12*/
.b12C
{
    width                   : 18px;
    height                  : 18px;
    line-height             : 16px;
    vertical-align          : middle;
    text-align              : center;
    border-radius           : 12px;
    border                  : 2px solid #000099;
    background              : #fafafa;
}

与列表 2 对应的公交车伪图标可以添加到 Bing 地图或任何 HTML5 文档中,只需一行简单的代码

<div class='b12'></div>

或者,包含在圆圈中

<div class='b12C'><div class='b12'></div></div>

建议的技术为图形文件提供了一种灵活且相当紧凑的 CSS3 替代方案。下面的演示截图链接到了使用所述技术的实时全功能 Web 应用。

演示

下面实时城市公交跟踪 Web 应用的示例截图显示了上面列表 2 中描述的高级 CSS3 技术生成的公交车 伪图标。点击图片链接即可查看实时纽约市公交跟踪应用的现场演示

图 2:实时纽约 MTA 公交跟踪应用使用 CSS3 生成的公交车伪图标(显示在圆圈中)

灵活性和可扩展性

伪图标解决方案是可扩展的,并且易于定制:例如,可以通过 CSS 样式表中的几行代码轻松更改颜色主题,如下面的列表 3 所示(HTML5+CSS3 封装在单个文件中)

列表 3. 公交车伪图标,灵活的 HTML5/CSS3 解决方案

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>ADVANCED HTML5/CSS3: BUS PSEUDO-ICONS MADE OF DIV</title>
    <style type="text/css">
        /* BUS PSEUDO-ICON, HEIGHT 1EM */
        .b1
        {
            display                 : inline-block;
            vertical-align          : middle;
            width                   : 0.8em;
            height                  : 0.8em;
            border                  : 0.2em solid;
            border-bottom           : none;
            border-radius           : 0.3em 0.3em 0em 0em;
        }
        .b1:before
        {
            content                 :'';
            display                 : block;
            height                  : 0.2em;
            padding                 : 0;
            margin-top              : 0.25em;
            border-top              : 0.15em solid;
            border-bottom           : 0.15em solid;
         }
        .b1:after
        {
            content                 :'';
            display                 : block;
            width                   : 0.4em;
            height                  : 0.4em;
            margin                  :-0.4em auto;
        }
        /*bus icon color*/
        .b1, .b1:before { border-color: #000099; }
        .b1:after {background : #000099; }

        /* BUS PSEUDO-ICON, HEIGHT 2EM */
        .b2
        {
            display                 : inline-block;
            vertical-align          : middle;
            width                   : 1.7em;
            height                  : 1.7em;
            border                  : 0.3em solid;
            border-bottom           : none;
            border-radius           : 0.4em 0.4em 0em 0em;
        }
        .b2:before
        {
            content                 :'';
            display                 : block;
            height                  : 0.4em;
            margin-top              : 0.6em;
            border-top              : 0.3em solid;
            border-bottom           : 0.2em solid;
         }
        .b2:after
        {
            content                 :'';
            display                 : block;
            width                   : 0.9em;
            height                  : 0.8em;
            margin                  :-0.8em auto;
        }
        /*bus icon color*/
        .b2, .b2:before { border-color: darkgreen; }
        .b2:after {background : darkgreen; }

        /*optional: headlights color*/
        .b2:before { background : Yellow;}
    </style>
</head>
<body>
    <table>
        <tr>
            <td>Bus pseudo-icon, 1em, blue w/white headlights</td>
            <td><div class="b1"></div></td>
        </tr>
        <tr>
            <td>Bus pseudo-icon, 2em, green w/yellow headlights</td>
            <td><div class="b2"></div></td>
        </tr>
    </table>
</body>
</html>

该解决方案使用 CSS3 'em' 单位以获得更好的可扩展性。可以通过以下两行轻松更改公交车伪图标的颜色

        /*bus icon color*/
        .b2, .b2:before { border-color: darkgreen; }
        .b2:after {background : darkgreen; }

可选地,可以通过以下方式使用 CSS3 属性指定前灯颜色

        /*optional: headlights color*/
        .b2:before { background : Yellow;}

相应的示例截图如下

图 3:公交车伪图标示例截图

关注点

我对于探索高级 CSS3 样式技术看似无限的可能性感到非常兴奋,这在数据流量/数据包大小相当关键的实时 Web 应用中尤其重要。更多关于此主题的信息请参阅我之前的文章/技巧 [2,3]。

实际考量

出于教学目的,整个解决方案(请参见列表 3 中的代码片段)被封装在一个 HTML 文件中,其中 CSS 样式表结构为了更好的可读性而使用了制表符/空格和额外的注释。对于此解决方案的生产级实现,有几个重要的实际考量。首先,可以删除所有注释和额外的制表符/空格,以进一步减小总体大小。此外,将文件拆分为两个是相当重要的:提供内容的 HTML 文件和一个通过 link rel 语句包含在主文件中的 CSS 文件,如下面的列表 4a,b 所示

列表 4a:HTML 文件

<!DOCTYPE html>
<html>
<head>
    <title>ADVANCED HTML5/CSS3: BUS PSEUDO-ICONS MADE OF DIV</title>
    <link rel="stylesheet" type="text/css" href="BusIcon.css" />
</head>
<body>
    <table>
        <tr>
            <td>Bus pseudo-icon, 1em</td>
            <td><div class="b"></div></td>
        </tr>
        <tr>
            <td>Bus pseudo-icon, 2em</td>
            <td><div class="b" style="font-size:2em;"></div></td>
        </tr>
    </table>
</body>
</html>

列表 4b:单独文件中的 CSS 样式表

/******************************************************************************
Module           :   BusIcon.css
Description      :   Bus pseudo-icon CSS3 style sheet
-------------------------------------------------------------------------------
Author           :   Alexander Bell
Copyright        :   2015 Infosoft International Inc
******************************************************************************/
.b
{
    display                 : inline-block;
    vertical-align          : middle;
    width                   : 0.8em;
    height                  : 0.8em;
    border                  : 0.2em solid;
    border-bottom           : none;
    border-radius           : 0.3em 0.3em 0em 0em;
}
.b:before
{
    content                 :'';
    display                 : block;
    height                  : 0.2em;
    padding                 : 0;
    margin-top              : 0.25em;
    border-top              : 0.15em solid;
    border-bottom           : 0.15em solid;
    }
.b:after
{
    content                 :'';
    display                 : block;
    width                   : 0.4em;
    height                  : 0.4em;
    margin                  :-0.4em auto;
}
/*bus icon color*/
.b, .b:before { border-color: #000099; }
.b:after {background : #000099; }

程序关注点分离,即内容(HTML)与表示层(CSS)是众所周知的编程范例,在这个用例中尤为重要。主要的 Web 浏览器实现了高效的缓存技术,因此外部 CSS3 文件(列表 4b)通常会在第一次请求时被缓存,从而减少 Web 流量并提高后续数据请求的性能。

如上所述,所提议解决方案的另一个优点在于其灵活性/可扩展性:只需指定一个伪图标 CSS3 样式即可,可通过代码轻松修改,例如所示。为了增加公交车伪图标的大小(例如,使其成为基础大小的 2 倍),只需将 font-size:2em; 应用于容器 div 元素:这可以在主 HTML 文件中完成(此处为教学目的),或者在外部 CSS 文件中完成,后者更适合生产发布。

可能的替代方案

如前一小节所述,最佳情况是使用 ASCII 或 Unicode 字符(如果存在合适的字符)。否则,这种高级 CSS3 技术是一种提供相当紧凑、灵活和可扩展的解决方案的选项。其他替代方案也存在,特别是评论线程中讨论的那些。第一个使用高度压缩图形图像/文件的建议缺乏灵活性/可扩展性,并且在处理图像编辑方面增加了大量劳动。使用 Canvas 绘图是另一个建议的替代方案,它也缺乏任何实质性优点:它需要额外的 JavaScript 并且会引发 Web 浏览器兼容性问题。除了这些建议之外,似乎 SVG 可以成为这种基于 CSS3 的伪图形解决方案的有效替代方案(SVG 主题将在单独的技巧中介绍)。

历史

  • 2015 年 3 月:按照 [1](竞赛文章)的描述发布了第一个解决方案草案
  • 2015 年 4 月:将高级 CSS3 技术应用于原始代码,以生成更灵活/紧凑的解决方案
  • 2015 年 4 月:添加了另一个示例代码,提供了更高的灵活性(使用“em”单位和简化的 CSS3 颜色主题)
  • 2015 年 5 月:添加了与生产级解决方案相关的代码和指南。

参考文献

  1. A.Bell,“enRoute:纽约市实时公交跟踪 Web 应用”(Codeproject 物联网竞赛提交)
  2. Advanced CSS3 Styling of HTML5 SELECT Element
  3. 基于 ASP.NET CheckBox 和 HTML5/CSS 的切换按钮
© . All rights reserved.