アクセシビリティチェックってどうやってるの?ということで、実際にやってみた。(その2)

アクセシビリティチェックってどうやってるの?ということで、実際にやってみた。(その1)の続きです。

おさらい

  • 対象ページ:「アトリエ金工やまぐち」
  • チェック基準:WCAG 2.1レベルA
  • 文中のSCはSuccess Criteriaの略で達成基準のこと
  • 目的はどうやってアクセシビリティチェックしているのか、チェックしながら何を考えているのかを書き記すことです
    • 制作ページやチェック内容にネガティブなことをいいたいわけではありません
  • チェックに抜け漏れ、誤りがあるかもしれません
  • 仕様等は基本的に日本語訳を当たります

では続きを進めていきましょう。

モーダル出現ボタン

スクリーンショットですと、

HTMLソースとしては、

<button class="js-open-modal modal-btn-kenzo" id="modalOpenKenzo" data-slide-index="1">
  <span class="section-works__modal-button">
    <img src="assets/img/kenzo/plate4.jpg" class="section-works__modal-button-kenzo" alt="山口堅造「(作品タイトル)」">
  </span>
  <h3 class="section-works__kenzo">
    <span class="section-works__name">Kenzo</span><span class="section-works__break"></span>Yamaguchi
  </h3>
</button>

になります。Nu Html Checkerが既に指摘していますが、HTML構文上、<button>の子に<h3>を置くことはできません(SC 1.3.1「情報及び関係性」)。念のためHTML仕様を当たってみましょう。

<button>のコンテンツモデル:

フレージングコンテンツであるが、インタラクティブコンテンツの子孫およびtabindex属性が指定された子孫が存在してはならない。

カテゴリー「フレージングコンテンツ」は、<h3>を含んでいませんから、HTML構文違反となります(Nu Html Checkerの指摘のとおり)。

これは完全に余談なのですが、業務でチェックしていると、稀にインタラクティブなコンテンツをネストしているサイトに遭遇することがあります…HTMLの性質上、フォーカスを持つ要素の中にフォーカスを持つことはできません…。

さておき、それでは、この問題を修正するとすればどうすればよいでしょうか。コンテンツモデルを満たすように<a>にする、という選択肢が思い浮かぶかもしれません。ちょっと雑ですが、構造だけ抜き出して書き換えるとすると、こういう感じでしょうか:

<a href="#">
  <span>
    <img src="jpg" alt="山口堅造「(作品タイトル)」">
  </span>
  <h3>
    <span>Kenzo</span><span></span>Yamaguchi
  </h3>
</a>

しかし、<button>改め、<a>の中でも問題が残っています。<a>要素の内部という区切りを設けると*1<h3>という見出しがありますが、見出しの後にコンテンツが何もないという問題があります(SC 1.3.1)。

ここでHTML仕様を思い出しましょう。h1、h2、h3、h4、h5、h6要素にはこう定義されています。

これらの要素は、そのセクションの見出しを表す。

見出しは、見出しの後ろにコンテンツがあるからこそ見出しなのです。実コードでも<h3>の直後に<h3>が来てしまっているので、情報構造として困ったことになってしまっています。

また、見出しに先行して、見出しに関連する画像があるという問題もあります(SC 1.3.2「意味のあるシーケンス」)。見出しに関連する要素は、見出し要素の中で提供するか、見出し要素よりも後で提供するようにします。

ちなみに、この画像は装飾的なのではないかと思われますので、alt=""とするのが適当かと思われます。思われる、というのはチェックする人間(ここでは私)はコンテンツオーナーでもコンテンツ制作者でもないので、どういう意図でここに画像を置いたのかがわからないからです(その意味で条件付きのSC 1.1.1「非テキストコンテンツ」としてマーク)。

情報設計の時点で、どういう意図でここに画像を置くのか?目立たせて視覚的な誘導をしたいだけなのか、画像自体が意味を持つ・情報を提供するからここに置くのか…というのを考えて画像を置く必要があると言ったところでしょうか。これは裏を返せば、現場のコーダーが必要に迫られて代替テキストを適当に入れればよい、というものではないということですね…。

