整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

CSS简史:从1.0到3.0,最终又将走向哪里?

/面包理想

一转眼已经2018年,前端行业也风风雨雨地走过了10多年,网页布局也从最原始的文档变成了精彩纷呈的交互。当我看到第四代CSS布局技术的时候,在惊叹互联网发展如此突飞猛进的同时,不禁会有一个疑问:CSS经历1.0到3.0的版本变迁,最终又将走向哪里?

今天我们就回顾一下CSS简史和四次布局技术的跃迁。

1.CSS简史

为什么我们需要回顾一下CSS简史呢?

1.了解过去能够更好地预测未来,毕竟太阳底下没有什么新鲜事。

2.相比预测未来,通过了解CSS发展演变趋势,能够科学合理地评判CSS的发展,指导我们学习CSS的核心技术,让我们在有限的精力和时间内学对知识,学好知识。

那是1989年的第一场雪,比1988年来的更早一些,伯纳斯·李(Tim Berners-Lee)以超人的智慧和消耗了前额无数浓密的头发为代价发明了World Wide Web,没有他就没有我们今天互联网相关的工作,也就没有了这个专栏教程,请允许我代表广大前端致以崇高的敬意。我们先一睹大神的风采。

对互联网之父,我只想对他说一句话,有一款洗发水增发效果挺好的,我一直用,你要不要试试?

互联网诞生了以后,最初的网页仅仅是纯文本,但是随着互联网的发展,大家意识到web的原始版本根本就没有提供一种装饰网页的方法。这就好比一个婴儿不会穿着衣服出生一样,孩子大了,总不能裸奔吧?这个时候两个大神提供了解决方案Pei Yaun Wei和Andreesen。

Pei Yaun Wei说,这个好办,我们可以给孩子穿上纸尿裤。

Pei-Yuan Wei在1991年创建图形浏览器 ViolaWWW ,他整合了自己提出的样式语言到自己开发的浏览器中,还期望自己的样式语法最终能成为web关于样式的官方标准。虽然这个目标并未达到,但是他提出的样式语法确实为其它的一些样式语法提供了一些灵感。

Andreesen说,那玩意得换多麻烦,我给孩子画一身衣服吧,当然你懂的,最后Pei Yaun Wei的方案被采用了,但是我们还是看看Andreessen画出来的情况有多乱。

与此同时,Andreessen 在他开发的网景浏览器中进行了不同的尝试。他并没有创建一种分离式的标记语言,而是采取拓展HTML标签的方法来包含非标准化的HTML标签已达到装饰网页的目的。不幸的是,没过多久,网页就失去了所有的语义化并看起来像下面这样混乱:

<MULTICOL COLS="3" GUTTER="25">
 <P><FONT SIZE="4" COLOR="RED">This would be some font broken up into columns</FONT></P></MULTICOL>

最终被大家采纳的语言是由Hakon Wium 在 1994年 10月提出的样式语法。它被称为样式层叠表,简称CSS,但是直到1996年的时候,CSS才演变成我们熟悉的样子。

html { margin-left: 2cm; font-family: "Times", serif;
}h1 { font-size: 24px;
}

然后在1998年5月W3C发表了CSS2,紧接着一个让我们深恶痛觉的浏览器诞生了!对没错,就是你深恶痛绝的那个万能的IE6,2001年微软发布了IE6,不过搞笑的是,IE6最初的出现确实很大程度推动了CSS发展。那时候的网页已经变成跟现在很接近了。

按照常理你肯定会想,后面我就知道了,你不用说了,然后就是CSS3.0了。好吧,如果是我,我也这样想,但是国际友人的脑回路可能跟我们不一样,事实上,CSS3早于1999年已经开始制订,直到2011年6月7日,CSS 3 Color Module终于发布为W3C Recommendation。这个故事告诉我们两件事:

1.w3c这个组织活的真够长,甚至比很多读者年龄都大。

2.不是CSS正式版发布了你才放心使用,如果等到那个时候使用,你的项目可能未曾绽放就枯萎了。

细心的读者可能会问了,CSS3正式版什么时候发布啊?另外CSS4.0什么时候发布?

好吧,我只能告诉你随缘吧……而且没有CSS4.0了,也不会有CSS5.0了。

来我们再看看国际友人的脑回路:

简单地说,就是从CSS3开始,CSS规范就被拆成众多模块(module)单独进行升级,或者将新需求作为一个新模块来立项并进行标准化。因此今后不会再有CSS4、CSS5这种所谓大版本号的变更,有的只是CSS某个模块级别的跃迁。

