回答編集履歴
2
shrink is better
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
詳細追加
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
|
-
|
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; /*
|
25
|
+
width: 150px; /* 画像と文字を入れるコンテイナーのサイズ指定 */
|
27
|
-
height: 150px; /*
|
26
|
+
height: 150px; /* 画像と文字を入れるコンテイナーのサイズ指定 */
|
28
|
-
margin-right: 10px; /*
|
27
|
+
margin-right: 10px; /* コンテイナーと文章の間の余白 */
|
29
|
-
position: relative; /*
|
28
|
+
position: relative; /* 子要素の移動の基点に設定する */
|
30
29
|
background-color: white;
|
31
30
|
border-radius: 50%;
|
32
|
-
overflow: hidden; /*
|
31
|
+
overflow: hidden; /* 子要素のはみ出た部分は非表示にする */
|
33
32
|
}
|
34
33
|
|
35
34
|
.image {
|
36
|
-
width: 100%; /*
|
35
|
+
width: 100%; /* コンテイナーの横幅いっぱい(150%) */
|
37
|
-
height: 100%; /*
|
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; /*
|
43
|
+
position: absolute; /* 親要素の上に重ねる */
|
45
|
-
left: 50%; /*
|
44
|
+
left: 50%; /* 左から50%の位置に移動(つまり右に移動) */
|
46
|
-
bottom: 10px; /*
|
45
|
+
bottom: 10px; /* 下から10pxの位置に移動 */
|
47
|
-
transform: translateX(-50%); /*
|
46
|
+
transform: translateX(-50%); /* 右に行き過ぎているので、文字の長さの半分だけ左に移動 */
|
48
47
|
text-align: center;
|
49
48
|
}
|
50
49
|
|
51
50
|
.text {
|
52
|
-
width: calc(100% - 150px); /*
|
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%)`です。
|