title: Hexo Next为每篇文章设置自定义的banner图片
date: 2019-07-23 13:17:46
tags:
categories:

  • Hexo技术

小试牛刀

想完成这样一个功能:

顶部banner默认读取images/background.jpg。当进入文章页面的时候,判断文件夹内是否存在header-banner.jpg图片存在,有就优先使用它,否则使用images/background.jpg

之前静态改变banner图是直接在custom.styl里改变.header-inner里的background属性的。

现在要动态改banner图,当然要在javascript中改。

首先我找到了整个宏观布局定义的代码在themes\next\layout\_layout.swig。swig其实可以看做是html的超集(类似于ejs),可以使用各种html属性,当然也就可以在里面插入js代码了。于是我试着往header那一端里面插入:

<script type="text/javascript">
console.log(window.location);
</script>

重启hexo服务器之后可以顺利地在控制台看到输出。

最终解决方案

知道了可以直接改动swig文件来往html中插入js之后,一切就都明了了。下面是最终的解决方案。

我们看到post.swig第一句,说明它扩展于_layout.swig,仔细看_layout.swig里面header一段,可以看到它又include了_partials/header.swig,这就说明了我们改了_layout.swig就可以覆盖到每种情况了。

首先在class="header-inner"前面加上id。

<header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader"><!-- 添加了id,后面改变css样式用 --><div id="id-header-inner" class="header-inner"> {%- include '_partials/header.swig' %} </div>
</header>

然后在下方粘贴上这段代码:

