Google Web FontsでWebフォントを使う


Google Web Fonts

大変かと思ったけれどかなり簡単に使えるので、綺麗に見えるフォントを使いたいという場合はオススメです。英字フォントは容量も軽いので問題なし。日本語フォントは容量重いのでちょっと厳しいかもしれない。

動作サンプル

例として、QuicksandというWebフォントを使いたければ、CSSファイルに以下のような感じで記述すればOKです。

実に簡単です。

ただ、フォントが小さいと文字が潰れて読めなくなってしまう場合があります。(普通のフォントではあまり見ない気がする。)

意図したフォントを探すには、Searchから検索するか、Filtersで好みの条件を指定するといろいろ出てきます。フォントの読み込みの方法は、各フォントの「Quick-use」というリンクから見ることができます。

webfonts_search

webfonts_use

注意点として、ブラウザの設定でWebページのフォントを優先するような設定になっていないと、ブラウザ自体の設定が優先されて、Webフォントでの表示がされなくなります。Firefoxで動かない!という事態になったのですが、原因はそれでした。

Fire.appをビルドして使う


Fire.appというHamlとかSassをコンパイルするディレクトリを注視してファイルが更新されたら勝手にコンパイルしてくれるアプリケーションがあります。(似たようなアプリにCodeKitがありますが、Mac Lion以上専用です。)

http://fireapp.handlino.com/

Githubでソースが公開されているのでビルドして使うことができます。

続きを読む Fire.appをビルドして使う

JavaScriptでカスタムイベント


JavaScriptでActionScriptのようにカスタムイベントが使えたらいいなぁと思って調べてみました。AS3のようにカスタムイベントクラスを作って~という方法ではないですが、イベントのtypeを自分で独自に設定することができそうだったので、そちらでやってみました。

IEが問題で、IE9以降ではaddEventListenerが使えるようですが、それ以前はattachEventしか使えません。またfireEventはtargetがdocumentの子ノードとして配置していないとエラーになってしまいました。さらに、attachEventするイベントはIEで定められているものしか使えないようです。

これを何とかしてみたのが以下のものです。

/**
* spiffieldCustomEvent
*
* @license MIT License http://www.opensource.org/licenses/mit-license.php
* @author sacrifs http://labs.spiffield.net/
* @update 2013/01/11
*
* var obj = document.createElement("object");
* spfdCustomEvent.addListener(obj, "loadComp", function(e){alert("loadComplete!")});
* spfdCustomEvent.dispatch(obj, "loadComp");
*/
var spfdCustomEvent = spfdCustomEvent || {};
(function(){
var _handlerFuncList = {};
/**
* addListener
* addEventListener / attachEvent
* @param target : DOMElement
* @param type : String
* @param func : Function
*/
addListener = function(target, type, func){
if(target.addEventListener){
target.addEventListener(type, func, false);
}
else if(target.attachEvent){
if(target.parentNode != document){
target.style.display = "none";
document.appendChild(target);
}
_handlerFuncList[type] = func;
if(_handlerFuncList.length == 1){
target.attachEvent("ondataavailable", handleFuncIE);
}
}
},
/**
* removeListener
* removeEventListener / detachEvent
* @param target : DOMElement
* @param type : String
* @param func : Function
*/
removeListener = function(target, type, func){
if(target.removeEventListener){
target.removeEventListener(type, func, false);
}
else if(target.detachEvent){
delete _handlerFuncList[type];
if(_handlerFuncList.length == 0){
target.detachEvent("ondataavailable", handleFuncIE);
}
}
},
/**
* handleFuncIE
*
* @param e : Event
*/
handleFuncIE = function(e){
var func = _handlerFuncList[e.datatype];
if(func){func(e);}
},
/**
* dispatch
* dispatchEvent / fireEvent
* @param target : DOMElement
* @param type : String
* @param data : Object
*/
dispatch = function(target, type, data){
var ev;
if(document.createEvent){
ev = document.createEvent("Event");
ev.initEvent(type, true, true);
ev.datatype = type;
ev.data = data;
target.dispatchEvent(ev);
}
else if(document.createEventObject){
ev = document.createEventObject();
ev.datatype = type;
ev.data = data;
target.fireEvent("ondataavailable", ev);
}
}
//public
spfdCustomEvent.addListener = addListener;
spfdCustomEvent.removeListener = removeListener;
spfdCustomEvent.dispatch = dispatch;
})();

使用方法は中にある通りです。

1spfdCustomEvent.addListener("登録したいDOMオブジェクト", "イベント名", function(e){alert("呼びたい処理")});
2spfdCustomEvent.dispatch("登録したDOMオブジェクト", "イベント名");

という感じで使用できるはずです。

参考:カスタムイベントとイベントの発火 :: 5509

こちらのサイトさんを参考にさせていただきました。detachEventにも対応させたかったので、1度クロージャにしたんですが、リスナにクロージャを登録して削除するところで失敗したので、別のやり方にしています。

他ライブラリを使えば余裕で実現できるかと思いますが、ライブラリに依存しない形で持っておきたかったのです。

HTMLに貼りつけた画像のサイズが実際のサイズと異なっていたら赤枠を付けてconsole.logに書くブックマークレット


どうもお久しぶりです。

