ロゴを和文フォントにしてCSS3のWebフォントで表示するデモを作ってみた。

デモ画面

「欧文」ではなく「和文」フォントなところがポイント。
一文字づつ書き出したのでHTMLソースは冗長気味だけど、
一文字あたり1~3Kと比較的軽めにできた。
今後、企業ロゴもベクター画像化する流れが来るかもしれないしね。

画像との違いは、ベクター画像と同等なのでどこまで拡大しても綺麗なことと、
文字自体がテキストとしてコピペできる部分。

せっかくHTML5+CSS3で記述したのに、
IE6でも表示できるようにしてしまっている点は職業病。

もちろんスマホで拡大しても超キレイですよ。

ちなみの和文フォントの作り方を大まかに言うと、
①イラレでロゴを作成
②ttEditという和文フォント作成ソフトで新規フォント作成。
③Ctrl+T>ロゴの該当文字をフォームに入力+ラジオボタンの「文字」を選択
④イラレからコピペ。
⑤エクスポートの「1文字Webフォント」でWeb用に書き出す。
以上
※ただし、エクスポートされるサンプルHTMLは、IEでうまく表示されなかったため、別の方法にしました。

▼ttEditの使用方法の参考URL
TTEditのすすめ
http://homepage2.nifty.com/upright/ttedit.html
手書きフォントの作り方まとめ : TTEdit簡単マニュアル(1)
http://shodoka.com/world/modules/d3blog/details.php?bid=51

ソフトさえあれば超簡単。
IE6、7などでも表示できるようにしてあるため、
HTML5ライクなのにソースが冗長になっているのはご愛嬌ということで。

▼具体的なソース

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS3 Webフォント表示デモ(ロゴフォント化計画)</title>
<style type="text/css">

@font-face {
font-family: '東';
src: url('./fonts/to.eot');
}
@font-face {
font-family: '東';
src:
url('./fonts/to.woff') format('woff'),
url('./fonts/to.ttf')  format('truetype'),
url('./fonts/to.svg')  format('svg');
}
@font-face {
font-family: '京';
src: url('./fonts/kyo.eot');
}
@font-face {
font-family: '京';
src:
url('./fonts/kyo.woff') format('woff'),
url('./fonts/kyo.ttf')  format('truetype'),
url('./fonts/kyo.svg')  format('svg');
}
@font-face {
font-family: 'ホ';
src: url('./fonts/ho.eot');
}
@font-face {
font-family: 'ホ';
src:
url('./fonts/ho.woff') format('woff'),
url('./fonts/ho.ttf')  format('truetype'),
url('./fonts/ho.svg')  format('svg');
}
@font-face {
font-family: 'ゲ';
src: url('./fonts/ge.eot');
}
@font-face {
font-family: 'ゲ';
src:
url('./fonts/ge.woff') format('woff'),
url('./fonts/ge.ttf')  format('truetype'),
url('./fonts/ge.svg')  format('svg');
}

p.logo{
margin:16px 0 32px;
font-size:600%;
color:#036;
}

p.logo span.logo_to {
font-family: "東";
}

p.logo span.logo_kyo {
font-family: "京";
}

p.logo span.logo_ho {
font-family: "ホ";
}

p.logo span.logo_ge {
font-family: "ゲ";
}

</style>
</head>
<body>
<p class="logo"><span class="logo_to">東</span><span class="logo_kyo">京</span><span class="logo_ho">ホ</span><span class="logo_ge">ゲ</span><span class="logo_ho">ホ</span><span class="logo_ge">ゲ</span></p>
</body>
</html>

ちなみに「東京ホゲホゲ」ロゴはイラレで適当に作ったオリジナルです。

OKWaveの質問で回答が締め切られた後に急に思いついた方法の備忘録。

http://okwave.jp/qa/q7422593.html

