デモページを作成しました。併せてご覧ください。
コード例
html
1<div class="box">
2 <div class="image-profile">
3 <img class="image" src="https://placehold.jp/150x150.png" alt="" width="100px" height="100px">
4 <div class="profile">男性</div>
5 </div>
6 <div class="text">ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。</div>
7</div>
css
1.box {
2 display: flex;
3 padding: 10px;
4 background-color: aqua;
5 border-radius: 20px;
6 width: 100%;
7 height: auto;
8}
9
10.image-profile {
11 width: 150px; /* 画像と文字を入れるコンテイナーのサイズ指定 */
12 height: 150px; /* 画像と文字を入れるコンテイナーのサイズ指定 */
13 margin-right: 10px; /* コンテイナーと文章の間の余白 */
14 position: relative; /* 子要素の移動の基点に設定する */
15 background-color: white;
16 border-radius: 50%;
17 overflow: hidden; /* 子要素のはみ出た部分は非表示にする */
18}
19
20.image {
21 width: 100%; /* コンテイナーの横幅いっぱい(150%) */
22 height: 100%; /* コンテイナーの高さいっぱい(150%) */
23 object-fit: cover; /* ↑の指定だけだと、長方形の画像の場合縦横比が崩れた形で変形されてしまうので、親要素の形状に切り抜かれるようにする */
24 /* padding: 10px; */
25 /* margin: 10px; */
26}
27
28.profile {
29 position: absolute; /* 親要素の上に重ねる */
30 left: 50%; /* 左から50%の位置に移動(つまり右に移動) */
31 bottom: 10px; /* 下から10pxの位置に移動 */
32 transform: translateX(-50%); /* 右に行き過ぎているので、文字の長さの半分だけ左に移動 */
33 text-align: center;
34}
35
36.text {
37 width: calc(100% - 150px); /* 文章エリアの横幅は、親要素全体の幅から画像の幅を引いたもの */
38}
解説
画像エリアと文章エリアの横幅を決める
.image-profile
の横幅が150pxなので、
.text
の横幅は、.box
全体の横幅から150pxを引いたものになります。
これをCSSに計算させてやるためにcalc()
を使用し、以下のように記述します。
css
1.text { width: calc(100% - 150px); }
追記:
他の回答者様の.image-profileにflex-shrink: 0
をつける方法の方がスマートだと感じました…!
画像エリア(画像と文字をいれるコンテイナー)の設定
.image-porofile
の縦横を150pxに指定する以外に以下のことをします。
position:relative
- 子要素を
position: absolute
で座標による移動をする時に、画像エリアが基点となるように指定するためposition: relative
を指定します。
- これをかかないと、子要素はbodyを起点に座標移動してしまいます。
border-radius: 50%
& overflow: hidden
- コンテイナー自体を丸い形にし、はみ出た子要素の部分は非表示にするようにします。
- これにより、画像も文字もまる形からはみ出た部分は非表示にになります。
画像のサイズを指定する
.image
にて縦横のサイズを100%としました。これによりコンテイナーサイズと同じサイズ(=150px)となります。
- このままだと長方形の画像だと、縦横150pxに併せてぐちゃっと変形した画像になってしまいます。
object-fit: cover
をつけると、変形ではなく、指定したサイズに切り抜かれます。
- つまり今回の場合150px x 150pxに切り抜かれます。
文字を移動させる
.profile
の文字を、コンテイナーに対して水平は中央、垂直は下の方移動させます。
position: absolute
を指定すると、基点から座標移動できます。
- デフォルトでは基点は
<body>
なのですが、
- 今回は事前にコンテイナーの.image-profileに
position: relative
を書いておいたので、それが基準となります。
- ちなみにpositionはデフォルトでは
position: static
であり、static以外だったらrelativeに限らず何でも起点となれます。
bottom: 10px
で、コンテイナーの下から10pxの場所を指定。
- 水平要素を中央寄せするために以下のことをしています。
left: 50%
で文字の左端が、中央にいくようにしています。
- こんな感じ→
[----------|text------]
- これだと行き過ぎているので、文字の長さの半分だけ左に戻してやります。
- こんな感じ→
[--------te|xt--------]
- そのための記述が
transform: translateX(-50%)
です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/27 15:00