美文网首页
Hexo代码块折叠功能

Hexo代码块折叠功能

作者: 看远方的星 | 来源:发表于2023-01-29 23:38 被阅读0次

说明

实现同样的效果:

image

本博客环境:hexo@6.2.0next@7.8.0,以下所有代码,建立在这个基础之上。

由 jQuery 选择器选择代码模块.highlight相关的DOM节点,给超过某个高度的代码模块添加展开收起的盒子,让盒子实现展开隐藏效果。[1]

hexo version即可查看hexo版本;

image

查看theme/next/package.json即可查看next版本;

image

1、添加 code-unfold.js

code-unfold.js放置在了themes/next/source/js/code-unfold.js

var CODE_MAX_HEIGHT = 200;
var containers = [];

// 展开
$('body').on('click', '.js_unfold_code_btn', function () {
  $(this).closest('.js_highlight_container').addClass('on');
});
// 收起
$('body').on('click', '.js_retract_code_btn', function () {
  var $container = $(this).closest('.js_highlight_container').removeClass('on');
  var winTop = $(window).scrollTop();
  var offsetTop = $container.offset().top;
  $(this).css('top', 0);
  if (winTop > offsetTop) {
    // 设置滚动条位置
    $('body, html').animate({
      scrollTop: $container.offset().top - CODE_MAX_HEIGHT
    }, 600);
  }
});
// 滚动事件,触发动画效果
$(window).on('scroll', function () {
  var scrollTop = $(window).scrollTop();
  var temp = [];
  for (let i = 0; i < containers.length; i++) {
    var item = containers[i];
    var { $container, height, $hide, hasHorizontalScrollbar } = item;
    if ($container.closest('body').length === 0) {
      // 如果 $container 元素已经不在页面上, 则删除该元素
      // 防止pjax页面跳转之后,元素未删除
      continue;
    }
    temp.push(item);
    if (!$container.hasClass('on')) {
      continue;
    }
    var offsetTop = $container.offset().top;
    var hideBtnHeight = $hide.outerHeight();
    // 减去按钮高度,减去底部滚动条高度
    var maxTop = parseInt(height - (hasHorizontalScrollbar ? 17 : 0) - hideBtnHeight);
    let top = parseInt(
      Math.min(
        Math.max(scrollTop - offsetTop, 0), // 如果小于 0 ,则取 0
        maxTop,// 如果大于 height ,则取 height
      )
    );
    // 根据 sin 曲线设置"收起代码"位置
    var halfHeight = parseInt($(window).height() / 2 * Math.sin((top / maxTop) * 90 * (2 * Math.PI/360)));
    $hide.css('top', Math.min(top + halfHeight, maxTop));
  }
  containers = temp;
});

// 添加隐藏容器
function addCodeWrap($node) {
  var $container = $node.wrap('<div class="js_highlight_container highlight-container"><div class="highlight-wrap"></div></div>').closest('.js_highlight_container');

  // 底部 "展开代码" 与 侧边栏 "收起代码"
  var $btn = $(`
    <div class="highlight-footer">
      <a class="js_unfold_code_btn show-btn" href="javascript:;">展开代码<i class="fa fa-angle-down" aria-hidden="true"></i></a>
    </div>
    <a class="js_retract_code_btn hide-btn" href="javascript:;"><i class="fa fa-angle-up" aria-hidden="true"></i>收起代码</a>
  `);

  $container.append($btn);
  return $container;
};

function codeUnfold () {
  $('.highlight').each(function () {
    // 防止重复渲染
    if (this.__render__ === true) {
      return true;
    }
    this.__render__ = true;
    var $this = $(this);
    var height = $(this).outerHeight();
    if (height > CODE_MAX_HEIGHT) {
      // 添加展开&收起容器
      var $container = addCodeWrap($this, height);
      containers.push({
        $container,
        height,
        $hide: $container.find('.js_retract_code_btn'),
        hasHorizontalScrollbar: this.scrollWidth > this.offsetWidth,
      });
    }
  });
};

2、添加 jquery

修改next主题配置文件:

fancybox: true  

因为fancybox会依赖jquery,所以设置成true

3、引用 code-unfold.js

修改文件themes/next/layout/_scripts/index.njk

// 在最后添加  
{{- next_js('code-unfold.js') }}  

