-
ID:5A06m7 さんの質問

テキストをどのようにしたら縦中央にする出来るのか苦戦しております。
どなたかご教授頂けませんでしょうか?

実現したいこととしては、画像の上にテキストを載せて、かつ、画像のちょうど縦横中央に記事タイトルを表示させたいです。

画像はフルードイメージ(?)でして、ウィンドウの幅によって拡大縮小されるため固定サイズではありません。

また、記事タイトルも動的に書き出されるため、固定の文字数ではありません。

<div class="articleTitle">
<h1 class="title">動的に書き出される記事タイトル</h1>
<img src="記事のサムネイル画像.jpg">
</div>

display:tableもこのケースでは上手く行かないですし、positionを使ったやり方も上手く出来ませんでした。。。

みんなの回答 12 件

ID:RFl95u さんの回答

画像をarticleTitleの背景にして、articleTitleをtableにしてh1をtable-cellにしてもだめだった?

ID:5A06m7

画像は記事のサムネイル画像なので背景にしない方が良いのかなと思っているのですが、どうでしょう?

ID:5A06m7

ttp://hyper-text.org/archives/2014/08/position_absolute_center_layout.shtml
このページのやり方も真似てみたのですが、どうも上手く行きません。。。

ID:RFl95u

実際テキストの背景として使うなら背景でいいんじゃない。
自分なら、重要なテキスト情報がないなら迷う事なく背景にする。

ID:5A06m7

確かに背景画像として使っても問題ないような気がして来ました!ただ、もしかするとサムネイル画像の下にテキストを置くかもしれないので、サムネイル画像はimgタグとしてあつかっておきたいところなのですよね。。。すいません。。。

ID:ufpwwj さんの回答

暇だったからやった
タイトルが1行以上になった場合は知らん
ttp://codepen.io/anon/pen/wDqdj

ID:ufpwwj

でも自分もRFl95uqLCi/Oさんと一緒でこういうときは背景にするかもね
画像サイズが固定じゃないならbackground-size: cover;つかったほうが楽そう

ID:5A06m7

すいません。タイトルは動的に書き出される為複数行になることがあります。

ID:5A06m7 さんの回答

画像の上にテキストを縦中央表示しているサイトを見つけました。

こちらのリンク先ページの「HYPER ISLAND STUDENT STORY - MEET JOEL」のところは画像の上にテキストを縦中央表示出来ているのですが、ソースを見て、真似て見てもどうも上手く行きません。なんでだろう。。。

リンク先サイトでは画像を背景として使っていますし、さらに、imgタグでも一応表示出来るようにマークアップされているみたいでした。(display:noneでimgタグの方は非表示になっていましたが)

Blog | Hyper Island

https://www.hyperisland.com/community/news
ID:ufpwwj

じゃあもうそのサイトと一緒でimgいれてdisplay:noneにしてすれば?

ID:MRK0sr

そうしたいんですけど、真似ても上手く出来なくて。。

ID:mKFMMq さんの回答

構成変える+webkit系だけならそれっぽいのができました。
でもなんでこれで動いてるかはちょっとわからないけど・・・

テキストをどうにかして縦中央にするwebkit系のみ - js do it

http://jsrun.it/Ituki/huUO
ID:.TxP56 さんの回答

positionでうまくいかないのでしょうか。
.articleTitle{
position: relative;
}
.title{
position: absolute;
top:50%;
width:100%;
margin-top:-.5em;
text-align:center;
}
img{
width:100%;
height:auto;
}
タイトルが一行のときのみですが。。。

ID:5A06m7

ごめんなさい。タイトルは動的に書き出される為、複数行になることがあります。

ID:RFl95u

テキストが複数行でも中央そろえにするにはtable使うしかないんじゃないかな。

ID:ufpwwj

でも画像とテキスト重ねるんだとtableはposition使えないし無理そう

ID:.TxP56

tableだとフルードイメージに合わせることが難しそうですね。あとはJSで取得ですかね。

ID:MRK0sr

ttps://www.hyperisland.com/community/news

このページは何で出来てるかわかりますか?

ID:.TxP56

こんなやり方知りませんでした。反省。。。

ID:5A06m7

私はやり方を見てもまだ理解出来ていません^^;

ID:ABL3Xm さんの回答

うふふ、坊やたち。困ってるのかしら。IE9以上ならコレでできるんじゃないかしら。

Z63 | Vertical align anything with just 3 lines of CSS | zerosix...

http://zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/
ID:MRK0sr

ごめんなさい!ie8は対応させてたいです!

ID:ABL3Xm

あらそう、じゃあCSSだけじゃ無理よ。あきらめなさいね。