target疑似クラスなのでIEの旧バージョンではまず効かないけど、
スマホ用ということでそれなりに使えそう。
ソース的には妙な入れ子状態になっているのがいまいちだけどね。

サンプルデモ

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style type="text/css">

li{
padding:8px;
border-bottom:1px solid #000;
}

#content03 ul,
#content03 p{
display:none;
}

#content01 ul,
#content01 p{
display:block;
}

#content02:target ul,
#content02:target p{
display:block;
}

#content02:target #content01 p{
display:none;
}

#content03:target ul,
#content03:target p{
display:block;
}

#content03:target #content02 p{
display:none;
}

</style>

</head>
<body>

<div id="content03">
<div id="content02">
<div id="content01">

<ul>
<li><a href="#">リンク01</a></li>
<li><a href="#">リンク02</a></li>
<li><a href="#">リンク03</a></li>
</ul>
<p><a href="#content02">次の3件</a></p>

</div>

<ul>
<li><a href="#">リンク04</a></li>
<li><a href="#">リンク05</a></li>
<li><a href="#">リンク06</a></li>
</ul>
<p><a href="#content03">次の3件</a></p>

</div>

<ul>
<li><a href="#">リンク07</a></li>
<li><a href="#">リンク08</a></li>
<li><a href="#">リンク09</a></li>
</ul>

</div>

</body>
</html>

ページ内のURLに変換漏れやエラーがないかチェックするために作ったグリモン用user.jsです。
少し改造すれば文字列チェック用にも使えます。
※グリモン用と書いてるけど最近はGoogle Chromeでもドラッグ&ドロップで普通に使えたりする。
Google Chromeからuser.jsを削除するには「ツール」→「機能拡張」でリストを開く

html_checker.user.js

// ==UserScript==
// @name html_checker
// @include *
// ==/UserScript==

// 表示領域の幅
var w = 400;
// チェックする要素(タグ)
var tag = new Array('a','area','input');
// チェックする属性
var attr = new Array('href','onclick');
// チェックするソース
var body = document.getElementsByTagName('body')[0];
// チェックするURLリスト
var str = new Array('w-x-w.com','hoge.co.jp');
var ol = document.createElement('ol');
ol.style.fontSize = '80%';
ol.style.listStyleType = 'decimal';
ol.style.margin = '0';
ol.style.padding = '8px 0 0 2em';
ol.style.textAlign = 'left';
for(var i=0;i<tag.length;i++){
	var t = body.getElementsByTagName(tag[i]);
	for(var j=0;j<t.length;j++){
		for(var k=0;k<attr.length;k++){
			if (t[j].getAttribute(attr[k])) {
				for(var l=0;l<str.length;l++){
					if (t[j].getAttribute(attr[k])) {
						var re = new RegExp(str[l], "ig");
						if (t[j].getAttribute(attr[k]).match(re)) {
							var clone = t[j].cloneNode(true);
							var li = document.createElement('li');
							li.style.padding = '0 0 8px';
							li.appendChild(clone);
							ol.appendChild(li);
							break;
						}
					}
				}
			}
		}
	}
}