<!-- 改变css样式 -->
<script type="text/javascript">
var url = document.location.pathname;
var folderName = url.substr(1, url.length - 2)
console.log(folderName);var listPostUrl = ["/" + folderName + "/" + "post-banner.png","/" + folderName + "/" + "post-banner.jpg",
];var nSuccessCount = 0;
var nResponceCount = 0;
function OnHttpResponse(bSuccess, strUrl) {console.log("OnHttpResponse: " + bSuccess + ", " + strUrl);nResponceCount++;if(nSuccessCount > 0){return;}if(bSuccess) {nSuccessCount++;document.getElementById("id-header-inner").style.backgroundImage = "url(" + strUrl + ")";}if(nResponceCount >= listPostUrl.length && nSuccessCount <= 0){// 使用默认图document.getElementById("id-header-inner").style.backgroundImage = "url(/images/background.jpg)";}
}function changeBanner(strPostUrl, nIndex){console.log("try to load" + strPostUrl);var xmlhttp;if (window.XMLHttpRequest){//  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码xmlhttp=new XMLHttpRequest();}else{// IE6, IE5 浏览器执行代码xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}xmlhttp.onreadystatechange=function(){if (xmlhttp.readyState==4 && xmlhttp.status==200){OnHttpResponse(true, strPostUrl);} else {OnHttpResponse(false, strPostUrl);}}xmlhttp.open("HEAD",strPostUrl,true);xmlhttp.send();
}listPostUrl.forEach(changeBanner);
</script>

这段代码的含义是在本文章的文件夹底下用head模式(只下载文件头,不下载文件内容)寻找名为post-banner.png的图,如果找到了就用这个图作为背景图,否则使用默认的在/images/background.jpg背景图。

以后就只需要在每篇文章的目录里面放一张post-banner.png的图,就可以用作自定义banner图片了。

实际使用的时候把下面的默认背景图改成你自己的默认背景图路径就可以了。

注意,这里使用background-image属性,不宜直接使用background属性,这是为了避免覆盖了我在custom.styl给banner设置的background-size: cover属性。

支持多个备选图片,所有图片都失败之后再使用默认图片,可用于同时支持png版本和jpg版本。

Hexo Next为每篇文章设置自定义的banner图片相关推荐

  1. Hexo为文章设置目录与标签的方法

    1. 创建目录页   在网站根目录下执行以下代码. hexo new page categories    Hexo\source 目录中会生成一个 categories 文件夹,文件夹内有一个 in ...

  2. 如何用Hexo优雅的书写文章

    MarkDown是什么这里就不多说了,具体参考我的技术博客,同时这里推荐一下我的个人网站,使用的是hexo的butterfly主题:https://lovelijunyi.gitee.io/ 了解文章 ...

  3. hexo博客的背景设置

    主要有以下30种: 在右上角或者左上角实现fork me on github 添加RSS 添加动态背景 实现点击出现桃心效果 修改文章内链接文本样式 修改文章底部的那个带#号的标签 在每篇文章末尾统一 ...

  4. Hexo系列(五) 撰写文章

    在利用 Hexo 框架搭建一个属于我们自己的博客网站后,下面我们就来谈谈怎样在网站上书写我们的第一篇博客吧 一.创建文章 在站点文件夹中打开 git bash,输入如下命令创建文章,其中 title ...

  5. react leaflet_如何使用React Leaflet和Leaflet Gatsby Starter设置自定义Mapbox底图样式

    react leaflet Building maps can be pretty powerful, but often you're stuck with open source options ...

  6. sql数据库 订阅发布_如何使用中央发布者和多个订阅者数据库设置自定义SQL Server事务复制

    sql数据库 订阅发布 In this article, you'll learn how to setup a simple, custom distributed database replica ...

  7. ASP.NET MVC - 设置自定义IIdentity或IPrincipal

    我需要做一些相当简单的事情:在我的ASP.NET MVC应用程序中,我想设置一个自定义IIdentity / IPrincipal. 哪个更容易/更合适. 我想扩展默认值,以便我可以调用User.Id ...

  8. 【QT 5 设置自定义标题栏+学习:《QT实现鼠标拖动调整窗口大小》+基础样例】

    [QT 5 设置自定义标题栏+学习:<QT实现鼠标拖动调整窗口大小>+基础样例] 1.说明 2.实验环境 3.实验目的 4.参考文章 5.实验步骤 (1)下载代码,运行没有错误. (2)加 ...

  9. Hexo+NexT 增加精品文章方法

    捣鼓了一下 置顶方法,又想折腾精品文章.和置顶方法类似. 精品 style 首先增加精品的样式文件. 在next 主题下面的 post.swig 找到如下代码. {% if theme.post_wo ...

最新文章

  1. 使用CEfSharp之旅(7)CEFSharp 拦截 http 请求 websocket 内容
  2. android TextView实现滚动显示效果
  3. 在Anacoda中管理多个版本Python
  4. 【CodeForces - 558C】Amr and Chemistry(位运算,bfs,计数,思维,tricks)
  5. DropBlock正则化
  6. Linux2个文件一起打包,Linux文件压缩和打包(二)
  7. hadoop之Combiner
  8. ContentProvider简单介绍
  9. angular集成websocket_angular使用 websocket,少点套路,多一点真诚
  10. 汪文君高并发编程总结-第一阶段
  11. 重力坝计算c语言程序,混凝土重力坝计算程序
  12. 很值得看看的中文翻译The Django Book
  13. 史上最全linux内核配置--Device drivers
  14. 一种贴片晶振异常情况,及晶振频率评估方法
  15. 安全系统工程徐志胜电子版_安全系统工程-第3版
  16. SharePoint文件审批功能设置
  17. 优秀程序员的博客有哪些?
  18. 计算机必备ASCII码表
  19. 腾讯开源 GFP-GAN 代码
  20. AUTOSAR 网络管理NM

热门文章

  1. 用友U8的SQL SERVER 数据库结构说明表
  2. 博士申请 | 卡耐基梅隆大学陈贝迪老师课题组招收机器学习方向博士生
  3. UI :新手自学完全指南(1) Karen X. Cheng
  4. 高效工具推荐:技术人员必备的3个知识收藏工具(浏览器插件)
  5. 超实用的几个编程学习公众号
  6. Eigen 求解线性方程组
  7. 吃透Chisel语言.31.Chisel进阶之通信状态机(三)——Ready-Valid接口:定义、时序和Chisel中的实现
  8. Linux 系统安全检查
  9. 使用Java设计简单的画图工具
  10. C++stack与queue模拟实现