[js] 改进型 - 隐藏图片或者任意块

代码功能:

  1. 默认隐藏图片,鼠标移到图片上时图片显示。
  2. 点击块标选中块然后 ctrl+alt+b,可以让任意块隐藏。再按一次快捷键,可令其显现

美中不足之处:

  1. 可能有 bug。不好说,我没测过
  2. 隐藏状态不能保存,也就是下一次打开所有块又是显现状态。
  3. 我其实希望的是导出的时候也能保持隐藏状态,但是看起来目前并没能实现。如果有大佬可以做到这一点的话……

代码

// 实现图片块默认模糊,鼠标悬停清晰,其他块按下 Ctrl/Meta + Alt + B 可模糊
(() => {
    // 模糊样式
    const filter = 'blur(6px)';
    // 模糊期间块是否可编辑,默认禁止编辑
    const editableOnBlur = false;

    // 初始为图片添加默认模糊效果
    const applyDefaultBlurToImages = () => {
        const imageElements = document.querySelectorAll('.protyle-wysiwyg img, .img--select img');
        imageElements.forEach((img) => {
            img.style.filter = filter;
            // 添加悬停事件,悬停清晰,移开模糊
            img.addEventListener('mouseenter', () => {
                img.style.filter = '';
            });
            img.addEventListener('mouseleave', () => {
                img.style.filter = filter;
            });
        });
    };

    // 调用一次以确保初始状态
    applyDefaultBlurToImages();

    // 监听 DOM 变化,动态为新增图片块添加模糊效果
    const observer = new MutationObserver(() => {
        applyDefaultBlurToImages();
    });
    observer.observe(document.body, { childList: true, subtree: true });

    // 监听按键事件,处理其他块的模糊效果
    document.addEventListener('keydown', (event) => {
        // 检查是否按下了 Ctrl/Meta + Alt + B
        if ((event.ctrlKey || event.metaKey) && event.altKey && event.code === 'KeyB' && !event.shiftKey) {
            // 遍历目标块元素
            const targetElements = document.querySelectorAll('.protyle-wysiwyg--select');
            const isBlurred = !!document.querySelector(`.protyle-wysiwyg--select[style*="${filter}"]`);
            targetElements.forEach((element) => {
                if (isBlurred) {
                    // 如果已经应用了 blur 样式,则移除
                    element.style.filter = '';
                    // 恢复编辑状态
                    if (!editableOnBlur) {
                        const contenteditableEl = element.querySelector('[contenteditable][data-blurred="true"]') || element.closest('[contenteditable][data-blurred="true"]');
                        if (contenteditableEl) {
                            contenteditableEl.setAttribute('contenteditable', true);
                            delete contenteditableEl.dataset.blurred;
                        }
                    }
                } else {
                    // 如果没有应用 blur 样式,则添加
                    element.style.filter = filter;
                    // 禁止编辑
                    if (!editableOnBlur) {
                        const contenteditableEl = element.querySelector('[contenteditable="true"]') || element.closest('[contenteditable="true"]');
                        if (contenteditableEl) {
                            contenteditableEl.setAttribute('contenteditable', false);
                            contenteditableEl.dataset.blurred = true;
                        }
                    }
                }
            });
        }
    });
})();

  • 思源笔记

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

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

    23064 引用 • 92801 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    91 引用 • 575 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • Mayrain 2 评论
    作者

    之所以说是改进型是因为这个代码是在 wilson(呃,这是网球的威尔胜吗)大佬的代码基础上改的。尝试多加了图片隐藏功能。调整 blur 的值也能调整 blur 的程度。

    原来的帖子在这里:
    Mayrain
  • 隐藏状态不能保存,也就是下一次打开所有块又是显现状态

    保存的话,调用下这个 api 更新下块就行了,图片的话可以用 closest 获取最近的块进行更新即可,块内容就是块元素的 outerHTML

    * /api/block/updateBlock
    * 参数
      {
        "dataType": "dom",
        "data": "",
        "id": "20211230161520-querkps"
      }
    
    • dataType:待更新数据类型,值可选择 markdown 或者 dom
    • data:待更新的数据
    • id:待更新块的 ID

    另外,原代码修复了列表块下禁用编辑失效的问题。

    1 回复
    3 操作
    wilsons 在 2024-12-24 15:22:23 更新了该回帖
    wilsons 在 2024-12-24 15:20:00 更新了该回帖
    wilsons 在 2024-12-24 15:09:05 更新了该回帖
  • Mayrain
    作者

    好,我试着改一改!不过不要抱太大希望就是了……今天我的 ai 账号刚挂……