回答編集履歴

1

追記

2019/03/11 19:29

投稿

AGadget
AGadget

スコア60

test CHANGED
@@ -13,3 +13,201 @@
13
13
 
14
14
 
15
15
  重ねて、ありがとうございました。
16
+
17
+
18
+
19
+ -- 追記 --
20
+
21
+ 解決方法について記載致します。
22
+
23
+
24
+
25
+ 当質問の意図は「height:auto; のときtransitionを使って、アニメーションをさせる方法は無いか」というものでした。
26
+
27
+ 結果としてはheightプロパティをautoにしたままtransitionさせることはできないので、max-heightプロパティをJavaScriptで操作して疑似的(?)に動かせるようになりました。
28
+
29
+ サンプルが文末に乗っていますので参考までに。
30
+
31
+
32
+
33
+ 考え方としては次の通りです。
34
+
35
+
36
+
37
+ 1) height:auto; で transition を使って手軽にアニメーションさせたいが不可能なので動かしたい対象の max-height を 0px にすることで height:0px; にしたみたいに隠す(overflow:hidden; も必要)。
38
+
39
+
40
+
41
+ 2) クリック、あるいはホバーしたときアニメーションを開始。まずは対象が完全に伸び切った後の height が知りたいので max-height:none; と getBoundingClientRect でheightを知り、変数に代入しておく
42
+
43
+
44
+
45
+ 3) 一旦 max-height を 0px にして閉じ、先の変数の値に従って伸ばそうとする……と原因は分かりませんが正常に動作しないので setTimeout で 1ミリ秒待ってから伸ばします
46
+
47
+
48
+
49
+ 4) transition-durationプロパティの値だけ setTimeout で待ってからmax-height:none; を当てることでheight上限値が無くなり、height:auto; が効いたレスポンシブ(?)な挙動になります。
50
+
51
+
52
+
53
+ 以上
54
+
55
+
56
+
57
+ ```HTML
58
+
59
+ <body>
60
+
61
+ <section>
62
+
63
+ <div class="section_head"</div>
64
+
65
+ <h1>ハンバーグの作り方</h1>
66
+
67
+ </div>
68
+
69
+ <div class="section_body">
70
+
71
+ <p>ハンバーグ0、ハンバーグ1、ハンバーグ2、ハンバーグ3、
72
+
73
+ ハンバーグ4、ハンバーグ5、ハンバーグ6、ハンバーグ7、
74
+
75
+ ハンバーグ8、ハンバーグ9、ハンバーグA、ハンバーグB、
76
+
77
+ ハンバーグC、ハンバーグD、ハンバーグE、ハンバーグF
78
+
79
+ </p>
80
+
81
+ </div>
82
+
83
+ </section>
84
+
85
+ </body>
86
+
87
+ ```
88
+
89
+ ```CSS
90
+
91
+ @charset "utf-8";
92
+
93
+ *{
94
+
95
+ border: none;
96
+
97
+ font: normal normal normal 15px normal sans-serif;
98
+
99
+ list-style: none;
100
+
101
+ margin: 0px;
102
+
103
+ outline: none;
104
+
105
+ padding: 0px;
106
+
107
+ text-decoration: none;
108
+
109
+ }
110
+
111
+ .section_body{
112
+
113
+ overflow: hidden;
114
+
115
+ transition: all 0.5s 0s ease;
116
+
117
+ }
118
+
119
+ .section_head{
120
+
121
+ background: rgb(255, 153, 102);
122
+
123
+ }
124
+
125
+ h1{
126
+
127
+ color: rgb(255, 255, 255);
128
+
129
+ }
130
+
131
+ p{
132
+
133
+ margin: 10px;
134
+
135
+ }
136
+
137
+ section{
138
+
139
+ border: solid 5px rgb(255, 153, 102);
140
+
141
+ margin: 10px;
142
+
143
+ }
144
+
145
+ ```
146
+
147
+ ```JavaScript
148
+
149
+ onload = () => {
150
+
151
+ let open_close;
152
+
153
+ let rect;
154
+
155
+ const section = document.querySelectorAll("section");
156
+
157
+ const section_body = document.querySelectorAll(".section_body");
158
+
159
+ const section_head = document.querySelectorAll(".section_head");
160
+
161
+ for(let i = 0; i < section.length; i++){
162
+
163
+ section_body[i].style.maxHeight = "0px";
164
+
165
+ section_head[i].addEventListener("click", () => {
166
+
167
+ if(section_body[i].style.maxHeight === "0px"){
168
+
169
+ section_body[i].style.maxHeight = "none";
170
+
171
+ rect = section_body[i].getBoundingClientRect();
172
+
173
+ section_body[i].style.maxHeight = "0px";
174
+
175
+ open_close = () => {
176
+
177
+ section_body[i].style.maxHeight = rect.height + "px";
178
+
179
+ }
180
+
181
+ setTimeout(open_close, 1);
182
+
183
+ open_close = () => {
184
+
185
+ section_body[i].style.maxHeight = "none";
186
+
187
+ }
188
+
189
+ setTimeout(open_close, 500);
190
+
191
+ }else{
192
+
193
+ rect = section_body[i].getBoundingClientRect();
194
+
195
+ section_body[i].style.maxHeight = rect.height + "px";
196
+
197
+ open_close = () => {
198
+
199
+ section_body[i].style.maxHeight = "0px";
200
+
201
+ }
202
+
203
+ setTimeout(open_close, 1);
204
+
205
+ }
206
+
207
+ });
208
+
209
+ }
210
+
211
+ }
212
+
213
+ ```