FlashDeveloperだったんですが、最近はHTMLも書くようになりました。

HTMLを作ってると、細かいところで面倒だなぁーと思うことが多いです。慣れてないだけかもしれませんが…。

変数が使えないというのが一番大きな問題で、ヘッダフッタを変更しようものなら全部変更というのがね…。慣れない。うまいやり方を見つけたいです。

それはさておきとして、表題の件です。imgのサイズはやはり指定したほうが良い、ということなので、全部指定しているのですが、コピペしたり、変更があったり、間違って入力してたりで、実際のサイズとは違うサイズがimgタグのwidth/heightに入ってたりします。大きい画像で少ないpixelであればそんなに目立ちませんが、やはりデザイン通りに配置しないと、ということで。

で、これを何とかできないかと思って、ブックマークレットを作ってみました。FirefoxでFirebugを使ってる前提の作りになっていますが、他の環境でもconsole.logを確認できれば使えると思います。

javascript: (function(){
var d = window.document;
var s = d.createElement('script');
s.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js';
d.body.appendChild(s);
setTimeout(function(){
$("img").each(function(){
var src = $(this).attr("src");
var img = new Image();
img.src = src;
if(img.width != $(this).width() || img.height != $(this).height()){
console.log("サイズが違います", src, "now:" + $(this).width() + "/" + $(this).height() + " real:" + img.width + "/" + img.height);
$(this).css("border", "3px solid red");
}
});
}, 1000);
})();

追加するには、適当にどこかのページをブックマークした上で、タイトルをわかり易い名前に変更し、以下のリンクのURLをコピーしてください。そのまま下のリンクをブックマークにドラッグ&ドロップでも大丈夫なブラウザもあるかもしれません。

画像サイズチェック

使い方:

  1. 調査したいページを開く
  2. FirebugのJavaScriptコンソールなど、console.logを見れる画面を開く
  3. ブックマークレットを実行
  4. 画像サイズが実際のサイズと異なるものがあれば、赤く枠がつき、コンソールに現在の画像サイズと、実際の画像サイズが表示されます。(now:現在の表示サイズ, real:実際の画像のサイズ)

ブラウザによっては動作しないかもしれませんが、Win7+Firefox16,Mac10.6+Firefox17では動作してくれました。

jQueryを使うために1秒待つ、ということをしています。読み込み完了が検知できればもっといいんですが…。このあたりは機能向上も含めて考えてみようと思います。

HTMLをやり始めるに当たって環境を整えたりしたので、次回はそれについて何か書こうとおもいます。

wmodeのもたらす不具合


Flashで背景を透過させるときにHTMLのSWFObject部分にwmode=”transparent”;と書くこともあると思いますが、これが結構不具合(仕様?)が多く、安易に使えません。

さっと確認した感じではwmodeをきちんと設定しないと、以下のような不具合が出たり出なかったりします。(FlashPlayerのバージョンによって変わるものもあります。)

  • ブラウザによってポップアップブロックに引っかかったり引っかからなかったりする
  • 文字入力がブラウザによってインライン入力できたりできなかったりする
  • ブラウザによって日本語入力ができたりできなかったりする
  • CSSのz-indexがwmode=windowでは無視される(Flashが最前面に表示される)

などなど

このできたりできなかったりする、というのが曲者です。ブラウザによってFlashが違う動作をするときはまずwmodeを疑うと良い気がします。
Flashは全部のブラウザで動くんだぜーとかやってると返り討ちにあいます。wmodeの設定によってはちゃんと動くようになる場合がありますが、こいつがやっかいなのは、ブラウザごとに動作を分ける必要があって、

  • wmode=transparent
  • wmode=window
  • wmode=opaque
  • wmode=direct
  • wmode=gpu

のどれが適切かはFlashとブラウザとOSによって異なるので、ブラウザごとに適切なwmodeを選んでいく必要がある場合があるということです。

以前にWindows7のChromeで日本語入力ができない、というのに悩まされました。これは一時wmodeを設定しないか、windowに設定すれば動くものの、それ以外だと動かない、という状況だったんですが、あとになって、逆にopaqueかtransparentにすると動くという風になったりでもうちんぷんかんぷんです。(検証が不十分だったのかもしれないですけれど。)

さきほど確認したところではWindowsで以下の不具合はまだあるようでした。

  • Windows + Firefoxだとopaque/transparentで日本語インライン入力ができない(Win7 + Firefox + FlashPlayer11.3で確認)
  • Windows + Operaだとopaque/transparentで日本語が入力できない(WinXP7 + Opera12 + FlashPlayer11.3で確認)

Flashのバージョンによりけりの可能性もあるので、transparent/opaqueを使う場合はいつもより念入りにチェックする必要がありますね。特に文字入力がある場合は。

Macではインライン入力ができない…というのがありますが、もともとどのブラウザでも、どのwmodeでもできないのであんまり関係ないですね。(どこかで、仕様なのでインライン入力できるようにはならない、と言われていた気がする。)

ちなみにwmode=window / direct / gpuはそれぞれ動作に違いはなさそうでした。検証が不十分なので、実際に使われる場合はFlashといえどブラウザのチェックは必要かと思います。特に日本語入力は一切できないものもあるので。