富文本编辑器CKEditor4简单使用-08(段落首行缩进插件 + 处理粘贴 Microsoft Word 中的内容后保持原始内容格式(包括首行缩进))

news2024/11/16 11:41:09

富文本编辑器CKEditor4简单使用-08(段落首行缩进插件 + 处理粘贴 Microsoft Word 中的内容后保持原始内容格式(包括首行缩进))

  • 1. 缩进,特殊方式处理——修改原工具栏里的增加缩进量
  • 2 缩进,插件处理
    • 2.1 下载段落插件 textindent
    • 2.2 使用段落插件 textindent
    • 2.3 修改textindent插件中的plugins.js文件
      • 2.3.1 修改插件按钮提示信息
      • 2.3.2 修改插件里的缩进偏移量和缩进单位
    • 2.4 开启textindent插件 并 看效果
      • 2.4.1 开启插件
      • 2.4.2 段落首行缩进测试
      • 2.4.3 来源word粘贴(保留缩进格式测试)
    • 2.5 附核心代码
    • 2.6 关于安装插件的其他详细内容
  • 3. 缩进,插件处理——优化(简直完美)
    • 3.1 如果不优化存在的问题
    • 3.2 修改插件的plugin.js——设置缩进2个字体空间
      • 3.2.1 直接换单位(rem)
      • 3.2.2 更改源码,计算缩进空间
        • 3.2.2.1 更改位置
        • 3.2.2.2 看效果
        • 3.2.2.3 核心代码
        • 3.2.2.4 更改后完整 plugin.js 代码
        • 3.2.2.5 优化后完整 plugin.js 代码
  • 4. 下载项目
  • 5. word里有图片的问题(待解决)
    • 4.1 问题描述
    • 5.1 查看自己的CKEditor4版本号
    • 5.2 关于Paste from Word插件
      • 5.2.1 下载Paste from Word插件
      • 5.3 解压所有插件

1. 缩进,特殊方式处理——修改原工具栏里的增加缩进量

  • 请看上篇文章,如下:

    富文本编辑器CKEditor4简单使用-07(处理浏览器不支持通过工具栏粘贴问题 和 首行缩进的问题).

2 缩进,插件处理

2.1 下载段落插件 textindent

  • 下载段落缩进插件,如下:

    https://ckeditor.com/cke4/addon/textindent.
    在这里插入图片描述

  • 备注:该插件没有依赖插件,所以只需要下载该一个插件即可使用!

2.2 使用段落插件 textindent

  • 下载之后解压,然后放在plugins目录下,如下:
    在这里插入图片描述

2.3 修改textindent插件中的plugins.js文件

2.3.1 修改插件按钮提示信息

  • 这个看自己,因为提示信息是一串英文的,所以这里改成明了的汉字,如下:
    在这里插入图片描述

2.3.2 修改插件里的缩进偏移量和缩进单位

  • 如下:
    在这里插入图片描述
    在这里插入图片描述

2.4 开启textindent插件 并 看效果

2.4.1 开启插件

  • 开启插件配置如下:
    在这里插入图片描述
    在这里插入图片描述

2.4.2 段落首行缩进测试

  • 看效果

  • 如果不修改缩进偏移量和缩进单位的话,原本效果如下
    在这里插入图片描述

  • 修改缩进偏移量和缩进单位后的效果,如下:
    在这里插入图片描述

2.4.3 来源word粘贴(保留缩进格式测试)

  • 使用这个插件之后,从word里复制出的内容再粘贴格式保持不变(包括首行缩进格式),如下:
    在这里插入图片描述
    在这里插入图片描述
  • 通过工具栏的按钮粘贴也是一样的可以实现缩进效果,但是不一样的是这种缩进不是缩进的两个字符(2em),而是缩进的两个字体的空间大小(可以理解是保持原文格式不变了)。
  • 注意前提:一定要开启textindent插件,否则首行缩进格式丢失!

