質問編集履歴

5

修正

2021/09/30 12:52

投稿

noel0718
noel0718

スコア20

test CHANGED
File without changes
test CHANGED
@@ -494,8 +494,6 @@
494
494
 
495
495
  _this.__Flag_open = true;
496
496
 
497
- $('html').addClass('is-open');
498
-
499
497
  },
500
498
 
501
499
  close: function close() {
@@ -504,15 +502,13 @@
504
502
 
505
503
  _this.__Flag_open = false;
506
504
 
507
- $('html').removeClass('is-open');
508
-
509
505
  //うまくいかない記述
510
506
 
511
507
  $('.l-header__menu .js-accordion').removeClass('is-active');
512
508
 
513
509
  $('.l-header__menu .js-accordion').addClass('is-hidden');
514
510
 
515
- $('.l-header__menu .js-accordion__tab').attr("aria-expanded", false);
511
+ $('.l-header__menu .js-accordion__trigger').attr("aria-expanded", false);
516
512
 
517
513
  $('.l-header__menu .js-accordion__panel').attr("aria-hidden", true);
518
514
 
@@ -526,4 +522,10 @@
526
522
 
527
523
  }
528
524
 
525
+
526
+
527
+ class Accordion {
528
+
529
+ }
530
+
529
531
  ```

4

追記

2021/09/30 12:52

投稿

noel0718
noel0718

スコア20

test CHANGED
File without changes
test CHANGED
@@ -324,120 +324,206 @@
324
324
 
325
325
  ```
326
326
 
