質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

5205閲覧

真ん中に区切り線を設置したい

study_111

総合スコア82

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2020/09/08 10:39

編集2020/09/08 10:48

2つの要素を左右に設置し、真ん中に区切り線を設置したいのですが、方法が分からないです。
具体的には、下記の画像のようにしたいと考えています。
イメージ説明

以下は現時点で作成しているコードになります。

html

1 <div class="info"> 2 <p class="name">データ</p> 3 <div> 4 <p>test</p> 5 <p>項目1:数学</p> 6 <p>項目2:英語</p> 7 </div> 8 </div>

css

1.name::after{ 2 content:""; 3 display:inline-block; 4 height:3rem; 5 background-color:red; 6 border: solid 1px; 7 } 8 .info{ 9 display: flex; 10 justify-content: space-around; 11 background-color: #F5F5F5; 12 border: solid 1px #C4C4C4; 13 14 }

after要素にheightを設定してみましたが、「テスト」の文字がどんどん下がっていってしまい、margin-leftを設定しても、バーが詰まってしまったような形であまり動かない状態です。

jsfiddleにて、動作確認可能な状態となっております為、こちらよりご確認頂けましたら幸いです。

ご助言の程、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

このような方法はいかがでしょうか。

  • 左右ブロックの幅を同じにするためflex-growを設定
  • ブロックの内容を中央表示するため flexboxのcenterを使用
  • 長さと位置が自由な区切り線にはbackground-imagelinear-gradientを使用

CSSのborderは良くも悪くも要素の外枠の長さぴったりでしか描けません。しかし、background-imagelinear-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要素のテキストと(存在する場合は)擬似要素のbeforeafterの内容が、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設定によりcenterrow並びで表示され、テキスト自体はテキスト範囲内で左揃えに表示されているのが確認できるかと思います。

display:flexのp要素内にあるbefore、テキスト、afterの例

.nametext-alignrightcenterに変更してみると、テキスト枠内で文字が整列されるのがより明確に分かるでしょう。

なおテキストは、このように要素の設定で位置を制御することも可能ですが、テキスト自体は要素ではないため直接制御することはできません。

テキストを個別に装飾したい場合は、spanタグ等で囲み、要素化する必要があります。

一度、以下のようなシンプルなテストコードを使って、デフォルトのp要素とテキストの背景に色を付けてtext-alignleftcenterrightの時の各位置を見ておくと、flex設定時との違いがよく分かるかもしれません。

HTML

1<p style="background-color: mistyrose; text-align: center;"><span style="background-color: lightskyblue;">テキスト</span></p>

投稿2020/09/08 21:51

編集2020/09/09 15:48
arenomarb

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

study_111

2020/09/09 03:28 編集

ご丁寧にご回答下さり、ありがとうございます。 「background-image」を使用し、縦線を描画する方法は、思い付きもしなかった為、このような方法があるのだなと大変勉強になりました。 更に、「flex-grow」を用いることで、widthを設定せずとも均等に幅を設定出来るといったことも、勉強になりました。 しかし、度々申し訳ないのですがCSSスタイル適用部分におきまして、どうしても分からない箇所がありお聞きしたいことがございます。 以下の部分では、.nameに対して、display:flexやjustify-content:の指定がありますが、こちらのプロパティは、子要素に対してのレイアウト調整のプロパティであると認識しております。 しかし、以下、スタイル指定から「.name」の指定を外すと、「データ」の文字が左上へとずれてしまいます。 こちらの現象は、親要素に指定していても、文字列などが指定されていた場合はその値に対しても適用が行われるということなのでしょうか...? 「.name, .item { display: flex; flex-flow: row nowrap; justify-content: center; align-items: center; } 」
arenomarb

2020/09/09 15:49

width関連をきちんと設定した方が動作は安定します。そのままですとflex-grow設定よりも内容の大きさが優先されますので、内容によってはレイアウトが崩れます。例えば、p要素のテキストが長文になると、p要素幅が広がり、区切り線は中央ではなくなります。 その崩れを防止する一例として、上のコードの.nameにmin-widthとmax-widthを加えておきました。また、場合によっては固定のwidthやflex-shrinkが役立つこともあります。flex-shrinkはデフォルト値が1なので今回は書く必要はありませんが、参考までに足しておきました。 p要素のテキスト位置についても回答に説明を追加しました。
study_111

2020/09/10 10:37

誠にご丁寧にご説明下さり、ありがとうございます。 自分はそもそも「calc」といった関数があることすら知らなかったので、本当に、色々と勉強になっております。 ご提示頂いたコードの、flexboxに関しましても、今までは要素を横並びにする為にだけ使っていたのですが、今回のように「.name」の「p」要素(display:flexを設定した要素)のテキストを上下左右中央揃えにする時にも使用出来ることは大変便利だと感じましたし、今後も使用していきたいと思いました。 さらには、今まで、例えば「display:flex」を設定した「.info」の子要素に対して、それぞれ「width:50%」を設定し同じ幅になるように指定していたのですが、こちらは、「flex-grow」を指定することで余った幅を分け合い、結果的に同じ幅を得ることが出来るというのも、本当に参考になりました。 今回、フロントエンドは覚えることが多く、難しく、奥が深いというのを痛感致しました。 教えて頂いたことを参考に、今後も勉強を続けていきたいと思います。
guest

0

ソースは変えずにCSSのみ修正してみました。
.infoブロック全体に疑似要素を使用しました。

css

1 .info { 2 display: flex; 3 position:relative; 4 justify-content: space-around; 5 background-color: #F5F5F5; 6 border: solid 1px #C4C4C4; 7 } 8  .info::after { 9 content: ''; 10 position: absolute; 11 top: 50%; 12 width: 1px; 13 height: 80%; 14 background-color: #C4C4C4; 15 transform: translate(0,-50%); 16 }

投稿2020/09/08 12:28

編集2020/09/08 12:32
progblog

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問