ID:MRK0sr

え、そうなんですか。。。上のコメントに貼ったリンク先サイトもcssだけでなく、jsか何か使って実現してるのでしょうか?

ID:ABL3Xm

上の「Blog | Hyper Island」ね。まあ素敵♪確かにできるわね。でも<h1>内に<span>要素が必要よ。ポイントは擬似要素と「inline-block」ね。坊やにできるかしら。うふふ。もう少しジラスけど、他の坊やたちもがんばって!もし解決できなかったらちゃんと教えてあげるわ。

ID:MRK0sr

もっかい真似ながらチャレンジしてみます!

ID:5A06m7

ttp://codepen.io/anon/pen/kFwAH
やってみたんですけど、上手く行きません!何が違うんでしょう!?

ID:KJdl5h

これは疑似要素の使い方の参考になりますわ。トピ主は中央には出せてるよ。imgにopacity: 0.5;してみ?

ID:5A06m7

ttp://codepen.io/anon/pen/kFwAH

あ、opacityを落としたら確かにタイトルが縦中央(?)に表示されてました!若干、中央からズレているような気がしないでもないですが。それと、行の折り返しが出来ていないのは何故なのか。。。

ID:0q0RU2 さんの回答

なんだろう・・。
回答してくれてる人たちがいるのに、それに対する返信で「ごめんなさい、すいません、ああしたいんです、こうしたいんです。」って。
まずは「ありがとうございます。」じゃないのかね。それと条件の後出しはダメよ。

ID:MRK0sr

すいません。ブラウザのバージョン条件が後出しになってしまっていて。ありがとうございます!

ID:ssACIc さんの回答

  • 高さは決めうち(px)
  • 幅が写真の幅以下になった時、写真がセンターにならない
    それでもよかったらHyper Islandを参考にしつつ近いものができた。かも。
    写真を<img>じゃなくbackgroundにしたらセンターにもできると思う。
    でも高さも可変の場合はJS使わないと無理っぽい

codepen

http://codepen.io/anon/pen/lCfxq
ID:ssACIc

あ、幅が写真の実寸以下で左右がセンターじゃないだけじゃなく、
実寸以上になったときは天地もセンターにならない、だった。
なんか方法あるかなー。

ID:MRK0sr

結構大変なんですね、縦中央表示って。意外。。

ID:ABL3Xm さんの回答

おつかれさま、坊やたち。いろいろがんばったみたいね。ほとんどできてるとおもうけど、例の参考サイトの部分を再現できる、必要最低限のHTMLとCSSをはっておくわね。
■HTML
<div class="articleTitle">
<h1 class="title"><span>記事タイトル<br>2行目</span></h1>
<img src="ttp://placeimg.com/200/200/any" alt="">
</div>
■CSS
.articleTitle {
width: 300px;
height: 300px;
background: #eee;
position: relative;
}
img {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
z-index: 1;
}
h1 {
line-height: 1;
z-index: 2;
position: relative;
height: 100%;
text-align: center;
vertical-align: middle;
}
h1:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
h1 span {
display: inline-block;
vertical-align: middle;
}
他サイトのソースを読み取り、すぐに再現できるHTML×CSSの応用力って、とても大切よ。現場や実務経験で重宝されるヒトツね。

ID:MRK0sr

トピ主です。昨日から引き続きありがとうございます!また、コードのサンプルも大変ありがたいです!

h1beforeのところとh1spanのところは何のために存在してるのですか?inline blockやalign middle自体は理解出来るものの、どうそれらが作用しているのかよくわかりません。特に同じような設定が繰り返されてるあたりが。。。

また、このサンプルコードでは、記事タイトルの文字数、行数と画像サイズが固定値ではなく、変動しても上手く行くものなのでしょうか?

まだcss勉強中なので早く人のソースから学べる力を身につけられるようになりたいです!

お力になっていただきありがとうございます!

ID:MRK0sr

imgのcssもポイントなのでしょうか。あの設定があるから後続の要素が縦横中央表示されるための下準備が一つ整うのでしょうか。ポジションの各値にauto以外の値を入れると全体に範囲が広がるみたいな話は昨日調べ物をしていて知りました。

ID:5A06m7

ttp://codepen.io/anon/pen/kFwAH
頂いたコードで試してみているのですが、画像のサイズがウィンドウ幅に応じて拡大縮小されるフロードイメージの場合、テキストが真ん中にならないようです。

ID:oI3Oql さんの回答