if(ol.innerHTML != ""){
	var d = document.createElement('dl');
	d.id = "error_keyword";
	d.style.zIndex = 999999;
	d.style.padding = '0';
	d.style.position = 'absolute';
	d.style.top = '8px';
	d.style.left = '8px';
	d.style.opacity = 0.8;
	d.addEventListener("dblclick", del_error, false);
	var dt = document.createElement('dt');
	dt.className = "drag_on";
	dt.innerHTML = '&nbsp';
	dt.style.cssFloat = 'left';
	dt.style.margin = '0';
	dt.style.padding = '4px';
	dt.style.width = w + 'px';
	dt.style.border = '1px solid #eee';
	dt.style.borderBottom = 'none';
	dt.style.MozBorderRadiusTopright = '8px';
	dt.style.MozBorderRadiusTopleft = '8px';
	dt.style.backgroundColor = '#ffc';
	dt.style.fontSize = '80%';
	var dt_a = document.createElement('a');
	dt_a.href = "javascript:void:(0);";
	dt_a.innerHTML = "×";
	dt_a.style.display = 'block';
	dt_a.style.cssFloat = 'right';
	dt_a.addEventListener("click", del_error, false);
	dt.appendChild(dt_a);
	d.appendChild(dt);
	var dd = document.createElement('dd');
	dd.style.clear = 'both';
	dd.style.width = w + 'px';
	dd.style.maxHeight = window.innerHeight * 0.75 + 'px';
	dd.style.margin = '0';
	dd.style.padding = '4px';
	dd.style.overflow = 'auto';
	dd.style.border = '1px solid #eee';
	dd.style.borderTop = '1px solid #eee';
	dd.style.MozBorderRadiusBottomright = '8px';
	dd.style.MozBorderRadiusBottomleft = '8px';
	dd.style.backgroundColor = '#fff';
	dd.appendChild(ol);
	d.appendChild(dd);
	body.appendChild(d);
}

function del_error() {
d.parentNode.removeChild(d);
}

// ここから 技評.jp掲載JSをほぼ引用^^;
// 第22回 JavaScriptによるUIの実装:ドラッグ
// http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0022
(function(){
var addEvent = document.addEventListener ?
    function(node,type,listener){
    node.addEventListener(type,listener,false);
    } :
    function(node,type,listener){
    node.attachEvent('on'+type, listener);
    }
var removeEvent = document.removeEventListener ?
    function(node,type,listener){
    node.removeEventListener(type,listener,false);
    } :
    function(node,type,listener){
    node.detachEvent('on'+type, listener);
    }
function getStyle(element){
    return window.getComputedStyle ?
    getComputedStyle(element, '') :
    element.currentStyle;
}
var IE6 = !window.XMLHttpRequest && window.ActiveXObject;
var root = document.documentElement;

var dragging = false;
var fixed = false;
var x, y, dx, dy;
var element;
addEvent(document,'mousedown', function(evt){
    if(!evt){
    evt = window.event;
    }
    var target = evt.target || evt.srcElement;
    if (target.className === 'drag_on') {
    x = evt.offsetX || evt.layerX;
    y = evt.offsetY || evt.layerY;
    dragging = true;
    element = target.parentNode;
    var style = getStyle(element);
    var rect = element.getBoundingClientRect();
    var left = window.pageXOffset || root.scrollLeft;
    var top = window.pageYOffset || root.scrollTop;
    if (style.position === 'fixed'){
    fixed = true;
    dx = 0;
    dy = 0;
    } else {
    fixed = false;
    dx = (rect.left + left) - element.offsetLeft;
    dy = (rect.top + top ) - element.offsetTop;
    }
    if (IE6){
    element.style.removeExpression('behavior');
    }
    if (evt.preventDefault){
    evt.preventDefault();
    } else {
    evt.returnValue = false;
    }
    addEvent(document, 'mousemove', mousemove);
    }
});
addEvent(document, 'mouseup', function(evt){
    if(dragging){
    dragging = false;
    removeEvent(document, 'mousemove', mousemove);
    var rect = element.getBoundingClientRect();
    element.style.left = rect.left + 'px';
    element.style.top = rect.top + 'px';
    element.style.position = 'fixed';
    if (IE6) {
    element.style.position = 'absolute';
    var L = 'document.documentElement.scrollLeft';
    var T = 'document.documentElement.scrollTop';
    element.style.setExpression('behavior',
    'this.style.left=(' +(rect.left-dx)+ '+' + L + ' )+"px",'+
    'this.style.top =(' +(rect.top -dy)+ '+' + T + ' )+"px"');
    document.body.style.backgroundImage='url(about:blank)'
    document.body.style.backgroundAttachment = 'fixed';
    }
    }
});
function mousemove(evt){
    if(!evt){
    evt = window.event;
    }
    if(dragging){
    var left= fixed? 0: window.pageXOffset||root.scrollLeft
    var top = fixed? 0: window.pageYOffset||root.scrollTop
    element.style.left= left+ evt.clientX - x - dx + 'px';
    element.style.top = top + evt.clientY - y - dy + 'px';
    element.style.right = 'auto';
    if (evt.preventDefault){
    evt.preventDefault();
    } else {
    evt.returnValue = false;
    }
    }
}
})();
// ここまで 技評.jp掲載JSをほぼ引用^^;