按照CSS工作组的说法,CSS历史上并没有版本的概念,有的只是“级别”(level)的概念。比如,CSS3其实是CSS Level 3,CSS2是CSS Level 2,而CSS Level 1当然就是CSS1。每个级别都以上一个级别为基础。

大家可能说这个命名好乱啊,这事儿我只想跟你说,你就把CSS工作组当成你女朋友就好了,她开心就好,她说的都是对的,她说啥就是啥……

至于我们,会用就好了。

CSS出现的好处就是让结构和表现分离,可以更灵活的修饰网页,学习也很简单。这里我更想说说它的不足。

1.CSS只有一个全局的命名空间,所以是无法避免出现选择器冲突的。

2.模块化做的不够好,所以造成嵌套和覆盖混乱,容易产生一大堆乱糟糟的样式。

所以现在CSS也在向“模块化、JS化发展”

不过客观地说,CSS的出现确实是互联网里程碑式的进步。

CSS其实就做了两件事:

1.如何布局

2.元素怎么表现

说直白一点就是两件事,一个房子是盖成两室一厅还是三室两厅,另一件事是精装修。

这里大家就会看到如果一个房子180平米隔成1个10平米的主卧170平米的厕所,你再怎么精装修也不会是一个宜居的房间。所以布局在CSS中是极其重要的。与CSS发展简史类似,CSS布局也经历了一代又一代的迭代,才成为当前的样子。

接下来我们就说说CSS布局简史。

2.CSS布局简史

初代table布局

在1997年的时候,David Siegel 改变了web,他自己研究出了一项网页布局技术,利用html中的table元素和gif图片缝合在一起,创造了表格布局技术,之后他就犹如一头猛兽泛滥起来。

优点:布局容易、快捷、兼容性好

缺点:改动不便,需要重新调整,工作量大

由于互联网网站越来越复杂,内容和业务更新频繁,所以table布局是完全不能胜任的,以至于table布局的发明人都说:

“我把炸酱和面倒在了一起,并且没法分开它。”

不过这个真不是我杜撰出来的,原文:

David Siegel:“有人说我毁掉了Web,我回答他们,的确如此。我毁掉了Web是因为我把巧克力和花生酱混合在一起却再也不能把它们分开。我犯下了把结构跟表现混合在一起的错误。”

然后第二代布局技术登场了,

CSS+div布局

CSS+div布局总结起来有三大优点,

1.省时,学习容易,写代码也很容易,很快,效率高

2.省事,如果业务逻辑变了,改起来特别方便快捷

3.省钱,代码量少,省带宽,适合seo

基于这三年不难看出CSS+div布局人畜无害,人见人爱,也就不难解释为什么被广泛地使用成为目前主流的布局技术了。当然了他也有缺点:

1.需要考虑平台兼容性,对制作人员的技能要求较高。

2.在移动端布局显得有些力不从心,如未知宽高float内部元素居中、垂直水平布局、响应式布局等方面略显繁琐。

基于此,第三代布局技术应运而生。

Flex布局

优点:

1.CSS3的布局方式,可以在不使用其他框架的情况下,简便、完整、响应式地实现各种页面布局 2.移动端布局简直太友好

缺点:

兼容性较差,IE浏览器版本在9.0以上,基本要10.0 对于其他浏览器,要求兼容性写法

Flex布局日渐成为移动端主流布局技术,但是它是单一维度的布局,这个我会在专栏后面讲到,有时候也会捉襟见肘,所以目前出现了第四代的布局技术:

grid布局

因为目前大部分浏览器并不支持这种技术,但是它代表了网络发展,这里大家保持关注就好,这里我重点说下它为什么可以称为第四代网络布局技术。首先一个观点大家先记住:

它并不会取代第三代的布局技术,而是颠覆和突破。就好像Flex远比div+CSS布局更方便,但是div+CSS依然有用武之地。

我们说下它的突破之处:

1.flex对标的是float,本质上还是一维布局,这就跟别人开着夏利,你开奔驰都是地面上跑没啥本质区别一样。但是grid升维了,grid是飞机,在地面马路这条线一维之上让人能够思考高度这个维度,以前是汽车一维交通工具(你只能在水平方向一个方向开),飞机是二维(能俯冲了(横向、纵向同时)),所以grid可以说是拓宽了CSS布局的维度。不排除将来会有三维布局的出现。到时候CSS不仅仅能控制横向布局,纵向布局,还可以深度布局(这个要依赖于三维展示的出现,如VR,AR三维立体的展示设备出现)。

