12月2011

position:absoluteを使うとき…

どうして?っていわれるかもしれないですけど、なんか、position:absoluteを使って解決するのって、ずるいような、負けを認めたような、そんな感じがしてました。
たぶん、absoluteを使わなきゃ解決できないコードを書いたことがないからだと思います。

positionの値として、static(初期値、配置を指定できない)、reletive(相対位置で記述)、absolute(親ボックスを基準に絶対位置で記述)、 fixed(スクロールせず、固定)があります。そのうち、自分で書く可能性が高いのはrelativeとabsoluteです。で、absoluteを使うときは、親ボックスが基準として使われ、その親ボックスにはstatic以外(とりあえずreletiveにしておけばOK)を指定しておかなければならないです。

これが今回使うXHTMLソースです。小さい写真を囲むpにphotoというIDを付け、absoluteで位置指定します。この写真がどこへ移動するか見てみます。

XHTML

<div id="wrap">
<div id="outer">
<div id="inner">
<p><img src="img/imgBig01.jpg" width="400" height="300" alt="" /></p>
<p id="photo"><img src="img/imgSmall01.jpg" width="50" height="38" alt="" /></p>
</div>
</div>
</div>

まず、どこにもposition:relativeをつけません。

CSS

*{
	margin:0;
	padding:0;
}
#wrap {
	padding:80px;
}
#outer {
	background-color:#FCC;
	height:700px;
	width:800px;
	margin:0 auto;
	border:1px #000 solid;
}
#inner {
	margin:100px;
	background-color:#FFF;
	padding:50px;

}
#photo {
	position:absolute;
	left:10px;
	top:10px;
}

▼サンプルはこちら

写真の位置は、ウィンドウの左上から10pxのところです。どこにもrelativeの指定がないので、ウィンドウが基準になっています。


CSS

*{
	margin:0;
	padding:0;
}
#wrap {
	padding:80px;
	position:relative;
}
#outer {
	background-color:#FCC;
	height:700px;
	width:800px;
	margin:0 auto;
	border:1px #000 solid;
}
#inner {
	margin:100px;
	background-color:#FFF;
	padding:50px;
}
#photo {
	position:absolute;
	left:10px;
	top:10px;
}

▼サンプルはこちら

写真の位置は、ウィンドウの左上から10pxのところです。一番外側の#wrapにrelativeの指定があるので、1つめと同様にウィンドウが基準になっています。


CSS

*{
	margin:0;
	padding:0;
}
#wrap {
	padding:80px;
}
#outer {
	background-color:#FCC;
	position:relative;
	height:700px;
	width:800px;
	margin:0 auto;
	border:1px #000 solid;
}
#inner {
	margin:100px;
	background-color:#FFF;
	padding:50px;
}
#photo {
	position:absolute;
	left:10px;
	top:10px;
}

▼サンプルはこちら

写真の位置は、#outerの左上から10pxのところです。#outerにrelativeの指定があるので、#outerが基準になっています。


CSS

*{
	margin:0;
	padding:0;
}
#wrap {
	padding:80px;
}
#outer {
	background-color:#FCC;
	height:700px;
	width:800px;
	margin:0 auto;
	border:1px #000 solid;
}
#inner {
	margin:100px;
	background-color:#FFF;
	padding:50px;
	position:relative;
}
#photo {
	position:absolute;
	left:10px;
	top:10px;
}

▼サンプルはこちら

写真の位置は、#innerの左上から10pxのところです。#innerにrelativeの指定があるので、#innerが基準になっています。


CSS

*{
	margin:0;
	padding:0;
}
#wrap {
	padding:80px;
}
#outer {
	background-color:#FCC;
	height:700px;
	width:800px;
	margin:0 auto;
	border:1px #000 solid;
	position:relative;
}
#inner {
	margin:100px;
	background-color:#FFF;
	padding:50px;
	position:relative;
}
#photo {
	position:absolute;
	left:10px;
	top:10px;
}

▼サンプルはこちら

写真の位置は、#innerの左上から10pxのところです。#outerにも#innerにrelativeの指定がありますが、#outerは無視され、#innerが基準になっています。


CSS

*{
	margin:0;
	padding:0;
}
#wrap {
	padding:80px;
}
#outer {
	background-color:#FCC;
	height:700px;
	width:800px;
	margin:0 auto;
	border:1px #000 solid;
	position:relative;
}
#inner {
	margin:100px;
	background-color:#FFF;
	padding:50px;
	position:static;
}
#photo {
	position:absolute;
	left:10px;
	top:10px;
}
}

▼サンプルはこちら

写真の位置は、#outerの左上から10pxのところです。#outerにrelativeの指定があります。先ほど#innerに記述されたrelativeはstaticに変更です。#innerは無視され、#outerが基準になっています。

position:absotuleで基準とする「親ボックス」というのは、直上の要素ということではなく、static以外を指定されている親ボックスということになるんでしょうか…。

なんとなく、分かったような、またまた呪文が増えたような…。見習の道は厳しいものですぅ。

サイドバーにサイトのURL入りQRコードを載せる

QRコードを作成して、いい気になってる見習ですが、記事の中だけじゃなくって、やっぱりサイドバーとかに載せて、どのページでもQRコードが見れるようにしたいです。

