2016-06-20 15 views
1

数字と2つのテキスト領域を連続して表示したい。子が親の全高と垂直方向の中央のテキストにする

数字は「ボックス」内にある必要があります。バックグラウンドは行の高さで、その数字は「ボックス」内で縦と横の中央に表示されます。

私はでposition: absolute; top: 0, left: 0のようなことをすることができると知っていますが、これはドキュメントの流れからそれを引き出します。テキストは、実際の番号が中央に配置されません。

* { 
 
    box-sizing: border-box; 
 
} 
 
.container { 
 
    width: 40%; 
 
} 
 
.number { 
 
    background: skyblue; 
 
    /*position: absolute;*/ 
 
    top: 0; 
 
    bottom: 0; 
 
    vertical-align: middle; 
 
} 
 
.row > div { 
 
    display: inline-block; 
 
    vertical-align: top; 
 
} 
 
.row { 
 
    background: lightgreen; 
 
    position: relative; 
 
}
<div class="container"> 
 
    <div class="row"> 
 
    <div class="number">10</div> 
 
    <div class="textArea"> 
 
     <div class="companyName">Top title</div> 
 
     <div class="industry">secondary text</div> 
 
    </div> 
 
    </div> 
 
</div>

EDIT 1:あなたはボックスは、コンテナの完全な高さではないことをスニペットで見ることができます。それは私が望むものではありません。

EDIT 2:グラデーションを使ってカンニングすることができますが、テキスト領域が数字ボックスの終点と一致するようにしなければなりません。 。

答えて

1

使用 flex display: table-cell

アップデート1:セルのパディングを使用せずに "余裕" を作成する方法を示し

アップデート2:プログレッシブ・エンハンスメントを表示使用する場合flex ava ilable

*{ 
 
    box-sizing: border-box; 
 
} 
 
.container { 
 
    width: 40%; 
 
} 
 
.number{ 
 
    background: skyblue; 
 
} 
 
.row > div { 
 
    display: table-cell; 
 
    vertical-align: middle; 
 
} 
 
.row { 
 
    background: lightgreen; 
 
    position: relative; 
 
} 
 

 
/* 3 ways to create a left margin on textArea */ 
 
.row .textArea.nr1 { border-left: 10px solid transparent; } 
 
.row .textArea.nr2 { position: relative; left: 10px; } 
 
.row .textArea.nr3 { padding-left: 10px; } 
 

 
/* feature detect - use flex when available */ 
 
@supports (display: flex) { 
 
    .row > div { 
 
    display: block; 
 
    } 
 
    .row { 
 
    display: flex; 
 
    } 
 
    .row .number { 
 
    display: flex; 
 
    align-items: center; 
 
    } 
 
}
<div class="container"> 
 
    <div class="row"> 
 
    <div class="number">10</div> 
 
    <div class="textArea nr1"> 
 
     <div class="companyName">Top title</div> 
 
     <div class="industry">secondary text</div> 
 
    </div> 
 
    </div> 
 
</div> 
 

 
<div class="container"> 
 
    <div class="row"> 
 
    <div class="number">10</div> 
 
    <div class="textArea nr2"> 
 
     <div class="companyName">Top title</div> 
 
     <div class="industry">secondary text</div> 
 
    </div> 
 
    </div> 
 
</div> 
 

 
<div class="container"> 
 
    <div class="row"> 
 
    <div class="number">10</div> 
 
    <div class="textArea nr3"> 
 
     <div class="companyName">Top title</div> 
 
     <div class="industry">secondary text</div> 
 
    </div> 
 
    </div> 
 
</div>

+0

はうまく見えましたが、 'textArea'に余白を残しておきたい場合は動作しませんので、http://stackoverflow.com/questions/16398823/why-is-a-div-with-display-table-セルに影響されないマージンを設定し、行の周りにパディング効果を置きます。これは望ましくありません。どのようにマージンをつけますか? –

+0

@jackblank 3つの "マージン"の選択肢を含む私の答えを更新しました。 "padding-left"が含まれています。 – LGSon

+0

@jackblank簡単な機能の検出を使用して漸進的な拡張を得る方法を示すために私の答えを更新しました – LGSon

1

これを実現するにはflexboxを使用することができます。最新のブラウザーであればそれをサポートし、prefixesではIE10でも動作します。

* { 
 
    box-sizing: border-box; 
 
} 
 
.container { 
 
    width: 40%; 
 
} 
 
.row { 
 
    background: lightgreen; 
 
    display: flex; 
 
} 
 
.number { 
 
    background: skyblue; 
 
    display: flex; 
 
    align-items: center; 
 
}
<div class="container"> 
 
    <div class="row"> 
 
    <div class="number">10</div> 
 
    <div class="textArea"> 
 
     <div class="companyName">Top title</div> 
 
     <div class="industry">secondary text</div> 
 
    </div> 
 
    </div> 
 
</div>

それとも、それはあまりにもレガシーブラウザ上で動作するようになっCSSのテーブルを使用しています。

* { 
 
    box-sizing: border-box; 
 
} 
 
.container { 
 
    width: 40%; 
 
} 
 
.row { 
 
    background: lightgreen; 
 
    display: table; 
 
    width: 100%; 
 
} 
 
.number, 
 
.textArea { 
 
    display: table-cell; 
 
} 
 
.number { 
 
    background: skyblue; 
 
    white-space: nowrap; 
 
    vertical-align: middle; 
 
} 
 
.textArea { 
 
    width: 100%; 
 
}
<div class="container"> 
 
    <div class="row"> 
 
    <div class="number">10</div> 
 
    <div class="textArea"> 
 
     <div class="companyName">Top title</div> 
 
     <div class="industry">secondary text</div> 
 
    </div> 
 
    </div> 
 
</div>

+0

あなたは、生産のウェブサイトにフレキシボックスを使用していますか?ポリフィルなどが必要ですか?私はフレックスボックスの効果を見ることができないということを心配しています。フレックスボックスを使用するブラウザがないからです。それはより新しいです。技術。それに関するコメント? –

+0

はい、それはIE10 +で動作するプレフィックス付きで、あなたとあなたのプロジェクトに任されています。古いブラウザで動作させるには、CSS表レイアウトも提案しました。 – Stickers

+0

@jackblank多くの場合、現在のウェブサイトでは、[+ 90%のブラウザ対応](http://caniuse.com/#feat=flexbox)を使用しているため、多くの場合、フレックスボックスを本番ウェブサイトで使用しています。ユーザーフレンドリーなレイアウトをレンダリングするもっと柔軟な方法があるので、これはお勧めの方法です – LGSon

0

*{ 
 
    box-sizing: border-box; 
 
} 
 
.container{ 
 
    width: 40%; 
 
} 
 
.number{ 
 
    background: skyblue; 
 
    /*position: absolute;*/ 
 
    top: 0; 
 
    bottom: 0; 
 
    vertical-align: middle; 
 
    height: 40px; 
 
    padding-top: 11px; 
 
} 
 
.row > div{ 
 
    display: inline-block; 
 
    vertical-align: top; 
 
} 
 
.row{ 
 
    background: lightgreen; 
 
    position: relative; 
 
}
<div class="container"> 
 
\t \t <div class="row"> 
 
\t \t \t <div class="number">10</div> 
 
\t \t \t <div class="textArea"> 
 
          <div class="companyName">Top title</div> 
 
\t \t \t \t <div class="industry">secondary text</div> 
 
\t \t \t </div> 
 
\t \t </div> 
 

 
\t </div>

関連する問題