如果我在我的页面上使用 CSS 缩放,然后将另一个包含动画的网站加载到 iframe 中,我的页面会变得模糊并且动画行为

If I use CSS scale on my page and then load another website containing animation into an iframe, my page gets blurry and animations misbehave

本文关键字:我的 动画 加载 iframe 模糊 网站 包含 CSS 缩放 如果 另一个      更新时间:2023-09-26

我使用jQuery和CSS的组合来运行动画。这很好用,直到我将网站加载到页面上的 iframe 中。

如果加载的网站包含动画,我的动画将停止正常工作。细纹也大部分消失了,我的字体开始看起来非常块状。

我已尽头。我尝试只使用 CSS 动画,这些没有解决任何问题。我尝试使用其他动画库(速度),但没有任何方法可以解决问题。

有没有人经历过这样的事情?

编辑 1:首先,我很抱歉没有提供任何代码。javascript"应用程序"非常大,只有当我将网站加载到包含一些动画的iframe中时,才会出现此问题。

我已经尝试了jQuery的"noConflict"模式(无济于事)。我将构建一个只有一个动画和一个 iframe 的小页面,看看我是否可以复制问题,我将发布完整的代码等。

感谢到目前为止的回复。

编辑 2:我有一些代码可以说明页面外观和感觉的问题,但我没有动画问题的示例。不过,我认为代码演示了问题。

我现在有一些代码。加载页面时,请尝试以下操作:

  1. 按下标有"打开/关闭菜单"的按钮:您应该会看到一个"菜单"幻灯片向右,从淡蓝色封面下方出来。
  2. 再次按下标有"打开/关闭菜单"的按钮:菜单向左滑动并隐藏。
  3. 按下标有"在iframe中加载/卸载网站"的按钮时,请密切注意按钮上的文字。在我的MacBook上,文本变得明显模糊。
  4. 如果您再次按下"在 iframe 中加载/卸载网站"按钮,文本将恢复为锐利。
  5. 如果您在使用标有"将比例从 1.2 切换到 1 并返回"的按钮将比例设置为 1 后重复这些步骤,则不会模糊。

:完成最初的测试页面后,我意识到即使没有使用 jQuery animate 命令,也会发生模糊(即:我删除了 toggleMenu 例程)。

在没有动画的情况下进行测试后,我尝试在没有jQuery的情况下进行测试。瞧,模糊消失了。

所以 :有人听说过这个问题吗?我认为如果没有jQuery,我无法重写当前的"应用程序"。

代码:测试:jQuery和动画

<html class="scaled">
  <head>
    <title>Test: jquery and animation</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <style>
      html {
        display                                            : none;
        -moz-transform-origin                              : 0 0;
        -ms-transform-origin                               : 0 0;
        -o-transform-origin                                : 0 0;
        -webkit-transform-origin                           : 0 0;
        transform-origin                                   : 0 0;
      }
      body {
        font-family                                        : Arial, sans-serif;
      }
      #toggleMenu {
        box-shadow                                         : 5px 5px 12px rgba(25, 25, 25, 0.5);
        position                                           : relative;
        width                                              : 100px;
      }
      #toggleMenu div {
        border-bottom                                      : 1px solid #0276fd;
        width                                              : 100px;
      }
      #menuCover {
        box-shadow                                         : 0 5px 12px rgba(25, 25, 25, 0.5);
        background-color                                   : #0276fd;
        height                                             : 170px;
        position                                           : relative;
        top                                                : -170px;
        width                                              : 100px;
      }
    </style>
  </head>
  <body>
    <script>
      jQuery(document).ready(function() {
        var
          Set_Scale                                        = function(fScale) {
            jQuery('html').css({
              'display'                                    : 'block',
              '-moz-transform'                             : 'scale(' + fScale + ', ' + fScale + ')',
              '-ms-transform'                              : 'scale(' + fScale + ', ' + fScale + ')',
              '-o-transform'                               : 'scale(' + fScale + ', ' + fScale + ')',
              '-webkit-transform'                          : 'scale(' + fScale + ', ' + fScale + ')',
              'transform'                                  : 'scale(' + fScale + ', ' + fScale + ')'
            });
          }
        ;                                                                                          // End of vars
        Set_Scale(1.2);
        this.toggleMenu                                    = function() {
          var
            jqMenu                                         = jQuery('#toggleMenu')
          ;                                                                                        // End of vars
          if (true == jqMenu.hasClass('open')) {
            jqMenu
              .removeClass('open')
              .animate({
                'left'                                     : 0
              }, 250)
            ;
          } else {
            jqMenu
              .addClass('open')
              .animate({
                'left'                                     : '101px'
              }, 250)
            ;
          }
        };
        this.loadWebsite                                   = function() {
          var
            jqiframe                                       = jQuery('iframe')
          ;                                                                                        // End of vars
          if (true == jqiframe.hasClass('website')) {
            jqiframe
              .removeClass('website')
              .attr('src', '')
            ;
          } else {
            jqiframe
              .addClass('website')
              .attr('src', 'http://www.nbc.com')
            ;
          }
        };
        this.toggleScale                                   = function() {
          var
            jqHTML                                         = jQuery('html')
          ;                                                                                        // End of vars
          if (true == jqHTML.hasClass('scaled')) {
            jqHTML.removeClass('scaled');
            Set_Scale(1);
          } else {
            jqHTML.addClass('scaled');
            Set_Scale(1.2);
          }
        };
      });
    </script>
    <input type="button" onclick="toggleMenu()"  value="Open/Close the Menu">
    <input type="button" onclick="loadWebsite()" value="Load/Unload website in iframe">
    <input type="button" onclick="toggleScale()" value="Toggle scale from 1.2 to 1 and back">
    <br/><br/>
    <div id="toggleMenu">
      <div>Menu Item 1</div>
      <div>Menu Item 2</div>
      <div>Menu Item 3</div>
      <div>Menu Item 4</div>
      <div>Menu Item 5</div>
      <div>Menu Item 6</div>
      <div>Menu Item 7</div>
      <div>Menu Item 8</div>
      <div>Menu Item 9</div>
    </div>
    <div id="menuCover"></div>
    <iframe src="" frameborder=""></iframe>
  </body>
