CSS的诞生

2022-11-24 0 309

1  HTML的困局

我是知名的CSS, 许多人都知道我的英文名字, 但却对我的基本原理和技术细节偶一为之。

这也能认知,较之于纯粹的HTML,我要繁杂得多, 特别是想使用我作出美奂美伦的网页,需要介绍太少的技术细节,那真不是两件平凡人有才干的事。 只好我们看到我以后最多瞧瞧,然后立刻转头行经。

讲起HTML,这只不过是个十分纯粹的混蛋, 他只关注文本的语法, 比如并用<h1>说明这是两个大副标题,用<p> 说明这是两个章节,用<img> 说明那儿有两个相片, 用<a> 表示该处有镜像。

镜像啊个有意思的发明者, 它能从两个网页跳到除此之外两个网页,从两个中文网站跳到除此之外两个中文网站,只好整座当今世界的中文网站都镜像了出来,形成了一张蜘蛛网 。

在我问世以后, 当今世界上的中文网站虽然许多,但他们都有两个协力的特征:

其原因很纯粹, 两个HTML文件格式有许多条码, 当那些条码女团出来的时候,究竟该是不是表明呢? 用甚么样的手写体? 甚么色调? 是不是翻转?

HTML不该管也说不清楚,只好晚期的中文网站绝大部分长这个模样:

CSS的诞生CSS的诞生

啊前所未见,六十年代的人们居然用这么破旧的中文网站来网购 !

不计其数的人向HTML举报: 你就不能把自己装扮得很漂亮一点儿吗?

HTML光明正大地提问:不不,我的女主人只让我负责管理网页的文本和内部结构,再者那些内部结构要表明成甚么模样,应用程序能负责管理啊。

而应用程序也会推卸责任:“这我可说不清楚,你不告诉我你用甚么手写体,甚么色调,我是不是可能给你展示出来?”

理由很充分,对吧,应用程序确实不应该做这件事情。

HTML没有办法,只好向组织上申请,给自己加上一堆新的条码, 专门用来描述展示相关的东西:

CSS的诞生

CSS的诞生

只好网页变得比以前很漂亮了一些,我们似乎满意了。

只是HTML发现自己的身躯越来越臃肿,那些负责管理表明的条码把原本的文本都给淹没了, 更要命的是修改的难度越来越高,你能想象一下,当两个html文件中有上百个<font>条码时, 老板让你把手写体改小一号, 那肯定要抓狂的。

组织上看到了问题的症结所在, 决定为HTML瘦身, 他定下了两个目标: “文本和样式必须要分离!”

这个重担就交给了我。

2 选择器

刚开始的时候,我一点儿思路都没有,究竟是不是把文本和样式分离呢?  我为此苦苦思考了好几天,既然我想给文本施加样式, 作为第一步, 必须要解决定位的问题,换句话说我需要能找到HTML中的元素才能。

我问HTML:“ 你两个网页这么多条码, 我是不是才能获得你完整的内部结构呢?”

“内部结构? 那很纯粹啊, 我在应用程序中就是两个DOM 树啊, 你尽管访问啊 ”

CSS的诞生

CSS的诞生

好 ! 有这个玩意儿就好办事了,但我是不是定位到两个元素,去设定这个元素的手写体,色调等表明属性呢?

XML向我支招: “这太容易了, 你能仿照我的XPath啊,例如那个DOM树,你想选中title 元素,就用 /html/head/title ,或者纯粹一点儿//title ; 你想选中第两个div 下面的h3, 能这么做  /html/head/div[1]/h3  ,是不是很方便?  ”

(码农翻身老刘注:实际上XPath的出现要比CSS晚)

“方便是方便, 可是你这为甚么要两个斜杠呢? 直接写成html head title 不行吗? ”

“这。。。” XML无语了。

我决定不用斜杠,我要讨好程序员,就用div ul li 这样写出来很简洁的方式, 我也不该叫XPath, 那是XML的宝贝。

我打算把它叫做选择器(Selector)。比如我想把所有的h3都变成红色, 黑体, 能这么写:

h3 {color:blue ; font-weight:bold;}

当然我设计的选择器能力可不仅仅这么纯粹,使用它你完全能选择两个特定的节点(如果有id属性或class属性的话),不管这个节点“隐藏”得有多深。

还能选择两个节点的兄弟节点, 某组元素的第x个孩子,任何带有属性名的条码名等等。

CSS的诞生

CSS的诞生

一句话, 使用Selector, 你能尽情在DOM树中遨游, 找到你想的地方, 然后设置样式。

文本和样式就分离了。

3 盒子