とある仕事でHTML内でSVGを使いたいがFireFox3.6など一部ブラウザで描画できないという問い合わせが来た。
救いは、IEはVMLで吐き出すから問題ないということだ。

早速、調べてみたところ、
ユーザ側で「about:config」を開き「html5.enable」を「true」にすれば表示できるようになることがわかった。

FirefoxでHTMLソース中のSVGやMathMLを有効にする方法

しかし、今回はユーザの設定任せにするわけにはいかないので改めて調べてみたところ、
Javascriptから吐き出された場合は、同じ条件でも描画できるということだったので、
HTML内にSVGが存在したら、JavaScriptで吐き出し直すJSを作ってみた。

サンプルデモ
※コードの詳しい説明はサンプルデモのソースにコメントアウトで記述してあります。

if(document.createElementNS){
	var svgs = document.getElementsByTagName('svg');
	if(svgs[0]){
		var ns ="http://www.w3.org/2000/svg";
		for(var i=0;i<svgs.length;i++){
			var pa = svgs[i].parentNode;
			var at = svgs[i].attributes;
			var sv = document.createElementNS(ns, 'svg');
			if(at[0]){
				for(var j=0;j<at.length;j++){
					sv.setAttribute(at[j].nodeName,at[j].nodeValue);
				}
			}
			var tags = svgs[i].getElementsByTagName('*');
			if(tags[0]){
				for(var j=0;j<tags.length;j++){
					var tn = tags[j].nodeName.toLowerCase();
					var tag = document.createElementNS(ns, tn);
					var att = tags[j].attributes;
					if(att[0]){
						for(var k=0;k<att.length;k++){
							tag.setAttribute(att[k].nodeName,att[k].nodeValue);
						}
					}
					walk_tree(tags[j],tag);
					sv.appendChild(tag);
				}
			}
			svgs[i].setAttribute("id","delsvg");
			var del = document.getElementById("delsvg");
			del.parentNode.removeChild(del);
			pa.appendChild(sv);
		}
	}
}
function walk_tree(n,p){
	if(n == null){
		return;
	}
	var c = n.childNodes;
	for(var i=0;i<c.length;i++){
		if(c[i].nodeType === 1){
			var e = document.createElementNS(ns, c[i].nodeName.toLowerCase());
			var a = c[i].attributes;
			if(a[0]){
				for(var j=0;j<a.length;j++){
					e.setAttribute(a[j].nodeName,a[j].nodeValue);
				}
			}
			walk_tree(c[i],e);
		}
		else if(c[i].nodeType === 8){
			var e = document.createComment(c[i].nodeValue);
		}
		else{
			var e = document.createTextNode(c[i].nodeValue);
		}
		p.appendChild(e);
	}
}

▼関数walk_treeは下記ページを参考にしました。
MDN > Docs > JavaScript > JavaScript Reference > 関数
このクロージャ関数はとても便利で、DOMツリーを全て取得することができます。
今回はSVG内の全ての要素を取得するために活用しました。

Firebugのコンソール画面に、
サイト内で使ってはいけない禁止文字列をチェックした結果を表示するための
Greasemonkey用user.jsを作ってみた。

これを使えばどんなサイトでも常に禁止文字列チェックが可能になります。

keyword_checker_by_console.user.js
※右クリックでダウンロードできます。