2.5 附核心代码

  • text.html,如下:
    <!doctype html>
    <html lang="en">
    
    <head>
      <meta charset="utf-8">
      <meta name="robots" content="noindex, nofollow">
      <title>Setting text part language</title>
      <script src="../ckeditor/ckeditor.js"></script>
    </head>
    
    <body>
      <textarea cols="80" id="editor2" name="editor2" rows="10"></textarea>
    
      <script>
        var editor = CKEDITOR.replace('editor2', {
          
        });
    
        editor.on("beforeCommandExec", function (event) {
            // 显示粘贴按钮的粘贴对话框并右键单击粘贴
            if (event.data.name == "paste") {
                event.editor._.forcePasteDialog = true;
            }
            // 不要显示Ctrl+Shift+V的粘贴对话框
            if (event.data.name == "pastetext" && event.data.commandData.from == "keystrokeHandler") {
                event.cancel();
            }
        });
    
      </script>
    </body>
    
    </html>
    
  • config.js,如下:
    CKEDITOR.editorConfig = function( config ) {
    
    	// 启用皮肤
    	config.skin = 'office2013';
    	
    	// textindent-首行缩进插件
    	config.extraPlugins = 'textindent';
    
    };
    
    

2.6 关于安装插件的其他详细内容

  • 可参考下面的文章:
    富文本编辑器CKEditor4简单使用-02(常用插件安装及使用).

3. 缩进,插件处理——优化(简直完美)

3.1 如果不优化存在的问题

  • 上面我们把缩进量和单位配置成2em,看着测试没什么问题,但是我们通过复制粘贴发现,复制粘贴后缩进保留的还是原文的px,所以我们上面测试看着没问题,那是因为字体刚刚好,如果我们把字体调大或者调小再次点击缩进按钮,问题就暴露出来了,如下:
    在这里插入图片描述
  • 所以,它是一个动态的,我们要做的是如何实现缩进两个字体(根据原文字体的大小缩进),所以我们要设置成动态的缩进2个字体的空间,也就是说:
    当设置为2个字体的空间时,即首行缩进的距离为2个字体大小的距离。例如,如果你的文字大小为16px,那么缩进的距离就是32px。

3.2 修改插件的plugin.js——设置缩进2个字体空间

3.2.1 直接换单位(rem)

  • 但是这个有个问题,如果正文字体大小都一样可以,如果第二段字体大小和第一段字体大小不一样的话,效果不是很理想(这时第一段可以实现效果,但是第二段不行)如下:
    在这里插入图片描述
    在这里插入图片描述

  • 关于emrem
    在 CSS 中,em 和 rem 都是相对长度单位,其中 em 是相对于父元素的字体大小,而 rem 是相对于根元素的字体大小(即 html 元素的字体大小)。具体来说:

    • em:表示相对于当前元素的字体大小。例如,如果当前元素的字体大小为 16px,那么 1em 就等于 16px。
    • rem:表示相对于根元素(即 html 元素)的字体大小。例如,如果根元素的字体大小为 16px,那么 1rem 就等于 16px。
      由于 rem 单位是相对于根元素的字体大小,因此在整个页面中都是一致的。这使得使用 rem 单位更加方便和灵活,可以避免在多层嵌套中计算父元素字体大小的复杂性。
  • 如果字体不一致的话,上面rem可能还是不能满足,这就需要计算了,如何实现,请继续……

3.2.2 更改源码,计算缩进空间

3.2.2.1 更改位置
  • 如下:
    在这里插入图片描述
    在这里插入图片描述
3.2.2.2 看效果
  • 如下:
    在这里插入图片描述

    在这里插入图片描述

3.2.2.3 核心代码
  • 添加的核心代码如下:

    // 第一个是span,获取span标签
    var child_span = node.$.firstElementChild; 
    // console.log(child_span);
    if(child_span!=null){
        // 获取span里的 font-size属性的值
        var spanFontSize = child_span.style.fontSize;
        indentation = 2 * parseFloat(spanFontSize) + "px"; // 更改缩进量和缩进单位
        // console.log(spanFontSize);
        // console.log(indentation);
    }
    
