如何给matery主题添加Pjax?

Pjax优点

1.减轻服务端压力

2.按需请求,每次只需加载页面的部分内容,而不用重复加载一些公共的资源文件和不变的页面结构,大大减小了数据请求量,以减轻对服务器的带宽和性能压力,还大大提升了页面的加载速度。

优化页面跳转体验

3.使用pjax后,只刷新部分页面,切换效果更加流畅,而且可以定制过度动画,在等待页面加载的时候体验就比较舒服了。

我知道你们在意的是教程不是这些啰嗦的废话,下面就是正文

教程

基本了解

Pjax的使用可以在保证Nav Header Footer不变的基础上改变Main的内容(适用于页面结构相对简单的主体)

步骤

新建pjax.ejs

_widget 目录下新建pjax.ejs文件

<%if(theme.pjax){%>
<script type="text/javascript">
$.getScript("https://cdn.jsdelivr.net/npm/pjax/pjax.min.js",loadPjax)
function loadPjax(){
var pjax = new Pjax({
selectors: [
"head title",
'head meta[name="keywords"]',
'head meta[name="description"]',
"main#main_wrap"
],
cache: true,
cacheBust: false
});
} // Pjax请求错误时,跳转到404页面
document.addEventListener('pjax:error', (err) => {
if (err.request.status === 404) {
pjax.loadUrl('/404.html')
}
})
</script>
<%}%>
添加容器

找到layout.eje<%- body %> 套一个 <main> 标签

<main id="main_wrap">
<%- body %>
</main>
引入pjax.ejs

找到 layout.ejs 在底部(首次加载没必要优先加载Pjax)添加

<% if (theme.pjax.enable) { %>
<%- partial('_widget/pjax') %>
<% } %>

此处添加一个判断条件,为后面_config.yml的配置作准备

添加pjax开关

themes\_config.yml中添加

pjax: true

bug的解决

由于Pjax会导致容器内的函数不会重载,要重载一下函数

在此仅提供重载方法,不一一做演示了

部分修改页面

由于时间问题,仅提供一些需要修改的 ejs 内容作为参考

  • 评论页面ejs(我使用的是valine,故我需要将valine.ejs页面进行修改)
  • 谷歌统计页面(google-analytics.ejs)
  • 文章目录(post-detail-toc.ejs)
  • 说说页面(artitalk.ejs)
  • 标签页面(tags)的词云(tag-wordcloud.ejs)
  • 分类页面(categories)雷达图(category-radar.ejs)
  • 归档页面(archives)统计图(post-calendar.ejs)
  • 关于页面(about)的统计图(post-charts.ejs)

欢迎提交遗漏bug

标签 (tags)页面为例

当操作完以上步骤后从首页点进标签(tags)页面时会有一下报错

打开tags.ejs该页面由 tag-cloud tag-wordcloud 两个ejs组成,故要查看这两个 ejs 页面哪里出现了 jQCloud 函数

找到bug处进行修改

  • 原页面
<link rel="stylesheet" type="text/css" href="<%- theme.jsDelivr.url %><%- url_for(theme.libs.css.jqcloud) %>">
<div class="container" style="padding-bottom: 20px" data-aos="fade-up">
<div id="tag-wordcloud" class="card-content"></div>
</div> <script type="text/javascript" src="<%- theme.jsDelivr.url %><%- url_for(theme.libs.js.jqcloud) %>"></script>
<script type="text/javascript">
<%
let tagWordArr = [];
site.tags.map(function(tag) {
tagWordArr.push({'text': tag.name, 'weight': tag.length, 'link': decodeURI(url_for(tag.path))});
}); let tagWords = JSON.stringify(tagWordArr);
%> $('#tag-wordcloud').jQCloud(<%- tagWords %>, {
autoResize: true
});
</script>
  • 修改后
<link rel="stylesheet" type="text/css" href="<%- theme.jsDelivr.url %><%- url_for(theme.libs.css.jqcloud) %>">
<style type="text/css">
#tag-wordcloud {
width: 100%;
height: 300px;
}
</style> <div class="container" data-aos="fade-up">
<div class="card">
<div id="tag-wordcloud" class="card-content"></div>
</div>
</div> <script type="text/javascript">
$.getScript("<%- theme.jsDelivr.url %><%- url_for(theme.libs.js.jqcloud) %>",function () {
<%
let tagWordArr = [];
site.tags.map(function(tag) {
tagWordArr.push({'text': tag.name, 'weight': tag.length, 'link': decodeURI(url_for(tag.path))});
}); let tagWords = JSON.stringify(tagWordArr);
%> $('#tag-wordcloud').jQCloud(<%- tagWords %>, {
autoResize: true
});
})
</script>

