マージンの話

(注)検証はIE6, IE7, IE8, Firefox, Opera, Google Chrome, Safari にて行いました。IE以外はヴァージョンの違いは気にしなくても良い内容だと思います。

 

<html>, <body>, <p> のデフォルトのマージンがどうなっているか調べるために、

css↓

html {
	background:#000;
}
body {
	background:#fff;
}
p {
	background:#f00;
}
p span {
	background:#0ff;
}

html↓

<html>
	<body>
		<p>背景が黒いのはhtml</p>
		<p>背景が白いのはbody</p>
		<p>背景が赤いのはp</p>
		<p>背景が青いのは<span>pの中のspan</span></p>
	</body>
</html>

としたとき、各ブラウザでの表示は以下のようになりました。

(図1)
pic
(↑IE6での表示。他もだいたいこんな感じ)

これは、cssの1行目に「すべてのpaddingを0にする」という

* {
	padding:0;
}

を加えても変わらなかったので、余白はmarginによるものだと分かります。

ただし、FirefoxとSafariにおいては、<p>の内部にわずかな隙間ができているように見えます。

Safari↓
safari
Firefox↓
firefox

<p>のpaddingを0にしたはずなのに、おかしいなぁ、と思いましたが、しばらくして原因は別のところにあることが分かりました。「line-height」の値を変えたら表示が変化したのです。なるほど。「font-size」や「line-hight」のデフォルト値についての比較はここでは省略します。

 

ということで備忘録その1として

デフォルトとして、
  • <body>には上下左右に10px程度の余白ができる(その値はブラウザに依存)
  • <p>には上下に1emの余白ができる(ただし詳細説明が必要なので下記参照)

<p>の余白に関してですが、IE6とIE7では違うようです。おそらくバグです。おそらくIEのバグです。おそらくIFE(Internet Fuckin’ Explorer)のバグです。IEのバグです。大切なことなので4回書きました。font-sizeを色々変えても、IE6とIE7だけ間隔が変わらないのです。1em自体の長さ(1文字文の長さ)はIE6でもIE7でも正しく解釈するのですが、<p>の上下の余白はおそらくデフォルトのfont-sizeの1emを取っているのではないかと思われます。

ところで、上の表示結果をみれば「あれ?」と思うかもしれません。上下に1emの余白ではなく、上か下かに1em、あるいは上下に0.5emではないかと。そして、一番上と一番下が変です。でも、

p {
	margin:1em 0;
}

とやっても同じ結果でしたので、確かに上下に1emのマージンをとっています。

それについては「default <p> margins」にはこうあります。

> Without css a <p> gets a blank line before and after > 1) even when there is an image > 2) except when the <p> is on top. > But when changing the margins with css, these two behaviours are gone. > Is there a workaround for this? The reason (1) and (2) happen is because, with most browsers, there’s   a default style rule that behaves like this: p { margin: 1em 0; } So <p> will always have a single line-height margin on top and on   bottom, regardless of contents (images, texts, input elements,   whatever). If "the <p> is on top", I’m not sure exactly what you mean by this.    On top of what? My best guess is that you mean on top of another <p>. In this case,   the vertical margins collapse, which means that the space between the   two <p> tags (or any other elements with vertical margins) will be   the greater of the two margins, not the sum of the two margins. For   two unstyled <p> tags, that means there will only be 1em of space   between them, not 2em (as it would be if you added the margins).

質問者の「except when the <p> is on top.(<p>が一番上にあるときは例外)」に対して回答者は「On top of what?(何の一番上?)」と尋ねていますが、「同一ボックス内の一番上」という意味だと思います。実際、(図1)では一番上と一番下が例外のようになっています。

これについては、

body {
	background:#fff;
	border:1px solid #00f; /* ←追加 */
}

と、<body>にborder(ここでは幅1pxの青直線)を引くと

pic

一番上の上側と、一番下の下側に余白が出ました。ただしIE6, IE7は違ってこんな感じ。

IE

これについては、現象を一般化してそれを覚えるのは脳味噌のシワの無駄使いのような気がするので、不具合が出たらその都度対処した方が良いような気がします。

 