3.2.2.4 更改后完整 plugin.js 代码
  • 如下:
    CKEDITOR.plugins.add( 'textindent', {
        icons: 'textindent',
        availableLangs: {'pt-br':1, 'en':1},
        lang: 'pt-br, en',
    	init: function( editor ) {
    
            var indentation = editor.config.indentation;
            var indentationKey = editor.config.indentationKey;
    
            if(typeof(indentation) == 'undefined')
                indentation = '2em';
            if(typeof(indentationKey) == 'undefined')
                indentationKey = 'tab';
    
            if(editor.ui.addButton){
    
                editor.ui.addButton( 'textindent', {
                    // label: editor.lang.textindent.labelName,
                    label: '首行缩进',
                    command: 'ident-paragraph',
                });
            }
    
            if( indentationKey !== false){
    
                editor.on('key', function(ev) {
                    if(ev.data.domEvent.$.key.toLowerCase() === indentationKey.toLowerCase().trim() || ev.data.keyCode === indentationKey){
                        editor.execCommand('ident-paragraph');
                        ev.cancel();  
                    }
                });
            }
            
            editor.on( 'selectionChange', function()
                {
                    var style_textindente = new CKEDITOR.style({
                            element: 'p',
                            styles: { 'text-indent': indentation },
                            overrides: [{
                                element: 'text-indent', attributes: { 'size': '0'}
                            }]
                        });
    
                    if( style_textindente.checkActive(editor.elementPath(), editor) )
                       editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_ON);
                    else
                       editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_OFF);
                    
            });
    
            editor.addCommand("ident-paragraph", {
                allowedContent: 'p{text-indent}',
                requiredContent: 'p',
                exec: function(evt) {
    
                    var range = editor.getSelection().getRanges()[0]; 
    
                    var walker = new CKEDITOR.dom.walker( range ),
                    node;
    
                    var state = editor.getCommand('ident-paragraph').state;
    
                    while ( ( node = walker.next() ) ) {
                        if ( node.type == CKEDITOR.NODE_ELEMENT ) {
                            if(node.getName() === "p"){
                                // console.log(node);
                                    editor.fire('saveSnapshot');
                                    if( state == CKEDITOR.TRISTATE_ON){
                                        node.removeStyle("text-indent");
                                        editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_OFF);
                                    }
                                    else{
                                        // 第一个是span,获取span标签
                                        var child_span = node.$.firstElementChild; 
                                        console.log(child_span);
                                        if(child_span!=null){
                                            // 获取span里的 font-size属性的值
                                            var spanFontSize = child_span.style.fontSize;
                                            indentation = 2 * parseFloat(spanFontSize) + "px";  // 更改缩进量和缩进单位
                                        }
                                        node.setStyle( "text-indent", indentation );
                                        editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_ON);
                                    }
                            }
                        }
                    }
    
                    if(node === null){
                        
                        node = editor.getSelection().getStartElement().getAscendant('p', true);
    
                        console.log(node);
                       
                        // var outerHtml = node.getOuterHtml();
                        // console.log(outerHtml);
    
                        // 获取 childNodes
                        // var childNodes = node.$.childNodes; 
                        // console.log(childNodes);
    
                        // 第一个是span,获取span标签
                        var child_span = node.$.firstElementChild; 
                        // console.log(child_span);
                        if(child_span!=null){
                            // 获取span里的 font-size属性的值
                            var spanFontSize = child_span.style.fontSize;
                            indentation = 2 * parseFloat(spanFontSize) + "px"; // 更改缩进量和缩进单位
                            // console.log(spanFontSize);
                            // console.log(indentation);
                        }
                        
                        editor.fire('saveSnapshot');
    
                        if( state == CKEDITOR.TRISTATE_ON){
                            node.removeStyle("text-indent");
                            editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_OFF);
                        }
                        else{
                            node.setStyle( "text-indent", indentation );
                            editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_ON);
                        }
                    }
                    
                }
            });
    	}
    
    });
    
    