修改内容:将未重载的函数利用 Jquery 的 getScript 方法进行重载

$.getScript("文件引用路径",function(){
//重载函数
})

推荐

页面切换加载动画

pjax.ejsscript 标签中添加以下代码

// 清除时间
var timer = null;
// 执行进度条
function ProgressStart(){
// 设置初始进度
var progress = 10;
// 创建进度条 及 css样式
var div = document.createElement('div');
div.className = "pjax_progress";
document.body.prepend(div);
// 定义随机数最大值最小值
var max=10,mini=3;
var result=max-mini;
// 清除
clearInterval(timer);
// 0.5秒内累加进度
timer = setInterval(function(){
// 随机数
var num = parseInt(Math.random()*result);
var randomResult = num+mini;
// 累加
progress+=randomResult
$queryAll(".pjax_progress")[0].style.width = progress+"%";
// 当进度达到95%时停止
if(progress>95)progress=95
},500)
}
// 加载进度条加载完毕
function ProgressFinish(){
clearInterval(timer);
// 页面加载完毕后进度100% 并在0.7秒后删除
var progress = $queryAll(".pjax_progress");
progress[0].style.width = "100%";
timer = setTimeout(function () {
progress[0].parentNode.removeChild(progress[0])
}, 700);
}
// 开始 PJAX 执行的函数
document.addEventListener('pjax:send', function () {
// 执行进度条
ProgressStart()
});
// PJAX 完成之后执行的函数,可以和上面的重载放在一起
document.addEventListener('pjax:complete', function () {
// 加载进度条加载完毕
ProgressFinish()
});

my.css 中添加以下样式代码

.pjax_progress{
position: fixed;
top: 0;
left: 0;
width: 10%;
height: 2px;
z-index: 103;
background: linear-gradient(130deg, #ff0, red);
transition: width .4s ease 0s;
}

页面切换加载进度条

pjax.ejsscript标签中添加以下代码

#loading {
position: fixed;
top: 0;
left: 0;
min-height: 100vh;
width: 100vw;
z-index: 9999;
display: none;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
}
#loading .loader {
width: 20em;
height: 20em;
font-size: 10px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
#loading .loader .face {
position: absolute;
border-radius: 50%;
border-style: solid;
animation: CW 3s linear infinite;
}
#loading .loader .face:nth-child(1) {
width: 100%;
height: 100%;
color: #ffd700;
border-color: currentColor transparent transparent currentColor;
border-width: 0.2em 0.2em 0 0;
--deg: -45deg;
animation-direction: normal;
}
#loading .loader .face:nth-child(2) {
width: 70%;
height: 70%;
color: #0f0;
border-color: currentColor currentColor transparent transparent;
border-width: 0.2em 0 0 0.2em;
--deg: -135deg;
animation-direction: reverse;
}
#loading .loader .face .circle {
position: absolute;
width: 50%;
height: 0.1em;
top: 50%;
left: 50%;
background-color: transparent;
transform: rotate(var(--deg));
transform-origin: left;
}
#loading .loader .face .circle::before {
position: absolute;
top: -0.5em;
right: -0.5em;
content: '';
width: 1em;
height: 1em;
background-color: currentColor;
border-radius: 50%;
box-shadow: 0 0 2em, 0 0 4em, 0 0 6em, 0 0 8em, 0 0 10em, 0 0 0 0.5em rgba(255,255,0,0.1);
}

