찾다
웹 프론트엔드HTML 튜토리얼Hexo 主题制作指南_html/css_WEB-ITnose

撰写于 2016年6月19日 修改于 2016年6月19日分类编程杂记标签Blog /Hexo /前端

当你看到你用的主题出现在两个以上的博客的时候,那你就要考虑自己写一个了。本文的主角是 Hexo ,如果你没有用过,那可以考虑 Hexo 你的博客了,如果你还没有写博客,那你真的 该试试了。根据 阮一峰提出的博客三阶段,技术人员早晚会选择 Github Pages 类似的服务,而 Hexo 绝对是值得尝试的。

本文内容与目的

写这篇文章的目的,当然是希望帮你快速的制作一款主题,将要包含的内容如下:

  • 主题的基本结构
  • 常见问题
  • 常用页面的实现
  • 基本工具

最终结果

写这篇文章的原因,就是因为制作了一个主题Random( 代码、 Demo),大家可以先看看,下面的代码,大都来自于这个主题。

基础知识

制作 Hexo 主题,除了需要了解 HTML / CSS / JavaScript 之外,还需要了解两个主要的技术,首先一个是模板引擎,Hexo支持主流的模板引擎,像 EJS / Jade / Swig 等,另外一个是 CSS 预处理,如 SASS / LESS / Stylus ,当然,这两个不用,直接使用 HTML / CSS 也是可以的,只不过可能效率会低一点,在本文中,选择使用如下两个:

  • Stylus: 语法文档,选择它,纯粹是因为想熟悉一下新技术
  • Swig: 语法文档,这个项目的作者已经半放弃了该项目,你也可以考虑使用 Jade Pug,两个功能差距不大,选择这个的原因同上

这篇文章将不介绍它们的使用,请参考它们的文档。

Hexo 工作流程

如果你已经看到了这篇文章,基本上你已经是一个 Hexo 用户了,但还是简单的介绍一下 Hexo 的流程:

  • 使用 hexo init来生成基本文件,做一些基本的配置,像安装模块、配置主题等
  • 使用 hexo new page / post来生成文章或页面的 md 文件,编辑
  • 使用 hexo g生成文件,Hexo 会根据主题中的模板,来生成对应的 html 文件,转译 CSS 文件,复制其它的静态文件(如图片图标字体等),组织为一个静态网站
  • 使用 hexo d来部署,一般是借助一些 部署模块完成

主题的作用就是在 Hexo 生成文件的时候,提供对应的模板和资源。

主题的基本结构

Hexo 对主题的基本要求,是需要有如下几个页面:

  • 首页 index
  • 存档页 archive
  • 标签文章列表页 tag
  • 分类文章列表页 category
  • 文章详情页 post
  • 页面详情页 page

以上这些文件,是 Hexo 在生成 HTML 文件时要用到的,全部放在主题的 layout文件夹中。由于上面这些页面里,有很多代码是重复的,比如,HTML文件的 head 部分,页面的顶部导航,底部版权部分等,为了修改方便,组织简洁,一般会将可重用的部分提出来,再利用模板引擎来引入。

此外,还有些 JS / CSS / 图片/ favicon.ico 一类的文件,这类文件并不需要 Hexo 进行转换,直接就在 HTML 页面里引用了,所以全部放在主题的 source文件夹中。

使用 yeoman 生成基础代码

现在开始项目之前,我都会搜索一下 yeoman 有没有库,生成 Hexo 主题就有 generator-hexo-theme。如果还没有安装 yeoman ,那先用 npm 全局安装。

npm i -g yo

接着安装生成器的库:

npm i -g generator-hexo-theme

然后到自己的博客目录之下,进入到 themes目录,创建一个用主题名命名的新文件夹,比如 test,进入新文件夹,先设置一下目录的权限,否则 yeoman 会提示权限不足:

chmod 675 ./

