找回密码
 立即注册

QQ登录

只需一步,快速开始

Ellia.Duan SpreadJS 开发认证
超级版主   /  发表于:2023-2-28 15:27  /   查看:1708  /  回复:0
本帖最后由 Ellia.Duan 于 2023-2-28 15:27 编辑

js有一个全屏API:dom.requestFullscreen(),当小伙伴们尝试在一些场景中将designer组件全屏化后,发现有一部分弹窗(选择颜色弹窗)不再出现,这是为什么呢?
首先打开一个designer组件,我们 观察下颜色选择器的dom结构
image.png221154479.png
发现其与designer的dom节点”gc-designer-container“共同在body下,并不是 包含关系。
对话框被设计为附加到 document body 而不是designer host(gc-designer-container)。所以,如果仅仅是让designer host全屏显示,它就会覆盖主体中的所有其他元素包括对话框。
那么此时如果将designer的dom节点”gc-designer-container“全屏,就会发现颜色选择器将不出现在屏幕中 ,当退出全屏模式后,发现可以正常显示。
  1. document.getElementById("gc-designer-container").requestFullscreen();
复制代码

为此,解决方案是需要将弹窗的dom放置在全屏dom容器内。
这里有两个思路,一个是将designer的dom节点、颜色选择器的dom节点,这两个节点的共同父节点全屏,即将body元素全屏;
第二个思路是将designer组件放置在iframe容器中,下面分别对这两种方案进行介绍

方案一:
  1. <body unselectable="on" id="wrap">
  2. <button id="btn" onclick="btn()">全屏</button>
  3. <div id="gc-designer-container">
  4. </div>

  5. <script type="text/javascript">
  6.     var designer
  7.     window.onload = function () {
  8.         designer = new GC.Spread.Sheets.Designer.Designer("gc-designer-container");
  9.         var spread = designer.getWorkbook();
  10.         var sheet = spread.getActiveSheet();

  11.         var cstyle = sheet.getDefaultStyle();
  12.         cstyle.themeFont = null;
  13.         cstyle.font = "24px Meiryo";
  14.         sheet.setDefaultStyle(cstyle);
  15.     }

  16.     function btn() {

  17.         document.getElementById("wrap").requestFullscreen();
  18.         setTimeout(() => {
  19.             const canvas = document.getElementById('gc-designer-container');
  20.             if (document.fullscreenElement) {
  21.                 console.log(111)
  22.                 canvas.style.height = window.screen.height + 'px';
  23.                 canvas.style.width = window.screen.width + 'px';
  24.             } else {
  25.                 console.log(222)
  26.                 canvas.style.height = '800px';
  27.                 canvas.style.width = '80%';
  28.             }
  29.         }, 100)
  30.     }
  31. </script>
  32. </body>
复制代码
方案二:
  1. <body unselectable="on" id="wrap">
  2.     <button id="btn" onclick="btn()">全屏</button>
  3.     <iframe id="iframe-one" width="100%" height="100%" scrolling="no" src="./index.html"></iframe>

  4.     <script type="text/javascript">
  5.         function btn() {
  6.             let iframe = document.getElementById("iframe-one");
  7.             iframe.requestFullscreen();

  8.         }
  9.     </script>
  10. </body>
复制代码
在body中创建iframe元素,然后索引指向包含designer组件的index.html ,然后对iframe元素全屏
接下来看下index .html
  1. <body>
  2. <div id="gc-designer-container"></div>


  3. <script type="text/javascript">


  4. window.onload = function () {
  5. var canvas = document.getElementById("gc-designer-container");
  6. canvas.style.height = window.screen.height + 'px';
  7. designer = new GC.Spread.Sheets.Designer.Designer("gc-designer-container");
  8. var spread = designer.getWorkbook();
  9. var sheet = spread.getActiveSheet();
  10. }

  11. </script>
  12. </body>
复制代码


在index.html中完成了designer初始化工作,并且重新设置了高度。


至此,两个方案就介绍完成了。

全屏方案.zip

2.67 KB, 下载次数: 212

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部