HTML里的“宏”

摊牌了,分享两个极少有人知道的技巧。

观察下面的网页

https://lab.est.im/xhtml/

有没有发现神奇之处

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html [
  <!ENTITY my_symbol "★">
  <!ENTITY wikipedia '<img height="14" src="https://en.wikipedia.org/favicon.ico" alt="Wikipedia" />'>
]>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Entity test</title>
  </head>
  <body>
    <p>hey &my_symbol; visit &wikipedia; for more!</p>
  </body>
</html>

另外就是刚做的 play2mi 有一个特立独行的想法:不让出现厂牌的关键字,一律用图标 代替。

但是这个 <img height="16" src="https://www.mi.com/favicon.ico" /> 出现得次数太多,就很重复了。有没有 宏/macro 来节约呢?

浑身不舒服。经过一番激烈拷打AI,最终结果:

div.wrap param {display: inline; height: 1em; vertical-align: -.125em;}
param[mi] { content: url("https://www.mi.com/favicon.ico"); }
param[mijia] { content: url("https://cdn.web-global.fds.api.mi-img.com/mijia/prod/home/favicon.ico") }

<param mi> 是一个自定义属性,写起来比 <i class="icon-mi"></i>短,也不需要闭合。

用不存在的自定义标签当然也行,但必须写一对儿 <mi-icon></mi-icon>。为了不闭合偷懒,查到浏览器只白名单了14个空元素(Void Elements)

那就变废为宝,拿 <param> 来当 宏 用,不会被当成未知元素,HTML 校验也不报错。

之前的版本还有 css 变量

param {display: inline-block; width: 1em; height: 1em; vertical-align: -0.125em; background: var(--icon) center / contain no-repeat;}
param[A] { --icon: url("A.jpg"); }
param[B] { --icon: url("B.jpg") }

也有利用 background-image 比 background 优先

param {display: inline-block; padding: .5em; vertical-align: -.125em; background: center / contain no-repeat;}
param[A] { background-image: url(A.jpg) }
param[B] { background-image: url(B.jpg) }

但 width: 1em 这个太死板。现代css有 content: 更省事儿,宽度还会按图片比例自动算。

AI 还教了一招,用 attr() 给宏传参数

param::after { content: attr(value) }

<param mi value="手机"> <param mi value="电视">

有AI真能学到好多东西,以前翻破书都想不到的,就看你肯不肯开口问。

Comments