脇道にそれました。話を元に戻すと、つまるところ、<h3>とすることがそもそもの問題となっている、と捉えることができるわけですね。ですから、もろもろを勘案すると下記のようになるのがよさそうでしょうか。

<button>
  <span>
    <img src="plate4.jpg" alt="">
  </span>
  <span>
    <span>Kenzo</span><br class="sp-only">Yamaguchi
  </span>
</button>

名前と苗字の間で改行したいのであれば素直に<br>を使えばよいかと。SP(スマートフォン)幅の場合だけ改行を設けたいのであれば、PC幅でdisplay:noneを噛ませておいて、ブレークポイントdisplay:noneを解除すればよいだけ、ということですね。素のCSSだとこれでよかったんでしたっけ*2

@media (max-width: 600px) {
  .sp-only {
    display: none;
  }
}

こうすると<h3>がなくなってページ全体のアウトラインとしてどうなんでしょう、というのはありますが、先行して

<div class="section-title__wrapper">
  <h2 class="section__title" id="works">WORKS</h2>
</div>

とあるので特段の問題は起きないでしょう。

とまあ、こんな感じで1つのモジュールであれやこれやと検討できてしまうのがアクセシビリティチェックの恐ろしいところ(?)でもあります*3。裏を返せば、アクセシビリティを担保したウェブサイトを提供するのであれば、モジュール設計時にアクセシビリティチェックを行う必要があるということになります。ちなみに勤務先の業務では、自社制作で高度なアクセシビリティが要求されるときは、アクセシビリティ専門の部門が都度チェックを行ってたりしてます。

モーダル

随分とボタンの話が長くなってしまいましたが、ボタンを押した時に出現するモーダルの話に移っていきましょう。

@HeldaForStudy氏の立てた方針として、

2. works部分のモーダルを削除し、別途worksのページを設けてリンクとして遷移するようにする

とありますが、仮にモーダルを存続させて、達成基準を満たすのであればどうなるのか、を念頭に置いて現状把握をしていきたいと思います。

キーボード操作をすればわかりますが、「Kenzo Yamaguchi」のボタンを押してTabキーで移動していくと、すぐにモーダルの中にフォーカスが移動しない、というのは@HeldaForStudy氏がSC 2.4.3「フォーカス順序」の問題として挙げているとおりです。ただこの根本の原因としては(例によっていろいろ省いたHTMLですが)、

<button>>Kenzo Yamaguchi</button>
<button>>Michiyo Yamaguchi</button>
<div><a href="construction.html">作品一覧を見る</a></div>
<!-- 堅造モーダル -->
<div class="section-works__modal" id="jsModalKenzo">...</div>
<!-- みちよモーダル --><div class="section-works__modal" id="jsModalMichiyo">...</div>

というHTMLソースの出現順序に根本的な問題があるということですね(SC 1.3.2「意味のあるシーケンス」)。モーダルも大雑把に言ってしまえば結局開閉するコンテンツですから、ボタンの直後に置くのが適切でしょう。

<button>>Kenzo Yamaguchi</button>
<!-- 堅造モーダル -->
<div class="section-works__modal" id="jsModalKenzo">...</div>
<button>>Michiyo Yamaguchi</button>
<!-- みちよモーダル --><div class="section-works__modal" id="jsModalMichiyo">...</div>
<div><a href="construction.html">作品一覧を見る</a></div>

また、フォーカスの順序という意味では、モーダル内でキーボードフォーカスが封じ込められていないという問題もあります。そして、このモーダルがモーダルだということを支援技術に伝えられていません(SC 4.1.2「名前 (name)・役割 (role)・値 (value) 」)

そのあたりのARIAの都合、フォーカスの制御はARIA APGのModal Dialog Exampleにあれそれ書いているので、自前でモーダルを書くというのであれば、ARIA APGを参考にすればよいかと。もっとも、もしかしたら<dialog>を使ってしまったほうが早いのかもしれません。

モーダルの「ガワ」の話はこんなところでしょうか…。


さて、モーダルの中身としては、スクリーンショットとしてはこういう感じになっているわけですが

スクリーンショット
モーダルは、上段(桃色枠部分)のメインスライド、中段(青枠部分)のサムネイル、下段(緑枠部分)のボタンで構成されている。

