【问题标题】:Swfobject and MooTools: Dynamic movie heightSwfobject 和 MooTools:动态电影高度
【发布时间】:2010-12-16 02:06:12
【问题描述】:

您好。

我正在为一个 Flash-HTML 混合网站开发一个动画主页,为了标准,我的解决方案被证明是困难的。我不是 Javascript 专业人士,因此不胜感激!

这是破败:

对于 Flash 用户,HTML 页面会加载可变高度的 AS3 Flash 影片,该影片将从 556 像素高开始,并在完成其动画序列后,通过 Actionscript + JavaScript 补间到 250 像素高

要开始这个电影序列 -- (左下) -- 我正在尝试通过 MooTools 设置 Flash 电影的初始高度,所以如果用户没有启用 Flash 或 Javascript ,他们将看到具有替代图像内容和 HTML 内容显示的较短高度的图像区域(右下方)

Element.setStyle 将高度设置得很好,直到 swfObject 运行,此时电影折叠,因为我没有通过 CSS 指定高度。如果用户没有 Flash,则默认为静态图片的高度。

所以这是我的问题:有谁知道如何将高度变量设置为宽度/高度 @ 100% 时动态传递给 swfobject?我是否会无缘无故地尝试使用两个页面高度?

图像序列:
左 - 下面带有 HTML 导航的初始 Flash 影片
右 - 在序列末尾调整大小的电影,下面带有 HTML 导航和内容,看起来与非 Flash 版本相同(静态图像)

alt text http://client.deicreative.com/op/images/twopages.jpg

                                           ^^ should land here for users w/o Flash

<script type="text/javascript">
  <!--
  window.addEvent('domready', function() {
     $('flashContent').setStyle('height', 556); // sets height for initial movie
     $('homeContent').setStyle('display', 'none'); // hides homepage text + photos below
     doSwfObject(); // attempting to start swfObject after setStyle is done
  });
  function resizePage(h) { // to be called from AS3
   var tweenObj = new Fx.Tween('flashContent');
   tweenObj.start('height', h);
  }
  function doSwfObject(){
   var flashvars = {};
   var params = { scale: "noScale" };
      var attributes = { id: "flashContent", name: "flashContent" };
   swfobject.embedSWF("swf/homeMovie.swf", "flashContent", "100%", "100%", "9.0.0", false, flashvars, params, attributes);
   alert(document.getElementById('flashContent').style.height); 
   // alerts & shows correct height, but page collapses after hitting 'ok'
  }
  //-->
</script>

【问题讨论】:

    标签: javascript flash mootools swfobject tween


    【解决方案1】:

    你试过SWFForceSize吗?这是一个 SWFObject 插件,它可以帮助你。即使你不使用它,你也可以看看源代码,看看它们是怎么做的。

    【讨论】:

    • 听起来很像 SwfFit。虽然我不喜欢删除 Doctype,但我会检查一下。感谢您的提示!
    【解决方案2】:

    我认为在此处发布内容有助于我思考问题——这样做之后,答案变得更加清晰。因此,对于以后偶然发现此问题的任何人来说,这是我的解决方案。

    为了将 Flash 影片的高度设置为初始的较高状态,同时为非 Flash 用户保留较短的高度(参见上图),我使用 JavaScript 的方式与在序列完成后补间影片高度的方式相同。结果类似于报纸网站上的下推式广告。

    在 AS3 中,预加载完成后,我告诉 Javascript 对 flash 电影容器的高度进行补间(很明显,很简单——没有预加载代码):

    package {
       import flash.display.MovieClip;
       import flash.display.StageAlign;
       import flash.display.StageScaleMode;
       import flash.external.ExternalInterface;
    
        public class HomeMovie extends MovieClip {
    
           private var stageHeight:uint;
    
           public function HomeMovie(){
    
               this.stage.scaleMode = StageScaleMode.NO_SCALE;
               this.stage.align = StageAlign.TOP_LEFT;
    
               stageHeight = 556;
               // Tell javascript the stage needs resizing.
               if (ExternalInterface.available) {
               ExternalInterface.call("resizePage", stageHeight);
               }
            }
        }
    
    }
    

    在 JavaScript 中(通过 MooTools):

    <script type="text/javascript">
    <!--
    window.addEvent('domready', function() { // hide content on home-page below movie
       $('homeContent').setStyle('display', 'none');
    });
    function resizePage(h) {
        var tweenObj = new Fx.Tween('flashContent', {
            property:'height',
            duration:500,
            transition:Fx.Transitions.Quad.easeOut
        });
        tweenObj.start(h);
    }
    //-->
    </script>
    

    我可能会更进一步,在隐藏主页内容之前检查 Flash,这样如果用户有 Javascript 但没有 Flash,就不会发生这种情况。同样,这一切都是为了标准。

    【讨论】:

      【解决方案3】:

      最简单的解决方案是将 SWF 嵌入到包装器 DIV 中。将 SWF 设置为 wrapper DIV 的 100% 宽度/高度,然后使用 JS 调整 wrapper DIV 的大小,而不是 本身。这样马车就少了。

      由于 SWFObject 2 将目标 DIV 替换为对象,因此您需要在标记中添加一个 div:

      <div id="wrapper">
         <div id="flashcontent"></div>
      </div>
      

      变成

      <div id="wrapper">
         <object id="flashcontent" width="100%" height="100%" (etc.) ></object>
      </div>
      

      【讨论】:

      • 甜蜜。我实际上使用了你的建议来让动画序列在 IE 中工作——因为它忽略了我的 Mootools 调用。混蛋!
      【解决方案4】:

      顺便说一句,在使用 Mootools 时您不需要 SWF 对象,因为它有一个名为 Swiff 的调用,可以完成 SWFObject 所做的所有事情,然后还有一些! :D

      【讨论】:

        猜你喜欢
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多