3.2.2.5 优化后完整 plugin.js 代码
  • 上述代码修改2处,并且原本也有重复代码,优化后如下:
    CKEDITOR.plugins.add( 'textindent', {
        icons: 'textindent',
        availableLangs: {'pt-br':1, 'en':1},
        lang: 'pt-br, en',
    	init: function( editor ) {
    
            var indentation = editor.config.indentation;
            var indentationKey = editor.config.indentationKey;
    
            if(typeof(indentation) == 'undefined')
                indentation = '2em';
            if(typeof(indentationKey) == 'undefined')
                indentationKey = 'tab';
    
            if(editor.ui.addButton){
    
                editor.ui.addButton( 'textindent', {
                    // label: editor.lang.textindent.labelName,
                    label: '首行缩进',
                    command: 'ident-paragraph',
                });
            }
    
            if( indentationKey !== false){
    
                editor.on('key', function(ev) {
                    if(ev.data.domEvent.$.key.toLowerCase() === indentationKey.toLowerCase().trim() || ev.data.keyCode === indentationKey){
                        editor.execCommand('ident-paragraph');
                        ev.cancel();  
                    }
                });
            }
            
            editor.on( 'selectionChange', function()
                {
                    var style_textindente = new CKEDITOR.style({
                            element: 'p',
                            styles: { 'text-indent': indentation },
                            overrides: [{
                                element: 'text-indent', attributes: { 'size': '0'}
                            }]
                        });
    
                    if( style_textindente.checkActive(editor.elementPath(), editor) )
                       editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_ON);
                    else
                       editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_OFF);
                    
            });
    
            editor.addCommand("ident-paragraph", {
                allowedContent: 'p{text-indent}',
                requiredContent: 'p',
                exec: function(evt) {
    
                    var range = editor.getSelection().getRanges()[0]; 
    
                    var walker = new CKEDITOR.dom.walker( range ),
                    node;
    
                    var state = editor.getCommand('ident-paragraph').state;
    
                    while ( ( node = walker.next() ) ) {
                        if ( node.type == CKEDITOR.NODE_ELEMENT ) {
                            if(node.getName() === "p"){
                                calculateAndDoFirstLineIndent();
                            }
                        }
                    }
    
                    if(node === null){
                        node = editor.getSelection().getStartElement().getAscendant('p', true);
                        calculateAndDoFirstLineIndent();
                    }
    
                    /**
                     * 计算并处理首行缩进
                     */
                    function calculateAndDoFirstLineIndent(){
                        editor.fire('saveSnapshot');
                        if( state == CKEDITOR.TRISTATE_ON){
                            node.removeStyle("text-indent");
                            editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_OFF);
                        }
                        else{
                            // 第一个是span,获取span标签
                            var child_span = node.$.firstElementChild; 
                            if(child_span!=null){
                                // 获取span里的 font-size属性的值
                                var spanFontSize = child_span.style.fontSize;
                                // 更改缩进量和缩进单位(缩进2个字体的空间)
                                indentation = 2 * parseFloat(spanFontSize) + "px"; 
                            }
                            node.setStyle( "text-indent", indentation );
                            editor.getCommand('ident-paragraph').setState(CKEDITOR.TRISTATE_ON);
                        }
                    }
                    
                }
            });
    	}
    
    });
    
    

4. 下载项目

  • 如果不想下载官网项目,下载后还需要单独下载插件,可直接从下面链接下载,包括常用的插件,项目拿来即用,如下:

    ckeditor4(4.22.1-含上传图片、快速表格、首行缩进等插件).

5. word里有图片的问题(待解决)

4.1 问题描述

  • 如果粘贴的word里有图片,复制之后图片不展示,如下:
    在这里插入图片描述

5.1 查看自己的CKEditor4版本号

  • 后续下载插件有的会根据CKEditor4的版本下载对应插件的版本号,所以先确定一下自己的版本号,在浏览器的控制台中输入命令即可查询,查询版本号的方式如下:
    CKEDITORCKEDITOR.version
    
    在这里插入图片描述