上・中・下段、どれもマウスで操作できてしまうのですよね…。これは、アクセシビリティというよりかはユーザビリティの視点で検討いただいた方がよい…のかもしれません。

アクセシビリティの観点としては、コンポーネントが操作できるということは、コンポーネントの名前を持つ必要がある、というところに留意いただければと。

モーダル上段のスライド1枚目に戻ってみましょう。中身はこんな感じです。

<div class="section-works__swiper-prof">
  <div class="section-works__swiper-prof-img">
    <img src="assets/img/kenzo-prof.jpg" alt="山口堅造" loading="lazy">
  </div>
  <div class="section-works__swiper-prof-box">
    <h4><略歴></h4>
    多摩美術大学 大学院修士課程終了 1982年<br>
    茨城県に工房移設(アトリエ金工やまぐち) 1998年<br>
    <br>
    <h4><主な発表活動></h4>
    池袋西武・玉川高島屋・松屋銀座にてグループ展 1980年~<br>
    ...
    日本煎茶工芸展 [文部科学大臣奨励賞]「銅鎚起錫彩茶托」 2005年
  </div>
</div>

まず目に付くのが、見出しで装飾の目的で不等号「<」「>」を用いていることでしょうか(SC 1.3.1)。そのような記号で装飾せずに、CSSでいい感じに見出しを装飾してもらえれば。

また、連続する<br>を余白を設ける目的で使用しています(SC 1.3.1)。HTML仕様でbr要素は、

br要素は改行を表す。

と定義されています。余白のためにはCSSで制御するようにします。

SC 1.3.1としてマークするのがよいのかは微妙なラインですが、「略歴」と「主な発表活動」は情報構造上、リストであると言えます。どうマークアップするのかはかなり趣味の領域になってくると思いますが、素直に<ul>を用いるパターン、

<div class="section-works__swiper-prof-box">
  <h4>略歴</h4>
  <ul>
    <li>多摩美術大学 大学院修士課程終了 1982年</li>
    <li>茨城県に工房移設(アトリエ金工やまぐち) 1998年</li>
  </ul>
  <h4>主な発表活動</h4>
  <ul>
    <li>池袋西武・玉川高島屋・松屋銀座にてグループ展 1980年~</li>
    ...
    <li>日本煎茶工芸展 [文部科学大臣奨励賞]「銅鎚起錫彩茶托」 2005年</li>
  </ul>
</div>

<dl>を用いるパターン1(見出しを変更)、

<div class="section-works__swiper-prof-box">
  <dl>
    <dt>略歴</dt>
    <dd>多摩美術大学 大学院修士課程終了 1982年</dd>
    <dd>茨城県に工房移設(アトリエ金工やまぐち) 1998年</dd>
    <dt>主な発表活動</dt>
    <dd>池袋西武・玉川高島屋・松屋銀座にてグループ展 1980年~</dd>
    ...
  </dl>
</div>

<dl>を用いるパターン2(亜種として、明示的に「年」と「内容」を構造化する)、

<div class="section-works__swiper-prof-box">
  <h4>略歴</h4>
  <dl>
    <dt>1982年</dt>
    <dd>多摩美術大学 大学院修士課程終了</dd>
    <dt>1998年</dt>
    <dd>茨城県に工房移設(アトリエ金工やまぐち)</dd>
  </dl>
  <h4>主な発表活動</h4>
  <dl>
    <dt>1980年~</dt>
    <dd>池袋西武・玉川高島屋・松屋銀座にてグループ展</dd>
    ...
  </dl>
</div>

などがあるでしょうか。まあこのあたりは趣味ですので、スタイルシートの当てやすさを勘案してお好きなのをどうぞ、というところでしょうか…。

あと、人名の代替テキストは、スクリーンリーダーのユーザーには伝わって、視覚で見ているユーザーには伝わらないという意味でSC 1.1.1「非テキストコンテンツ」としてマークするかもしれません。

それを踏まえて、1つの情報構造の形として、

<div class="section-works__modal" id="jsModalKenzo" role="dialog" aria-labelledby="modal-heading-1" aira-modal="true">
  <h3 id="modal-heading-1">山口堅造</h3>
  <div>
    <div class="section-works__swiper-prof-img">
      <img src="assets/img/kenzo-prof.jpg" alt="" loading="lazy">
    </div>
    <div class="section-works__swiper-prof-box">
      <h4>略歴</h4>
      ...
    </div>
  </div> 