それよりも興味深いのは、「the vertical margins collapse, which means that the space between the   two <p> tags (or any other elements with vertical margins) will be   the greater of the two margins, not the sum of the two margins.」(<p>タグ(あるいは上下にマージンを持つ他の要素)間のスペースは、大きいほうのマージンを取り、和にはならない)と言われている点です。

marginとは – はてなキーワード」にも、注意に書いてありますが、

上下方向にmarginを持つものが隣接する場合、マージンの相殺がある

ようです。ただし、

隣接するマージン値が同符号の場合は絶対値の大きい方をとり、異符号の場合は和になる

という具合に。これは、実際に試してみると<p>でも<div>でも<h1>~<h6>でも同じでした。

 

(例)

css

div {
	background:#fee;
	border:1px #000 solid;
}
p.m1 {
	background:#200;
	color:#fff;
	margin:100px 0 20px;
}
p.m2 {
	background:#800;
	color:#fff;
	margin:100px 40px -20px;
}
p.m3 {
	background:#880;
	color:#fff;
	margin:100px 80px -20px;
}
p.m4 {
	background:#080;
	color:#fff;
	margin:-50px 120px 100px;
}

html

<div>
	<p class="m1">(1)余白:上100px 下 20px</p>
	<p class="m2">(2)余白:上100px 下-20px</p>
	<p class="m3">(3)余白:上100px 下-20px</p>
	<p class="m4">(4)余白:上-50px 下100px</p>
</div>

結果

(1)余白:上100px 下 20px

(2)余白:上100px 下-20px

(3)余白:上100px 下-20px

(4)余白:上-50px 下100px

IE8, Firefox, Opera, Google Chrome, Safari で、こんな感じに表示されています。

pic

 

ただし、この場合もIE6とIE7は表示が崩れました。marginにマイナス値を与えたのが原因でしょう。でもそんなケースは少ないし、ハックするのが面倒なので、代わりにここにその醜態を晒しておきます。

IE6
IE6

IE7
IE7

Filed under: ★Web制作関係  タグ: , , , , , , , , ,   charlie432 00:00  Comments (1)

二種深信は矛盾ではない、ということ

二種深信は「矛盾した二つのことが同時に知らされる」ことではありません」を読んで。

二種深信とは、機の深信と法の深信で、
一つには、決定して深く、自身は現にこれ罪悪生死の凡夫、曠劫よりこのかたつねに没し、つねに流転して、出離の縁あることなしと信ず。 二つには、決定して深く、かの阿弥陀仏の四十八願は衆生を摂受して、疑なく慮りなくかの願力に乗じて、さだめて往生を得と信ず。(教行信証信巻より・浄土真宗聖典(註釈版)P218)
とあります。

西田幾多郎の「絶対矛盾的自己同一」という言葉もあるように、それまで、相反することが同時にハッキリすると理解しており、人智を超えた崇高な世界で(それには違いないと思うのですが)、今ひとつ「先に進んだら分かるだろう」という気持ちがありました。

一方、紹介したエントリーのように「捨自帰他」という説明の仕方は分かりやすいと思いました。未来のことではなく、今の問題としてとらえられる気がします。

ポイントは、「機の深信」と「罪悪観」の違いにあるのではないでしょうか。
機の深信は、地獄行きの自分の姿がハッキリ知らされることではなく、ただ今の自分、また過去に自分がやってきた行為(今までやってきた功徳、聞法、自力の念仏)は、生死を離れるためには全く役に立たないと知らされることです。別の言葉で、自力無功といいます。


この補足の元となるエントリーには
機の深信とはなにかといえば、「罪悪生死の凡夫」とハッキリ自覚することではありません。またそれだけではご文の一部分だけになってしまいます。

大事な部分は「出離の縁あることなし」です。

自らには生死を離れるだけの善根をもちあわせていないので(出離の縁有ることなし)、自らの善根をたのむ自力の心を捨てたというのが機の深信です。

なぜ「出離の縁有ることなし」なのかといえば、自ら生死を離れるほどの善根を持ち合わせていないからです。罪悪生死の凡夫だから生死を離れるほどの善根を現在持ち合わせていませんし、また未来もそんな善根を持つことはありませんが、「罪悪生死の凡夫」を自覚するだけでは、機の深信とはいえません。

