想要找一个插件,图片那里是隐藏起来的,点击才显示出来,找了半天,还是自己写一个吧。
在scripts
文件夹下新建文件夹hexo-tag-hiddenimg
初步设想是在md文件中插入以下代码,在页面中一开始显示的是test
,点击后显示链接的图片。
1
| {% hiddenimg https://i.loli.net/2019/11/06/NGpbIeE6Q3OoBxX.png "test" %}
|
在文件夹下新建
index.js
,加入以下代码
1 2 3 4 5 6
| hexo.extend.tag.register("hiddenimg", require('./hiddenimg-tag.js'), { ends: false } );
|
然后同级下新建文件
hiddenimg-tag.js
,初始代码
1 2 3 4 5 6
| module.exports = function(args){ console.log(args); //['https://i.loli.net/2019/11/06/NGpbIeE6Q3OoBxX.png', 'test'] return ""; };
|
之前是使用样式来控制显示,但是在scripts
文件夹下的所有文件hexo都会以js的方式来加载并试图运行,这就导致每次编译,都会报一个异常,虽说不影响使用,但看着实在不爽,于是改成了行内样式。这样插件内,返回的代码最终为
后来发现隐藏img的方法,不会阻止图片在页面加载时载入,所以修改了显示方法,先不写入img的src属性,而是在点击后才写入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| return `<div style="width: 100%;" class="hiddenimg-main" id="hiddenimg-${domid}"> <p id="hiddenimg-${domid}-txt" style="height: 4em; line-height: 4em; text-align: center; background-color: #ddd; cursor: pointer;">${showtxt}</p> <img id="hiddenimg-${domid}-img" style="display: none;" class="hiddenimg-img" img-src=${JSON.stringify(imgurl)}> </div> <script> var himg_${domid} = document.getElementById("hiddenimg-${domid}"); himg_${domid}.onclick = function(){ var tmp = this.className, txt = document.getElementById("hiddenimg-${domid}-txt"), img = document.getElementById("hiddenimg-${domid}-img"); if(tmp.indexOf("active") < 0){ // this.className = tmp + " active"; txt.style.display = "none"; img.style.display = "block"; var imgsrc = img.getAttribute("img-src"); img.src = imgsrc; } } </script>`
|
测试隐藏图片1
测试隐藏图片2
测试成功
以下为之前的内容,已经作废
这里返回的就是hiddenimg标签所显示的内容。除了页面的dom以外还需要加入样式,参照别的插件代码,在index.js
中加入代码。
1 2 3 4 5
| const generator = require('./generator'), filter = require('./filter'); hexo.extend.generator.register('hiddenimg', generator); hexo.extend.filter.register('after_post_render', filter);
|
其中
generator.js
负责处理样式文件,
filter.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
| //generator.js module.exports = function(locals){ let ctx = this, option = optioner(ctx.config.hiddenimg);
if("default" === option.css){ var str = fs.readFileSync( path.join(__dirname, "./asset/css.styl"), {encoding: "utf8"} ); return { path: option.file, data: stylus.render(str) } } return {} }
//filter.js module.exports = function(data){ let ctx = this, option = optioner(ctx.config.hiddenimg);
if("none" !== option.css){ data.content = '<link rel="stylesheet" href="' + ctx.config.root + option.file + '">' + data.content; } return data; }
|
整体思路就是用样式控制显示隐藏,一上来只显示文字,点击后添加一个class,遂
css.styl
文件为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| .hiddenimg-main width: 100%
.hiddenimg-main p height: 4em line-height: 4em text-align: center background-color: cursor: pointer
.hiddenimg-main .hiddenimg-img, .hiddenimg-main.active p display: none
.hiddenimg-main.active .hiddenimg-img display: block
|
最后修改
hiddenimg-tag.js
,加入逻辑即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| module.exports = function(args){ let domid = utils.randomString(5, '1234567890'), imgurl = args[0], showtxt = args[1] || "图片已被隐藏,点击查看";
return `<div class="hiddenimg-main" id="hiddenimg-${domid}"> <p>${showtxt}</p> <img class="hiddenimg-img" src=${JSON.stringify(imgurl)}> </div> <script> var himg_${domid} = document.getElementById("hiddenimg-${domid}"); himg_${domid}.onclick = function(){ var tmp = this.className; if(tmp.indexOf("active") < 0){ this.className = tmp + " active"; } } </script>` };
|