从有没有无论在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(因为国产系统常常更新不及时)。
就这么多吧,反正大概也没什么人看,什么,你看了?!我不信我不信!除非你买咖啡给我喝!老鼠爱发电