CSSのボックスモデル(CSSで画像を中央にする方法)

Webで画面レイアウトをいじくろうとしたときに、margin、border、padding がどこの部分だっけ?と忘れてしまうのでボックスモデルと呼ばれるものを書いてみた。

CSSでは内容(Content)に対して幅と高さの指定ができて、余白部分がpadding、border、marginとなるんだなと。ただこのボックスモデルはブロックレベル要素には効くのだがインライン要素には効かないときがあるらしい(後述)。

[広告]

ブロックレベル要素とは要素の前後に改行が入って要素同士が縦に並ぶもの。インライン要素とは要素の前後に改行が入らず要素同士が横に並んでいくもの。HTMLタグでいうと以下です。

ブロックレベル要素
・div
・h1〜h6
・p
・ul, ol, li
・table
・form
 など

インライン要素
・a
・span
・img
・label
 など

先ほどインライン要素ではボックスモデルの指定が効かないときがあると書きましたが、具体的に言うと「marginは左右は効くが上下は効かない」、「paddingは他の要素の領域を考慮しないので重なるときがある」らしいです。なので、インライン要素でmargin、paddingを使うときは注意が必要そうです。

[広告]

初歩的なんですけれども、、、画像を中央にしたくって、CSSをいじくったときの話。
div(ブロックレベル要素)の中にあるimg(画像)を中央にするにはCSSを以下のようにすればうまくいきました。

■HTMLの内容
<div class=”abc”>
  <img ・・>
</div>

■CSSの内容
.abc { text-align: center;
   margin-left: auto;
   margin-right: auto}

margin-leftとmargin-rightをautoにしておけば画像が中央にいくとばかり思っていたのですが、それだけではdivのブロック領域が中央にいくだけで画像は真ん中より少し左によってしまいます。画像自体も真ん中にするにはtext-alignを使う必要がありました。text-alignは文字列に使うものだと思っていましたが画像にも使えるみたいです。もう少し言うと、text-alignはインライン要素に使えるようです(ブロックレベル要素には使えない)。

Linuxの実ユーザIDと実効ユーザIDについて

Linuxには実ユーザIDと実効ユーザIDというのがあります。実ユーザIDとはプログラムを実行したユーザで、プログラムはそのユーザIDの権限で動きます。通常は実ユーザIDと実効ユーザIDは同じになります。

ユーザ「AAA」が所有者「BBB」のプログラムを実行します(AAAが所有していない他人のプログラムを実行します。このプログラムのアクセス権限は「rwxr-xr-x(755)」であるため他人であるAAAも実行することが可能です)。このときこのプログラムはAAAの権限で動くことになります。つまり、AAA所有のファイルにはアクセス可能ですがBBB所有のファイルにはアクセス不可です。ファイルのアクセス権が「rw-rw-rw-(666)」の場合はアクセス可能です。このときの実ユーザIDと実効ユーザIDは「AAA」となります。

実ユーザIDと実効ユーザIDが異なるケースですが、代表例でいうと「su」コマンドや「passwd」コマンドです。これらのコマンドはパスワードの読み取りが必要なのですが、パスワードは「/etc/shadow」ファイルに書かれており所有者はrootでアクセス権限が「rw——-」となっています(※shadowファイルのアクセス権については後述)。つまり、一般ユーザの権限でこれらのコマンドを実行してもshadowファイルにアクセスできません。そこで、実ユーザは一般ユーザだけれども実効ユーザはrootとなる仕組みが必要になります。これを実現するのが「セットユーザIDビット」というもので、このビットをセットすると実行権限が「x」ではなく「s」となりプログラムは実行したユーザの権限ではなくプログラム所有者の権限で動きます。「su」コマンドや「passwd」コマンドの所有者はrootでありセットユーザIDビットが設定されていますので、rootの権限でプログラムが実行されます。以下はubuntuのsuコマンドとpasswdコマンドの権限を表示したものです。

(※)shadowファイルのアクセス権について
Linuxのディストリビーションによって権限が異なるようです。ubuntuの場合は「rw-r—–(640)」、CentOSの場合は「———(000)」となっているようです。CentOSの場合「000」ですが、rootでは読めますので「400」と同じみたいです。

セットユーザIDビットが設定されたプログラム(所有者はBBB)をユーザAAAが実行したときの場合です。

実ユーザIDはAAA、実効ユーザIDはBBBとなるので所有者がBBBのファイルにアクセスが可能となります。

セットユーザIDビットはグループに対しても使うことができ、その場合は「セットグループIDビット」と言います。IDの使われ方も実グループID、実効グループIDとなり、ユーザIDの考え方と同じです。セットユーザIDビット、セットグループIDビットの設定の仕方は以下となります。

セットユーザIDビット
$ chmod u+s ファイル名

セットグループIDビット
$ chmod g+s ファイル名

あと、セットユーザIDビットに似た(?)ものとしてstickyビットというものがあるので書いておきます。stickyビットが設定されたディレクトリ配下では誰でもファイルの作成や書き込みができますが、ファイル削除、ファイル名変更はファイルを作成した所有者とrootのみができるようになる権限です。stickyビットが設定されると実行権限には「t」が設定されます。「/tmp」ディレクトリにはstickyビットが設定されています。stickyビットの設定の仕方は以下となります。

stickyビット
$ chmod o+t ディレクトリ名