5.2 关于Paste from Word插件

5.2.1 下载Paste from Word插件

  • 下载地址:
    https://ckeditor.com/cke4/addon/pastefromword.
  • 下载所需的所有依赖插件,如下:
    在这里插入图片描述
  • 关于Paste from Word插件,如下:
    在这里插入图片描述

5.3 解压所有插件

  • 解压所有插件并放到plugins目录下(已有的插件不用替换),如下
    在这里插入图片描述
  • 问题是:此插件无论怎么配置都不生效,把默认插件换成下载的插件之后重新配置还是不生效,不知道此插件啥情况!!!
  • 参考官网配置如下:
    https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-pasteFromWordRemoveFontStyles.
  • 感兴趣的、用过的朋友可以交流一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1643318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java基础】Maven的生命周期(clean+site+default)

1. 前言 在 Maven 出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试及部署&#xff0c;但由于没有统一的规范&#xff0c;不同公司甚至不同项目之间的构建的方式都不尽相同。 Maven 从大量项目…

ES集群数据备份与迁移

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、文章涉及概念讲解二、操作步骤1.创建 snapshot repository操作主机hadoop1分别操作从机hadoop2和hadoop3 2. 查看仓库信息3. 备份索引&#xff0c;生成快照…

k8s Dashboard 运维维护记录

k8s Dashboard 运维维护记录 k8s Dashboard 运维维护记录 Q1&#xff1a;需要使用firefox浏览器访问 提示了证书错误NET::ERR_CERT_INVALID&#xff0c;原因是由于物理机的浏览器证书不可用 需要注意的是&#xff0c;若提示“连接不安全”的警告时&#xff0c;点击“高级”…

2024新蓝海项目 零门槛高收益持续稳定 纯手机操控 单日盈利3000 新手当日入门

这个项目具有极高的稳定性&#xff01;通过积累的里程积分&#xff0c;我们可以以较低的成本获取机票。然后&#xff0c;我们以远低于官方网站的价格出售这些机票&#xff0c;从而获得利润。随着我们经营的时间增长&#xff0c;我们积累的客户群体也会越来越大。 项目 地 址 …

游戏AI的智能化:机器学习在虚拟生命中的应用

文章目录 写在前面游戏AI的智能化&#xff1a;机器学习在虚拟生命中的应用游戏内容的自动化创作&#xff1a;机器学习的革新性应用玩家体验的个性化优化&#xff1a;机器学习的定制化力量未来展望&#xff1a;机器学习塑造游戏行业新纪元游戏AI的智能化发展自动化内容生成的革命…

什么是脏读?幻读?不可重复读?

脏读(Drity Read)&#xff1a;某个事务 A 已更新一份数据&#xff0c;另一个事务 B 在此时读取了同一份数据&#xff0c;由于某些原因&#xff0c;事务 A 回滚&#xff0c;而事务B读取到事务 A 回滚前的数据。 例子:小明读取到小红提交的100数据.但是小红异常回滚了数据,100变…

【前端学习——正则】

https://www.bilibili.com/video/BV1da4y1p7iZ/?spm_id_from333.337.search-card.all.click&vd_source5cef5968d539682b683e7d01b00ad01b 学习网站 https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md

CCPC训练赛题解补题

B. Memory Problem - B - Codeforces&#xff08;原题出处点击这里&#xff09; 题意&#xff1a;根据题目中给出的求和公式&#xff0c;将输入的数据进行判断&#xff0c;输出”“或”-“或”0“&#xff1b;因为范围特别大&#xff0c;精度特别高&#xff0c;所以循环遍历的…

mac监听 linux服务器可视化(Grafana+Promethus+Node_exporter)

Grafana和promethus(普罗米修斯)的安装和使用 监控系统的Prometheus类似于一个注册中心&#xff0c;我们可以只需要配置一个Prometheus,而在其他服务器&#xff0c;只需要安装node_exporter,它们的数据流转就是通过exporter采集数据信息&#xff0c;然后告诉prometheus它的位置…