next8.0的模板是使用njk,旧版是使用swig[2];我的next是7.8版本,没有 index.njk 文件只有 index.swig 文件;查看了njk文件感觉和添加进去的代码格式似乎没有差别,尝试将以上代码添加到 index.swig 文件中;

image

下面找到文件themes/next/source/js/next-boot.js

NexT.boot.refresh = function () {  
  // 添加一行代码  
  codeUnfold()  
    
  // ...
image

4、添加样式

1、创建 highlight.styl
可以添加theme/next/source/css/_common/components/highlight.styl文件:

// 展开收起效果
.highlight-container
  position: relative
  background-color: highlight-background
  &.on
    .highlight-footer
      display: none
    .hide-btn
      display: flex
    .highlight-wrap
      max-height: none
  .highlight-wrap
    overflow: hidden
    max-height: 200px
  .highlight-footer
    position absolute
    width: 100%
    left: 0
    bottom: 0
    height: 60px
    background-image: 'linear-gradient(-180deg, rgba(255,255,255,0) 0%, %s 65%)' % highlight-background;
    text-align: center
  .show-btn
    font-size: 12px
    color: #fff
    position: absolute
    left: 50%
    transform: translateX(-50%)
    bottom: 0
    line-height: 2em
    text-decoration: none
    padding: 0 0.8em
    text-align: center
    border-radius: 4px 4px 0
    &:hover
      text-decoration: none
  .hide-btn
    color: #fff
    font-size: 12px
    width: 22px
    position: absolute
    left: -21px
    top: 0
    line-height: 1em
    text-decoration: none
    text-align: center
    display: none
    flex-direction: column
    background-color: highlight-background
    border-radius: 4px 0 0 4px
    padding: 0.1em 0 0.6em
    transition: top ease 0.35s
  .fa-angle-up,
  .fa-angle-down
    font-style: normal
    color: #fff
  .fa-angle-up:before
    content:"\f106"
  .fa-angle-down:before
    content:"\f107"
    margin-left: 0.5em
  .js_unfold_code_btn, .js_retract_code_btn
    background: rgba(0,0,0,0.5)
    border-bottom: none !important
    &:hover
      border-bottom-color: none !important

2、引用样式
找到文件 themes/next/source/css/_common/components/index.styl

@import 'post';
@import 'pages';
@import 'third-party';
// 添加这一行,不要加分号!!
@import 'highlight'

该目录下( themes/next/source/css/_common/components/)没找到 index.styl ,尝试将 @import 'highlight' 添加到 components.styl ,看是否可行;

image

实现了想要的效果,做的修改是可行的!

参考文章


  1. hexo博客代码折叠功能

  2. Hexo-5.x 与 NexT-8.x 跨版本升级

相关文章

  • Hexo NexT 代码块复制功能

    为了提高博客代码块的用户体验,仅仅代码高亮还不行,最好还能一键复制代码。故此文将讲述Hexo NexT主题博客的代...

  • Xcode快捷键

    折叠最小代码块 command+option+left 折叠当前文件所有代码块 shift+command+opt...

  • Xcode快捷键

    折叠代码块: 局部折叠(折叠一个函数)Command+Option+Left/Right 全局折叠(折叠全部函数)...

  • Android Studio快捷键

    展开、折叠代码块的方法:

  • Pycharme快捷键

    代码操作 mac下command相当于window下的Ctrl 折叠代码折叠/展开当前代码块:command+-/...

  • hexo的使用技巧

    总结一下hexo的使用技巧 首页展示折叠 在需要折叠的地方添加 `` 指令 指令集 hexo g = hexo g...

  • sublime使用

    调节字体大小 command + - 代码块折叠

  • python添加代码块&代码折叠

    很多时候为了阅读代码方便,会提高代码的管理,进行代码块的折叠处理,如C#的#region (code) #endr...

  • 功能代码块

    获取当前时间的前或后n个小时 忽略对象字段转json及忽略json field对应赋值给object field

  • Xcode 9 插件

    已经有很多 插件 不能用了。发现xcode 没有了 插件 好像少了点什么 代码块的折叠功能也给去掉了。。。 今天 ...

网友评论

      本文标题:Hexo代码块折叠功能

      本文链接:https://www.haomeiwen.com/subject/gqfmhdtx.html