display:table-cellでやってみた。IE8+で複数行対応。
cssはsassでスマンがこんな感じ。
.
<div class="articleTitleWrap">
<div class="articleTitle">
<h1 class="title">titletitletitletitletitle<br>titletitletitletitletitletitle<br>titletitletitle</h1>
<img src="ttp://placeimg.com/200/200/any" alt="">
</div>
</div>
.
.articleTitleWrap {
position: relative;
.articleTitle {
position: relative;
display: table-cell;
width: 200px;
height: 200px;
line-height: 0;
text-align: center;
vertical-align: middle;
h1 {
position: relative;
display: inline;
color: #fff;
line-height: 1.6;
z-index: 2;
}
img {
position: absolute;
top: 0px;
left: 0px;
}
}
}
.
width,heightを%にすればフルードイメージでもいけるはず。

ID:oI3Oql

書いてみたらすげー見にくかったからやっぱ普通のCSSで。
.articleTitleWrap { position: relative; }
.articleTitleWrap .articleTitle { position: relative; display: table-cell; width: 200px; height: 200px; line-height: 0; text-align: center; vertical-align: middle; }
.articleTitleWrap .articleTitle h1 { position: relative; display: inline; color: #fff; line-height: 1.6; z-index: 2; }
.articleTitleWrap .articleTitle img { position: absolute; top: 0px; left: 0px; }

ID:5A06m7

ありがとうございます!SASSは全く触った事が無いのでわからないのですが、通常のcssに直すとこんなかんじでしょうか?うまく表示されてないので間違ってるっぽいですが。。。ttp://codepen.io/anon/pen/vcgBh

ID:5A06m7

あ、時間差で修正頂いていた。ありがとうございます。今からためしてみます!

ID:5A06m7

.articleTitleWrap .articleTitleの部分にwidthとheightが固定値で設定されていたのですが、これはやっぱり外してしまうとダメなのでしょうか?外してしまうとテキストが上に表示されてしまうみたいです。
ttp://codepen.io/anon/pen/vcgBh

ID:oI3Oql

あーほんとだね。。。
widthは%でも大丈夫だけど、heightは固定値じゃないとvertical-align: middle;が上手く効いてくれないみたいだ。
.
どうしてもフルードイメージ/グリッドにしたいなら、JSで動的にpxを設定してやるしかないかもしれないね。

ID:oI3Oql

もしくは、横方向限定のフルードでもいいかもしれない。
はみ出た部分はoverflow:hidden;で隠す感じで。

ID:5A06m7

ありがとうございます。いろいろと試して頂いてm(_ _)m
こちらの参考にしてるttps://www.hyperisland.com/communityはjs使って動的にサイズ変更しているのでしょうか?どうもcssだけで対応出来ているように感じるのですが。

ID:GLG5Zp

↑あげてるその参考サイトも親要素の高さは固定になってるでしょ。フルードイメージじゃないからね

ID:5A06m7

あ、高さ固定の件、本当ですね。気付きませんでした。。。ie8対応を考えるならばcssだけだと無理なのですね。。。

ID:oI3Oql

ただのフルードイメージ/グリッドだけならcssだけでie8の対応も出来るんだけど、この場合縦方向中央揃えでどうしても高さを指定しなければならないから難しいかも。
パフォーマンスは遅くなるけど、JS使ったほうがブラウザ対応は確実だろうね。

ID:MRK0sr

なるほどー。ありがとうございます!

ID:GwwbqS さんの回答

疑似要素でどうにかやってみました。
IE8はテストしてないけど、IE8ダメなプロパティは使ってないつもり。

<div class="wrapper">
<div class="articleTitle">
<h1 class="title">動的に書き出される記事タイトル</h1>
<img src="記事のサムネイル画像.jpg">
</div>
</div>
<style>
.wrapper {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
.articleTitle {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
white-space: nowrap;
}
.title {
width: 100%;
display: inline-block;
vertical-align: middle;
text-align: center;
white-space: normal;
}
.articleTitle:after {
content: ’ ’;
width: 1px;
height: 100%;
vertical-align: middle;
display: inline-block;
}
.articleTitle img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
}
</style>

どうでしょう?
.wrapperの外側(bodyとか)の縦横比と画像の縦横比が合わないと、画像が変形しちゃうと思うけど・・・。
変形させずにクリップしたいなら、imgもdivで囲って何かすればいけるかも。

ID:FeN2CX

あれ?マッチロ

ID:GwwbqS

ああ、シングルクオートが全角に変換されてた・・・

.articleTitle:after {
content: " ";

で大丈夫かな?

ID:taKUIz さんの回答

IE8も対応させたいなら、そのデザインを捨てるというのが正解かもな。

最終更新日:2014-08-23 (4,981 views)

関連するトピックス

ページ上部に戻る