[js][css] 分享一个类语雀代码块折叠 JS

本贴最后更新于 285 天前,其中的信息可能已经时移世易

image.png

image.png

PixPin20250312155832.gif

.code-block {
  position: relative;
  margin: 1.5rem 0;
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  transition: all 0.3s ease;
  overflow: hidden;
  z-index: 1;
  background-color: #f5f5f5;
  padding: 1rem;
  border: 2px solid transparent;
}

@keyframes neon-border {
  0% { border-color: #ff0080; box-shadow: 0 0 5px #ff0080; }
  25% { border-color: #00ffff; box-shadow: 0 0 5px #00ffff; }
  50% { border-color: #00ff00; box-shadow: 0 0 5px #00ff00; }
  75% { border-color: #ffff00; box-shadow: 0 0 5px #ffff00; }
  100% { border-color: #ff0080; box-shadow: 0 0 5px #ff0080; }
}

.code-block:hover:not([data-fullscreen="true"]) {
  animation: neon-border 5s infinite;
  transform: translateY(-3px) scale(1.02);
  box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
  z-index: 10;
}

.code-block pre {
  margin: 0;
  padding: 0;
}

.code-block-header .code-block-title {
  font-weight: 500;
}

.theme-dark .code-block {
  background-color: #1e1e1e;
  color: #d4d4d4;
}

.code-block .protyle-action {
  opacity: 0;
  transition: opacity 0.3s ease;
}

.code-block:hover .protyle-action {
  opacity: 1;
}

.code-block[data-fullscreen="true"] {
  border: none;
  animation: none;
  transform: none !important;
  box-shadow: none;
  border-radius: 0;
  margin: 0;
  padding: 0;
}

.code-block[data-fullscreen="true"] .hljs {
  height: calc(100vh - 45px);
  padding: 1rem;
  box-sizing: border-box;
}

.code-block[data-fullscreen="true"] .code-block-header {
  padding: 8px 15px;
  background-color: rgba(0, 0, 0, 0.1);
  border-bottom: 1px solid rgba(127, 127, 127, 0.3);
}

.code-block[data-fullscreen="true"] .code-block-header {
  border-left: 4px solid #ff0080;
  transition: border-color 0.5s ease;
}

.code-block[data-fullscreen="true"] .code-block-header:hover {
  border-left-color: #00ffff;
}

.code-fullscreen-button {
  opacity: 0.6;
  transition: transform 0.3s ease, opacity 0.3s ease;
}

.code-fullscreen-button:hover {
  opacity: 1;
  transform: rotate(90deg);
}


.code-block.animate .hljs {
  transition: max-height 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}

.code-arrow {
  transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}


@media (max-width: 768px) {
  .code-block:hover:not([data-fullscreen="true"]) {
    transform: translateY(-2px) scale(1.01);
  }
  
  .code-fullscreen-button {
    right: 20px;
  }
}
(() => {
    const config = {
        defaultTitle: "Code",
        arrowExpandedHTML: '<svg class="code-arrow" width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M8.59 16.59L13.17 12L8.59 7.41L10 6L16 12L10 18L8.59 16.59Z"></path></svg>',
        arrowCollapsedHTML: '<svg class="code-arrow" width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M8.59 16.59L13.17 12L8.59 7.41L10 6L16 12L10 18L8.59 16.59Z"></path></svg>',
        fullscreenHTML: '<svg class="code-fullscreen" width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg>',
        exitFullscreenHTML: '<svg class="code-fullscreen" width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"></path></svg>',
        headerMinWidth: 100,
        collapseAnimation: true,
        animationDuration: 300,
    };
    function addStyles() {
        const styles = `
            .code-block-header {
                display: flex;
                align-items: center;
                padding: 4px 8px;
                cursor: pointer;
                background-color: var(--b3-code-block-bg);
                color: var(--b3-protyle-inline-code-color);
                border-bottom: 1px solid rgba(127, 127, 127, 0.2);
                font-size: 13px;
                font-family: var(--b3-font-family-code);
                position: relative;
            }
  
            .code-block-title {
                margin-left: 8px;
                flex-grow: 1;
                line-height: 1.5;
                overflow: hidden;
                white-space: nowrap;
                text-overflow: ellipsis;
            }
  
            .code-arrow {
                width: 35px;
                height: 35px;
                margin-left: 20px;
                transition: transform 0.2s ease;
            }
  
            .code-fullscreen-button {
                position: absolute;
                right: 50px;
                width: 35px;
                height: 35px;
                display: flex;
                align-items: center;
                justify-content: center;
                cursor: pointer;
                opacity: 0.7;
                transition: all 0.3s ease;
            }
  
            .code-fullscreen-button:hover {
                opacity: 1;
                transform: scale(1.1);
            }
  
            .code-fullscreen {
                width: 24px;
                height: 24px;
            }
  
            .code-block-title:empty:before {
                content: "${config.defaultTitle}";
                opacity: 0.6;
            }
  
            .code-block[data-collapsed="true"] .code-block-header .code-arrow {
                transform: rotate(0deg);
            }
  
            .code-block[data-collapsed="false"] .code-block-header .code-arrow {
                transform: rotate(90deg);
            }
  
            .code-block[data-collapsed="true"] .code-block-header {
                border-bottom: none;
                opacity: 0.8;
            }
  
            .code-block-title:focus {
                outline: none;
                border-bottom: 1px dotted var(--b3-protyle-inline-code-color);
            }
  
            .code-block[data-collapsed="true"] .hljs {
                display: none;
            }
  
            .code-block[data-fullscreen="true"] {
                position: fixed;
                top: 0;
                left: 0;
                width: 100vw;
                height: 100vh;
                z-index: 9999;
                background-color: var(--b3-code-block-bg);
                display: flex;
                flex-direction: column;
                overflow: hidden;
            }
  
            .code-block[data-fullscreen="true"] .hljs {
                flex-grow: 1;
                overflow: auto;
                max-height: none !important;
                display: block !important;
                height: auto !important;
                opacity: 1 !important;
            }
  
            .code-block[data-fullscreen="true"] .code-block-header {
                position: sticky;
                top: 0;
                z-index: 1;
            }
        `;
        const styleEl = document.createElement('style');
        styleEl.innerHTML = styles;
        document.head.appendChild(styleEl);
    }
    function createCodeBlockHeader(codeBlock) {
        if (codeBlock.querySelector('.code-block-header')) {
            return;
        }
        const header = document.createElement('div');
        header.className = 'code-block-header protyle-custom';
  
        header.innerHTML = config.arrowExpandedHTML;
        const title = document.createElement('div');
        title.className = 'code-block-title';
        title.contentEditable = 'true';
        title.spellcheck = false;
  
        const language = getCodeBlockLanguage(codeBlock);
        if (language) {
            title.textContent = language;
        }
  
        header.appendChild(title);
  
        const fullscreenButton = document.createElement('div');
        fullscreenButton.className = 'code-fullscreen-button';
        fullscreenButton.innerHTML = config.fullscreenHTML;
        fullscreenButton.title = "全屏显示代码";
  
        header.appendChild(fullscreenButton);
  
        header.addEventListener('click', (e) => {
            if ((e.target === title && document.activeElement === title) || 
                fullscreenButton.contains(e.target)) {
                return;
            }
            toggleCodeBlock(codeBlock);
        });
  
        title.addEventListener('click', (e) => {
            e.stopPropagation();
        });
  
        title.addEventListener('keydown', (e) => {
            if (e.key === 'Enter') {
                e.preventDefault();
                title.blur();
            }
        });
  
        fullscreenButton.addEventListener('click', (e) => {
            e.stopPropagation();
            toggleFullscreen(codeBlock, fullscreenButton);
        });
  
        codeBlock.insertBefore(header, codeBlock.firstChild);
  
        codeBlock.setAttribute('data-collapsed', 'false');
        codeBlock.setAttribute('data-fullscreen', 'false');
    }
  
    function toggleFullscreen(codeBlock, button) {
        const isFullscreen = codeBlock.getAttribute('data-fullscreen') === 'true';
        const hljs = codeBlock.querySelector('.hljs');
  
        if (isFullscreen) {
            codeBlock.setAttribute('data-fullscreen', 'false');
            button.innerHTML = config.fullscreenHTML;
            button.title = "全屏显示代码";
  
      
            if (codeBlock._wasCollapsedBeforeFullscreen) {
           
                if (hljs) {
                    hljs.style.display = '';
                    hljs.style.maxHeight = '';
                    hljs.style.height = '';
                    hljs.style.opacity = '';
                    hljs.style.overflow = '';
    
             
                    delete hljs.dataset.animating;
                }
  
        
                setTimeout(() => {
                    codeBlock.setAttribute('data-collapsed', 'true');
                    if (hljs) {
                        hljs.style.display = 'none';
                    }
                    delete codeBlock._wasCollapsedBeforeFullscreen;
                }, 50);
            }
  
            if (window._scrollPositionBeforeFullscreen !== undefined) {
                window.scrollTo(0, window._scrollPositionBeforeFullscreen);
                delete window._scrollPositionBeforeFullscreen;
            }
        } else {
            window._scrollPositionBeforeFullscreen = window.scrollY;
  
            if (codeBlock.getAttribute('data-collapsed') === 'true') {
                codeBlock._wasCollapsedBeforeFullscreen = true;
                codeBlock.setAttribute('data-collapsed', 'false');
  
                if (hljs) {
         
                    hljs.style.display = 'block';
                    hljs.style.maxHeight = 'none';
                    hljs.style.height = 'auto';
                    hljs.style.opacity = '1';
                    hljs.style.overflow = 'auto';
    
        
                    if (hljs.dataset.animating === 'true') {
                        delete hljs.dataset.animating;
                    }
                }
            }
  
            codeBlock.setAttribute('data-fullscreen', 'true');
            button.innerHTML = config.exitFullscreenHTML;
            button.title = "退出全屏";
  
            setTimeout(() => {
                if (hljs) {
                    hljs.scrollTop = 0;
                }
            }, 0);
        }
    }
  
    function getCodeBlockLanguage(codeBlock) {
        const hljsElement = codeBlock.querySelector('.hljs');
        if (!hljsElement) return null;
  
        const classes = hljsElement.className.split(' ');
        for (const cls of classes) {
            if (cls !== 'hljs' && cls.length > 0) {
                return cls;
            }
        }
  
        return null;
    }
    function toggleCodeBlock(codeBlock) {
        if (codeBlock.getAttribute('data-fullscreen') === 'true') {
            return;
        }
  
        const isCollapsed = codeBlock.getAttribute('data-collapsed') === 'true';
        const hljs = codeBlock.querySelector('.hljs');
  
        if (!hljs) return;
  
        if (hljs.dataset.animating === 'true') {
            return;
        }
  
        hljs.dataset.animating = 'true';
  
        hljs.style.transition = 'none';
        codeBlock.classList.remove('animate');
  
        if (isCollapsed) {
            hljs.style.display = 'block';
            hljs.style.height = '0px';
            hljs.style.overflow = 'hidden';
            hljs.style.opacity = '0';
  
            const targetHeight = hljs.scrollHeight;
  
            const heightAnimation = hljs.animate([
                { height: '0px', opacity: 0 },
                { height: targetHeight + 'px', opacity: 1 }
            ], {
                duration: 250,
                easing: 'cubic-bezier(0.4, 0.0, 0.2, 1)',
                fill: 'forwards'
            });
  
            heightAnimation.onfinish = () => {
                hljs.style.height = '';
                hljs.style.overflow = '';
                hljs.style.opacity = '';
                hljs.style.transition = '';
  
                delete hljs.dataset.animating;
            };
        } else {
            const startHeight = hljs.offsetHeight;
            hljs.style.height = startHeight + 'px';
            hljs.style.overflow = 'hidden';
  
            const opacityAnimation = hljs.animate([
                { opacity: 1 },
                { opacity: 0 }
            ], {
                duration: 120,
                easing: 'ease-out',
                fill: 'forwards'
            });
  
            setTimeout(() => {
                const heightAnimation = hljs.animate([
                    { height: startHeight + 'px' },
                    { height: '0px' }
                ], {
                    duration: 180, 
                    easing: 'cubic-bezier(0.4, 0.0, 0.2, 1)',
                    fill: 'forwards'
                });
  
                heightAnimation.onfinish = () => {
                    hljs.style.display = 'none';
    
                    hljs.style.height = '';
                    hljs.style.opacity = '';
                    hljs.style.overflow = '';
                    hljs.style.transition = '';
    
                    delete hljs.dataset.animating;
                };
            }, 70);
        }
  
        codeBlock.setAttribute('data-collapsed', !isCollapsed);
    }
    function processCodeBlocks(element) {
        const codeBlocks = element.querySelectorAll('.code-block:not([data-processed="true"])');
        codeBlocks.forEach(codeBlock => {
            createCodeBlockHeader(codeBlock);
            codeBlock.setAttribute('data-processed', 'true');
        });
    }
    function observeCodeBlockAddition(container) {
        const observer = new MutationObserver(mutations => {
            mutations.forEach(mutation => {
                if (mutation.type === 'childList') {
                    mutation.addedNodes.forEach(node => {
                        if (node.nodeType === Node.ELEMENT_NODE) {
                            if (node.classList && node.classList.contains('code-block')) {
                                createCodeBlockHeader(node);
                                node.setAttribute('data-processed', 'true');
                            }
      
                            if (node.querySelectorAll) {
                                processCodeBlocks(node);
                            }
                        }
                    });
                }
            });
        });
  
        observer.observe(container, { 
            childList: true, 
            subtree: true 
        });
  
        return observer;
    }
    function setupKeyboardHandlers() {
        document.addEventListener('keydown', (e) => {
            if (e.key === 'Escape') {
                const fullscreenCodeBlock = document.querySelector('.code-block[data-fullscreen="true"]');
                if (fullscreenCodeBlock) {
                    const fullscreenButton = fullscreenCodeBlock.querySelector('.code-fullscreen-button');
                    if (fullscreenButton) {
                        toggleFullscreen(fullscreenCodeBlock, fullscreenButton);
                        e.preventDefault();
                    }
                }
            }
        });
    }
    function waitForElement(selector) {
        return new Promise(resolve => {
            if (document.querySelector(selector)) {
                return resolve(document.querySelector(selector));
            }
  
            const observer = new MutationObserver(() => {
                if (document.querySelector(selector)) {
                    observer.disconnect();
                    resolve(document.querySelector(selector));
                }
            });
  
            observer.observe(document.body, {
                childList: true,
                subtree: true
            });
        });
    }
    function isMobile() {
        return !!document.getElementById("sidebar");
    }
    async function init() {
        addStyles();
  
        setupKeyboardHandlers();
  
        const container = await waitForElement(isMobile() ? '.protyle-content' : '.layout__center');
  
        processCodeBlocks(container);
  
        observeProtyleAddition(container, protyles => {
            protyles.forEach(protyle => {
                if (!protyle.classList.contains('protyle')) {
                    protyle = protyle.closest('.protyle');
                }
  
                if (protyle) {
                    processCodeBlocks(protyle);
                    observeCodeBlockAddition(protyle);
                }
            });
        });
    }
    function observeProtyleAddition(container, callback) {
        const observer = new MutationObserver(mutations => {
            const protyles = [];
  
            mutations.forEach(mutation => {
                if (mutation.type === 'childList') {
                    mutation.addedNodes.forEach(node => {
                        if (node.nodeType === Node.ELEMENT_NODE) {
                            if (node.classList && 
                                (node.classList.contains('protyle') || 
                                 node.classList.contains('protyle-content'))) {
                                protyles.push(node);
                            }
                        }
                    });
                }
            });
  
            if (protyles.length > 0) {
                callback(protyles);
            }
        });
  
        observer.observe(container, { 
            childList: true, 
            subtree: true 
        });
  
        return observer;
    }
    init();
})();
  • 思源笔记

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

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

    28446 引用 • 119783 回帖
  • 代码片段

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

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

    285 引用 • 1986 回帖
4 操作
Luuxcyzz 在 2025-03-12 16:02:38 更新了该帖
Luuxcyzz 在 2025-03-12 15:48:47 更新了该帖
JeffreyChen 在 2025-03-12 12:08:18 更新了该帖
JeffreyChen 在 2025-03-12 12:07:46 更新了该帖

相关帖子

欢迎来到这里!

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

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

    太宽了哈哈

  • 其他回帖
  • jacob111

    看起来楼主的代码里是有这部分的,但是没生效

    1 回复
  • jacob111

    试了下很不错呀,唯一一点是折叠的时候和展开的时候 code 左边的符号是不是应该有些区别。

    参考了下 confluence,折叠块折叠起来的时候如果有更明显的标志知道这个块是折叠的可能会比较好。

    1 回复
  • Luuxcyzz
    作者

    后面也会慢慢更新自己用的觉得好看的样式,如果有同样需要且常用代码段记录的同学也可以贴一下自己的 css

  • 查看全部回帖

推荐标签 标签

  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 633 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    173 引用 • 1559 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    110 引用 • 153 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖
  • Ubuntu

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

    127 引用 • 169 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    105 引用 • 908 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    33 引用 • 108 回帖
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 2 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 284 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 11 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • 运维

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

    151 引用 • 257 回帖 • 1 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 11 关注
  • Follow
    4 引用 • 13 回帖 • 19 关注
  • sts
    2 引用 • 2 回帖 • 260 关注
  • H2

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

    11 引用 • 54 回帖 • 691 关注
  • 电影

    这是一个不能说的秘密。

    125 引用 • 610 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 545 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 123 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    27 引用 • 7 回帖 • 92 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    51 引用 • 200 回帖 • 2 关注
  • 心情

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

    59 引用 • 369 回帖 • 1 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    126 引用 • 83 回帖 • 1 关注