ということで、QRコードをWord Pressで作ったサイトのサイドバーにつけてみたいと思います。
(※QRコードは(株)デンソーウェーブの登録商標です)

QRコードの画像は、この前cmanさんで作成したものを使います。

さて、どうやってサイドバーに載せよう…。グーグル先生への質問の仕方が悪いのか、なかなかヒットしてくれません。

ということで、見習が苦悩の中から苦し紛れに書きました。たぶん、というか、ぜったいもっといい方法あるに違いない。どなたか教えてください…。

サイドバーなんだから、とりあえずウィジェットのなにかに書き込んじゃえってことで、管理権限ある人でログインして、「外観」から「ウィジェット」へ…。ウィジェットのなかでも、HTMLさえ書けければ、なんだかんだと汎用性がありそうで、前にリンクの存在を知らなかったときに使った「テキスト」を使ってみます。

テキストのウィジェットを、サイドバーへドラッグして、タイトルに「このサイトへのアクセスにご利用ください」と入力。

テキストウィジェットのテキストエリア部分に、力ずくで下記のように書き込みました。そして、保存。

<img src="http://pc.beginners-luck.net/csstest/img/qrcodeimg.gif" width="123" height="123" alt="">

とりあえず、画像ファイルのパスは絶対パスにして、どんな階層からでもきっちり見られるようにしました。しかし、この状態で、ソースを表示してみると、画像ファイルを示すimgが、直接divで囲われているし、画像が真ん中じゃない。imgはインライン要素なので、直接divとかで囲うのは、本当は問題らしいということも聞いたことがあるし(といっても、表示上は問題ないみたいですけど)、imgをpで囲って、そこへ真ん中に寄せるスタイルつけちゃえって思いました。

<p style="text-align:center;"><img src="http://pc.beginners-luck.net/csstest/img/qrcodeimg.gif" width="123" height="123" alt=""></p>

(X)HTML内に直接スタイルつけちゃったり、絶対パス使ったりと、さすが見習な力技ですが、なんとか、表示できました。でも、これ、もっと改善の余地ありそうな…。課題にします、課題に。

Word Pressのウィジェット、検索ボックスを追加する

Word Pressでブログを書くようになって、まだ日は浅いですが、少しずつ記事が溜まってきました。分からないことがいっぱいだから、メモることがいっぱい。当初の目的、「仕事場で、前に調べたことを、もう一度調べるのは時間がもったいないので、メモとしてブログ書いちゃえ」からすると、ちょっと不便になってきました。

使い勝手には、それなりに問題があるようですが、ないよりはイイじゃんという見習は、とりあえず、Word Pressのウィジェットですぐに使える検索ボックスを入れてみることにしました。

管理者の権限でログインして、「外観」の「ウィジェット」画面を開き、サイドバーのところに「検索」をドラックして移動させるだけ。基本はこれだけです。

検索ボックスが表示されたが…

検索ボックスが表示されたが…

ただ、これだけだと、悲しいまでにレイアウトが崩れてます。いきなり、ボックスがはみ出してるし、「検索」「検索」ってちょっとクドイ。ここだけ何とかしたいです。

先ほどドラックしたサイドバー内にある「検索」の▼をクリックすると、「タイトル」という項目があるので、ここに「サイト内を検索してみる」と入力し、「保存」をクリックします。

上部のサイドバーとスタイルは統一された

上部のサイドバーとスタイルは統一された

これで、他のサイドバーの項目と同じようなレイアウトで「サイト内を検索してみる」が記述されます。

ここで出力されるXHTMLを見ると

XHTML

<li id="search-4" class="widget widget_search"><h2 class="widgettitle">サイト内を検索してみる</h2>
<form role="search" method="get" id="searchform" action="https://pc.beginners-luck.net/pcwp/" >
<div><label class="screen-reader-text" for="s">検索:</label>
<input type="text" value="CSS" name="s" id="s" />
<input type="submit" id="searchsubmit" value="検索" />
</div>
</form></li>

とあります。

CSS

div#sidebar li.widget_search label.screen-reader-text {
display:none;
}

とすることで、ラベルの「検索」という文字を消すことができます。

また、検索ボックスが横にはみ出ているので、これを縮めたいですが、ここではinputに幅を指定すると、「検索」ボタンまで同じ長さになってしまいます。

[属性名="属性値"]を追加記載すると、属性名と属性値が一致したときのみCSSが適用されるので、

CSS

div#sidebar li.widget_search input[type="text"]{
width:95%;
}

とします。

最後にinput同士の間隔を整えると、

CSS

div#sidebar li.widget_search input {
margin:5px auto;
}
検索ボックスのスタイルも、一応それなりにキレイ

検索ボックスのスタイルも、一応それなりにキレイ

なんかそれなりになりました。

Word Pressのお勉強だと思ってましたが、CSSの指定方法で、属性名や属性値も使う方法を始めて使い、ちょっとカンドーな見習です。

ちなみに

CSS

div#sidebar li.widget_search input[type] {
margin:5px auto;
}

と記述しても、同じ結果になります。[属性名]という記述方法だと、その属性名と一致したものに適用されるので、属性値がtextもsubmitも含まれるからです。