327
+
328
+
329
+ ####追記1
330
+
331
+
332
+
333
+ 1点、実装中にうまくいかないことがありました。
334
+
335
+ スマホの際、ヘッダーのメニュー内にアコーディオンがあります。メニューを開いた後にアコーディオンを開き、メニューを閉じるとアコーディオンも開じるようにしたいです。開いたままですと、メニュー内の文字のアニメーションができなくなることが判明しました。
336
+
337
+
338
+
339
+ メニューを閉じた際にアコーディオンも閉じる処理を無理矢理書いたのですが、アコーディオンのjavascriptでの判定ですと閉じていないため、再度メニューを開いた際に2度クリックしないとアコーディオンが開かないのが現状となります。
340
+
341
+
342
+
343
+ ```html
344
+
345
+ <header class="l-header" role="banner">
346
+
347
+ <div class="l-header__inner">
348
+
349
+ <div class="l-header__menu">
350
+
351
+ <div class="l-header__menu-inner">
352
+
353
+ <nav class="l-header__menu-nav">
354
+
355
+ <ul class="l-header__menu-nav-list">
356
+
357
+ <li class="l-header__menu-nav-item">
358
+
359
+ <div class="c-accordion js-accordion">
360
+
361
+ <button type="button" class="c-accordion__trigger js-accordion__trigger">
362
+
363
+ <span class="c-headline-lv2">アコーディオンタイトル</span>
364
+
365
+ </button>
366
+
367
+ <div class="c-accordion__panel js-accordion__panel">
368
+
369
+ <div class="c-accordion__content">
370
+
371
+ <p>この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。</p>
372
+
373
+ </div>
374
+
375
+ </div>
376
+
377
+ </div>
378
+
379
+ <div class="c-accordion js-accordion">
380
+
381
+ <button type="button" class="c-accordion__trigger js-accordion__trigger">
382
+
383
+ <span class="c-headline-lv2">アコーディオンタイトル</span>
384
+
385
+ </button>
386
+
387
+ <div class="c-accordion__panel js-accordion__panel">
388
+
389
+ <div class="c-accordion__content">
390
+
391
+ <p>この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。</p>
392
+
393
+ </div>
394
+
395
+ </div>
396
+
397
+ </div>
398
+
399
+ </li>
400
+
401
+ </ul>
402
+
403
+ </nav>
404
+
405
+ </div>
406
+
407
+ </div>
408
+
409
+ <button type="button" class="l-header__hamburger">
410
+
411
+ <span class="l-header__hamburger-inner">
412
+
413
+ <span class="l-header__hamburger-bars">
414
+
415
+ <span class="l-header__hamburger-bar"></span>
416
+
417
+ <span class="l-header__hamburger-bar"></span>
418
+
419
+ <span class="l-header__hamburger-bar"></span>
420
+
421
+ </span>
422
+
423
+ </span>
424
+
425
+ </button>
426
+
427
+ </div>
428
+
429
+ </header>
430
+
431
+ ```
432
+
433
+
434
+
327
435
  ```javascript
328
436
 
329
- class Accordion {
437
+ $(function () {
438
+
330
-
439
+ menu.onInit();
440
+
441
+ });
442
+
443
+
444
+
445
+ // ----------------------------------------
446
+
447
+ // メニュー
448
+
449
+ // ----------------------------------------
450
+
331
- constructor(element) {
451
+ const menu = {
332
-
452
+
333
- this.element = element;
453
+ onInit: function onInit() {
334
-
335
- this.tabs = this.element.querySelector('.js-accordion__trigger');
454
+
336
-
337
- this.panels = this.element.querySelector('.js-accordion__panel');
338
-
339
- this.isOpen = false;
455
+ this.__Flag_open = false;
456
+
340
-
457
+ this.$menu = $(".l-header__menu");
458
+
459
+ this.$button = $(".l-header__hamburger");
460
+
341
- this.height = 0;
461
+ $(document).on({
462
+
342
-
463
+ click() {
464
+
465
+ if (!menu.__Flag_open) {
466
+
343
- this.events();
467
+ menu.open();
468
+
344
-
469
+ } else {
470
+
345
- this.close();
471
+ menu.close();
472
+
473
+ }
474
+
475
+ },
476
+
477
+ }, '.l-header__hamburger');
478
+
479
+ $(document).on({
480
+
481
+ click() {
482
+
483
+ menu.close();
484
+
485
+ },
486
+
487
+ }, '.l-header__menu a[href]');
488
+
489
+ },
490
+
491
+ open: function open() {
492
+
493
+ const _this = this;
494
+
495
+ _this.__Flag_open = true;
496
+
497
+ $('html').addClass('is-open');
498
+
499
+ },
500
+
501
+ close: function close() {
502
+
503
+ const _this = this;
504
+
505
+ _this.__Flag_open = false;
506
+
507
+ $('html').removeClass('is-open');
508
+
509
+ //うまくいかない記述
510
+
511
+ $('.l-header__menu .js-accordion').removeClass('is-active');
512
+
513
+ $('.l-header__menu .js-accordion').addClass('is-hidden');
514
+
515
+ $('.l-header__menu .js-accordion__tab').attr("aria-expanded", false);
516
+
517
+ $('.l-header__menu .js-accordion__panel').attr("aria-hidden", true);
518
+
519
+ $('.l-header__menu .js-accordion__panel').css({
520
+
521
+ maxHeight: "",
522
+
523
+ });
346
524
 
347
525
  }
348
526
 
349
- events() {
350
-
351
- this.tabs.addEventListener('click', this.handleClick.bind(this));
352
-
353
- this.panels.addEventListener('transitionend', this.handleTransition.bind(this));
354
-
355
- }
527
+ }
356
-
357
- handleClick() {
358
-
359
- if (this.isOpen) {
360
-
361
- this.close();
362
-
363
- } else {
364
-
365
- this.open();
366
-
367
- this.height = this.panels.scrollHeight;
368
-
369
- console.log(this.height);
370
-
371
- }
372
-
373
- }
374
-
375
- open() {
376
-
377
- this.isOpen = true;
378
-
379
- this.element.classList.add('is-active');
380
-
381
- this.element.classList.remove('is-hidden');
382
-
383
- this.panels.style.maxHeight = `${0}px`;
384
-
385
- this.tabs.setAttribute('aria-expanded', "true");
386
-
387
- this.panels.setAttribute('aria-hidden', "false");
388
-
389
- setTimeout(() => {
390
-
391
- this.panels.style.maxHeight = `${this.height}px`;
392
-
393
- }, 1);
394
-
395
- }
396
-
397
- close() {
398
-
399
- this.isOpen = false;
400
-
401
- this.element.classList.remove('is-active');
402
-
403
- this.panels.style.maxHeight = `${this.height}px`;
404
-
405
- this.tabs.setAttribute('aria-expanded', "false");
406
-
407
- this.panels.setAttribute('aria-hidden', "true");
408
-
409
- setTimeout(() => {
410
-
411
- this.panels.style.maxHeight = `${0}px`;
412
-
413
- }, 1);
414
-
415
- }
416
-
417
- handleTransition() {
418
-
419
- if (!this.isOpen) {
420
-
421
- this.element.classList.add('is-hidden');
422
-
423
- }
424
-
425
- this.panels.style.maxHeight = '';
426
-
427
- }
428
-
429
- }
430
-
431
- Array.from(document.querySelectorAll('.js-accordion')).forEach((el) => {
432
-
433
- new Accordion(el, {
434
-
435
- tabs: this.tabs,
436
-
437
- panels: this.panels
438
-
439
- });
440
-
441
- });
442
528
 
443
529
  ```

3

修正

2021/09/30 12:39

投稿

noel0718
noel0718

スコア20

test CHANGED
File without changes
test CHANGED
@@ -30,6 +30,8 @@
30
30
 
31
31
  処理の分岐をどうしていいかわからなくなりました。
32
32
 
33
+
34
+
33
35
  もし書き方がわかる方がいましたら、教えていただけますと幸いです。
34
36
 
35
37
 

2

誤字

2021/09/20 08:19

投稿

noel0718
noel0718

スコア20

test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  今javascriptでできているの処理は通常のアコーディオンになります。
22
22
 
23
- アコーディオンの中にアコーディオンがあるパターンやtriggerとcontentが同階層にない場合も想定してうまく動いています。
23
+ アコーディオンの中にアコーディオンがあるパターンやtriggerとpanelが同階層にない場合も想定してうまく動いています。
24
24
 
25
25
  よくあるslideDownやslideUpのやり方ではなくmax-heightを使ったアコーディオンの処理としています。
26
26
 

1

誤字

2021/09/19 09:35

投稿

noel0718
noel0718

スコア20

test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  htmlにis-activeというクラスをつけて、
8
8
 
9
- 開いた状態にしたいです。
9
+ 最初から開いた状態にしたいです。
10
10
 
11
11
 
12
12