运行这个命令一般需要管理员权限,请根据自己系统的情况加 su/ sudo。接着开始生成代码:

yo hexo-theme

然后选择一些基本的配置,比如使用什么模板引擎,使用什么 CSS 预编译等,这里分别选择 Swig 和 Stylus。完成之后,主题目录下就会生成一些如下结构的文件:

├── _config.yml // 主题配置文件├── languages // 多语言文件夹├── layout│   ├── archive.swig // 存档页模板│   ├── category.swig // 分类文章列表页模板│   ├── includes // 各页面共享的模板│   │   ├── layout.swig // 页面布局模板,其它的页面模板都是根据它扩展来的│   │   ├── pagination.swig // 翻页按钮模板│   │   └── recent-posts.swig // 文章列表模板│   ├── index.swig // 首页模板│   ├── page.swig // 页面详情页模板│   ├── post.swig // 文章详情页模板│   └── tag.swig // 标签文章列表页模板└── source    ├── css    │   └── theme.styl // 主题自定义 CSS 文件    ├── favicon.ico    └── js        └── theme.js // 主题 JavaScript 文件

赶紧在 Hexo 的主配置文件中使用新主题,到博客根目录下找到 _config.yml文件,找到 theme行,修改如下:

theme: test

赶紧 hexo s启动博客,到浏览器看看效果吧。

多语言支持

Hexo 支持多语言显示,在主题的 languages文件夹中,存放具体的多语言文件,可以是 YML 或者 JSON 文件。再在主配置文件 _config.yml中使用下面的方法来指定具体的使用的配置文件名:

language: zh-CN# 或者多个配置文件language: - zh-CN - en

像下面这样组织语言文件, languages/en.yml:

archive_title: Archivescategory_title: Categorytag_title: Tag

在模板里,当需要在页面中显示文字时,可以使用 Hexo 提供的帮助函数 __()/ _p()来读取具体的值,如:

{% if is_archive() %}  {% set pageTitle = _p('archive_title') %}{% endif %}<h1 id="page-title">{{ page_title }}</h1>

这样,主题就可以轻松支持使用不同语言的博客主。

各个页面的布局

在上面生成的代码中,所有页面均使用同一个布局,全部扩展自 includes/layout.swig,在这个文件中,可以看到第 51 行有如下的代码:

{% block body %}{% endblock %}

在其它的布局文件(除开 includes目录中的)里,都是使对 includes/layout.swig进行扩展,然后指定 body这个块的代码,比如像 index.swig的代码如下:

{% extends 'includes/layout.swig' %}{% block body %}  {% include 'includes/recent-posts.swig' %}  {% include 'includes/pagination.swig' %}{% endblock %}

这就相当于是使用 includes/layout.swig里的代码,并且将 block body替换为那两行代码。注意,这个功能, EJS 模板引擎是不支持的。

因此,如果你要不同页面使用不同的布局,那就需要你在各自的页面里自定义,或者在单独的布局文件中定义,再扩展。

数据的填充

主题是供了页面的布局和样式,在生成 HTML 文件时,Hexo 会把特定的数据,传给 swig 模板,然后再由 swig 将数据填充到 HTML 文件之中。这些特定的数据,分为如下几类。

主配置文件数据

Hexo 的根目录中,有个 _config.yml文件,它就是主配置文件,数据组织使用 yml语法,其中的项目,可以在模板中直接使用,比如博客的名字、副标题等等之类。这些数据项组织在 config对象中。可以数字、字符串、对象、数组,例如:

# 字符串title: 不可能不确定# 没有值permalink_defaults:# 逻辑值auto_spacing: true# 数字since: 2010# 数组skip_render:   - "books"  - "books/*"# 对象social:  GitHub: https://github.com/stiekel  Coding.NET: https://coding.net/u/Stiekel  Twitter: https://twitter.com/SidCN

完整代码,请参见 _config.yml。

主题配置文件