基本設定は、禁止文字列や禁止タグをuser.jsの配列部分に追記するだけです。
実際に動かしてみると、Firebugのコンソール画面に禁止文字列があったときに表示されます。

例えば、コーダーチェックシートのようなものがあったときに、
「「Firebug コンソール > 情報」で禁止文字列がないか確認した」という項目を追加すればいいわけです。

▼Firebug コンソール > 情報
Firebugのコンソール画面

※ただし、JavaScriptなどで常に内容が変化するようなページの場合など、
正確にチェックできないこともありますので、ご注意ください。

// ==UserScript==
// @name           禁止文字列&タグチェック(コンソールβ版)
// @include        *
// @exclude        http://hoge*
// ==/UserScript==

(function(){

var w = "";
// 禁止文字列指定
var keywords = new Array('hoge','ホゲ');
// 禁止タグ指定
var elements = new Array('font','blink','marquee');

for(var i=0;i<keywords.length;i++){
	if(w != ""){
	w += "|";
	}
	w += keywords[i];
}

for(var i=0;i<elements.length;i++){
	if(w != ""){
	w += "|";
	}
	w += "<(\/)?" + elements[i] + "([^>]+)?>([^<]+<\/" + elements[i] + ">)?";
}

var re = new RegExp(w, "gm");

var console = {
	_defined: false,
	info: function(object) {
		if (!console._defined) {
			console._defined = true;
			location.href = "javascript:" + uneval(function() {
				document.addEventListener("consoleData",
					function(event) {
					  console.info.apply(this, event.getData("object"));
					},
				false);
			}) + "()";
		}
		setTimeout(send, 1000, arguments);
		function send(object) {
			var event = document.createEvent("DataContainerEvent");
			event.initEvent("consoleData", true, false);
			event.setData("object", object);
			document.dispatchEvent(event);
		}
	}
};

var h = document.getElementsByTagName('html')[0].innerHTML;
h = h.replace(/\t/g, " ");
h = h.replace(/^[ ]+/gm, " ");
h = h.replace(/\r\n|\r|\n/gm, "\n");
h = h.replace(/(<head([^>]+)?>)/g, "\n\n$1");
h = h.replace(/<\/head><body/g, "</head>\n<body");
h = h.replace(/<\/body>.*?/g, "\n</body>");
var rows = h.split("\n");
var rows_match_flag = 0;
for(var row_i=0;row_i<rows.length;row_i++){
	if (rows[row_i].match(re)) {
		rows_match_flag = 1;
		var info = "禁止文字列(" + rows[row_i].match(re).length + "件)";
		var hits = new Array();
		var hits_count = new Array();
		var hits_i = 0;
		for(var j=0;j<rows[row_i].match(re).length;j++){
			var flag = 0;
			if(j == 0){
				flag = 1;
			}
			else{
				for(var k=0;k<hits.length;k++){
					var re_e = new RegExp(hits[k]);
					if (rows[row_i].match(re)[j].match(re_e)) {
						hits_count[k]++;
						flag = 0;
						break;
					}
					else{
						flag = 1;
					}
				}
			}
			if(flag > 0){
				hits[hits_i] = rows[row_i].match(re)[j];
				hits_count[hits_i] = 1;
				hits_i++;
			}
		}
		for(var l=0;l<hits.length;l++){
			if(hits_count[l] > 1){
			info += "「" + hits[l] + "」" + "×" + hits_count[l];
			}
			else{
			info += "「" + hits[l] + "」";
			}
		}
		info += "がマッチしました(" + (row_i + 1) + "行目前後)\n";
		console.info(info + rows[row_i]);
	}
}

if(rows_match_flag == 0){
	console.info("禁止文字列は見つかりませんでした。");
}

})();

▼参考URL
Greasemonkeyから安全にconsole.logを利用する
効率的なデバッグをサポートするFirebugのコンソールAPI

w-x-w © Copyright 2009, All Rights Reserved.