このような方法はいかがでしょうか。
- 左右ブロックの幅を同じにするため
flex-grow
を設定
- ブロックの内容を中央表示するため flexboxの
center
を使用
- 長さと位置が自由な区切り線には
background-image
でlinear-gradient
を使用
CSSのborder
は良くも悪くも要素の外枠の長さぴったりでしか描けません。しかし、background-image
とlinear-gradient
を使えば、ボーダーのような物が長さ自由で描けるので、それを利用します。
実現すると、以下のようなコードになります。
HTML
1<div class="info">
2 <p class="name">データ</p>
3 <div class="item">
4 <div>
5 <p>テスト</p>
6 <p>項目1:数学</p>
7 <p>項目2:英語</p>
8 </div>
9 </div>
10</div>
CSS
1.info {
2 display: flex;
3 flex-flow: row nowrap;
4 justify-content: space-between;
5 align-items: stretch;
6 background-color: #F5F5F5;
7 border: solid 1px #C4C4C4;
8}
9
10.name,
11.item {
12 display: flex;
13 flex-flow: row nowrap;
14 justify-content: center;
15 align-items: center;
16}
17
18.name {
19 flex-grow: 1;
20 flex-shrink: 1;
21 min-width: calc(50% + 1px);
22 max-width: calc(50% + 1px);
23 margin: 0;
24 padding: 0 1px 0 0;
25 background-image: linear-gradient(#C4C4C4, #C4C4C4);
26 background-repeat: no-repeat;
27 background-size: 1px 80%;
28 background-position: right center;
29}
30
31.item {
32 flex-grow: 1;
33 flex-shrink: 1;
34}
これですと、仮にユーザーがブラウザのウィンドウサイズを変更し、info
クラスdiv
要素の幅が変わったとしても、区切り線は(ほぼ)中央位置のままです。
なお、name
クラスp
要素の範囲内で背景として線を描くため、そのままですと、この区切り線は完全な中心線ではなく、name
クラスp
要素に1px
分寄った線になります。
その対策として、name
クラスにpadding-right: 1px;
を設定し、name
クラスの幅をitem
クラスより1px
分大きくして、区切り線が中心にくるように調整しています。
とはいえ、今回はwidth
関連の値に%
を用いたため、描画時に値が算出される際に小数点以下がどう処理されるかによって、若干中央からズレる可能性はあります。
ちなみに、background-image
にはlinear-gradient
を複数設定できますので、区切り線を2本線や3本線にカスタマイズすることも可能です。
例えば以下は、2本線にする場合の.name
です。
CSS
1.name {
2 flex-grow: 1;
3 margin: 0;
4 padding: 0 4px 0 0;
5 background-image: linear-gradient(#C4C4C4, #C4C4C4),
6 linear-gradient(#C4C4C4, #C4C4C4);
7 background-repeat: no-repeat;
8 background-size: 1px 80%, 1px 80%;
9 background-position: right center, calc(100% - 4px) center;
10}
#####追記:flexにしたp要素のテキスト位置について
p
要素の内容物であるテキストは、それ自体は要素ではありませんが、独自の表示範囲を持っています。p
要素をflex
にすると、p
要素のテキストと(存在する場合は)擬似要素のbefore
とafter
の内容が、flex
設定通りに表示されます。
上のコードの一部を、以下のように変更して、どう表示されるか試してみてください。
HTML
1<p class="name">データ<br>デー<br>デ</p>
CSS
1/* 既存の.nameに追加で */
2.name {
3 text-align: left;
4}
5
6.name::before {
7 content: 'before';
8 background-color: gold;
9}
10
11.name::after {
12 content: 'after';
13 background-color: lightskyblue;
14}
p
要素のbefore
、テキスト、after
が、flex
設定によりcenter
にrow
並びで表示され、テキスト自体はテキスト範囲内で左揃えに表示されているのが確認できるかと思います。
.name
のtext-align
をright
やcenter
に変更してみると、テキスト枠内で文字が整列されるのがより明確に分かるでしょう。
なおテキストは、このように要素の設定で位置を制御することも可能ですが、テキスト自体は要素ではないため直接制御することはできません。
テキストを個別に装飾したい場合は、span
タグ等で囲み、要素化する必要があります。
一度、以下のようなシンプルなテストコードを使って、デフォルトのp
要素とテキストの背景に色を付けてtext-align
がleft
、center
、right
の時の各位置を見ておくと、flex設定時との違いがよく分かるかもしれません。
HTML
1<p style="background-color: mistyrose; text-align: center;"><span style="background-color: lightskyblue;">テキスト</span></p>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/09 03:28 編集
2020/09/09 15:49
2020/09/10 10:37