回答編集履歴

2

shrink is better

2022/09/27 14:36

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -61,6 +61,9 @@
61
61
  .text { width: calc(100% - 150px); }
62
62
  ```
63
63
 
64
+ **追記:**
65
+ 他の回答者様の.image-profileに`flex-shrink: 0`をつける方法の方がスマートだと感じました…!
66
+
64
67
  ##### 画像エリア(画像と文字をいれるコンテイナー)の設定
65
68
  `.image-porofile`の縦横を150pxに指定する以外に以下のことをします。
66
69
  - `position:relative`

1

詳細追加

2022/09/27 14:29

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -1,13 +1,12 @@
1
- 取り急ぎ、こんな感じでどうでょう?詳細解説後ほど更新ます
1
+ デモページを作成併せてご覧ください。
2
+ - [Demo on JSFiddle](https://jsfiddle.net/4tgmc07h/1)
2
3
 
3
- デモ
4
+ ### コード例
4
- https://jsfiddle.net/tsgxwofj/42/
5
-
6
5
  ```html
7
6
  <div class="box">
8
7
  <div class="image-profile">
9
8
  <img class="image" src="https://placehold.jp/150x150.png" alt="" width="100px" height="100px">
10
- <div class="profile">男性</div>
9
+ <div class="profile">男性</div>
11
10
  </div>
12
11
  <div class="text">ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。ここにテキストを入れます。</div>
13
12
  </div>
@@ -23,32 +22,70 @@
23
22
  }
24
23
 
25
24
  .image-profile {
26
- width: 150px; /* add */
25
+ width: 150px; /* 画像と文字を入れるコンテイナーのサイズ指定 */
27
- height: 150px; /* add */
26
+ height: 150px; /* 画像と文字を入れるコンテイナーのサイズ指定 */
28
- margin-right: 10px; /* add */
27
+ margin-right: 10px; /* コンテイナーと文章の間の余白 */
29
- position: relative; /* add */
28
+ position: relative; /* 子要素の移動の基点に設定する */
30
29
  background-color: white;
31
30
  border-radius: 50%;
32
- overflow: hidden; /* add */
31
+ overflow: hidden; /* 子要素のはみ出た部分は非表示にする */
33
32
  }
34
33
 
35
34
  .image {
36
- width: 100%; /* add */
35
+ width: 100%; /* コンテイナーの横幅いっぱい(150%) */
37
- height: 100%; /* add */
36
+ height: 100%; /* コンテイナーの高さいっぱい(150%) */
38
- object-fit: cover;
37
+ object-fit: cover; /* ↑の指定だけだと、長方形の画像の場合縦横比が崩れた形で変形されてしまうので、親要素の形状に切り抜かれるようにする */
39
38
  /* padding: 10px; */
40
39
  /* margin: 10px; */
41
40
  }
42
41
 
43
42
  .profile {
44
- position: absolute; /* add */
43
+ position: absolute; /* 親要素の上に重ねる */
45
- left: 50%; /* add */
44
+ left: 50%; /* 左から50%の位置に移動(つまり右に移動) */
46
- bottom: 10px; /* add */
45
+ bottom: 10px; /* 下から10pxの位置に移動 */
47
- transform: translateX(-50%); /* add */
46
+ transform: translateX(-50%); /* 右に行き過ぎているので、文字の長さの半分だけ左に移動 */
48
47
  text-align: center;
49
48
  }
50
49
 
51
50
  .text {
52
- width: calc(100% - 150px); /* add */
51
+ width: calc(100% - 150px); /* 文章エリアの横幅は、親要素全体の幅から画像の幅を引いたもの */
53
52
  }
54
53
  ```
54
+
55
+ ### 解説
56
+ ##### 画像エリアと文章エリアの横幅を決める
57
+ - `.image-profile`の横幅が150pxなので、
58
+ - `.text`の横幅は、`.box`全体の横幅から150pxを引いたものになります。
59
+ これをCSSに計算させてやるために`calc()`を使用し、以下のように記述します。
60
+ ```css
61
+ .text { width: calc(100% - 150px); }
62
+ ```
63
+
64
+ ##### 画像エリア(画像と文字をいれるコンテイナー)の設定
65
+ `.image-porofile`の縦横を150pxに指定する以外に以下のことをします。
66
+ - `position:relative`
67
+ - 子要素を`position: absolute`で座標による移動をする時に、画像エリアが基点となるように指定するため`position: relative`を指定します。
68
+ - これをかかないと、子要素はbodyを起点に座標移動してしまいます。
69
+ - `border-radius: 50%` & `overflow: hidden`
70
+ - コンテイナー自体を丸い形にし、はみ出た子要素の部分は非表示にするようにします。
71
+ - これにより、画像も文字もまる形からはみ出た部分は非表示にになります。
72
+
73
+ ##### 画像のサイズを指定する
74
+ - `.image`にて縦横のサイズを100%としました。これによりコンテイナーサイズと同じサイズ(=150px)となります。
75
+ - このままだと長方形の画像だと、縦横150pxに併せてぐちゃっと変形した画像になってしまいます。
76
+ - `object-fit: cover`をつけると、変形ではなく、指定したサイズに切り抜かれます。
77
+ - つまり今回の場合150px x 150pxに切り抜かれます。
78
+
79
+ ##### 文字を移動させる
80
+ `.profile`の文字を、コンテイナーに対して水平は中央、垂直は下の方移動させます。
81
+ - `position: absolute`を指定すると、基点から座標移動できます。
82
+ - デフォルトでは基点は`<body>`なのですが、
83
+ - 今回は事前にコンテイナーの.image-profileに`position: relative`を書いておいたので、それが基準となります。
84
+ - ちなみにpositionはデフォルトでは`position: static`であり、static以外だったらrelativeに限らず何でも起点となれます。
85
+ - `bottom: 10px`で、コンテイナーの下から10pxの場所を指定。
86
+ - 水平要素を中央寄せするために以下のことをしています。
87
+ - `left: 50%`で文字の左端が、中央にいくようにしています。
88
+ - こんな感じ→`[----------|text------]`
89
+ - これだと行き過ぎているので、文字の長さの半分だけ左に戻してやります。
90
+ - こんな感じ→`[--------te|xt--------]`
91
+ - そのための記述が`transform: translateX(-50%)`です。