Preface

如果只是要写程序,那的确是不需要这么麻烦,上来直接看Syntax,动手写上至少300行代码,做上3个应用程序,这门语言你也就差不多会用了,接下来不过就是模式,特殊的地方以及记住一些函数而已。但是如果你想更深刻的了解这门语言为什么这么设计,想知根知底的时候,那么回顾历史是最好的选择。而且经过这么多年对于学习本身的研究,如果想要精通一样东西,研究促使它诞生的问题会更加准确的明白它的缺点和优点,以及理解它为什么会是这个逻辑,怎么改善等等。而研究历史的时候,有时候也会发现,因为当年某些限制条件无法实现的更好的解决方案,现在正是实施的时候。

Style Sheets’ History

后面就像大家所知道的一样,在95年11月6-7日的W3C Workshop上面,Håkon Lie 介绍了Cascading Style Sheets,算是开启了CSS的历史。但是针对于Style Sheet Language本身来说,则早于CSS一些,这部分在我打算查阅CSS历史的时候才发现并没有多少中文资料可供查询。出于对起源的好奇以及自身的学习方法,将一些资料自己进行了汇总。

在很久很久以前(当然,是在有了HTML之后),大家都是做学术的,因此大部分人只是用HTML来传递文档,浏览器也只是要让文档能解析的好看一些就好了。从我获得的资料来看,用户自己定义的样式好像更加受到重视。

从1993年开始,大家相继提出了自己的Style Sheet协议提案,然而很多都很复杂。如果让现在的前端来看,部分看起来绝对是天书级别的。

Robert Raisch : Stylesheets for HTML1

# DEFAULT for all succeeding objects..

@UL in(le=5)
@LI ma(pr=ro,be=4) in(le=10,ri=10)

我想这个可以算是天书级别的协议了。开头定了所有object适用的标准,在这之下大部分的属性做了缩写。比如nu对应的是number,be对应的是before。key和value之间使用的是=进行连接。 从现代的角度来说,这个标准的确不怎么样,但是他提供了几个思路,应该说这个思路在后来的CSS里面有所体现。

HTML documents would include a LINK STYLE tag which would point to a stylesheet associated with the current document. Multiple stylesheets could be used per document to include stylistic changes. Once a new stylesheet was loaded it would hide, not overwrite, the previous stylesheet. The previous stylesheet would become visible once an empty LINK STYLE tag was encountered.

第一条是推荐如何将style载入HTML里面,在后面他提出了使用

<LINK STYLE="{URL}"/>

的方式进行载入,这个算是外链样式表的起源的。而第二条,用我4级刚过的的英语看起来是很像是今天的层叠的概念。 Robert Raisch的提案是我目前见过的提案当中比较像CSS早期的起源协议了。

Pei-Yuan Wei:Stylesheet Language2

(HEAD,BODY  fontSize=normal
BGColor=white
FGColor=black
(H1 fontSize=largest
BGColor=red
FGColor=white)
(STRONG fontWeight=bold)
)

这个感觉起来很像中国的人提出了一个看起来非常酷的提案,但是非常非常短。如果是使用过LESS和Sacss的人就会很有感觉。没错,这是早期的嵌套语法。看起来很像是子选择器和后代选择器的原型,不过就算他不是,我想在动态CSS里面基本上都包含了这个提案的概念。

Håkon Wium Lie: Cascading HTML style sheets – a proposal3

30%
h1.font.family = times 40%
font.family = times
h1.font.family = helvetica 100%
AGE > 3d ? background.color = pale_yellow : background.color = white
RELEVANCE > 80 ? h1.font.size *= 1.5
h1.font.size = 18pt 100%
h1.font.family = times;
h1.space.above = 36pt;
h1.space.below = 8pt; speech.*.weight = 35db
speech.em.weight = 40db

这个是最早出现Cascade概念的Style Sheet提案,首先将样式载入的方式做了规范,看起来已经很像我们现在使用的规范了,然后他将Robert Raisch的提案进行了扩展,增加了权重值。这是最早期的权重值的使用。

首先,每个样式表当中先定义权重值是多少(而不是像今天是随着selector计算出来的),解析的时候根据之前的权重值进行overwrite。语法方面更像是lisp和js。有心的人应该看出了,这里面有三元表达式以及计算..当然也有带单位的计算方式。LESS在这个方面算是弱爆了吧?他在协议里面提到了如何计算,鉴于时间的原因,我就没在看下去了。