2.grid布局里面采用了“可视化布局(template部分,所见即所得)”,这个是颠覆了传统的,写一句代码刷一下浏览器这样的开发方式,不排除以后会出现代码即效果的开发模式。比如你在一个设备上画一个区域,然后画轮播图。

这种方式类似于vc++控件方式,但是更智能,也更友好。谁说不可能呢?大家不要忘了grid布局的来源是早就废弃的table布局。说到这里我多说一句搞笑的微软,frontpage没火,dreamwaver火了,最早提出“canvas”概念的 VML没火,最后html5的canvas火了,连CSS3网格布局也是由微软创建的一个模块 ,最后火起来居然没人认识它。心疼微软一秒钟。

说到这里大家对CSS简史和布局也有所了解了,我们总结下,通过本文你应该学到:

(1)CSS的发展历史。

(2)熟知布局的发展历史,以便对未来布局技术的发展有一个客观的判断,来选择是否学习。

通过本文的学习大家已经对CSS相关基础知识有所了解,接下来我们就开始真正的进入技术的学习,大家是不是迫不及待了呢?

例简介

有些网站为了凸显某部分字体,而引入自定义字体,但由于自定义字体相对都比较大(几M),导致页面加载缓慢;所以本文介绍三种压缩字体的方法,可根据项目情况自行选择。


压缩方法

1、利用Fontmin程序(效果如下图)

1)运行Fontmin程序后,1位置输入需要生成的文字内容,2位置拖入ttf文件(源文件7947KB);

2)点击“生成”按钮,生成成功后,弹出生成文件(ttf文件变成11KB),根据浏览器兼容性引入文件。

Tips:当需要增加新的文字时,需要重新生成文件。

2、利用Node.js+Fontmin组件(效果如下图)


1)配置好Node.js框架(本文使用Express);

2)在index.js文件增加代码,用来自动读取“views”下面的所有*.ejs文件的文字,然后根据“src”的ttf源文件,使用Fontmin组件生成压缩文件(生成目录“dest”)。

Tips:适用于多文件情况下,自动汇总生成。

// 遍历所有文件提取里面的所有文字
const fs = require("fs");
const Fontmin = require('fontmin');
let set = new Set();


//get all possible characters
const scanFolder = (dir, done) => {
    let results = [];
    fs.readdir(dir, (err, list) => {
        if (err) {
            return done(err);
        }
        let i = 0;
        (function iter() {
            let file = list[i++];
            if (!file) {
                return done(null, results);
            }
            file = dir + '/' + file;
            console.log(file)
            fs.stat(file, (err, stat) => {
                if (stat && stat.isDirectory()) {
                    scanFolder(file, (err, res) => {
                        results = results.concat(res);
                        iter();
                    });
                } else {
                    results.push(file);
                    iter();
                }
            });
        })();
    });
};
//get all possible characters
const generateFinalHTML = finalString => {
    const fontmin = new Fontmin()
        .src('public/fonts/SourceHanSansCN-Medium.ttf')
        .dest('public/fonts/build/')
        .use(Fontmin.glyph({
            text: finalString,
            hinting: false
        }))
        .use(Fontmin.ttf2woff({
            deflate: true
        }));




    fontmin.run((err) => {
        if (err) {
            throw err;
        }
    });
}
//get all possible characters
scanFolder("views", (n, results) => {
    results.forEach(file => {
        const result = fs.readFileSync(file, 'utf8');
        const currentSet = new Set(result)
        set = new Set([...set, ...currentSet]);
    });
    generateFinalHTML(Array.from(set).join(""))
})

3、利用font-spider组件(效果如下图)

1)安装font-spider组件;

npm install font-spider -g

2)新建index.html文件;

3)执行下面命令生成压缩文件。