每个主题,还有单独的配置文件,用于配置与主题紧密相关的内容,格式与主配置文件一致。只不过变量名为 theme。

具体哪些数据放到主配置文件中,哪些数据放到主题配置文件,自由度其实很高,一般的,推荐与博客中的数据相关的,放主配置文件,如博客的名字、作者、菜单配置等,与主题相关的,放到主题配置文件,比如主题的脚本文件列表、样式文件列表等。当然,在编写主题的时候,也可以考虑对于某一个数据,既可以放在主配置文件中,也可以放在主题配置文件中,像这样:

{% set menu = config.menu || theme.menu %}

要读取菜单配置时,任意哪个配置文件中有都可以,而且是优先使用主配置文件中的配置。

配置文件中数据的使用

如果要在模板中使用某个具体的值,比如字符串、数字、逻辑变量或者对象的某个成员,可以在主题的模板文件 swig 中直接使用:

<div class="title" onClick="openUserCard()">{{ config.title }}</div>

这就相当于把配置文件中的 title输出到 HTML 中。如果是要遍历数组或者对象,就要复杂一点:

<ul class="index-nav-link">  {% set menu = config.menu || theme.menu %}  {% for key in Object.keys(menu)  %}    {% if menu[key] != '/'  %}      <li><a href="{{ url_for(menu[key]) }}">{{ key }}</a></li> {% endif %} {% endfor %}</ul>