</div>

としてしまえば、モーダルの内外でアウトラインとして見出しの階層構造を崩さずに済みますし、モーダルの名前を見出しで提示できます(SC 1.3.1、SC 4.1.2の観点から)。こうすることで、「略歴」は<h4>でも<dt>でもよくなります。

さんざっぱらモーダルの場合を仮定してあれやこれやを書きましたが、

2. works部分のモーダルを削除し、別途worksのページを設けてリンクとして遷移するようにする

というのが改修方針でした。そもそもモーダルダイアログを選択した方がよいのかについては、Webアプリケーションアクセシビリティ──今日から始める現場からの改善 (WEB+DB PRESS plus)の8章でかなり厚く書かれているので、一読するとよいでしょう。

小まとめ

あれ、モーダルの話しかしてないような…(ふるえ)。

脇道にそれたり、私の趣味というか好みに走っている面も多分にありましたが、達成基準としてSC 1.3.1「情報及び関係性」とSC 4.1.2「名前 (name)・役割 (role)・値 (value) 」が多くのウェイトを占めています。マシンリーダブルの1つの考え方としては、主にDOMツリーから生成される、堅牢なアクセシビリティツリーを作ることにありますから、必然的にそうなってくるものと思っています。

また、実装した後でアクセシビリティに取り組むのでは遅いということもうっすら感じてもらえれば幸いです。実装よりも前のビジュアルデザイン、さらにその前のワイヤーフレームを描く段階でアクセシビリティの闘いが始まっている、と言えるでしょう。

その3に続きます

*1:セクショニングという意味では、厳密には怪しい区切り方でしょうが、それは脇に置いて

*2:メディアクエリーすらまともに書けないのがバレる回

*3:アクセシビリティチェックに限らず、フロントエンドでHTMLを検討し出すと止まらないというのはある程度共感してもらえるかしらとは

*4:最近話題の改正障害者差別解消法は、「環境の整備」に位置づけられるウェブアクセシビリティを法的に強制するものではない点に注意。

アクセシビリティチェックってどうやってるの?ということで、実際にやってみた。(その1)

ツイッターアクセシビリティ向上日誌2【目視試験編】‐Akira Tsuda Portfolio and Blogというのを見かけて、そういえばアクセシビリティチェックって何をどうしているのかという話をウェブ上でほとんど見かけない(というか自分は知らない)ので、思い切ってチェックの過程や考え方を書いてみようかなと。

チェック対象のサイトを作った@HeldaForStudy氏に尋ねたところ、題材として使ってよいという返事をいただいたので、「アトリエ金工やまぐち」のサイト1ページをチェックしてみることにします。

対象ページはBasic認証がかかっているので、アクセシビリティ向上日誌1【各種ツール評価編】からたどってください。 @HeldaForStudy氏はレベルはA*1でチェックしたとのことなので、チェック基準はWCAG 2.1レベルAでチェックすることにしましょう。 わたしは普段はCOB-CHAを使っていないので、ページの頭から問題点を挙げていくスタイルで。

なお、このページの目的はアクセシビリティチェックにどう取り組んでいるのかを説明するためであって、氏の制作したサイトやチェック結果にネガティブなことを言いたいわけではないので、そこは念のため記載しておきます。 また、チェックに抜け漏れ、誤りがある可能性があることもお断りしておきます。

機械検証(ツールによる検証)について

業務ではNu Html Checker*2axe-coreを利用した社内ツールでぱぱーっとチェックしますが*3、今回はアクセシビリティ向上日誌1【各種ツール評価編】で既にチェックされているので結果を改めてここで書く必要はないでしょう。

なお、axe DevtoolsLighthouseも中身はaxe-coreなので、どちらかお好きな方を使えばよいかと(axe-coreのバージョンが違ったりするかもなので、違う結果が返ってくるかもしれないですけど)

ところで、よくある誤解としてNu Html Checkerのエラーは全部SC 4.1.1「構文解析*4の問題とすることがあるみたいですが、それは誤りです。SC 4.1.1*5

