可替换元素

可替换元素(英文: replaced element), 起初只是想了解什么是"可替换元素", 但是看了几个解释也理解不了, 所以接着又查了不少资料, 最终结果是本文有钻牛角尖的嫌疑.

先看MDN的解释:

CSS 里,可替换元素(replaced element)的展现不是由CSS来控制的。这些元素是一类外观渲染独立于CSS的外部对象。 典型的可替换元素有 <img><object><video> 和 表单元素,如<textarea><input> 。 某些元素只在一些特殊情况下表现为可替换元素,例如 <audio><canvas> 。 通过 CSS content 属性来插入的对象 被称作 匿名可替换元素(anonymous replaced elements

"这些元素是一类外观渲染独立于CSS的外部对象"是什么意思? 理解不了. 后面又找到 CSS2.1规范中的定义

An element whose content is outside the scope of the CSS formatting model, such as an image, embedded document, or applet. For example, the content of the HTML IMG element is often replaced by the image that its "src" attribute designates. Replaced elements often have intrinsic dimensions: an intrinsic width, an intrinsic height, and an intrinsic ratio. For example, a bitmap image has an intrinsic width and an intrinsic height specified in absolute units (from which the intrinsic ratio can obviously be determined). On the other hand, other documents may not have any intrinsic dimensions (for example, a blank HTML document).

User agents may consider a replaced element to not have any intrinsic dimensions if it is believed that those dimensions could leak sensitive information to a third party. For example, if an HTML document changed intrinsic size depending on the user's bank balance, then the UA might want to act as if that resource had no intrinsic dimensions.

The content of replaced elements is not considered in the CSS rendering model.

最有用的当属第一句和最后一句, 第一句的"outside the scope of the CSS formatting model"和上面的"外观渲染独立于CSS"解释相似, 那所谓的"CSS formatting model"是什么东西? 规范里面有两章描述这个 Visual formatting modelVisual formatting model details, 这就脱离了本文讨论的东西了(实际上是我看不懂...). 不过最后一句还是好懂的, CSS"不干预"可替换元素的内容, 那也就是说CSS里面设置的content对可替换元素无效. 在 stackoverflow 上也找到一个关于这个问题的回答 Is HTML label a replaced element?, 里面提到这么一种验证思路:

You cannot apply generated content to replaced elements. That is, you cannot apply the pseudo-element selectors :before or :after to them.

既然这样, 就写份 HTML 验证一下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Replaced Elements</title>
    <style>
        tbody td {
            padding: 10px 20px;
        }

        tbody > tr > td:nth-child(2) > *:before {
            content: "«";
            color: blue;
        }

        tbody > tr > td:nth-child(2) > *:after {
            content: "»";
            color: red;
        }
    </style>
</head>
<body>
<table border="1">
    <thead>
    <tr>
        <th>元素</th>
        <th>表现</th>
    </tr>
    </thead>

    <tbody>
    <tr>
        <td>label</td>
        <td><label for="">标签</label></td>
    </tr>

    <tr>
        <td>button</td>
        <td>
            <button>按钮</button>
        </td>
    </tr>

    <tr>
        <td>img</td>
        <td><img src="https://iph.href.lu/200x50?text=img" alt=""></td>
    </tr>

    <tr>
        <td>select</td>
        <td>
            <select name="" id="">
                <option value="1">选项 1</option>
                <option value="2">选项 2</option>
                <option value="3">选项 3</option>
            </select>
        </td>
    </tr>

    <tr>
        <td>meter</td>
        <td>
            <meter value="0.3"></meter>
        </td>
    </tr>

    <tr>
        <td>progress</td>
        <td>
            <progress value="0.3"></progress>
        </td>
    </tr>

    <tr>
        <td>textarea</td>
        <td><textarea name="" id="" cols="30" rows="3">文本</textarea></td>
    </tr>

    <tr>
        <td>input[type=text]</td>
        <td><input type="text" value="输入框"></td>
    </tr>

    <tr>
        <td>input[type=radio]</td>
        <td><input type="radio"></td>
    </tr>

    <tr>
        <td>input[type=checkbox]</td>
        <td><input type="checkbox"></td>
    </tr>

    <tr>
        <td>input[type=range]</td>
        <td><input type="range"></td>
    </tr>

    <tr>
        <td>input[type=file]</td>
        <td><input type="file"></td>
    </tr>

    <tr>
        <td>input[type=image]</td>
        <td><input type="image" src="https://iph.href.lu/200x50?text=input[type=image]"></td>
    </tr>

    <tr>
        <td>input[type=submit]</td>
        <td><input type="submit" value="提交"></td>
    </tr>

    <tr>
        <td>iframe</td>
        <td>
            <iframe src="http://www.baidu.com" frameborder="1"></iframe>
        </td>
    </tr>

    <tr>
        <td>object[type=image/png]</td>
        <td>
            <object data="httpshttps://iph.href.lu/200x50?text=object" type="image/png"></object>
        </td>
    </tr>

    <tr>
        <td>embed[type=image/png]</td>
        <td>
            <embed type="image/png" src="https://iph.href.lu/200x50?text=embed">
        </td>
    </tr>

    <tr>
        <td>hr</td>
        <td>
            <hr>
        </td>
    </tr>

    <tr>
        <td>br</td>
        <td>换行前<br>换行后</td>
    </tr>
    </tbody>
</table>
</body>
</html>

下面两张图是 Win7 分别在 Chrome68 和 Firefox62 的渲染效果.

chrome68Render
firefox62Render

两个浏览器渲染结果是不同的, 差异集中在 input 那块. 这里有一篇关于这个问题的讨论: CSS generated content on replaced elements, 文章中有几个开发者表达了自己的看法(主要是对 Chrome 的渲染结果), 有说是 bug 的, 也有说是 feature 的. 不过这貌似还是没解决问题.

后面又找到了 W3C 文档里面提供的浏览器对元素和控件的渲染参考, 里面有两个小节值得注意: 可替换元素非可替换元素, 按照里面的分类, 属于可替换元素的有: embed, iframe, video, img, input[type=image](即 Image Button), 特定情况下的 audio, canvas, object, 其他的都属于非可替换元素.

一路下来, 实际上也并没有找到一个规范或定义, 可以严格分类可替换元素和非可替换元素, 倘若一定要选出最靠谱, 那我认为是 W3C 给出的渲染参考里面的分类. 不过文章开头也说了, 本文有钻牛角尖的嫌疑, 实际上弄清楚哪些元素是可替换元素并不应该成为目的, 更多是为学习(写) CSS 服务的, 所以其实更应该花时间弄清楚 "CSS rendering model" .

参考链接:
HTML 5.3: 2 Common infrastructure#replaced-element

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,722评论 1 92
  • 夜沉的滴下几滴水 落在无眠人的心上 起身熄灭亮着的灯 把期盼紧紧抱在怀里 酿成酸味的酒 洒在自己的酒窝 路绵延在远...
    爱吃面包的树阅读 152评论 7 11
  • 过几天就是小鱼五周岁生日了,这几天特别的怀旧,脑海里不断想着他出生时的情景,居然有点模糊,甚...
    娜些事阅读 342评论 0 1
  • 夏天ALex的那一首歌 不再联系,在脑海里久久循环 我和你不再联系,不再打扰彼此的生活 请你不要介意,要怪就怪当初...
    木子虫阅读 215评论 0 0
  • 今年我28她27! 1、深思熟虑的开始了这一生最后的一场恋爱和余生的征程! 四个来月的男女关系!好坏参半、但也各自...
    陌上莨人阅读 353评论 0 3