font-spider ./*.html


总结

可以根据项目实际情况,选择适当的方法。

CSS的字体样式中,通常会受到客户端是否安装了所设置的字体的限制。如果客户没有安装我们在CSS中所设置的字体,则在最终的客户页面中是无法显示出来的。这样我们在页面开发过程中就无法使用一些较为生僻的字体,一些具有艺术感的文字效果只能使用图片来代替。今天小海前端(头条号)来带领大家一同学习CSS3为我们提供的服务器端字体属性。

承接文章:CSS3提供了类似Photoshop的效果,可以为文本添加阴影,新属性解决大问题

技术等级:中级 | 适合有一定的CSS基础人士阅读。

希望收藏了这篇文章的你同时也可以关注一下“小海前端”的头条号,因为这些文章都是连载的,并且是经过系统的归纳和总结的。塌下心来认真阅读,你一定会学到对你有用的知识。

本文涉及到的CSS3属性包括:

  • @font-family

一、服务器端字体的语法格式

CSS3技术使用@font-face定义服务器端字体

CSS3提供了如下的语法格式来定义服务器端字体:

@font-face{

字体属性:取值;

}

在@font-face内部的字体属性可以包括下列CSS样式:

  • font-family,设置服务器端字体的自定义名称。

  • font-style,设置文本是否为斜体。

  • font-weight,设置文本的粗细。

  • font-variant,设置文本是否为小型大写字母。

  • font-size,设置文本的字号。

  • src,设置自定义字体的字体文件路径和文件名,以及字体类型。

上述CSS属性中,前5个都是CSS原本具有的属性,在小海前端(头条号)的文章《CSS字体属性,详解属性用法,提升前端小白能力》中详细介绍过,不太了解小伙伴可以阅读学习。

这里不太一样的地方是font-family属性,这个属性在@font-face内部的功能是为服务器端字体设置一个自定义名称。因为@font-face仅仅是在定义服务器端字体,font-family所设置的自定义名称,将来要在引用这个服务器端字体时进行书写。

那我们就来说一说src属性。首先,要想使用服务器端字体,就需要将这个大部分用户都可能没有安装的字体的字体文件复制出来,粘贴到自己的站点目录中。这里假设站点根目录下有一个font文件夹,我们在里面放置了一个名为x.ttf的字体文件。

定义服务器端字体的CSS代码如下所示:

@font-face{

font-family:myfont;

src:url(../font/x.ttf) format(“truetype”);

}

在一个id名为box的容器中,要使用这个新定义的服务器端字体,CSS代码如下所示:

#box{

font-family:myfont;

}

二、字体的格式:

我们通过上面的代码可以看到,在@font-face中src属性除了指明字体文件的路径和文件名以外,还需要利用format()来指定字体的格式。

这里小海前端(头条号)为大家总结了几种常用字体文件的格式:

  • TrueType字体:文件扩展名.ttf,设置为 format(“truetype”)

  • OpenType字体:文件扩展名.otf,设置为format(“opentype”)

  • Embedded OpenType字体:扩展名为.eot,设置为format(“eot”)

三、在src属性中使用local()方法:

我们所使用的生僻字体,客户端到底是否安装了,我们是无从知晓的。并不排除你认为这个字体非常生僻,但是客户在自己的电脑上确实安装了它。这样如果使用服务器端字体,就无形中增加了字体下载的步骤。

为了保证安装过这个字体的用户从本地调用,没安装过这个字体的用户从服务器端调用。src属性提供了一个名为local()的方法,只需在该方法的括号中指定字体的名称,就可以从本地调用这个字体了。

假设根据页面设计需要,我们要使用一款名为“汉仪综艺体简”的字体,这款字体的文件名为hyzytj.ttf,同样存储在站点根目录下的font文件夹中。那么我们将服务武器端字体设置为如下CSS代码:

@font-face{

font-family:myfont;

src:local(“汉仪综艺体简”),url(../font/hyzytj.ttf) format(“truetype”);

}

这样一来,真正安装了“汉仪综艺体简”这个字体的用户就无需从服务器端下载字体文件了。

四、实例:利用服务器端字体展示一首古诗。

本实例利用一个名为“叶根友毛笔行书”的字体来为大家展示毛泽东诗词《沁园春 雪》的开头片段。本实例的最终效果如下图所示。

实例的最终效果

HTML代码如下所示:

实例的HTML代码

CSS代码如下所示:

实例的CSS代码

小海声明

在头条上发表的这些文章都是从前端开发的基础开始一步一步讲起的。我非常希望能有更多的前端开发初学者通过我写的文章,逐步学到一定的知识,甚至慢慢有了入门的感觉。这些文章都是我这几年教学过程中的经验,每写一篇时我都尽量把握好措辞,用简单易懂的语言描述,同时精心设计版面,让版面更加丰富,激发阅读兴趣。所以,每一篇文章可能篇幅不长,但是都要耗费小海前端(头条号)很久的时间。

希望收藏了这篇文章的你同时也可以关注一下“小海前端”的头条号,因为这些文章都是连载的,并且是经过系统的归纳和总结的。塌下心来认真阅读,你一定会学到对你有用的知识。

关注“小海前端”,我会继续为大家奉上更加深入的前端开发文章,也希望更多的初学者跟着学下去,我们共同将前端开发的路努力坚持的走下去。

文章预告

在下一篇文章中,小海前端(头条号)将为大家介绍CSS3提供的颜色设置方式。并为大家讲解颜色三要素和颜色代码的相关知识。希望正在学习CSS技术或前端开发的小伙伴们一定不要错过。