Object.keys是取出一个对象的所有索引, for key in是遍历索引数组,即将对象的所有值生成一组用

  • 组织的链接。

    常用功能的实现

    Hexo 提供了很多专门的变量及函数,用于在编写主题时使用。请参见 变量列表和 帮助函数列表。这里针对常用的一些功能做对应的介绍。

    获取站点的所有的文章、页面、标签和分类

    Hexo 为主题提供了一个变量 site,这个变量包括以下几个成员:

    • site.posts博客里的所有文章列表
    • site.pages所有创建的页面的列表
    • site.categories分类列表
    • site.tags标签列表

    其中, site.posts与 site.pages两个结构是相同的,它们各自包括两个成员,一个 length 为长度,一个 data 为具体的数组,它是个对象,但索引是数组,成员是各个文章的详情。

    site.categories和 site.tags则为两个对象,成员比较多,但具体的分类和标签列表,存在索引为 data的成员上,该成员为对象,对象的索引为分类和标签对应的 id,类似于:

    "data":{  "cipap3lwj0001fhpvlubaa0sp":{    "name":"乱七八糟",    "_id":"cipap3lwj0001fhpvlubaa0sp"  }}

    不过实际在编写主题的时候,很少会直接用到这几个变量。

    获取当前页面的数据

    这个变量便是 page,这个变量的特点是,在不同的页面中,它的成员会不一样。比如,在文章归档页,它就有文章列表,如果在文章详情页,它就包含有文章的相关信息。而且在不同的页面中,就算同一个索引的成员,值也会不一样,比如 page.posts,在首页,它是按分页设置限制过的文章列表,而在存档页则是所有文章的列表。

    比如,在我们生成的代码中,首页里使用 includes/recent-posts.swig( 在线代码)来显示文章列表,其主要代码如下:

    {% if site.posts.length > 0 %}    {# ... #}    {% for postItem in site.posts.toArray() %}      {# ... #}    {% endfor %}{% endif %}

    如果你的博客已经有几篇文章得话,会发现文章虽然列出来了,但并不是按时间来排列的。所以几乎没什么用,但如果使用 page.posts变量替代 site.posts,结果就不一样了,修改一下试试。

    再刷新一下首页,可以看到,文章只有几篇,并不是全部文章,且按时间倒序排列。 page的所有成员,请参见 列表。

    各种链接的处理

    获取某个页面的地址,有很多方法。包括:

    • 全局的变量 path url
    • page.path page.permalink,这两个值在单个的文章、分类和标签中,也是都有的

    我们来看看这几个值各自有何作用。打开 layout/post.swig,在第4行前插入如下代码:

    <p>{{ path | json }}</p><p>{{ url | json }}</p><p>{{ page.path | json }}</p><p>{{ page.permalink | json }}</p>

    然后启动博客,进入做任意一篇文章,可以在顶部看到三个字符串,类似于:

    "2016-06/Material-Design-Float-Action-Button.html""http://chensd.com/2016-06/Material-Design-Float-Action-Button.html""2016-06/Material-Design-Float-Action-Button.html""http://chensd.com/2016-06/Material-Design-Float-Action-Button.html"

    链接的具体样式,是主配置文件中 permalink来决定的,这里的配置值为 :year-:month/:title.html。可以看出来, path与 page.path输出一致, url与 page.permalink一致。而这几个链接都是无法直接使用的。因为 page.path的值是相对路径,所以除了首页都是不能直接当链接的。而 path.permalink,则是带有主配置文件中 url值配置的全路径,也不太好当作站内链接直接使用。这时候,就需要 Hexo 提供的帮助函数 url_for()来救场了。

    再来加一行:

    <p>{{ url_for(page.path) | json }}</p>

    输出为:

    "/2016-06/Material-Design-Float-Action-Button.html"

    这个结果就比较适合作为站内链接了。

    在页面中加入 css 与 js 文件

    Hexo 提供了两个帮助函数 css()和 js(),传入路径数组便可生成对应的 link/ script标签。路径数组配置在主题的配置文件中。

    当前页面类型的判断

    由于有些代码在不同的页面都是共用的,所以有时候就需要根据不同的页面,做不同的显示。比如,一般会把 HTML 的

    部分写到一个单独的文件里。比如,这里生成的 layout/includes/layout.swig文件里,就需要根据不同的页面,来生成不同的 标签值。 这类判断的方法主要有:
    • is_tag()
    • is_category()
    • is_month()存档页中的按月份文章列表页
    • is_year()存档页中的按年份文章列表页
    • is_archive()
    • is_post()
    • is_home()
    • is_current()传入一个 URL ,判断是否本页就是,比如,链接中要对当前页面的链接做加强显示,就可以利用这个方法来添加对应的 class

    常用的字符串处理函数

    • strip_html()去除一段 HTML 代码中的标签,返回其包含的字符
    • markdown()将 md 代码转换为 HTML
    • word_wrap()将一段字符,按固定宽度插入换行符号
    • truncate()按固定长度截取字符串,比如,生成摘要时,如果没有摘要,可以截取一段文本

    另外几个,请参见 字符串处理函数列表。

    时间的处理

    Hexo 提供了多个 时间处理函数,不过一个 date()也就够用了,接受两个参数,第一个为时间值,第二个为格式,模板引用中用法如下:

    {% set thisYear = date(Date.now(), 'YYYY') %}

    HTML 中用法如下:

    <span id = "post-title-date">{{ date(postItem.date, 'M-D') }}</span>

    由于是使用 Moment.js 来显示的时间,所以直接使用 Moment.js 的 时间格式就行了,常用的如下:

    • YYYY-MM-DD=> 2016-06-17
    • M-D=> 6-17
    • HH:mm:SS=> 07:38:19

    生成标签云

    Hexo 提供了帮助函数 tagcloud()来生成标签云。生成的时候,可以设定标签云的文字大小范围、排序、颜色等值。具体请参见 参数列表。

    以下是生成的一个标签云 HTML:

    <div class="tag-cloud-tags">  <a href="/tags/ASP-NET/" style="font-size: 17.33px; color: #929292">ASP.NET</a>  <a href="/tags/Access/" style="font-size: 24px; color: #6f6f6f">Access</a>  <a href="/tags/Android/" style="font-size: 17.33px; color: #929292">Android</a></div>

    这样便可以通知设置 tag-cloud-tags的样式来自定义标签云的外观。

    生成文章的目录

    对于长文章,目录还是非常实用的,Hexo 也提供了 toc()来实现这一功能,具体请参见 文档。

    生成的 HTML 是个有序列表,结构如下:

     <ol class="toc">  <li class="toc-item toc-level-3">    <a class="toc-link" href="#按钮的定位">      <span class="toc-text">按钮的定位</span>    </a>  </li></ol>

    只要使用了 toc()函数,无论当前页面有几个标题,都会生成对应的代码。比如想当目录少于三个的时候自动隐藏,那就得靠 JavaScript 了。可以通过获取 ol.toc子成员的数量,来确定其显示或隐藏,jQuery 代码如下:

    if($("ol.toc").children().length <= 3) {  $(".toc").hide();}

    这样当目录条数少于四条时,便自动隐藏目录。

    页面的组织

    代码的复用

    上面我们曾经提到,对于一个主题,主要有首页、存档页、标签文章列表页、分类文章列表页、文章详情页、页面详情页这几个页面。这些页面的实现中,你会发现有大量的代码是可以共享的,比如:

    • HTML 的 部分
    • 页面的顶部导航
    • 页面的底部版权和链接
    • 各个文章列表页中的单个文章的链接(一般包括文章标题、标签、分类、时间、摘要等信息)
    • 第三方插件代码,如评论、统计等
    • 分页按钮

    所以,对于这部分的代码,一般都会设计成可复用的代码段,将这些代码段文章存放在 includes文件夹中,如果在某个页面中需要使用,只需要使用模板引擎的 include 功能来包含。比如,我们来看看如何组织一个文章列表中的单个文章的链接,这个代码段会在存档页、标签和分类的文章列表页等地方用到,创建文件 includes/post-title-item.swig,代码如下:

    {# postItem 为存有一个文章的所有信息的对象 #} {# postItem.title 为文章标题,如果没有标题,则直接截取文章内容 #} {# strip_html 是将 html 代码中提取可供普通人阅读的文字部分 #} {# trim 是去除前后空格 #} {% set postTitle = postItem.title || trim(strip_html(postItem.content)) %} {# 标题最多 80 个字符,超过得话,使用 truncate 来截取 #} {% if postTitle.length < 80 %} {{ postTitle }} {% else %} {{ truncate( postTitle, {length: 80}) }} {% endif %}

    {# 显示时间 #} <span id = "post-title-date">{{ date(postItem.date, 'M-D') }}</span> {% if postItem.categories.length %} {# 组织分类的链接列表 #} {{ __('category_title') }} {% set i = 0 %} {% for cat in postItem.categories %} {% if i !== 0 %} {{'/'}} {% endif %} {% set i = i + 1 %} {{ cat.name }} {% endfor %} {% endif %} {# 组织标签的链接列表 #} {% if postItem.tags.length %} {{ __('tag_title') }} {% set i = 0 %} {% for tag in postItem.tags %} {% if i !== 0 %} {{'/'}} {% endif %} {% set i = i + 1 %} {{ tag.name }} {% endfor %} {% endif %} {# 有些在文章的头部指定了照片,也显示出来 #} {% if postItem.photos %}
    {% set i = 0 %} {% for photo in postItem.photos %} {% set i = i + 1 %} {% if i <= 3 %} {# 这里使用了 fancybox 的一些功能,具体后面了解 #} Hexo 主题制作指南_html/css_WEB-ITnose {% endif %} {% endfor %} {% endif %}

    这样,在需要使用的页面中,单个文章对象的常量名设置为 postItem便可以组织为相应的结构。比如,在标签文章列表页,可以这样组织:

    {# 遍历所有文章,注意,单个文章的对象为 `postItem` #}{% for postItem in site.posts.toArray() %}  {% set isShow = false %}  {# 确定一下某一个文章,是否包含当前这个标签 #}  {% for tag in postItem.tags %}    {% if tag.name === page.tag %}      {% set isShow = true %}    {% endif %}  {% endfor %}  {# 包含就显示 #}  {% if isShow %}    {% include 'includes/post-title-item.swig' %}  {% endif %}{% endfor %}

    以上代码在 layout/tag.swig中, 在线代码。

    首页

    首页一般会包括一些链接和最近的几篇文章,使用的模板文章为 layout/index.swig。链接可以固定的,比如,显示首页、存档页。也可以从配置文件中读取链接列表,再予以显示。

    如果要显示最近的几篇文章的列表,可以使用 page.posts中的文章列表,注意加上翻页链接。

    分类列表页与分类文章列表页

    分类列表页显示博客里的所有分类,分类文章列表页显示某个分类中的文章列表。

    Hexo 并没有专门分类列表页的模板,那该如何处理呢?一般是写在页面模板中,即 layout/page.swig里,然后判断页面类型变量 page.type,如果是 categories,则显示分类列表页。再在博客里创建一个页面,指定其 type为 categories。实现方法如下,先来看看 layout/page.swig中的代码:

    {% extends 'includes/layout.swig' %}{% block body %}  <article id="page">    {% set page_title = page.title %}    {# 判断是否是分类列表页,如果是,显示对应内容 #}    {% if 'categories' === page.type %}      <h1 id="page-title-category-title">{{ page_title || __('category_title') }}</h1>      {{ list_categories() }}    {# 显示普通页面的内容 #}    {% else %}      <h1 id="page-title">{{ page_title }}</h1>      {% autoescape false %}{{page.content }}{% endautoescape %}    {% endif %}  </article>  {% include 'includes/pagination.swig' %}{% endblock %}

    要显示所有的分类,这里是使用了 list_category()来显示,也可以从 site.categories中遍历组织显示。接着,使用如下命令创建一个页面:

    hexo new page categories

    然后在站点的 source文件夹下,会多出来一个名为 categories的文件夹,只包括一个名为 index.md的文件,内容如下:

    title: categoriesdate: 2016-06-19 10:29:23---

    将其内容修改为:

    title: 分类date: 2016-06-19 10:29:23type: "categories"comments: false---

    这样,Hexo 在生成页面时,判断到 type为 categories,便会生成分类列表。页面的地址为 /categories/。

    而对于分类文章列表页,则需要在 layout/category.swig中编辑。具体的文章列表,可以从 page.posts中取,也可以从 site.posts中取文章,再根据文章分类筛选显示。

    标签列表页与标签文章列表页

    这个与分类的处理类似,不做重复介绍。

    归档页

    归档页使用的 layout/archive.swig模板,一般是按年或按月来显示文章。Hexo 里其实有专门按年和月显示的文章列表页,从 page.posts里读取文章列表,再根据上文中提到的 is_month()/ is_year()来组织显示。

    文章列表显示比较简单,单说一点,如何按年分隔来显示文章列表,当然,按月分隔显示的操作也一样。

    操作方法其实比较简单,先遍历 page.posts,判断当年文章对比前一篇文章的发表年份是否变化,如果变化,则加一个年份的显示,代码实现如下:

    {# 先遍历一篇文章列表,找出每年各发了多少文章,以便显示 #}{% set howMuch = {} %}{% for postItem in page.posts.toArray() %}  {% set thisYear = date(postItem.date, 'YYYY') %}  {% if !howMuch[thisYear] %}    {% set howMuch[thisYear] = 0 %}  {% endif %}  {% set howMuch[thisYear] = howMuch[thisYear] + 1 %}{% endfor %}{# 开始显示, lastYear 为上一篇文章的发表年份 #}{% set lastYear %}{% for postItem in page.posts.toArray() %}  {# 当前文章的发表年份 #}  {% set thisYear = date(postItem.date, 'YYYY') %}  {# 如果当前文章年份与上一篇不一样,则显示年份 #}  {% if thisYear !== lastYear %}    {% set lastYear = thisYear %}    <h3 id="thisYear-年份后面-显示一下这年共发表了多少篇文章-if-howMuch-thisYear-span-class-posts-count-total-title-howMuch-thisYear-if-howMuch-thisYear-post-title-else-posts-title-endif-span-else-not-post-endif">{{ thisYear }}    {# 年份后面,显示一下这年共发表了多少篇文章 #}    {% if howMuch[thisYear] %}      <span class="posts-count">      {{ __('total_title') }}      {{ howMuch[thisYear] }}      {% if 1 === howMuch[thisYear] %}        {{ __('post_title') }}      {% else %}        {{ __('posts_title') }}      {% endif %}      </span>    {% else %}        {{ __('not_post') }}    {% endif %}    </h3>  {% endif %}  {% include 'post-title-item.swig' %}{% endfor %}

    图片与图片库

    文章的图片放在 photos之中,在 page.photos和 post.photos中都有。Hexo 主题一般的做法是使用 FancyBox来展示图片。

    两个地方可能要显示图片,一个是文章或页面的详情中, 另外一个是在各个文章列表中。

    代码的显示

    代码段一般是使用 highlight的样式,直接加载它的 css 就行。另外可能需要调整一下代码段的 padding和 margin,另外就是字体。具体被 highlight 处理后的代码段的 HTML 结构,请通过 Chrome 调试工具查看,这里就不列了。

    除了代码段,在正文中之内还有一些代码文字,会使用 标签包裹,这个需要单独针对这个标签设置样式。比如,可以给一个浅灰的背景色,再改个字体,加个斜体等等。

    代码的字体,可以 www.cssfontstack.com上找一组合适的,并且兼容 Windows / OS X 的字符,比如下面这个:

    code, table .line{ font-family: Consolas, Monaco, Courier New, Lucida Console;}

    主题的发布

    如果你想要更多的人看到你的主题,可以考虑发布到 Hexo 官方网站的主题列表中。需要经过几个步骤来实现。

    主题测试

    官方提供了一个站点的示例,里面包含了多种需要考虑的可能情况。克隆 hexo-theme-unit-test,然后在这个站点里安装你的主题。并确定主题可以成功的处理如下几种类型的文章:

    • 图片文章
    • 无标题的文章
    • 带摘要的文章
    • 带视频的文章
    • 带图库的文章
    • 支持常用的标签,如代码块、Gist、jsFddle和引用等
    • 标签是网址的文章
    • 对东亚文字的支持——必然的

    发布

    先 Fork 官方站点, hexojs/site,然后克隆到本地,再编辑站点内 source/_data/theme.yml,增加一段如下的数据:

    - name: Random  description: A hexo theme with random fullscreen background image.  link: https://github.com/stiekel/hexo-theme-random  preview: http://hexo-theme-random.herokuapp.com/  tags:    - responsive    - one_column    - background_image    - random    - iconfont    - modal

    然后再在 source/theme/screenshots/文件夹中放一个主题截图,尺寸为 800 * 500 ,文件名与主题名字一致。可以参考 这个图片。

    其实主题制作,主要是各种细节,按你想要的样子去实现吧。

  • 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    HTML, CSS 및 JavaScript 이해 : 초보자 안내서HTML, CSS 및 JavaScript 이해 : 초보자 안내서Apr 12, 2025 am 12:02 AM

    WebDevelopmentReliesonHtml, CSS 및 JavaScript : 1) HtmlStructuresContent, 2) CSSSTYLESIT, 및 3) JAVASCRIPTADDSINGINTERACTIVITY, BASISOFMODERNWEBEXPERIENCES를 형성합니다.

    HTML의 역할 : 웹 컨텐츠 구조HTML의 역할 : 웹 컨텐츠 구조Apr 11, 2025 am 12:12 AM

    HTML의 역할은 태그 및 속성을 통해 웹 페이지의 구조와 내용을 정의하는 것입니다. 1. HTML은 읽기 쉽고 이해하기 쉽게하는 태그를 통해 컨텐츠를 구성합니다. 2. 접근성 및 SEO와 같은 시맨틱 태그 등을 사용하십시오. 3. HTML 코드를 최적화하면 웹 페이지로드 속도 및 사용자 경험이 향상 될 수 있습니다.

    HTML 및 코드 : 용어를 자세히 살펴 봅니다HTML 및 코드 : 용어를 자세히 살펴 봅니다Apr 10, 2025 am 09:28 AM

    "Code"는 "Code"BroadlyIncludeLugageslikeJavaScriptandPyThonforFunctureS (htMlisAspecificTypeofCodeFocudecturecturingWebContent)

    HTML, CSS 및 JavaScript : 웹 개발자를위한 필수 도구HTML, CSS 및 JavaScript : 웹 개발자를위한 필수 도구Apr 09, 2025 am 12:12 AM

    HTML, CSS 및 JavaScript는 웹 개발의 세 가지 기둥입니다. 1. HTML은 웹 페이지 구조를 정의하고 등과 같은 태그를 사용합니다. 2. CSS는 색상, 글꼴 크기 등과 같은 선택기 및 속성을 사용하여 웹 페이지 스타일을 제어합니다.

    HTML, CSS 및 JavaScript의 역할 : 핵심 책임HTML, CSS 및 JavaScript의 역할 : 핵심 책임Apr 08, 2025 pm 07:05 PM

    HTML은 웹 구조를 정의하고 CSS는 스타일과 레이아웃을 담당하며 JavaScript는 동적 상호 작용을 제공합니다. 세 사람은 웹 개발에서 의무를 수행하고 화려한 웹 사이트를 공동으로 구축합니다.

    HTML은 초보자를 위해 쉽게 배우나요?HTML은 초보자를 위해 쉽게 배우나요?Apr 07, 2025 am 12:11 AM

    HTML은 간단하고 배우기 쉽고 결과를 빠르게 볼 수 있기 때문에 초보자에게 적합합니다. 1) HTML의 학습 곡선은 매끄럽고 시작하기 쉽습니다. 2) 기본 태그를 마스터하여 웹 페이지를 만들기 시작하십시오. 3) 유연성이 높고 CSS 및 JavaScript와 함께 사용할 수 있습니다. 4) 풍부한 학습 리소스와 현대 도구는 학습 과정을 지원합니다.

    HTML의 시작 태그의 예는 무엇입니까?HTML의 시작 태그의 예는 무엇입니까?Apr 06, 2025 am 12:04 AM

    anexampleStartingtaginhtmlis, whithbeginsaparagraph.startingtagsareessentialinhtmlastheyinitiate rements, definetheirtypes, andarecrucialforstructurituringwebpages 및 smanstlingthedom.

    메뉴에서 점선 분할 효과의 중심 정렬을 달성하기 위해 CSS의 Flexbox 레이아웃을 사용하는 방법은 무엇입니까?메뉴에서 점선 분할 효과의 중심 정렬을 달성하기 위해 CSS의 Flexbox 레이아웃을 사용하는 방법은 무엇입니까?Apr 05, 2025 pm 01:24 PM

    메뉴에서 점선 분할 효과를 설계하는 방법은 무엇입니까? 메뉴를 설계 할 때는 일반적으로 접시 이름과 가격 사이에 왼쪽과 오른쪽을 정렬하는 것이 어렵지 않지만 점선 또는 중간의 점은 어떻습니까?

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    메모장++7.3.1

    메모장++7.3.1

    사용하기 쉬운 무료 코드 편집기

    SecList

    SecList

    SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

    DVWA

    DVWA

    DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    WebStorm Mac 버전

    WebStorm Mac 버전

    유용한 JavaScript 개발 도구