達成基準 4.1.1 構文解析 (レベル A): マークアップ言語を用いて実装されているコンテンツにおいては、要素には完全な開始タグ及び終了タグがあり、要素は仕様に準じて入れ子になっていて、要素には重複した属性がなく、どの ID も一意的である。ただし、仕様で認められているものを除く。

とあるように、タグが壊れてない、要素が誤った入れ子になっていない、開始タグ内に同一属性が存在しない、IDが一意(重複したID値がない)の4つです。…まあ、達成基準の注記にあるとおり、

HTML 又は XML を使用するすべてのコンテンツでは、この達成基準は常に満たされているとみなすべきである。

というように(WCAG 2.2を契機に)明示されたので、SC 4.1.1は常に満たされているものとして扱います。Nu Html Checkerの報告は概ね達成基準の問題にならないことの方が多いですが*6、達成基準上の問題となるのであれば、ほとんどの場合はSC 1.3.1「情報及び関係性」かSC 4.1.2「名前 (name)・役割 (role)・値 (value)」で判断することになるので、(特にこれからアクセシビリティチェックをするという人は)忘れて大丈夫でしょう*7

HTMLのコンテンツモデルの違反は、情報構造の問題ですから、SC 1.3.1としてマークしていきます。

達成基準 1.3.1 情報及び関係性 (レベル A): 何らかの形で提示されている情報、構造、及び関係性は、プログラムによる解釈が可能である、又はテキストで提供されている。

目視検証について

本題に入る前に、COB-CHA、いいかえるなら実装チェックリストをどうして使っていないのか、という話をしておきましょう。WCAG 2.1解説書のWCAG 達成基準の達成方法を理解するでは

達成方法は、参考情報である。つまり、達成方法は必須要件ではない。WCAG 2.1 への適合を判断する根拠は、WCAG 2.1 で規定している達成基準であり、達成方法ではない。

とあります。つまりTechniques for WCAG 2(日本語訳名でいう「WCAG達成方法集」)は、参考情報であって、WCAG 2の達成基準を満たしているかどうかだけが判断基準です。また「その他の達成方法」にあるように、

W3C の WCAG 2.1 達成方法集文書にある達成方法に加えて、WCAG 達成基準を満たすその他の方法がある。W3C の達成方法は包括的なものではなく、より新しい技術や状況をカバーしていないかもしれない。

つまり、必ずしも達成方法(Techniques)を使ってWCAG 2を満たす必要はなく、Techniquesにはない別の方法で達成基準(SC)を満たしてしまっても問題ない、ということになります。実際にアクセシビリティチェックをこなしていけばわかりますが、チェックリストで判断するのはものすごく窮屈です。

前置きはさておき、中身を見ていきましょう。

ルーセルの問題

まず目に付くのは、カルーセルが止まらない問題ですね。SC 2.2.2「一時停止、停止、非表示」の問題ですが、これは@HeldaForStudy氏も問題点としてあげているとおりです。ちなみにSC 2.2.2は非干渉の達成基準ですので、WCAG2の観点では致命的…と評価されることになります。

swiperの評価をするのが面倒ですが、一応中身を見ておきましょう…

<ul class="swiper-wrapper section-top__swiper-wrapper" id="swiper-wrapper-309340565d92446a" aria-live="off" style="transition-duration: 0ms;">
<li class="swiper-slide section-top__swiper-slide swiper-slide-prev" role="group" aria-label="1 / 5" data-swiper-slide-index="0" style="width: 1648px; opacity: 0; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;">
...
</li>
<ul>

となっているわけですが、axeが指摘するとおり、

リスト要素内に許可されていない直接の子要素が存在します: [role=group]

ということですが、仕様に沿って何がどうダメなのかを確認しましょう。

HTMLのネイティブロールは、ARIA in HTML仕様で定義されています。これによると、ullistlilistitemを持ちます。ところが、ここでのコードは<li ... role="group">となっており、ロールが上書きされています。つまり親子関係としては

  • list
    • group

というようになっているわけですが、WAI-ARIA仕様 *8によればlistロールは、listitemロールしか持てません(これは、HTMLの<ol><ul><li>しか持てないのと同じ)。ですから、ARIA仕様違反、つまり情報構造としての誤りとなるため、SC 1.3.1の問題となります(axeの報告どおり)。