Matery主题添加Pjax的更多相关文章

  1. 044. asp.net主题之二为主题添加CSS样式和动态加载主题

    1. 新建任意一个网站, 默认主页为Default.aspx, 增加一个App_Themes目录, 用于存储主题, 添加一个MyTheme的主题, 在MyTheme主题下添加一个样式表文件, 默认名称 ...

  2. Mysql远程连接,并解决wordp主题添加问题

    1.增加允许远程连接 MySQL 用户并授权. 在 Linux 主机中在命令提示行下输入下面的命令. > MySQL -uroot -p 密码 2.创建远程登陆用户并授权 grant all P ...

  3. Hexo博客maupassant主题添加Google Adsense广告

    自从在 Github Page 落户以后,很长一段时间使用的是极简且有点艺术范儿的 fexo 主题,而不是大名鼎鼎的 next 主题.后来偶然发现了符合我审美的Hexo博客 maupassant 主题 ...

  4. 为Hexo Next主题添加分享及打赏功能

    博客地址:往事亦如风的博客 要想先看打赏和分享功能效果,请移步我的博客 打赏功能 因为next主题自带打赏功能,所以我们只需要在next的主题配置文件中找到如下代码,image文件夹是我在blog/s ...

  5. Orchard运用 - 特定主题添加独立代码文件

    今天继续跟大家分享捣鼓Orchard的一些心得.其实有时一些问题或者Bugs还是蛮好解决的,主要看你采取哪种方式方法.比如有时我们为了扩展某些特性或功能,你可以搭建一个全新的模块来完成,如果临时的或简 ...

  6. Hexo NexT主题添加点击爱心效果

    给NexT主题内添加页面点击出现爱心的效果 创建js文件 在/themes/next/source/js/src下新建文件clicklove.js,接着把该链接下的代码拷贝粘贴到clicklove.j ...

  7. 给hexo博客的NEXT主题添加一个云日历

    一点废话 hexo中有文件的归档,但是博文的数目多了,浏览的时候也是很不方便的.于是我就有找个云日历的想法了,折腾了几天,网上的方法都试过了.但是没出效果.于是想着自己来写一个.这自己写的这部分是基于 ...

  8. Hexo next主题添加站内搜索功能

    根据关键字搜索博文,站内搜索的功能很实用.hexo开启站内搜索很方便,已经有现成的插件可以使用,也是为了方便自己 安装插件 npm install hexo-generator-search --sa ...

  9. 在next主题添加微信公众号二维码

    在侧边栏添加微信公众号二维码 首先,当然是准备一张微信公众号二维码.有两种添加方式,添加到侧边栏或者添加到推文的结尾处.我的next主题是7.x版本的,使用的主题是Gemini,设置的侧栏显示方式是一 ...

随机推荐

  1. c++ 线段树

    关于线段树 线段数是一种区间树 可以看出:叶子即为输入的数 假设一个节点为 x ,则其左儿子为 2x 右儿子为 2x+1 操作解析 约定 变量名 意义 input[] 输入的数 t[] 线段树 其中 ...

  2. 深度学习与CV教程(14) | 图像分割 (FCN,SegNet,U-Net,PSPNet,DeepLab,RefineNet)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  3. identityserver4 (ids4)中如何获取refresh_token刷新令牌token 使用offline_access作用域

    ids4默认自带的api接口/api/connect/token 调用这个接口的时候,需要在body里面的 x-www-form-urlencoded模式下写 {     grant_type: &q ...

  4. 《A Neural Algorithm of Artistic Style》理解

    在美术中,特别是绘画,人类掌握了通过在图像的内容和风格间建立复杂的相互作用从而创造独特的视觉体验的技巧.到目前为止,这个过程的算法基础是未知的,也没有现存的人工系统拥有这样的能力.然而在视觉感知的其他 ...

  5. 【ASP.NET Core】自定义的配置源

    本文的主题是简单说说如何实现 IConfigurationSource.IConfigurationProvider 接口来自定义一个配置信息的来源,后面老周给的示例是实现用 CSV 文件进行应用配置 ...

  6. java面向对象编程---方法

    二.方法 1.方法的重载 1.1 方法的签名 方法的唯一标识就是方法的签名:方法的名字和参数列表: 一个类中不能出现两个方法的签名完全一样的方法 1.2 方法的重载 方法名相同但参数列表不同称之为方法 ...

  7. MIT 6.824 Llab2B Raft之日志复制

    书接上文Raft Part A | MIT 6.824 Lab2A Leader Election. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021 ...

  8. mvc Ensure that HttpConfiguration.EnsureInitialized()

    The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called ...

  9. 流程控制语句continue

    continue语句 用于结束当前循环,进入下一次循环,同样通常与if分支结构一起使用 (这边和前面的break可以结合在一起与C中的一样的理解) 注意这个不是终止整个循环只是终止当前循环进行下一次循 ...

  10. salt stack学习笔记

    saltstack运行模式: local master/minion salt ssh saltstack三大功能 远程执行命令 配置管理(状态管理) 云管理 安装: master  salt-mas ...