leetCode68. 文本左右对齐

基本思路&#xff1a; leetCode68. 文本左右对齐 代码 class Solution { public:vector<string> fullJustify(vector<string>& words, int maxWidth) {vector<string> res;for(int i 0; i < words.size(); i){ // 枚举有多少个单词int j i 1; //…

Springboot+vue基于协同过滤算法的电商系统

项目由maven管理依赖&#xff0c;mybatis&#xff08;plue&#xff09;与数据库交互&#xff0c;一共14张表&#xff0c;功能都经过测试无问题&#xff0c;需要可在最下方扫码联系我。&#xff08;有文档&#xff0c;调试&#xff0c;讲解可加购&#xff09; 商品推荐板块基于…

如何选购骨传导耳机?精选五大拔尖宝藏骨传导耳机,闭眼入也不踩雷!

尽管目前市面上的骨传导耳机热度非常高&#xff0c;一度成为当下最热门的耳机款式&#xff0c;但作为有着资深工作经验的数码测评师&#xff0c;我仍然要提醒大家&#xff1a;在选择骨传导耳机的时候&#xff0c;不要盲目选择网红品牌&#xff0c;因为市场上的许多骨传导耳机过…

【Python基础】进程

文章目录 [toc]程序与进程的区别与联系同步任务示例 并行任务示例进程调度的“随机性” 进程属性与方法process_object.start()方法process_object.join()方法process_object.daemon属性没有设置守护进程的情况设置守护进程的情况 process_object.current_process()方法 进程通…

MySql主从复制(多主多从)

多主多从 序言前期准备工作创建主机和从机的配置文件和数据存储目录配置master1配置文件配置master2配置文件配置slave1配置文件配置slave2配置文件docker-compose-mysql.yml启动文件启动master1启动master2两个主机分别创建用户两个主机分别刷新权限查看两个主机binlog状态mas…

UDP报头结构 和注意事项

UDP协议 UDP这个协议的学习 ,最只要学习的就是报文格式 UDP数据报 UDP报头 UDP载荷 UDP协议端口格式 报头由4个部分组成 : 源端口号 、目的端口号、UDP长度、UDP校验和 UDP长度描述了整个UDP数据报&#xff0c;占多少个字节 通过UDP长度 就可以知道&#xff0c;当前载荷一…

第3章 内存管理(2)

3.2虚拟内存管理 3.2.1 传统内存和虚拟内存对比 传统内存虚拟内存一次性:全部装入内存才能运行多次性:仅装入当前需要的数据驻留性:作业装入内存,运行时一直驻留内存对换性:暂时用不到的数据换出外存虚拟性:逻辑上扩充内存作业过大无法装入,作业过多也无法装入需要添加请求调…

3.10设计模式——Template Method 模版方法模式(行为型)

意图 定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;Template Method 使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 结构 AbstractClass&#xff08;抽象类&#xff09;定义抽象的原语操作&#xff0c;具体的子类将重定…

贪吃蛇(下)游戏的实现

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 文章目录 前言一.蛇和食物的打印二.游戏的运行逻辑三.结束游戏 &#xff08;善后工作&#xff09;四.游戏的测…

MacBook Pro 原生安装 Ubuntu 24.04 ARM 版

趁着休假整理家里闲置的设备&#xff0c;看到了一台许久不用的 M2 芯片的 MacBook Pro&#xff0c;想着或许应该把它改造成 ARMv64 的 CI/CD 构建机&#xff0c;于是就有了这篇文章。 本篇文章适用于 M1、M2 全系列的设备&#xff0c;包括&#xff1a;MacBook Air、MacBook Pr…

JVM笔记2--垃圾收集算法

1、如何确认哪些对象“已死” 在上一篇文章中介绍到Java内存运行时的各个区域。其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生&#xff0c;随线程而灭&#xff0c;栈中的栈帧随着方法的进入和退出而有条不紊的执行着入栈和出栈操作。每个栈帧中分配多少内存基本上…