パッチ的な修正方法としてはrole="group"を削除すればそれでよいでしょう。根本的にswiperが悪いので、別のライブラリを使用するのを推奨します(@HeldaForStudy氏が言及しているとおり、Splideを使うのも一つの手かもしれません。ただ、実装にも依るのでアクセシビリティ上の問題が解決するのかは、チェックしてみないと何ともいえません)。個人的にはカルーセルは単なるリストの亜種でしかないと思っているので、あれそれとrole属性を付けなくといいのではと思いますけど。

ルーセルのスライドの中身としては、

<img class="section-top__swiper-img-pc" src="assets/img/michiyo/vase19-pc.jpg" alt="山口みちよ「(作品名)」">

というように提示されていますが、これは代替テキストが視覚以上の情報を含んでしまう(言いかえると、画像だけでは作品名は伝わらない)ので、作品名を提供したい(情報を持つ画像である)というのであれば、目で見えるようにテキストで提供するのが適切でしょう。SC 1.1.1「非テキストコンテンツ」の問題としてマークします。ただまあ、(後述する)「日常に火を灯す」とロゴの画像の背景となっていると捉えると、単なる装飾画像と捉えるのが適当かもしれません。

余談ですが、W3C WAIのaltディシジョンツリーの日本語訳が最近公開されたので、代替テキストに悩んだら初手としてこちらを当たるのもよいでしょう。

ルーセルのボタンのコントラスト比(SC 1.4.11)であったり、フォーカスが見えなかったり(SC 2.4.7)、リードテキスト「日常に火を灯す」のコントラスト比(SC 1.4.3)が気になるところですが、いずれもレベルAAの問題です(今はレベルAで見ているのでスルー)。ちなみに、ロゴはコントラスト比の達成基準の例外となることに注意しておきましょう。

ああでも、カルーセルのボタンとしては、

<span class="swiper-pagination-bullet" tabindex="0" role="button" aria-label="Go to slide 1"></span>

日本語のページなのにaria-label属性によるアクセシブルな名前が英語なのは微妙なので、SC 4.1.2「名前 (name)・役割 (role)・値 (value)」の問題としてマークしちゃいましょう(まあ<span>の中身が空っぽなのも気にはなりますが、目をつむっておきましょう)。

h1見出しの検討

h1見出しのテキスト(HTMLソースは改)はこういう格好ですが

<h1 class="section-top__lead">
  日常に火を灯す
  <img src="assets/img/logo1.png" alt="アトリエ金工やまぐち" loading="lazy">
</h1>

キャッチコピー「日常に火を灯す」は構造的には見出しではないのでh1は不適当

と@HeldaForStudy氏は評価しているものの、リードテキストをh1に含めること自体は不自然ではないと思います。どうしても見出し要素に入れたくないということであれば、

<header>
 <p>日常に火を灯す</p>
 <h1><img src="assets/img/logo1.png" alt="アトリエ金工やまぐち" loading="lazy"></h1>
</header>

というのもなくはないですが、スクリーンリーダーの見出しジャンプを考えると上策だとは思えず、今のテキストの入れ方のままでよいと個人的には思います。

あと、h1がある時点でSC 2.4.1ブロックスキップ」は自動的に満たされます。説明はブロックスキップを考える | Accessible & Usableあたりを読んでもらうとよいかなと。

メニュー

HTMLソース順という意味ではちょっと前後しますが、PC幅だと下スクロールしてからはじめて(画面左上の)サイドバーが出現する一方で、HTMLソースとしては<header>として<body>先頭に記述されているために、順方向のキーボードフォーカス移動でたどり着けない、という問題があります。SC 2.4.3「フォーカス順序」というよりかはむしろ、根本的にはHTMLソース上の提示順に問題があるので、SC 1.3.2「意味のあるシーケンス」の問題としてマークしておきましょう。(ワンソースで記述することを考えると、構造として破綻してしまうか…)

スクリーンショット
Firefoxの開発者ツールでタブ順序を表示させて雑に取ったスクリーンショット。フォーカス順序として難しいものが…。

SP(スマートフォン)幅ですと、ハンバーガーメニューとなりますが(下記ソース)、

