88

后端工程师入门前端页面重构(一):口诀 - Scala Cool

 6 years ago
source link: https://scala.cool/2017/12/be_2_fe/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是 KnewHow,一名前 Java 开发工程师。为什么要说是「前」呢?这要从两周前我加入一家新公司说起。

入职第一天,实习导师告诉我会有一个月的新人引导计划,当时心里还是美滋滋的,觉得这个公司比较人性化,没有把工程师当劳动力使。

但随后,我就被震撼到了。因为面试时就得知公司崇尚的是全栈文化,在部署完一切办公环境之后,实习导师告诉我开始学习的第一个技能竟然是:「前端页面重构」!!!

当时我的内心是这样子的。

suprise.jpeg

要知道,我对于前端,除了几个基本的标签外,可是一无所知。然而,我很快调整了状态,不就是前端开发么,应该难不倒机智的我。

—————————— 以下开始严肃脸 —————————

serious.jpeg

什么是页面重构

好,第一个问题:所谓的「页面重构」到底是干嘛的?

实习导师提出了要求,一定要有自己深刻的见解,好吧。。。。。

于是,我的视线离开了电脑屏幕,开始寻求不一样的答案。很快,我注意到了我的办公桌面,是这样子滴。

desk.jpg

在我看来,前端页面重构,本质不就是处理空间布局的关系吗?

于是,机智如我,很快得出了自己的见解和答案。

上面的这张图片是日常生活一个场景,「 一张办公桌上面摆放着一些物品。桌面是背景,书和键盘并排的放着,白色书和紫色书交叠着,紫色书上面放着一个鼠标」。

其实这就是一个布局,也类似一张网页。

然后我看了看旁边同事的桌子,也看了看整个公司的办公环境。

然后我发现在一个布局中,存在三种关系:组成、包含和交叠

secene-sum.png

于是,我把这个结论告诉了实习导师。实习导师听后思考许久,但还是表达了赞赏。之后,他又提出了第二个问题:

那么,你说说看什么是「盒子模型」?

这一次,我马上 Google 了这个概念。机智如我,基于我以上的结论,很快我又得出了以下的解读。

在我看来,「盒子模型」,本质就是去处理布局中,元素大小、位置和距离的关系。

box-module.jpeg

在上面的场景中,键盘和紫色书是有尺寸、边框的,它们是并排放置的,彼此之间的距离可以使用盒子模型中的「外边距(margin)」来表示。

鼠标被紫色书包含着(如果按照完全 2D 的视角),它们的距离可以使用「内边距(padding)」来表示。

白色书和紫色书交叠在一起的,这个如何表示呢?

哈哈,它们其实同样可以使用某一方的「外边距(margin)」来处理,只不过值要是负数而已。

box.png

我找到了实习导师,把我刚刚总结的答案告诉了他,他微微一笑:「这个回答还算不错」,接着又问道:

那么在网页布局中,「盒子模型」是怎么被使用的呢?

当时我的内心是这样的:

emoj4.jpeg

你怎么这么多问题,你特么还有完没完!!!

理智的我压制了自己的小情绪,不就是怎么使用「盒子模型」吗?

绝对定位布局

机智的我思考片刻,很快就有了答案,这也太简单了!

直觉上我们只要把网页划分成一个个小块,然后调整它们的位置就行了。

拿豆瓣的首页来说,我们可以把第一行分为三块,分别为豆瓣的 logo、搜索框以及后面的热搜主题。

然后我们只需要使用「外边距(margin)」来设置他们和浏览器左边界之间的距离,就 OK 了。

douban-box.png

哈哈,我简直就是个天才。

我把我的答案告诉了实习导师。心里美滋滋的:「我聪明吧」。

实习导师轻瞟了一眼我的答案,预料中的赞美和肯定并没有出现。

他目光转向我,说:「你的这种方案是可行的,但是至少犯了两个错误。」