定位的问题解决了, 初步的样式也解决了。 但最让人排版的问题依然存在, 想想你曾经看过的报纸和杂志,人家那图文并茂,赏心悦目的排版, 我们得好好学习下了。

CSS的诞生

CSS的诞生

我对杂志的排版做了仔细的研究, 分栏,间距,翻转, 图文混排, 本质上他们是由两个个“块”组成的。

我对HTML说: 咱们能不能也把文本搞成两个两个的块啊, 然后把那些块进行女团不就成了?

HTML提问: “块(block) 我有啊, 你还不知道吗, 所有的HTML元素要么是块级(block)元素,要么是行内(inline)元素。”

“甚么意思?”

块级元素(比如标题和章节) 会两个接两个的堆叠出来沿着网页向下排列,每个元素占一行;行内元素(比如镜像和相片)则会在一行内相互并列,只有在空间不足以并列的时候才会折到下一行。你能想象一下, 两个文件格式只不过就是那些元素在网页上堆叠流动而已, 俗称文件格式流。”

既然如此, 我就能把那些元素当成两个个的“盒子”了,为了能够排版,我给每个盒子都都设定三个属性:

边框(border): 能设定宽窄,样式,色调

内边距(padding): 文本到边框的间距

外边距(margin):  边框到相邻元素的间距

CSS的诞生

CSS的诞生

通过调整内外边距和边框,你就能对网页做一点儿基本的美化排版了。

4 浮动和定位

盒子还只是在在文件格式流中按次序流动而已, 想做到漂亮的排版, 还得让他们灵活地定位才行。

比如有人想把两个盒子放到应用程序的最右边,不会随着网页滚动而滚动;

或者大盒子中套了两个小盒子,小盒子要相对于大盒子来定位;

或者两个盒子想罗列出来;

或者像报纸杂志那样分栏表明,左边是菜单,中间是文本,再加上两个右边栏; 等等诸如此类的要求。

所以,两个盒子必须得能在常规的文件格式流中重新定位,只好我给盒子添加了两个重要的属性:floatposition

float可以让两个盒子脱离标准的文件格式流,一直往上飘,直到遇到父元素的边界。

当有多个盒子都在飘的时候,就能按照次序形成分栏的效果了。

比如下面这3个<div> 本来是从上往下依次往下流动的, 如果给div2, div3加上float:left属性,他们就横着排列出来了:

CSS的诞生CSS的诞生

对于position 来说, 那就更加灵活了。 如果不设置,那就是默认定位,在文件格式流中的位置不做改变。

能设置为相对于盒子在原来文件格式流中的位置做定位(原来的位置没有被别的div占据):

CSS的诞生CSS的诞生

还能设置成相对于某个父元素做绝对定位(下图中祖先元素就是橙色的框,div2原来的位置被div3占据了) 。

CSS的诞生

CSS的诞生

唉,给我们说这么多琐碎的东西, 我自己都有点烦了, 总结下就是:我提供了各种各样的方式让你的盒子能灵活的排列出来。

当然我必须得承认, 那些布局对程序员们确实不那么友好,你没有办法通过拖拽的方式对那些盒子进行排版。

为了减少工作量,大量CSS框架在源源不断地推出,例如Bootstrap, Semantic UI, Pure.css , EZ-CSS。。。。。。 这是后话了。

5 CSS

浮动和定位能说是我搞出的最繁杂的东西, 其他的像背景了,手写体了,文本了就纯粹得多,就不再啰嗦了。

当我告诉HTML我的定义工作基本搞定时, 他提出了两个问题: “你那些选择器,盒子模型,浮动和定位, 背景,手写体之类定义,最终要放在哪儿啊? 你不会还是想放在我这里吧?”

我想了想,必须得有最大的灵活度,程序员能直接写到元素的条码中(叫行内样式), 也能写到html的<style>条码里(这叫嵌入样式), 当然我是建议我们写到单独的CSS样式中,然后通过镜像的方式和html文本结合出来。

行内样式长这个模样:

CSS的诞生很明显,这和最早的在html中写<font>条码差不多。

嵌入样式就好一点儿:

CSS的诞生

CSS的诞生如果把那些样式完全从html中分离,放到独立的文件中,就能使用镜像样式:

<link href=”mystyle.css” rel=”stylesheet” type=”text/css” />

正像你猜到的那样, 嵌入样式会覆盖镜像样式, 行内的样式会覆盖嵌入样式。 就像一层盖着一层那样, 就是由于这个其原因,W3C把我命名为层叠样式表(CSS)。

你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身2016文章精华》或者《码农翻身2017上半年文章精华

码农翻身

用故事讲述技术

CSS的诞生

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务