アクセシビリティ対策で、フォントサイズの変更をネイティブなJavaScriptで実装してみます。
アクセシビリティ対策のフォントサイズを変更する機能は、WordPressならプラグインがあったりしますが、プラグインを使いたくない方は、是非参考にしてみてください。
目次
JavaScriptの document.cookie
は、Webブラウザ上に保存された情報のcookieを読み書きすることができます。
以下では「cookieを追加」と「cookieを削除」する方法についてご紹介します。
JavaScriptでcookieを追加する時、以下のような記述をします。
document.cookie = 'value=クッキー名; max-age=9999';
max-age
はそのcookieの寿命で表され、上記のような9999だと大体3時間弱です。
value
のところは任意の名称でOKです。
追加したcookieを削除する場合、max-age
の値を0に設定して、Cookieを有効期限切れにすることで削除の扱いにします。
document.cookie = "value=cookie名;max-age=0;";
フォントサイズを変更して状態を保持するサンプル
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。
山路を登りながら、こう考えた。智に働けば角が立つ。情に棹させば流される。意地を通せば窮屈だ。とかくに人の世は住みにくい。住みにくさが高じると、安い所へ引き越したくなる。どこへ越しても住みにくいと悟った時、詩が生れて、画が出来る。
cookieで状態を保存するので、ページ更新しても設定が再現されます。
試しにページ更新や、ページ遷移してからこのページに戻ってみてください。
実装の手順と方法
コードの解説の前に、ざっくりとした実装の手順と方法について解説します。
まずはじめに、HTMLを記述します。
<ul class="cookieSwitch">
<li><p id="fontMini">小</p></li>
<li><p id="fontDefault" class="activeOn">標準</p></li>
<li><p id="fontBig">大</p></li>
</ul>
<div id="textArea">
<p>あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</p>
<p>山路を登りながら、こう考えた。智に働けば角が立つ。情に棹させば流される。意地を通せば窮屈だ。とかくに人の世は住みにくい。住みにくさが高じると、安い所へ引き越したくなる。どこへ越しても住みにくいと悟った時、詩が生れて、画が出来る。</p>
</div>
次にJavaScriptのコードをページに記述します。
コードは <body>〜</body>
で、</body>
の閉じタグ(クロージングタグ)の前に記述しましょう。
/* ロード時のcookie有無チェック */
window.addEventListener('DOMContentLoaded', (event) => {
const bodyFont = document.querySelector('body');
/* cookieを取得 */
function getCookieArray(){
var arr = new Array();
if(document.cookie != ''){
var tmp = document.cookie.split('; ');
for(var i=0;i<tmp.length;i++){
var data = tmp[i].split('=');
arr[data[0]] = decodeURIComponent(data[1]);
}
}
return arr;
}
var arr = getCookieArray();
var result = arr["value"];
/* valueのcookieがない時 */
if(result == null){
console.log("no cookie");
}
// cookieがある場合
else {
var theme = result;
// valueの値でfontMiniCookieがある時
if(theme == 'fontMiniCookie'){
document.getElementById("fontMini").classList.add('activeOn');
document.getElementById("fontDefault").classList.remove('activeOn');
document.getElementById("fontBig").classList.remove('activeOn');
bodyFont.style.fontSize = '0.8em';
console.log('fontMiniOn');
}
// valueの値でfontBigCookieがある時
else if(theme == 'fontBigCookie'){
document.getElementById("fontBig").classList.add('activeOn');
document.getElementById("fontDefault").classList.remove('activeOn');
document.getElementById("fontMini").classList.remove('activeOn');
bodyFont.style.fontSize = '1.2em';
console.log('fontBigOn');
}
else {
console.log('none');
}
}
});
/* フォントサイズを小さく */
document.querySelector('#fontMini').addEventListener('click', () => {
document.getElementById("fontMini").classList.add('activeOn');
document.getElementById("fontDefault").classList.remove('activeOn');
document.getElementById("fontBig").classList.remove('activeOn');
const bodyFont = document.querySelector('body');
bodyFont.style.fontSize = '0.8em';
// cookieの操作
document.cookie = "value=fontMiniCookie;max-age=9999;";
console.log('fontMiniOn');
});
/* フォントサイズを標準に */
document.querySelector('#fontDefault').addEventListener('click', () => {
document.getElementById("fontDefault").classList.add('activeOn');
document.getElementById("fontMini").classList.remove('activeOn');
document.getElementById("fontBig").classList.remove('activeOn');
const bodyFont = document.querySelector('body');
bodyFont.style.fontSize = '107%';
// cookieの操作
document.cookie = "value=fontMiniCookie;max-age=0;";
document.cookie = "value=fontBigCookie;max-age=0;";
console.log('fontDefaultOn');
});
/* フォントサイズを大きく */
document.querySelector('#fontBig').addEventListener('click', () => {
document.getElementById("fontBig").classList.add('activeOn');
document.getElementById("fontDefault").classList.remove('activeOn');
document.getElementById("fontMini").classList.remove('activeOn');
const bodyFont = document.querySelector('body');
bodyFont.style.fontSize = '1.2em';
// cookieの操作
document.cookie = "value=fontBigCookie;max-age=9999;";
console.log('fontBigOn');
});
最後に、CSSを記述して見た目を整えて完了です。
/* ラベルの文字サイズを固定 */
body ul.cookieSwitch li p {
font-size: 1rem !important;
}
/* サイズ変更ラベル */
ul.cookieSwitch {
display: flex;
list-style: none;
justify-content: flex-end;
align-items: center;
margin: 0 0 15px;
border: none;
padding: 0;
}
ul.cookieSwitch li {
border: solid 1px #CCC;
padding: 0;
}
ul.cookieSwitch li:first-child, ul.cookieSwitch li:nth-child(2) {
border-right: none;
}
ul.cookieSwitch li p {
margin: 0;
padding: 5px 20px 3px;
background: #FFF;
cursor: pointer;
}
ul.cookieSwitch li p.activeOn {
background: #707070;
color: #FFF;
pointer-events: none;
}
これで完成です!
ざっくりとしたコードの解説
コードは、フォントサイズを変更する「ラベル」のHTML・cookieの追加・削除を行うJavaScript・見た目を整えるCSSの3種類です。これらのコードについて、順に解説していきます。
HTML
HTMLは、「cookieSwitch」のclass名がつく ul
タグが、クリックでフォントサイズを変更するラベルを設置する親要素です。その中には、li
p
タグが各ラベルです。
<ul class="cookieSwitch">
<li><p id="fontMini">小</p></li>
<li><p id="fontDefault" class="activeOn">標準</p></li>
<li><p id="fontBig">大</p></li>
</ul>
<div id="textArea">
<p>あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</p>
<p>山路を登りながら、こう考えた。智に働けば角が立つ。情に棹させば流される。意地を通せば窮屈だ。とかくに人の世は住みにくい。住みにくさが高じると、安い所へ引き越したくなる。どこへ越しても住みにくいと悟った時、詩が生れて、画が出来る。</p>
</div>
JavaScript
JavaScriptは、最初の HTML 文書の読み込みと解析が完了した時に処理を開始する DOMContentLoaded
のイベントリスナーで、cookieの有無をチェックします。このチェックの内容によって、フォントサイズをどれにするか?を決めて、対応するフォントサイズを反映させます。
/* ロード時のcookie有無チェック */
window.addEventListener('DOMContentLoaded', (event) => {
const bodyFont = document.querySelector('body');
/* cookieを取得 */
function getCookieArray(){
var arr = new Array();
if(document.cookie != ''){
var tmp = document.cookie.split('; ');
for(var i=0;i<tmp.length;i++){
var data = tmp[i].split('=');
arr[data[0]] = decodeURIComponent(data[1]);
}
}
return arr;
}
var arr = getCookieArray();
var result = arr["value"];
/* valueのcookieがない時 */
if(result == null){
console.log("no cookie");
}
// cookieがある場合
else {
var theme = result;
// valueの値でfontMiniCookieがある時
if(theme == 'fontMiniCookie'){
document.getElementById("fontMini").classList.add('activeOn');
document.getElementById("fontDefault").classList.remove('activeOn');
document.getElementById("fontBig").classList.remove('activeOn');
bodyFont.style.fontSize = '0.8em';
console.log('fontMiniOn');
}
// valueの値でfontBigCookieがある時
else if(theme == 'fontBigCookie'){
document.getElementById("fontBig").classList.add('activeOn');
document.getElementById("fontDefault").classList.remove('activeOn');
document.getElementById("fontMini").classList.remove('activeOn');
bodyFont.style.fontSize = '1.2em';
console.log('fontBigOn');
}
else {
console.log('none');
}
}
});
/* フォントサイズを小さく */
document.querySelector('#fontMini').addEventListener('click', () => {
document.getElementById("fontMini").classList.add('activeOn');
document.getElementById("fontDefault").classList.remove('activeOn');
document.getElementById("fontBig").classList.remove('activeOn');
const bodyFont = document.querySelector('body');
bodyFont.style.fontSize = '0.8em';
// cookieの操作
document.cookie = "value=fontMiniCookie;max-age=9999;";
console.log('fontMiniOn');
});
/* フォントサイズを標準に */
document.querySelector('#fontDefault').addEventListener('click', () => {
document.getElementById("fontDefault").classList.add('activeOn');
document.getElementById("fontMini").classList.remove('activeOn');
document.getElementById("fontBig").classList.remove('activeOn');
const bodyFont = document.querySelector('body');
bodyFont.style.fontSize = '107%';
// cookieの操作
document.cookie = "value=fontMiniCookie;max-age=0;";
document.cookie = "value=fontBigCookie;max-age=0;";
console.log('fontDefaultOn');
});
/* フォントサイズを大きく */
document.querySelector('#fontBig').addEventListener('click', () => {
document.getElementById("fontBig").classList.add('activeOn');
document.getElementById("fontDefault").classList.remove('activeOn');
document.getElementById("fontMini").classList.remove('activeOn');
const bodyFont = document.querySelector('body');
bodyFont.style.fontSize = '1.2em';
// cookieの操作
document.cookie = "value=fontBigCookie;max-age=9999;";
console.log('fontBigOn');
});
後半以降は、それぞれに対応する id名に対応した要素をクリックして処理を行う .addEventListener
のクリックで、ラベルのclass「activeOn」の追加・削除をそれぞれ行います。
そして、それぞれに対応した body
タグのフォントサイズを変更して、最後に対応したcookieの削除・追加を行います。
CSS
CSSは、フォントサイズをクリックで変更するラベルのデザイン・レイアウトを整える記述がほとんどです。
/* ラベルの文字サイズを固定 */
body ul.cookieSwitch li p {
font-size: 1rem !important;
}
/* サイズ変更ラベル */
ul.cookieSwitch {
display: flex;
list-style: none;
justify-content: flex-end;
align-items: center;
margin: 0 0 15px;
border: none;
padding: 0;
}
ul.cookieSwitch li {
border: solid 1px #CCC;
padding: 0;
}
ul.cookieSwitch li:first-child, ul.cookieSwitch li:nth-child(2) {
border-right: none;
}
ul.cookieSwitch li p {
margin: 0;
padding: 5px 20px 3px;
background: #FFF;
cursor: pointer;
}
ul.cookieSwitch li p.activeOn {
background: #707070;
color: #FFF;
pointer-events: none;
}
そして最後に、クリックで付与される「activeOn」のclassで見た目を切り替える記述があります。
変更するフォントサイズはJavaScriptで制御するので、CSSの記述量は少なめです。
さいごに
Webアクセシビリティの対応は、コントラストやリンクやボタンのオブジェクトを明確にすることなど、多岐にわたります。
この記事のようなフォントサイズ以外に配慮すべき内容もいろいろあるので、考慮しつつ対応するようにしましょう。