JavaScriptの最近のブログ記事
Flashと関係なく、一般的なhtmlサイトでウィンドウサイズによってエリアの大きさを変えるには、下のサンプルを利用して高さを規定し、JSでクラス名を置き換えるか、JSでstuleのそれぞれの値を変えることでも実現できます。
それほど難しいものではありませんが、今後コピペで使うために載せておきます。
※swfobjectは2を利用
<script type="text/javascript">
function getMyH(){
var my_h = getBrowserHeight();
if(my_h<=700){
my_h = 650;
} else {
my_h = 780;
}
return my_h;
}
function getBrowserHeight() {
if ( window.innerHeight ) {
return window.innerHeight;
}
else if ( document.documentElement && document.documentElement.clientHeight != 0 ) {
return document.documentElement.clientHeight;
}
else if ( document.body ) {
return document.body.clientHeight;
}
return 780;
}
var swf_h = getMyH();
swfobject.embedSWF('file.swf', 'flasharea', '100%', swf_h, '9');
</script>
単純にMT内で月別リストを作るのは、
<MTIfArchiveTypeEnabled archivetype=”Monthly”>
<MTArchiveList archivetype=”Monthly”>
などを使って作ればいいだけの話で、初期状態でもサイドバー内などに設置されているので、どうと言うことはありません。
が、各カテゴリのページなどにも月別リストを入れたい場合、同じように入れると、そのカテゴリ内の月別リストになってしまい、全ての記事が反映されなくなってしまいます。同様に、月別アーカイブのページにカテゴリリストを入れる場合なども、そのアーカイブ内に含まれる記事のみしかリストに反映されないため、下の方法が有効です。
そこで、月別リストは、インデックステンプレートとして外部Javascript化して生成し、それを必要とする各ファイルでロードしてdocument.writeさせます。これなら簡単に全記事の反映された月別リスト/カテゴリリスト等が入れられます。
下のサンプルは月別リストをインデックステンプレートで作成した場合です。
インデックステンプレート==========
var htmllist = '<ul id="sidearchive">';
<MTIfArchiveTypeEnabled archive_type="Monthly">
<MTArchiveList archive_type="Monthly">
htmllist += '<li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$>(<$MTArchiveCount$>)</a></li>';
</MTArchiveList>
</MTIfArchiveTypeEnabled>
htmllist += '</ul>';
document.write(htmllist);
画面解像度は320×480なので、コンテンツの幅が320と480の両方に対応して作ります。
表示の際の幅はmeta内のviewportで設定しますが、画面閲覧中に縦横を切り替えた場合の画像サイズの切替を行いたくていろいろ調べました。
下のサンプルでは、SitePoint内の記事を参考に、div#mainimage内のimg1.jpgの幅を、縦の場合は320×160、横の場合、480×240で表示します。
その他レイアウト等もCSS内に同様に記述することで、縦横で分岐することが出来ます。
今回のキーポイントは、iPhoneの表示角度を利用するときに使う、window.orientationです。window.orientationchangeで、縦横切替の際のトリガーになります。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:spry="http://ns.adobe.com/spry">
<head>
<meta name="viewport" content="initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />
<script type="text/javascript">
window.addEventListener('load', setOrientation, false);
window.addEventListener('orientationchange', setOrientation, false);
function setOrientation() {
var orient = Math.abs(window.orientation) === 90 ? 'landscape' : 'portrait';
var cl = document.body.className;
cl = cl.replace(/portrait|landscape/, orient);
document.body.className = cl;
}
</script>
<style>
body.portrait #main_image img{
width:320px;
height:160px;
}
body.landscape #main_image img{
width:480px;
height:240px;
}
</style>
</head>
<body class="portrait">
<div id="main_image">
<img src="img1.jpg" width="320" height="160" />
</div>
</body>
参考記事
Sitepoint : New Articles, Fresh Thinking for Web Developers and Designers
http://articles.sitepoint.com/print/iphone-development-12-tips
FlashからJavaScriptへは、AS2でもよく使ったExternalInterfaceを使い、JavaScriptからCSSへは、document.getElementByIdを使ってdivのID名を探し、.className="クラス名"でクラス名を設定します。
下のサンプルでは、#idname内のbackgroundを3色の中から変更できる仕様です。
//Flash内AS3.0
import flash.external.ExternalInterface;
colorID = no;
var result:uint = ExternalInterface.call("callJS", no);
//JavaScript
function callJS(str) {
switch(str){
case 1: document.getElementById("idname").className = "color1";break;
case 2: document.getElementById("idname").className = "color2";break;
case 3: document.getElementById("idname").className = "color3";break;
}
return str;
}
//CSS
.color1{
width:100px;
height:200px;
background:#ff6600;
}
.color2{
width:100px;
height:200px;
background:#ffffff;
}
.color3{
width:100px;
height:200px;
background:#333333;
}
最近忙しさのせいにして、ブログのアップを怠っています。反省して、来月からまた頑張ります。
更新が必要な変数をHTML内に変数を書くことで、更新作業の手間が大きく削減できます。
「,」で区切られた文字列をFlash内で配列にするには、
splitを使います。
//HTML内//////////////////////////////////////////////////////////////////
※FlashをSWFObject v1.5 で読込む場合の読込み該当部分に記述。
var so = new SWFObject("swf/test.swf", "devdev", "300", "200", "8");
so.addVariable("hensu", "100,111,154");
so.write("devdev");
//ActionScript//////////////////////////////////////////////////////////////////
var myAry = _root.hensu.split(",");
trace(myAry);
上をパブリッシュすると、myAryが配列としてtraceされます。
例えば、1つのswfをいろいろなページで使う場合や、更新が多々あるものの、変数の変更のみの場合、変数をHTML側に書いてあれば、Flashを扱えない人にも更新をお願いすることができます。
もちろんXMLで管理することもできますが、大した量でない場合などは、HTML内に書くと便利です。
下の例は、『moviefile = movie75.flv』と『"picfile", "images/movie18.jpg"』という変数をHTML内に記述した場合の例です。FLVのプレーヤswfをサイト内で使い回し、プレーヤー内で使うFLVファイルと、サムネールなどを変数として投げる設定です。
addVariableを使って変数を設定します。
//HTML内//////////////////////////////////////////////////////////////////
※FlashをSWFObject v1.5 で読込む場合の読込み該当部分に記述。
var so = new SWFObject("swf/movie.swf", "movie", "300", "200", "8");
so.addVariable("moviefile", "movie75.flv");
so.addVariable("picfile", "images/movie18.jpg");
so.write("movie");
//ActionScript//////////////////////////////////////////////////////////////////
trace(_root.picfile);
trace(_root.moviefile);
のように、これでActionscript内でJSから投げた変数が取得できます。1つのswfをいくつかのページで使い回す際などにとても便利です。
HTML内では、ソースを挿入したい部分でJavaScriptをよびます。
//HTML//////////////////////////////////////////////////////////////////
<script type="text/javascript" src="ぱす/footer.js"></script>
//JavaScript//////////////////////////////////////////////////////////////////
var html = '<div id="footer">';
html += '<a href="#"><img src="http://ぱす/bnr1.jpg" alt="" width="100" height="10"></a>';
html += '<a href="#"><img src="http://ぱす/bnr2.jpg" alt="" width="100" height="10"></a>';
html += '<a href="#"><img src="http://ぱす/bnr3.jpg" alt="" width="100" height="10"></a>';
html += '</div>';
document.write(html);
ただし、ヘッダーやサイドバーなど、上から一定座標に配置する場合は、position: absoluteを使ってクリアすることができますが、フッターのように、ブラウザ内の下にくっつけて配置したい場合はなかなかうまくいきません。
いろいろとネットで検索するうちに、1つのJavascriptを読込むだけでposition: fixedが有効になるものを発見しました。
doxdesk.com: software: fixed.js
http://www.doxdesk.com/software/js/fixed.html
これを導入してみましたが、残念ながら、IE6でスクロールした際に若干ピクついた挙動をします。
最終手段では、高さ100%のFlashエリアとして入れて、Flash内で下にくっつかせたらどんなに簡単に処理できるだろうと考えています。
もう一つ参考になるサイトがありました。
http://gyauza.egoism.jp/clip/archives/2008/03/080302-ie6positionfixed/
今回はFlashで作ったswfを#flashnaviに読み込むためのエリアですが、規定サイズ(ここでは1000px)以下の場合には1000pxより#flashnaviのwidthが縮まらないようにしました。
ウィンドウの幅は、Javascriptのwindow.innerWidthでとれるはず!と思いましたが、IEなどでは計算方法が異なるため、以下の方法を使いました。
下の例では、ウィンドウサイズが1000px以下の場合のみの記述ですが、elseやelse if等を使って、もっと細かく指定するといろいろと使えそうです。
//CSS//////////////////////////////////////////////////////////////////
#flashnavi{
width:100%;
}
//HTML//////////////////////////////////////////////////////////////////
<script language="JavaScript">
<!--
inW = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
if(inW<1000){document.write("<style>#flashnavi{width:1000px !important;}</style>");}
// -->
</script>
そのときにおいておくバナーの元の場所をメモついでに記録しておきます。
http://www.adobe.com/macromedia/style_guide/buttons/
バナーのリンク先は
www.adobe.com/go/getflashplayer
これは.comのページですが、言語やOSは自動判定して適切なPlayerのDLページへとリダイレクトされます。
それは、いろいろなアドオンを入れて使えるためです。
Mac miniのFirefoxを入れ直すことになったので、ついでに、アドオンの一覧を記録しておきます。
ColorZilla[サイト内の色情報をスポイトで取得できる]
Web Developer 1.1.4[JS,CSSなどのON/OFFや、webに関するいろいろな機能が集約されている]
Measureit[ブラウザ内のものさし]
その他は順次更新予定
それと、adobeのサイト内の解説も。
blog.deconcept.com
adobeディベロッパーセンター(swfObject関連)