<div id="open-button" class="open-button">
<span class="open-button__line1"></span>
<span class="open-button__line2"></span>
<span class="open-button__menu">menu</span>
</div>

マウスでクリックできてもキーボードで押下できない(SC 2.1.1「キーボード」の問題)、「ボタン」であることがスクリーンリーダーのような支援技術に伝わらない(SC 4.1.2「名前 (name)・役割 (role)・値 (value)」の問題)という状況です。まあネイティブの<button>なりを使ってくださいということですね。実装例は純粋なハンバーガーメニューってわけでもないのでなんともですが、Webアプリケーションアクセシビリティ──今日から始める現場からの改善 (WEB+DB PRESS plus)の「5.7 ハンバーガーメニュー」に任せます。

「閉じる」ボタンも、ボタンの役割と名前がない(SC 4.1.2)のと、表示上はメニューの末尾にある一方で、HTMLソース上はメニューよりも前にあるのでキーボードで移動できません(SC 1.3.2)。

いずれにせよ

1. メニューをサイドバーではなくヘッダとして設置

と最初の改善点として挙げられているので、改修で改善されるでしょう。。

Instagramの項目

<li class="sidebar__navigation--instagram">Instagram
  <p><a href="https://www.instagram.com/kenzo_kennkenn/" rel="noopener" target="_blank"><img src="assets/img/icon-insta.png" alt="Instagram-堅造" loading="lazy"><span class="sidebar__navigation-yugothic"></span>堅造</a></p>
  <p><a href="https://www.instagram.com/kinkou_yamaguchi/" rel="noopener" target="_blank"><img src="assets/img/icon-insta.png" alt="Instagram-みちよ" loading="lazy"><span class="sidebar__navigation-yugothic"></span>みちよ</a></p>
</li>

altは適切ではないと言えそうです(SC 1.1.1「非テキストコンテンツ」)。既に先行してInstagramというテキストがあって、人名も<img>の後で提供されているために、「大事なことなので2回言いました」になってしまうことから、画像は装飾的として代替テキストを空にする(alt="")のがよいかと。

リスト構造は趣味が入ってきますので、達成基準上(SC 1.3.1「情報及び関係性」)の問題とまではならない理解ですが、リストの入れ子にするとすっきりするとは思います。こういう感じでしょうか。(わかりやすさのため構造だけ記載)

<li class="...">Instagram
  <ul>
    <li><a href="..."><img src="..." alt=""><span aria-hidden="true" class="..."></span>堅造</a></li>
    <li><a href="..."><img src="..." alt=""><span aria-hidden="true" class="..."></span>みちよ</a></li>
  </ul>
</li>

リスト項目内で先行する画像を装飾とするならば、3点リーダーも装飾と捉えるのが自然かと思いますので、付け焼き刃的(あんまり好きじゃない)ですが、aria-hidden="true"とするのがよいでしょうか(SC 1.3.1の観点から)。いずれにせよ、(コロン「:」的な)3点リーダーの意味を伝えるのはこの文脈だとナシになるかと思いますので。

画面右上バナー

SC 2.4.4「リンクの目的 (コンテキスト内)」として挙げられていますが、特に問題ないという認識です。むしろ、キーボードのフォーカス移動のことを考えるとHTMLソース上でどこで提供すればよいのかに頭を抱える感じでしょうか…(SC 1.3.2として)。

小まとめ

まあ予想はしていましたが、ヘッダーとファーストビューで力尽きましたね(実際の業務にアクセシビリティチェックでもトップページは作業量として「重い」です)。その2に続きます

*1:WCAG 2.0なのか2.1なのかがわかりませんが、まあどっちでも大差ないといえばないので

*2:勤務先では社内にサーバーが立てられています

*3:miCheckerは使っていません

*4:Success Criteria、達成基準のこと。漢字を打つのが面倒なので、SCとします

*5:W3Cの文書は基本的に日本語訳があればそれを張っていきます

*6:HTMLの品質を測るものであって、アクセシビリティチェックのためのツールではないですので

*7:WCAG 2 FAQ How and why is success criteria 4.1.1 Parsing obsolete?がそう言っているように

*8:なんでリンクがWAI-ARIA 1.3なの?というツッコミがありそうですが、訳者の都合です