善導大師は別のところでは「罪悪生死の凡夫」の部分を「善根薄少」と言われています。

「罪悪生死の凡夫」も「善根薄少」も私の姿です。しかし、そう自覚するだけでは罪悪観です。

「罪悪生死の凡夫」であり「善根薄少」だから「出離の縁有ることなし」「三界に流転して火宅を出でず」なのが私です。そうなると、生死を離れるために自らの善根を往生の足しにしようとか、自らの考えをたのみにする自力の心を捨てるということです。

このように自分の持ち合わせている善根(罪悪生死の凡夫ならなおさらありませんが)では生死を離れることが出来ないと、自らの善根をたのむ心(自力の心)を捨てたことを機の深信といいます。

「地獄行き間違いない自己の自覚」が機の深信ではありません。
とあります。

それまで、二種深信がたつとは、驚天動地の体験だと思っていましたが、これを読むと必ずしもそうではないということが知らされます。

自力を捨てることと他力に帰することは、表現上別の言葉ですが、同じ事をいわれています。自力を捨てたということは他力に帰したということです。他力に帰したということは、自力を捨てたということです。

また、自力無功と知らされたと言うことは、他力全託したということです。

文字で書けば二つあっても、二つの別のものがあるのでも、矛盾したものが同時にあるいは、順番に起きることでもありません。

二種深信といっても二種類の別々の深信があるのではありません。他力信心を二種深信というのですから、一つのことをいわれてたお言葉です。

前日のエントリーに関連していえば、矛盾した二つのことがおきるのではないので、驚天動地の体験ともなりません。

まとめ

最後に図にしてみました。

二種深信-捨機即託法捨自即帰他
機の深信自力無功捨機捨自
法の深信他力全託託法帰他
  • 機の深信と法の深信は矛盾したことをいわれているのではありません。
    • 自力を捨てる(機の深信)ままが他力に帰したこと(法の深信)になるため。
  • 二種深信は、二つのものが同時に起きることではありません。
  • 二種深信は、二つのものが順番に起きるのでもありません。
    • 機の深信が立ってから法の深信が立つということはありません。
    • 機の深信だけ立ったとか、法の深信だけ立ったということもありません。





Filed under: ★仏教  タグ: , , , , , , , , , ,   charlie432 00:00  Comments (0)

ブラウザをJavaScriptで判別して対処したときの備忘録

IE対策として、「CSSハックを使わずIEのバグに対処する方法 – [ホームページ作成] All About」にあるように、条件付きコメント

<!--[if 【条件式】 ]>
   (中身)
<![endif]-->

を使う手があります。では、IE以外のブラウザはどうすればよいか、調べてみましたが、どうやらhtml内の記述では難しそうです。

そのかわり、JavaScriptを使えば出来るということが分かったので、「ブラウザ判定 :JavaScript の基本コード」を参考に、ブラウザを判別するボタンを作って(コピーして)みたのがこれです↓。

ソースは

html↓

<input type="button" value="お使いのブラウザを表示します" onClick="getBrowser();" />

JavaScript↓

<script type="text/javascript">
document.getElementById("str_agent").innerHTML = window.navigator.userAgent.toLowerCase();
function getBrowser() {
	var userAgent = window.navigator.userAgent.toLowerCase();
	var appVersion = window.navigator.appVersion.toLowerCase();
	message1="あなたがお使いのブラウザは、\n";
	message2="です。";

	if (userAgent.indexOf("msie") > -1) {
		if (appVersion.indexOf("msie 6.0") > -1) {
			alert(message1+"IE6"+message2);
		}
		else if (appVersion.indexOf("msie 7.0") > -1) {
			alert(message1+"IE7"+message2);
		}
		else if (appVersion.indexOf("msie 8.0") > -1) {
			alert(message1+"IE8"+message2);
		}
		else {
			alert(message1+"不明"+message2);
		}
	}
	else if (userAgent.indexOf("firefox") > -1) {
		alert(message1+"Firefox"+message2);
	}
	else if (userAgent.indexOf("opera") > -1) {
		alert(message1+"Opera"+message2);
	}
	else if (userAgent.indexOf("chrome") > -1) {
		alert(message1+"Google Chrome"+message2);
	}
	else if ((userAgent.indexOf("safari") > -1) && (userAgent.indexOf("iphone") == -1)) {
		alert(message1+"Safari"+message2);
	}
	else if ((userAgent.indexOf("safari") > -1) && (userAgent.indexOf("iphone") > -1)) {
		alert(message1+"iPhoneのSafari"+message2);
	}
	else {
		alert(message1+"不明"+message2);
	}
}
</script>

