从一个误解说开去

有没有无论在99%设备上都不改变样式的易编辑文档格式?继续讨论:

(这个标题简直暴露年龄,感觉是非常古早的说法了……

上面帖子中出现了一个关于 HTML 标签自带样式的误解,大家认真解释了一番,我也尝试补充两句,但因为一句“现在内核基本统一了”遭到了“群嘲”(啊,我这句是自嘲,我知道大家无恶意,都是欢乐的气氛),索性借机展开讲讲吧(借题发挥。

一、一个观点

我觉得,如果是向小白解释某个东西,就不要追求精确,而是首先浅显易懂,并且尽可能简短。

因为太长不看;精确就枯燥烧脑(很多细节是必须抠字眼的)立刻劝退。这样就无法达成“向小白解释某个东西”的原本目的了。

所以有时候我的回答只是大概齐、差不多、接近正确答案而已。故意的。

以前也“误入歧途”,想写尽可能精准的教程,写完一看,嘿,这不就字典么,我又权威不过 MDN(虽然它里面的内容也有错……老鼠嘴硬)。所以后来就“改正”了。

二、HTML 和 CSS

  • HTML 描述“这是什么”
  • CSS 描述“这东西长什么样”
  • JavaScript 设定“这些东西怎么运作”

这都不是精确的定义,也都有例外,但大方向没错。为了让小白容易理解,还得再打个比方:

  • HTML 就像商场里的人模,有胳膊有腿,但你一点也不会多看它一眼,太素了
  • CSS 就是给这个人模做了涂装,穿上了衣服,摆出了好看的姿势,甚至会按着既定的程序重复一些动作,以至于一时分辨不出是真人还是假人
  • JavaScript 就好像给这个人模植入了 AI,你夸它一句,它会脸红的把头扭过去,并说一句:“臭流氓!”

你看,这么讲,小白脑子里就有画面了。然而“一切比喻都是蹩脚的”,显然上面的比喻距离精准的定义有着那么大(伸开双臂比划)的差距。

事实上,都有例外,实际应用中也是三者结合,灵活选择的。只有初学时才会努力区分它们。(真不展开了,再展开就要开课了)

三、加粗

HTML 中没有加粗,<b><strong> 是强调。什么区别呢?讲话中要强调一个内容,就和大声讲话画等号么?显然不是。我们可以加重音(重音不是大声),可以放慢语速,也可以……叫对方全名(妈妈擅长)。

在网页中,强调也不一定是加粗,还可以高亮,可以用特殊颜色的文字,可以用下划线,可以用不同的字体……同样也没有什么斜体、删除线,这些都是样式。

当然,你会说:它们默认是加粗。

四、默认?!

这个默认是谁规定的呢,如果是统一的规定,那没事儿了。但是,这个是浏览器规定的。

浏览器说:我啊,难呀。有时候网页就告诉我这是什么,我要是全按照一个样子显示,用户就分不出来了。那我总得给每种元素一个默认的样子吧。就像人模,这个是男的,那个是女的,这个是孩子,那个是胖子……听着很明确,可是谁多高,谁多重,什么三围,什么体型,没说啊!我就只能做个差不多的样子让你能区分,但你不能说男人就长这样,女人就长那样,胖子就应该正好这么胖(

不同厂家的人模,男性都应该一样吗?显然不是。不同浏览器的默认样式必须都一样么,也不是的。

h1 是标题,一级标题,就是页面中最大的标题,你觉得多大合适?浏览器厂商也不知道,就按着自己的习惯大概齐吧。

好巧哦,在不同浏览器下,同种元素长得也都差不多。为什么呢?商场说啊,这不同厂家的人模区别太大,不好摆在一起,为了统一一点,那就只好只从同一家采购了。人模厂家为了竞争,自然会让人模的尺寸趋同。浏览器也一样,太特立独行会被嫌弃的。所以我们都知道加粗的内容是强调了(但不可以反过来讲)。

那不还是一样?可是样式上的细节非常多啊,不是穿上同样的衣服就一样了的,商场大妈给人模穿衣服的手法也千奇百怪的,至少系不系扣子就是很明显的区别。

只是一般用户不会这么留意这些细节的差异罢了。就像我这个乡下人无法理解现在有人分不清鸭子和鹅。(内行觉得差异明显,外行觉得明明都一个样子)

五、一致的过去

以前,前端为了让不同浏览器下面显示的效果基本一致,会学习很多“技巧”,学习很多浏览器私有的“方言”,然后为它们量身定制具体的样式。这还不够,为了更好地定制,还得学 CSS hack,这个名字好有年代感,我得写下来,不然我都快忘掉了。

这里得贴一段 CSS hack 代码怀旧:

via

/***** Attribute Hacks ******/

/* IE6 */
#once { _color: blue }

/* IE6, IE7 */
#doce { *color: blue; /* or #color: blue */ }

/* Everything but IE6 */
#diecisiete { color/**/: blue }

/* IE6, IE7, IE8, but also IE9 in some cases :( */
#diecinueve { color: blue\9; }

/* IE7, IE8 */
#veinte { color/*\**/: blue\9; }

/* IE6, IE7 -- acts as an !important */
#veintesiete { color: blue !ie; } /* string after ! can be anything */

/* IE8, IE9 */
#anotherone  {color: blue\0/;} /* must go at the END of all rules */

/* IE9, IE10, IE11 */
@media screen and (min-width:0\0) {
    #veintidos { color: red}
}


/***** Selector Hacks ******/

/* IE6 and below */
* html #uno  { color: red }

/* IE7 */
*:first-child+html #dos { color: red }

/* IE8 (Everything but IE 6,7) */
html>/**/body #cuatro { color: red }

/* Everything but IE6-8 */
:root *> #quince { color: red  }

/* IE7 */
*+html #dieciocho {  color: red }

/* IE 10+ */
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
   #veintiun { color: red; }
}

当年摘抄下来,当游戏秘技那么仔细保存着。

六、一致的现在

现在规范多了,起码如果描述了的样式基本大家都是(差不多)一致的,毕竟基于 Chromium 的浏览器占有率实在是高。Chrome + Edge 大概占有了 76% 的浏览器市场份额,再加上其他基于 Chromium 的浏览器,那么总量大概能到 80%。

对于前端来说,浏览器好点坏点还能忍,但务必要统一,因为这样工作量少好多,为一个浏览器写一份样式真不是人干的……

然而,现在其实也没啥改变,浏览器的一致性确实高了,但是设备的差异性可大多了,以前都是电脑屏幕,差不多都是那几个分辨率。现在电脑、手机、平板、折叠屏……手机平板还可以横过来……你也不想在手机上看电脑排版的网站然后反复缩放吧?于是适配分辨率成了新时代的问题,当然还有不同的操作方式。

现在不再 CSS hack 了,改用媒体查询了。语法简单了,条件更多了。历史啊,是个环。

七、为了一致

差异总是存在的,那就消除差异。毕竟一致以后多个问题就变成了一个问题,难度降低。

所以现在写网页时要先 Reset CSS,简单说就是谁也别吵,不就默认样式嘛,我直接给一份方案,以我这个为准。诶,从根源解决问题,妙啊!然而问题只是小了,并没有消失。

谁也不可能完全定义所有样式,也就是这个默认值无法完全覆盖所有可能,万一你没定义的地方浏览器定义了,就又是差异。

打个比方,你给人模厂商做了详尽的技术要求,是不是几个厂家生产的就都一样了,显然不是啊,细节太多了,总有你没考虑到的地方,于是厂商就又可能自由发挥了,要不给女性的指甲盖做个美甲吧……

八、语义化

如果不同的东西可能长得一样,相同的东西可能长得不一样,那我们应该如何区分呢?当然是说清楚这是什么。所以现在 HTML 标签要求尽量语义化,着重表达——“这是什么”。这一点做到了,就可以方便的进行后续处理。

都用 div 行不行?行,但这样的网页就好像早期的语音引擎一样,一个字一个字往外蹦,没有任何重点,甚至断句都没有。

九、前端和编程

也不是多难,也不是一定要学到什么水平,应用场景也非常广泛,觉得用不到只是因为不了解。学点,方便。挺推荐的。但看多了不懂且拒绝,想学却一动不动……也不想多说啥了。

十、浏览器啥的

其一

早年网景(Netscape)浏览器市场占有率干到 90% 多(看上面现在 Chrome 的占有率,就知道当年网景多强了),然后微软在系统里绑定 IE 嘛,网景就没了……微软占据市场,觉得高枕无忧,不思进取,以为 IE6 已经很完美了,几乎是浏览器的终极形态。后来 Chrome 横空出世,势不可挡什么的,大家也都耳熟能详了。

网景没了?!是没了,但是:

在 1998 年 2 月,大约在被 AOL 收购一年之前,Netscape 公开了浏览器的代码,并建立了 Mozilla 组织来协调其产品的未来发展。Mozilla 组织以 Gecko 排版引擎为基础重写了整个浏览器的源代码,而往后的 Netscape 版本也都是基于这个被重写的代码。Gecko 引擎技术随后也用于 Mozilla 基金会的 Firefox 浏览器。——(via

IE 死了,橘红色的小狐狸还在。

其二

Safari 用的是自己的浏览器内核:WebKit。但并不是只有苹果一家在用,GNOME Web 也是。(冷知识)

Blink 渲染引擎是开源引擎 WebKit 中 WebCore 组件的一个分支,并且在 Chrome(28及往后版本)、Opera(15及往后版本)、Yandex、Vivaldi 及Microsoft Edge(79及往后版本)等诸多基于 Chromium 的浏览器中使用。——(via

所以 Chrome 和 Safari 有点亲缘关系,可能算大侄子?!(我不会算辈分

其三

Chromium 是基于 Blink 内核的开源浏览器项目,所以现代很多浏览器都基于 Chromium 项目,这样就和 Chrome 同内核了。而 Chrome 是闭源的。

其四

Opera 自有的浏览器内核 Presto 已经停产了,他自己都不用了。唏嘘,一代传奇的小众浏览器,被收购以后已经没什么存在感了。

其五

IE 的内核是 Trident,还没死透。

Edge 早期内核是 EdgeHTML,现在的 UWP 应用中还在用。

其六

用 Linux 的用户应该知道 KDE,他们有一个浏览器内核:KHTML,也凉了。但是:

苹果电脑于 2002 年采纳了 KHTML,作为开发 Safari 浏览器之用,并发布所修改的最新及过去版本源代码。后来发表了开放源代码的 WebCore 及 WebKit 引擎,它们均是 KHTML 的派生产品…… ——(via

其七

即使浏览器百家争鸣的时代,也罕见自研内核的,多数都是现有内核套壳,最初多是调用系统自带内核,最初都是 IE。后来自己带一个 Chromium ,再加上 IE,双核。(虽然讲内核,但好多时候大家都用代表性的浏览器名称代替了)。

现在手机上,iOS 都是套壳浏览器,因为只能用 Webkit 内核。Android 上,那些非常小巧的浏览器也是调用系统的 Webview 的,约等于旧版本的 Chrome(因为国产系统常常更新不及时)。


就这么多吧,反正大概也没什么人看,什么,你看了?!我不信我不信!除非你买咖啡给我喝!老鼠爱发电

2 个赞

虽然标题一股子古早味,但是孩子还不到20呢 :doge:

1 个赞

统一了?可能么?强国地方办公的网页都没进去看过吧?火狐都不支持

活捉一个没读完的小可爱

幸好大家不用IE了,看到这代码都头痛。

1 个赞

鼠鼠,你的文章写得非常易懂、有趣,充满人情味,能在互联网上看到这种文章简直是享受,感谢撰写和分享。

HTML 中没有加粗,<b><strong> 是强调

关于这点,我几天前听的 字谈字畅(他们俩又在一起了) 中有说过这个问题,讨论了强调不单纯是样式的改变,还有可能涉及语义的改变,以及其他相关的,感兴趣的可以去听听。

另:感谢鼠鼠之前的 Obsidian 教程,用 md 写评论真是舒适。

1 个赞

这篇文章显然违反了自己开头定下的这个原则 :sunglasses:

原则是对前面帖子中我的回复进行解释。这篇是相对详细的解答。不过写这么多就没几个人看了……

长文可以发到个人博客好好保存,你似乎没有博客?

有,好像叫 zji.me

wo.zji.me 新的。

本地笔记里东西更多,慢慢整理着。这篇内容觉得不太值得放入笔记,或者论坛也是我的一个笔记分支。

现在个人博客,真没浏览量。