在绝对定位中,不会使用 margin 来表示位置偏移,我们应该使用 top 和 left 。(可参见:position

只有入门级别的小白才会使用「绝对定位布局」来作为一个网页的主要布局方式,这种方案是十分低效的!

绝对定位布局 - 低效分析

「啊,低效的?为什么是低效的?」

在网页中,会有成百上千的元素,如果每个元素你都去量一下它的边距,这个效率是不是很低!

「iOS 端布局有一个更清晰的描述:绝对定位本质就是通过帧来定位一个视图的起点,高度和宽度。」

「这个就要求你需要去计算每个视图的位置和大小。」

更可怕的是,如果有一天有一个元素的位置或者大小发生改变,那么其它的元素也可能需要更改,这个更是低效的!

「简单来说 就是牵一发而动全身!」

good.gif

「现在的页面布局都使用浮动布局,你去调研一下吧。」

我用 Google 搜索了浮动布局和绝对定位布局。机智的我发现了它们最本质的一个区别:

绝对定位布局使用浏览器的窗口的边界作为参考,一个元素的位置是针对浏览器的边界来设定的。

然而在绝对定位布局中,元素和元素之间视对方为不存在,这意味着当一个元素位置和大小发生了变化,不会对其它元素产生影响

absolute-layout.png

而在浮动布局中,它的位置通常采用 「 float 」 来处理,一个元素的位置受到其它的元素的影响。

如果有一天被参考的元素位置或者大小发生了变化,那么当前元素的位置也会发生相应的变化。这样就比较高效了。

float-layout.png

我兴奋的把调研结果告诉了实习导师,实习导师看了后,说:「还可以吧。」

接着他又问道,「如果现在给你一个网页,你知道怎么布局吗?」

「这个。。。」

youyu.gif

页面重构之口诀

「看你这个犹犹豫豫的样子,我直接告诉你好了。」

我们在网页的左上方放一块磁铁,那么所有元素都会被磁铁所吸引,那么磁力相反的方向,就是我们布局的方向。

layout-direction.png

「所以我们布局的方向就是先从左到右,再从上到下,从整体到局部,化整为零!」

「明白了吗?」

「还不是很明白。」

「那我们来做个练习吧。」

「看这个豆瓣的首页,先从整体来看,按照从左到右可以分成几个部分。」

douban-index.png

「一个部分吧。」

「对的。」

「因为整个页面就只有中间的那个部分。」

douban-index-first.png

「从上到下,你看看这个页面可以分成几个部分。」

「这个好像有点多了,每一行都可以分成一个部分吧。」

douban-index-second.png

「不错嘛,看你你已经掌握了规律,看看下面的可以分成几个部分。」

douban-head.png

「这个。。。」

「不要捉急,按照我的口诀,先看从左到右分成几个部分,再看从上到下分成几个部分。」

「从左到右可以分成三个部分。」

douban-head-first.png

「从上到下就一个部分吧,感觉没有其它东西了。」

douban-head-second.png

「不错不错,我们再来一个难一点的,看看这个可以分成几个部分。」

douban-middle.png

「从左到右可以分成三个部分。」

douban-middle-first.png

「从上到下可以分成一个部分。」

「那这个呢?」

douban-part-1.png

「从左到右一个部分,从上到下也是一个部分。」

「这个呢?」

douban-part-2.png

「从左到右一个部分,从上到下三个部分。」

last-second.jpeg

「这个呢?」

douban-part-3.png

「从左到右一个部分,从上到下四个部分,然后再对更小的模块进行划分。」

last.jpeg

「有没有发现什么规律?」

「就是按从左到右,从上到下的顺序,先把网页的进行整体的划分,然后在依次对小模块进行划分,然后再对更小的模块进行划分,一直这么递归划分下去。」

「好的!你已经学会了!」

「啊!这么简单的?那个可以问你一个问题?能不能先从上到下,在从左到右?」

不能,因为人看网页的习惯就是先从左到右,在从上到下,这样的设计会有更好的视觉效果。」

好了,通过本篇文章,我们领悟了前端页面重构的口诀,再来重复一遍:「从左到右,从上到下,化整为零」。

那么,在后续的文章里,我们将进一步介绍所谓的心法和招式。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK