HEXO优化之(二)----添加复制功能

这月工作比较繁忙,所以这篇文章出的晚了,本次先把我文章内的复制功能的实现代码贴出来,如果对其他功能还有需要的,请留言给我,我会整理出来分享给大家!好了,废话说完了 ,这就开始正题。

概要

  • 应用第三方插件clipboard.js
  • 使用JQuery操作显示位置
  • 支持浏览器
    • Chrome 42+
    • Edge 12+
    • Firefox 41+
    • IE 9+
    • Opera 29+
    • Safari 10+

下载插件clipboard.js

clipboard.js(这里我不赘述了,直接贴主页/GitHub)

提供下载

 
保存文件clipboard.js / clipboard.min.js推荐),目录如下:(相对目录为工程目录)

.\themes\next\source\lib\zclip\clipboard.min.js 新增


插入JavaScript

新建文件 custom.js ,目录如下:(相对目录为工程目录)

.\themes\next\source\js\src\custom.js 新增

.\themes\next\source\js\src\custom.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//此函数用于创建复制按钮
function createCopyBtns() {
var $codeArea = $("figure table");
//查看页面是否具有代码区域,没有代码块则不创建 复制按钮
if ($codeArea.length > 0) {
//复制成功后将要干的事情
function changeToSuccess(item) {
$imgOK = $("#copyBtn").find("#imgSuccess");
if ($imgOK.css("display") == "none") {
$imgOK.css({
opacity: 0,
display: "block"
});
$imgOK.animate({
opacity: 1
}, 1000);
setTimeout(function() {
$imgOK.animate({
opacity: 0
}, 2000);
}, 2000);
setTimeout(function() {
$imgOK.css("display", "none");
}, 4000);
};
};
//创建 全局复制按钮,仅有一组。包含:复制按钮,复制成功响应按钮
//值得注意的是:1.按钮默认隐藏,2.位置使用绝对位置 position: absolute; (position: fixed 也可以,需要修改代码)
$(".post-body").before('<div id="copyBtn" style="opacity: 0; position: absolute;top:0px;display: none;line-height: 1; font-size:1.5em"><span id="imgCopy" ><i class="fa fa-paste fa-fw"></i></span><span id="imgSuccess" style="display: none;"><i class="fa fa-check-circle fa-fw" aria-hidden="true"></i></span>');
//创建 复制 插件,绑定单机时间到 指定元素,支持JQuery
var clipboard = new Clipboard('#copyBtn', {
target: function() {
//返回需要复制的元素内容
return document.querySelector("[copyFlag]");
},
isSupported: function() {
//支持复制内容
return document.querySelector("[copyFlag]");
}
});
//复制成功事件绑定
clipboard.on('success',
function(e) {
//清除内容被选择状态
e.clearSelection();
changeToSuccess(e);
});
//复制失败绑定事件
clipboard.on('error',
function(e) {
console.error('Action:', e.action);
console.error('Trigger:', e.trigger);
});
//鼠标 在复制按钮上滑动和离开后渐变显示/隐藏效果
$("#copyBtn").hover(
function() {
$(this).stop();
$(this).css("opacity", 1);
},
function() {
$(this).animate({
opacity: 0
}, 2000);
}
);
}
}
//感应鼠标是否在代码区
$("figure").hover(
function() {
//-------鼠标活动在代码块内
//移除之前含有复制标志代码块的 copyFlag
$("[copyFlag]").removeAttr("copyFlag");
//在新的(当前鼠标所在代码区)代码块插入标志:copyFlag
$(this).find(".code").attr("copyFlag", 1);
//获取复制按钮
$copyBtn = $("#copyBtn");
if ($copyBtn.lenght != 0) {
//获取到按钮的前提下进行一下操作
//停止按钮动画效果
//设置为 显示状态
//修改 复制按钮 位置到 当前代码块开始部位
//设置代码块 左侧位置
$copyBtn.stop();
$copyBtn.css("opacity", 0.8);
$copyBtn.css("display", "block");
$copyBtn.css("top", parseInt($copyBtn.css("top")) + $(this).offset().top - $copyBtn.offset().top + 3);
$copyBtn.css("left", -$copyBtn.width() - 3);
}
},
function() {
//-------鼠标离开代码块
//设置复制按钮可见度 2秒内到 0
$("#copyBtn").animate({
opacity: 0
}, 2000);
}
);
//页面载入完成后,创建复制按钮
$(document).ready(function() {
createCopyBtns();
});

插入主题中

新建文件 custom.swig ,目录如下:(相对目录为工程目录)

.\themes\next\layout_custom\custom.swig 新增

.\themes\next\layout\_custom\custom.swig
1
2
<script type="text/javascript" src="/lib/zclip/clipboard.min.js"></script>
<script type="text/javascript" src="/js/src/custom.js"></script>

修改文件 _layout.swig ,目录如下:(相对目录为工程目录)

.\themes\next\layout_layout.swig 修改

.\themes\next\layout\_layout.swig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!doctype html>
...
<html class="{{ html_class | lower }}" lang="{{ config.language }}">
<head>
...
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="{{ page.lang || page.language || config.language }}">
...
...
{% include '_third-party/mathjax.swig' %}
{% include '_third-party/scroll-cookie.swig' %}
{% include '_third-party/exturl.swig' %}
{% include '_custom/custom.swig' %}
</body>
</html>

向文件中</body>前一行插入文件引用,如第15行效果。

{% include '_custom/custom.swig' %}


总结

至此,代码复制 功能添加完毕,所有文件添加及修改状态如下

.\themes\next\source\lib\zclip\clipboard.min.js 新增
.\themes\next\source\js\src\custom.js 新增
.\themes\next\layout\_custom\custom.swig 新增     (感谢@heliuphy发现问题!)

.\themes\next\layout_layout.swig 修改

运行起来看看效果吧!


注意点

  • 相对目录都以 工程目录根目录
  • 本文内容使用 jQuery v2.1.3
  • HEXO主题 NexT
  • 图标库 Font Awesome (NexT主题内嵌)
如果觉得我的文章对您有用,请随意打赏。您的支持将是我继续创作的动力!