手机端 < 类微信读书 >:自动隐藏顶栏

目的:模仿微信读书效果,方便手机端阅读

主要功能:

  1. 自动隐藏:顶栏、面包屑
  2. 快速双击屏幕,显示 3s 顶栏后,自动隐藏

效果图:

Screenshot_2025-12-03-16-19-54-357_org.b3log.siyuan

修改配置:

可在配置区域修改,双击触发间隔、自动隐藏时间等

    /* 2. 配置:要控制的元素选择器和动画参数 */
    const CONFIG = {
        selectors: ['.toolbar', '.protyle-breadcrumb', '.protyle-breadcrumb__bar'],
        hideDelay: 3000, // 3秒后隐藏
        animationDuration: 300, // 动画时长300ms
        doubleClickDelay: 300, // 双击判定时间300ms
        enablePassive: true
    };

JS 代码分享:

/******************************************************************
 * 移动端增强:Toolbar 和面包屑的自动隐藏/显示功能(双击触发)
 * 功能:默认隐藏,双击页面后显示,3秒无操作自动隐藏
 * 特性:双击触发,带有平滑动画效果
 ******************************************************************/
(function () {
    /* 1. 环境检查:只在指定模块启用时执行 */
    const html = document.documentElement;
    const has = (key) => html.dataset?.en_enabled_module?.includes(key);
    if (!has('EnOther') || !has('EnhancerIsMobile')) return;

    /* 2. 配置:要控制的元素选择器和动画参数 */
    const CONFIG = {
        selectors: ['.toolbar', '.protyle-breadcrumb', '.protyle-breadcrumb__bar'],
        hideDelay: 3000, // 3秒后隐藏
        animationDuration: 300, // 动画时长300ms
        doubleClickDelay: 300, // 双击判定时间300ms
        enablePassive: true
    };

    let hideTimer = null;
    let lastTapTime = 0; // 记录上一次点击时间
    let tapTimeout = null; // 单击超时定时器

    /* 3. 动态添加CSS动画样式 */
    const injectStyles = () => {
        const styleId = 'mobile-toolbar-double-tap';
        if (document.getElementById(styleId)) return;
      
        const style = document.createElement('style');
        style.id = styleId;
        style.textContent = `
            .toolbar, .protyle-breadcrumb, .protyle-breadcrumb__bar {
                transition: all ${CONFIG.animationDuration}ms cubic-bezier(0.4, 0, 0.2, 1) !important;
                opacity: 1;
                transform: translateY(0);
            }
          
            .toolbar-hidden, .protyle-breadcrumb-hidden, .protyle-breadcrumb__bar-hidden {
                opacity: 0 !important;
                transform: translateY(-10px) !important;
                pointer-events: none !important;
            }
          
            /* 确保隐藏时不会挡住内容 */
            .toolbar-hidden { display: none !important; }
          
            /* 双击提示效果(可选) */
            .double-tap-hint {
                position: fixed;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
                background: rgba(0, 0, 0, 0.7);
                color: white;
                padding: 8px 16px;
                border-radius: 20px;
                font-size: 14px;
                z-index: 10000;
                opacity: 0;
                transition: opacity 0.3s;
                pointer-events: none;
            }
          
            .double-tap-hint.show {
                opacity: 1;
            }
        `;
        document.head.appendChild(style);
    };

    /* 4. 双击检测逻辑 */
    const handleDoubleTap = (event) => {
        const currentTime = new Date().getTime();
        const tapLength = currentTime - lastTapTime;
      
        // 清除之前的单击超时
        clearTimeout(tapTimeout);
      
        // 判断是否为双击(在指定时间间隔内连续点击)
        if (tapLength < CONFIG.doubleClickDelay && tapLength > 0) {
            // 阻止事件冒泡和默认行为
            event.preventDefault();
            event.stopPropagation();
          
            // 触发显示
            showAll();
          
            // 重置时间
            lastTapTime = 0;
        } else {
            // 第一次点击,设置超时,超时后重置
            lastTapTime = currentTime;
            tapTimeout = setTimeout(() => {
                lastTapTime = 0;
                // 可选:显示单击提示
                showTapHint();
            }, CONFIG.doubleClickDelay);
        }
    };

    /* 5. 显示单击提示(可选功能) */
 /*   const showTapHint = () => {
        // 创建或获取提示元素
        let hint = document.getElementById('double-tap-hint');
        if (!hint) {
            hint = document.createElement('div');
            hint.id = 'double-tap-hint';
            hint.className = 'double-tap-hint';
            hint.textContent = '双击显示工具栏';
            document.body.appendChild(hint);
        }
      
        // 显示提示
        hint.classList.add('show');
      
        // 2秒后隐藏提示
        setTimeout(() => {
            hint.classList.remove('show');
        }, 2000);
    };
*/
    /* 6. 工具函数:显示/隐藏所有目标元素(带动画) */
    const hideAll = () => {
        CONFIG.selectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(el => {
                // 先添加动画类
                el.classList.add(selector.replace('.', '') + '-hidden');
              
                // 动画结束后完全隐藏(针对toolbar)
                if (selector === '.toolbar') {
                    setTimeout(() => {
                        if (el.classList.contains('toolbar-hidden')) {
                            el.style.display = 'none';
                        }
                    }, CONFIG.animationDuration);
                }
            });
        });
    };

    const showAll = () => {
        CONFIG.selectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(el => {
                // 先确保元素可见(针对toolbar)
                if (selector === '.toolbar') {
                    el.style.display = '';
                }
              
                // 强制重绘,确保动画触发
                void el.offsetWidth;
              
                // 移除隐藏类,触发显示动画
                el.classList.remove(selector.replace('.', '') + '-hidden');
            });
        });
      
        // 清除之前的定时器,设置新的隐藏定时器
        clearTimeout(hideTimer);
        hideTimer = setTimeout(hideAll, CONFIG.hideDelay);
      
        // 隐藏可能的单击提示
        const hint = document.getElementById('double-tap-hint');
        if (hint) {
            hint.classList.remove('show');
        }
    };

    /* 7. 初始化函数 */
    const init = () => {
        // 注入CSS样式
        injectStyles();
      
        // 初始状态:隐藏所有元素
        setTimeout(() => {
            hideAll();
        }, 100);
      
        // 绑定触摸事件(移动端使用touch事件更准确)
        document.body.addEventListener('touchstart', handleDoubleTap, { 
            passive: false // 需要preventDefault,所以设为false
        });
      
        // 同时支持鼠标双击(桌面端调试用)
        document.body.addEventListener('click', handleDoubleTap, { 
            passive: false
        });
      
        // 长按等其他手势时隐藏提示
        document.body.addEventListener('touchmove', () => {
            const hint = document.getElementById('double-tap-hint');
            if (hint) {
                hint.classList.remove('show');
            }
        });
    };

    /* 8. DOM就绪后执行初始化 */
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28443 引用 • 119762 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    736 引用 • 1307 回帖 • 2 关注
4 操作
chenhao396 在 2025-12-03 16:56:52 更新了该帖
chenhao396 在 2025-12-03 16:51:09 更新了该帖
chenhao396 在 2025-12-03 16:16:33 更新了该帖
chenhao396 在 2025-12-03 16:08:56 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    203 引用 • 4024 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 350 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    194 引用 • 1034 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 6 关注
  • 倾城之链
    23 引用 • 66 回帖 • 189 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    316 引用 • 547 回帖 • 4 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 1 关注
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 307 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 193 关注
  • 分享

    有什么新发现就分享给大家吧!

    251 引用 • 1801 回帖 • 1 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    135 引用 • 798 回帖 • 2 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 565 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 436 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    97 引用 • 155 回帖
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 152 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 404 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 736 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 2 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • V2Ray
    1 引用 • 15 回帖 • 4 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 706 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 517 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 691 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