</html>

代码:测试:jQuery,但没有动画

<html class="scaled">
  <head>
    <title>Test: jquery but no animation</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <style>
      html {
        display                                            : none;
        -moz-transform-origin                              : 0 0;
        -ms-transform-origin                               : 0 0;
        -o-transform-origin                                : 0 0;
        -webkit-transform-origin                           : 0 0;
        transform-origin                                   : 0 0;
      }
      body {
        font-family                                        : Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <script>
      jQuery(document).ready(function() {
        var
          Set_Scale                                        = function(fScale) {
            jQuery('html').css({
              'display'                                    : 'block',
              '-moz-transform'                             : 'scale(' + fScale + ', ' + fScale + ')',
              '-ms-transform'                              : 'scale(' + fScale + ', ' + fScale + ')',
              '-o-transform'                               : 'scale(' + fScale + ', ' + fScale + ')',
              '-webkit-transform'                          : 'scale(' + fScale + ', ' + fScale + ')',
              'transform'                                  : 'scale(' + fScale + ', ' + fScale + ')'
            });
          }
        ;                                                                                          // End of vars
        Set_Scale(1.2);
        this.loadWebsite                                   = function() {
          var
            jqiframe                                       = jQuery('iframe')
          ;                                                                                        // End of vars
          if (true == jqiframe.hasClass('website')) {
            jqiframe
              .removeClass('website')
              .attr('src', '')
            ;
          } else {
            jqiframe
              .addClass('website')
              .attr('src', 'http://www.nbc.com')
            ;
          }
        };
        this.toggleScale                                   = function() {
          var
            jqHTML                                         = jQuery('html')
          ;                                                                                        // End of vars
          if (true == jqHTML.hasClass('scaled')) {
            jqHTML.removeClass('scaled');
            Set_Scale(1);
          } else {
            jqHTML.addClass('scaled');
            Set_Scale(1.2);
          }
        };
      });
    </script>
    <input type="button" onclick="loadWebsite()" value="Load/Unload website in iframe">
    <input type="button" onclick="toggleScale()" value="Toggle scale from 1.2 to 1 and back">
    <br/><br/>
    <iframe src="" frameborder=""></iframe>
  </body>
</html>

代码:测试:没有jQuery和动画

<html id="elementHTML" class="scaled">
  <head>
    <title>Test: no jquery and no animation</title>
    <style>
      html {
        -moz-transform-origin                              : 0 0;
        -ms-transform-origin                               : 0 0;
        -o-transform-origin                                : 0 0;
        -webkit-transform-origin                           : 0 0;
        transform-origin                                   : 0 0;
        -moz-transform                                     : scale(1, 1);
        -ms-transform                                      : scale(1, 1);
        -o-transform                                       : scale(1, 1);
        -webkit-transform                                  : scale(1, 1);
      }
      html.scaled {
        -moz-transform                                     : scale(1.2, 1.2);
        -ms-transform                                      : scale(1.2, 1.2);
        -o-transform                                       : scale(1.2, 1.2);
        -webkit-transform                                  : scale(1.2, 1.2);
      }
      body {
        font-family                                        : Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <script>
      loadWebsite                                          = function() {
        if ('website' == document.getElementById('elementIFRAME').className) {
          document.getElementById('elementIFRAME').className = '';
          document.getElementById('elementIFRAME').src       = '';
        } else {
          document.getElementById('elementIFRAME').className = 'website';
          document.getElementById('elementIFRAME').src       = 'http://www.nbc.com';
        }
      };
      toggleScale                                          = function() {
        if ('scaled' == document.getElementById('elementHTML').className) {
          document.getElementById('elementHTML').className = '';
        } else {
          document.getElementById('elementHTML').className = 'scaled';
        }
      };
    </script>
    <input type="button" onclick="loadWebsite()" value="Load/Unload website in iframe">
    <input type="button" onclick="toggleScale()" value="Toggle scale from 1.2 to 1 and back">
    <br/><br/>
    <iframe id='elementIFRAME' src="" frameborder=""></iframe>
  </body>
</html>

啪!
布鲁斯。

只是预感,你可能想看看jQuery的"noConflict"模式。 http://api.jquery.com/jquery.noconflict/