ちなみに、アラート内での改行は「\n」。

 

ここで「イヌでもわかるJavaScript講座」を参考に見てみると、
「userAgent」(= window.navigator.userAgent.toLowerCase();)

「appVersion」( = window.navigator.appVersion.toLowerCase();)
という変数がポイントみたいです。中身に何入っているか見てみると、

↑のソース↓

<input type="button" value="userAgentを表示する" onClick="userAgent = window.navigator.userAgent.toLowerCase();window.alert(userAgent)">
<input type="button" value="appVersionを表示する" onClick="appVersion = window.navigator.appVersion.toLowerCase();window.alert(appVersion)">

ということで、この中にブラウザやヴァージョン情報が入っており、そのキーワードは以下の通り(追記:ソースを見れば分かると思いますが、キーワードは小文字に変換されています)。

ブラウザ userAgent内に含まれるキーワード
Internet Explorer msie
Firefox firefox
Opera opera
Google Chrome chrome
Safari safari
iPhone iphone

ってそのままなんですけど、IFE(Internet Fuckin’ Explorer)の場合は特にヴァージョンが重要になって、それは「appVersion」の中に(「userAgent」にも)「msie 6.0」とか「msie 7.0」とか「msie 8.0」とある訳なんですね。

 

で、文字の検索に使うのがindexOf()【検索対象】.indexOf(【検索ワード】[,【検索開始位置】]);という書式で、検索ワードの文字位置、なければ-1を返します。

だからif (userAgent.indexOf("firefox") > -1)ならば「文字列userAgentに”firefox”という文字があれば」という意味に。

 

ということで、これを使えば特定のブラウザだけ表示が異なる場合のハックが簡単になるのですが、以下、いくつかメモっておきたいことがあるので、以前これを利用して「firefoxのテーブル内強制改行を実現させるためのjsを導入したらOperaの表示がおかしくなっちゃった(どんな風におかしくなったかは忘れた)」対策をしたときの備忘録です。

発端は、firefoxで自動改行がうまくいかないことでした。参照 → 自動改行(word-break・word-wrap・white-space プロパティ)をコントロールして、テキストがボックスから飛び出さないようにしたい。 | 乱雑モックアップ

その対策として、FirefoxとOperaでword-break:break-allを実現する「wordBreak.js」を導入したんですが(OperaはすでにCSSだけで対応済み)、そしたらFirefox以外で不具合が。

そこで、上に書いた、ブラウザを判定するjsと、{document.write('【html文】');}を利用して以下のように書いてみたけどエラー。

{document.write('');}

調べた結果、「JavaScriptファイルの中からJavaScriptを呼び出す – 高密度商業地域」に

JavaScriptファイル内に
document.write(“<\/script>");
と書けば呼び出すことができます。

とあったので、「script」の閉じタグを<\/script>としたらうまく行きました。

他のタグはそんなことしなくても良いのですが、なぜ「script」だけ「\/(エスケープコード?)」になるのかまだ理解できていません。余裕があったらまた調べてみたいと思います。

【追記】
Operaの不具合を思い出しました。「FirefoxとOperaでword-break:break-allを実現する「wordBreak.js」」を実装させたときに、Opera内のtableのセル(行かも?)にmargin(なのかスペースなのか何なのかは未調査ですが、とにかく余白)が生じてしまうことでした。

Filed under: ★Web制作関係  タグ: , , , , , , , , , , , , ,   charlie432 00:00  Comments (0)
    2011年4月
    « 3月   5月 »
     123
    45678910
    11121314151617
    18192021222324
    252627282930