另外值得关注的是他针对HTML的多平台特性,提出了多媒体的解决方案,就是上面的speech前缀,这个前缀可以让程序自动识别是针对哪个平台渲染。如果不指定前缀,默认是在所有的设备上面渲染。

Joe English:Style Sheets for HTML (postscript)4

<stylesheet>
<colors>
<color id=red rgb="#F00">
</colors>
<!-- Highlight all code sections in red: -->
<style gis = "code kbd pre" fgcolor=red>
</style>
</stylesheet>

这个是基于SGML定义了一些font的常量,看起来ms对CSS的影响不是很大。

James Clark : DSSSL & DSSSL Lite5

(define *heading-font* "Times New Roman")
(define *heading-weight* 'bold)
(define *heading-posture* 'italic) (element H1
(make paragraph
font-family-name: *heading-font*
font-weight: *heading-weight*
font-posture: *heading-posture*
font-size: 20pt
quadding: 'center)) (element H2
(make paragraph
font-family-name: *heading-font*
font-weight: *heading-weight*
font-posture: *heading-posture*
font-size: 18pt
quadding: 'left))

这段代码是Lisp格式的,但是如果你熟悉CSS的话,就会有一种感觉:”嘿,老兄,这看起来好像是定义样式用的。”没错,在CSS尚未成型的时候,和它算是齐名的DSSSL[ISO标准]的的样式。如果你更加熟悉LESS和SACSS的话,就会更有感觉,因为它有更加强大的语法表达式以及变量定义。假想当时人们接受的是DSSSL而不是CSS的话,现在要再去区分黑客和设计师就会有点困难。虽然从历史上,DSSSL不应该和CSS进行比较,不过那个时候Bert Bos在他的协议提案里面提到了它。

Bert Bos:Stream-based Style sheet Proposal6

! Effect of `delay image loading' on FIG element
!
*FIG.inline: !SRC
*FIG.hide: true
delay_images*FIG.inline:
delay_images*FIG.hide: false
!
! Indentation and justification made dependent on window width
!
*DL.leftindent: 3.0
narrow*DL.leftindent: 1.0
wide*DL.leftindent: 5.0
!
narrow*P.justify: left
!
! Use colours only if on colour screen
!
*A.textcolor: red
*A.textbackground: yellow
b&w*A.textcolor: white
b&w*A.textbackground: black
monochrome*A.textcolor: black
monochrome*A.textbackground: gray80

1995年早期,Bert Bos提出了他自己的提案,有趣的是在前面先将各个提案比较了一番。这个讲的就是后面覆盖前面的基于流的样式协议,在语法上借鉴了Håkon Wium Lie。不过这个时候采用了:去做分割,并且没有分号。而且语法也很复杂,尽管Bos当时认为这个很人性化。

Netscape:JavaScript-Based Style Sheets(JSSS)7

with(tags) {
contextual(UL, LI).color = "red";
contextual(UL, UL, LI).color = "blue";
} ids.z098y.letterSpacing = "0.3em"
classes.foo.H1.color = "red"
tags.EM.color = "red"; /* red, really red!! */
tags.B.color = "blue"; // blue, really blue
contextual(tags.DIV, tags.P).color = "green";
contextual(classes.reddish.all, tags.H1).color = "red";
contextual(ids.x78y, tags.CODE).background = "blue";

1996年Netscape提出了它自己的标准给W3C,使用js去写style。语法使用with来确定作用域,这个时候js可以将document解析为tags,ids,classes这些object,然后使用js来进行查找赋值。对应group selector,则使用contextual函数去做。但是相应的,它死的悄无声息,不过有传闻说Netscape4内部是将CSS解析成JSSS来执行的,因为如果禁用JS的话,CSS也不会出现。

最后的胜利

最终的胜利,依旧还是使用者(设计师)的胜利,因为他们获得了更加简单的语言实现。CSS没有引入上述协议当中的变量部分,它简单的计算方式,人性化的语法,算是响应的暴雪的易于上手的规则,但是它也没有难于精通,大部分的CSS只是在于你怎么控制文档流。无怪乎 Jakob Nielsen 来了一句:”Hopefully, future Web innovations will emulate the example set by the Web Consortium in its work on CSS.”

相关资料

UPDATE:

  • [2011-10-16]拆分History部分和变量部分到新的文章,补全相关的协议
  1. http://ksi.cpsc.ucalgary.ca/archives/WWW-TALK/www-talk-1993q2.messages/443.html

  2. http://ksi.cpsc.ucalgary.ca/archives/WWW-TALK/www-talk-1993q4.messages/263.html

  3. http://www.w3.org/People/howcome/p/cascade.html

  4. http://www.w3.org/Style/History/jenglish.ps

  5. http://www.falch.no/~pepper/DSSSL-Lite/

  6. http://www.w3.org/People/Bos/stylesheets.html

  7. http://www.w3.org/Submission/1996/1/WD-jsss-960822.html

CSS History的更多相关文章

  1. 浅析history hack、心血漏洞、CSS欺骗、SQL注入与CSRF攻击

    漏洞产生的原因主要有系统机制和编码规范两方面,由于网络协议的开放性,目前以 Web 漏洞居多 关于系统机制漏洞的典型有JavaScript/CSS history hack,而编码规范方面的漏洞典型有 ...

  2. 关于XSHM(Cross-Site History Manipulation)

    http://blog.chinaunix.net/uid-27070210-id-3255407.html 乍一看,好像和以前 css history hack 差不多,其实原理还是不一样的.浏览器 ...

  3. XSS Payload知识备忘

    参考资料:<白帽子讲Web安全>吴翰清 著 参见: 百度百科 http://baike.baidu.com/view/50325.htm 维基百科 http://zh.wikipedia. ...

  4. OWASP top10

    PhishTank 是互联网上免费提供恶意网址黑名单的组织之一,它的黑名单由世界各地的志愿者提供,且更新频繁. 1.XSS 1.1. XSS简介 跨站脚本攻击,英文全称是Cross Site Scri ...

  5. Jquery实现的几款漂亮的时间轴

    引言 最近项目中使用了很多前端的东西,对于我一个做后台开发的人员,这是一个很好的锻炼的机会.经过这段时间的学习,感觉前端的东西太多了,太强大了,做出来的东西太炫酷了.现在有很多开源的前端框架,做的都非 ...

  6. Web安全之跨站脚本攻击(XSS)

    XSS 简介 跨站脚本攻击,英文全称是 Cross Site Script,本来缩写是CSS,但是为了和层叠样式表(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做&q ...

  7. web攻击之一:XSS跨站脚本

    一.浏览器安全 同源策略 影响源的因素:host,子域名,端口,协议 a.com通过以下代码: <script scr=http://b.com/b.js> 加载了b.com上的b.js, ...

  8. xss payload

    xss payload可以使用富客户端文本书写,大多数用javascript,少部分用actionscript等等. 1.盗取cookie,发起cookie劫持 使用xss漏洞插入cookie.js ...

  9. Evercookie

    1. Evercookie Evercookie是一个Javascript API,可以在浏览器中生成极其持久的cookie. 它的目标是在客户删除标准cookie,Flash cookie(本地共享 ...

随机推荐

  1. 29、[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreatovi

    29.[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreatovi

  2. 009——C#全局变量定义

    (一)窗体二定义,static静态 public static byte[] waveform_data = { }; // 数据,在串口接收中变化 public static bool wavefo ...

  3. hive优化,并行查询

    1.hive中控制并行执行的参数有如下几个: $ bin/hive -e set | grep parall hive.exec.parallel=false hive.exec.parallel.t ...

  4. 010_Python3 字典

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:   d ...

  5. GridView修改含有DropDownList控件列的宽度

    GridView进入Edit模式,编辑列动态绑定DropDown List方便客户选择,但当里面的Item过长,不免令界面不美观 正确做法: <asp:TemplateField HeaderT ...

  6. 爬虫(二):Urllib库详解

    什么是Urllib: python内置的HTTP请求库 urllib.request : 请求模块 urllib.error : 异常处理模块 urllib.parse: url解析模块 urllib ...

  7. 4、wordcount程序原理剖析及Spark架构原理

    一.wordcount程序原理深度剖析 二.Spark架构原理 1.

  8. 洛谷P1419寻找段落

    题目 单调队列+前缀和 #include <bits/stdc++.h> #define N 101001 using namespace std; int n, s, t; int da ...

  9. 链家网爬虫同步VS异步执行时间对比

    异步执行时间 import time import asyncio import aiohttp from lxml import etree start_time = time.time() asy ...

  10. 使用java写js中类似setTimeout的代码

    javascript目前已经是一门相当主流的编程语言了,它的异步IO特定项目其他编程语言来说,大大减少了cpu在线程切换方面的速度.实现了单线程高并发的奇迹.而java作为老牌编程语言,在很多的项目中 ...