--- title: 【网站技术文档】网站布局与覆盖 author: '`能动少C71尤佳睿`' --- > 本文迁移自信息站仓库的对应 wiki 页面。目前网站的样式已经完全重新设计,不再是覆写的成果;因此,此份文档目前仅可作一份网站设计的入门教程,而不能被视为当前本站技术架构的反映。 本文档将介绍: - 为何要覆写由主题所定义的文件; - 如何通过 `_layouts/default.html` 文件修改网页的通用布局; - 如何通过 Sass 代码覆写原有主题中的样式; - 如何覆写 Javascript 脚本,并实现新的功能。 ## 覆写文件 钱院学辅信息站使用 GitHub Pages 提供的 Leap Day 主题。这是一款很不错的主题,但也有许多问题,包括但不限于: - 导航菜单功能有限,样式不够美观,且不支持中文; - 在引用块中采用了斜体,而这对中文排版的内容是毁灭性的打击; - 标题栏固定在页面顶部,将正文盖住,这使得同页面内的锚记必须向下偏移若干距离,给页内引用造成困扰; - 样式不美观…… 主题本来是解决「有无」问题的,不应肩负起「自定义」的使命。好在 Jekyll 允许用户「覆盖」主题所定义的布局、样式与脚本,它遵守这样的两条原则: 1. Jekyll 会优先使用你的仓库中已有的文件。例如,你的仓库中有一份样式表,而主题的仓库中定义了同名、同路径的另一份样式表;这时,Jekyll 便会忽略远端(主题)的那份文件,而应用你的样式表。 2. 如果 Jekyll 在你的仓库中没有找到所需的文件,则它将使用主题仓库中的文件。 这两条原则决定了你「覆盖」主题的方式:如果你希望继续沿用主题的某个部分,则你什么也不用做;如果你希望改动主题的某个部分——例如,页面生成的 HTML 模板,或者页面采用的 Javascript 脚本,则你应该检查主题仓库的结构,并在你的仓库中对应位置创建同名的文件,将主题的文件覆盖掉。 > :warning: 对于 CSS 样式表,则并不需要覆写主题所定义的文件:只需要定义自己的样式,再按照 CSS 的方式「层叠」即可。 以下将分别讨论布局、样式与脚本的覆写方法。 ## 页面布局:HTML 在[仓库与网站机制](仓库与网站机制)这一篇中,你已经知道:Jekyll 能将 Markdown 文档渲染为 HTML 文档。但如果对比文档仓库中的 Markdown 文档,以及由 GitHub Pages 最终发布的网页,你会发现:网页上的许多内容,并非由 Markdown 文档转化而来。例如,网站的标题、导航菜单、许可证信息……它们并未出现在你的 Markdown 文档中,但它们却出现在每一个页面上(如你所愿)。 事实上,这些内容是由仓库中的 HTML 模板所决定的。对于未加指定的 Markdown 文档,Jekyll 总是会以仓库中 `_layouts` 目录下的 `default.html` 模板来生成最终的网页;如果你在 Markdown 文档中指定了「分类」,则 Jekyll 还会在 `_layouts` 搜索与这个分类对应的模板。 > :warning: 在阅读以下内容之前,你需要确保自己对 HTML 文档(文件结构、标签)有基本的概念。 > > :book: 如果你缺少 HTML 的基本知识,可以先快速浏览这篇文章:[菜鸟教程 - HTML 简介](http://www.runoob.com/html/html-intro.html)。 {% raw %} ### 页面生成原理 以本站的页面模板为例,`_layouts/default.html` 的主要内容大致如下: ```html
{{ site.description }}
本文发布于 {{ page.data }}。
{{ site.extra_info }}
`)用亮灰色显示: ```css body p { color: lightgray; } ``` 以此类推。当然,如果你已经精通了 Sass 的 SCSS 语法,甚至可以写的更为简洁。 > 自定义样式表的位置,取决于 HTML 模板中的定义。这里所确定的目录,是由 GitHub Pages 的主题中所定义的;读者可以修改仓库中 `_layouts/default.html` 模板引用样式表的方式,进而自定义样式表的存放位置。 ### 检查样式效果 定义 CSS 样式,最值得担心的问题是:在不同的浏览器、不同大小的屏幕上,显示效果是否始终如一?为了测试不同平台上的显示效果,你可以使用浏览器自带的「开发者工具」,检查样式的定义情况,切换窗口大小,甚至直接修改样式。 > :book: 不同浏览器的「开发者工具」不尽相同,因此这里并不详细介绍。读者可参考这篇文章:[MDN - 什么是浏览器开发者工具 ](https://developer.mozilla.org/zh-CN/docs/Learn/Discover_browser_developer_tools)。其是以 Firefox 为例介绍的,但同时也给出了其他浏览器的对应链接。 ## 开发 Javascript 脚本 许多人可能对仅由 HTML 与 CSS 组织的「静态」页面不甚满意。例如,我们希望学辅信息站上能支持这些功能: - 根据文章的各级标题,自动生成一个导航菜单/目录,点击其中的条目就能「平滑」地滚动到文章对应位置; - 搜索页面上的一些特定对象,改变它们的样式(CSS 自有的选择器往往无能为力); - 光标在页面上移动时,会伴随炫丽的幻影。 除了第三个功能没有意义外,剩余的几项功能都非常有必要实现。这时,可以用 Javascript 或相关的库(如 JQuery)写一些简单的脚本,实现这些带有「动态」属性的功能。Javascript 并非网页设计的必选项,你可以充分的依赖别人已有的成果;不过,即使是做一些简单的个性化调整,也需要你至少具有一定的 Javascript 基础。 > :book: 如果你希望快速了解 Javascript 的语法与特性,可浏览这篇教程:[菜鸟教程 - Javascript 简介](http://www.runoob.com/js/js-intro.html)。此外,我们的网站中常常使用到 jQuery,它是一个 Javascript 库,你可以浏览[菜鸟教程 - jQuery 教程](http://www.runoob.com/jquery/jquery-tutorial.html)中的有关条目——它的语法非常简单,且功能强大,很容易上手。 ### 脚本在哪里? 在我们所用的主题中,其仅使用了一份脚本:位于 `assets/js` 目录下的 `main.js`。在原本的主题中,其定义了两项功能: - `sectionHeight()` 函数,用于计算网页的高度; - 导航栏的生成与运行脚本,定义了导航栏的生成方式(提取正文标题)、运行方式(点击链接后,会以动画的形式跳转到对应位置)。 其中,第二项功能的实现不甚完备,特别是对中文支持不佳。为了完善这些问题,首先在本地仓库的对应位置克隆了原有的 `main.js` 文件,然后再根据实际需求进行改动。 ### 覆写实例:导航栏 > :warning: 导航栏的改动尚未完成,个别样式还需进一步优化。因此,这里暂不讨论改动的具体内容。 ### 新建实例:`shieldsManu.js` 除了优化已有的功能,你也可以在自己的站点中尝试新的脚本。例如,在本站中,有一份名为 `shieldsManu.js` 的脚本,用来优化网站中 [shields](https://shields.io) 标牌的样式与使用。它用 jQuery 写成,便于理解,也便于修改。 > :scroll: 关于 `shieldsManu` 插件的功能与使用方法,请先跳转至这份技术文档:[Markdown 文档规范](Markdown-文档规范#并不足够shieldsmanu)。 这里对 `shiledsManu.js` 的实现方式作简单讨论。……