適用 (対象)
クライアントサイド又はサーバーサイドのスクリプトとともに使用される CSS
この達成方法は、解説書から参照されていない。
解説
ウェブページのデフォルトの提示が部分的に達成基準を満たさない場合、「適合要件」の条項 (適合要件 1) にある「代替版」を用意することで必要条件を満たすことができる。必要条件によっては、ページのあらゆる側面が主張したレベルに適合するように提示を調整できるリンク又はコントロールによってスタイルスイッチャーを呼び出すことで、コンテンツ制作者が同じ情報の複数バージョンの提供を避けることを可能にする。
この達成方法の目的は、ウェブページの適合している代替版を提供するために、スクリプトと組み合わせて CSS を使う方法を示すことである。この達成方法では、コンテンツの提示を制御するために使用されている CSS を変更するコントロールを提供することで、コンテンツ制作者はコンテンツの代替表示を提供する。ウェブページ内で提供されるコントロールは、そのレベルで要求される達成基準を満たすことができるような提示方法を利用者が選択及び変更することを可能にする。これによって、以下のような状況において、利用者が異なる提示方法を選択できるようになる:
- パソコンの知識や権限がないことが原因で、利用者はブラウザや OS の設定を調整できないかもしれない
- テキストが、ブラウザや OS の設定では対処できない方法で提供されている (テキストが画像の中に書き込まれているなど)
- コンテンツのデフォルトの提示では、一部の利用者に対して十分なコントラストがない
この達成方法で達成させるには、以下の 3 項目を満たしていなければならない。
- オリジナルのページのリンク又はコントロール自身は、代替の提示を通して達成基準を満たしていなければならない。例えば、スタイルスイッチャーが大きなフォントサイズを提供するために使用され、かつそのコントロールが小さいフォントを用いて提示される場合、利用者はそのコントロールを作動させてその代替の提示を見ることができないかもしれない。
- 新しいページは、オリジナルのページと同じすべての情報と機能を含んでいなければならない。
- 新しいページは、希望する適合レベルのすべての達成基準に適合しなければならない。たとえば、ひとつの要求は満たすが、それを使うと別の要求に適合しなくなってしまうような代替スタイルシートは使用できない。
スタイルスイッチャーを使う場合は、以下の課題と制限について検討することが重要である:
- 利用者が行うことのできる変更の数や形式は、ウェブページのコンテンツ制作者によって制御される範囲に限定される。できる限り多くの利用者のニーズに対応できるようにするために、さまざまな提示と設定項目が提供されるべきである。しかしながら、コンテンツ制作者は、利用者に多くのオプションを提供することに起因する、利用者にとっての設定可能な項目と複雑さの相互作用について熟考することも重要である。
- あるページから別のページに移動しても利用者の設定を保持しておくには、利用者の機器にクッキーで保存したり (詳細はリソースのセクションを参照)、ウェブサーバーに保存されるプロファイルにクエリー文字列として渡して格納するなどの方法で実現できる場合がある。
- スタイルスイッチャーを実装するための技術的手法は、利用者の環境においていくつかの技術が利用可能であることを前提としている (たとえば、多くのクライアントサイドソリューションは、JavaScript と CSS の両方が利用可能であることを必要とする)。これらのウェブコンテンツ技術が適合のために当てにできる場合を除き、クライアントサイドのサポートとウェブコンテンツ技術の利用可能性が保証されない場合には、コンテンツ制作者はサーバーサイドのウェブコンテンツ技術を使うことを検討すべきである。その代案としては、これらのウェブコンテンツ技術のサポートを適合のために当てにできない場合に、使用されているいくつかのウェブコンテンツ技術が有効でなくてもコンテンツが確実に適切な表現に変換されるような達成方法を使うことが、より良いページにするための効果的な方法となる。
事例
例 1: 異なる外部スタイルシートファイルを適用するために JavaScript のコントロールを使う
この例では、文字色と背景色を変更するリンクを JavaScript で提供する。そのリンクは、利用者の環境で JavaScript がサポートされており、かつ有効な場合にのみ挿入されるようにすべきである。これは、そのリンク自身を挿入するためにスクリプトを使う (つまり JavaScript がサポートされており、かつ有効な場合にのみリンクが表示される) ことで実現できる。
以下のコードは、JavaScript に依存した色を変更するリンク並びに、ウェブページのコンテンツの一部、関連するスタイルシート規則、及び色を変更するリンクが選択されたときに使われるスタイルシートを変更する JavaScript を示している。
この例は、現在のページの表示だけに適用される。実稼働環境では、利用者がそのサイトで一度選択すれば済むように、その設定をクッキーまたはサーバーサイドのユーザプロファイルに保存することが望ましい。
XHTML (抜粋):
In <head> section: <link href="main.css" rel="stylesheet" type="text/css" /> <link id="currentCSS" href="defaultColors.css" rel="stylesheet" type="text/css" /> In <body> section: <div id="colorswitch"> <p>Change colors:</p> <ul class="inline"> <li><a href="#" onClick="javascript:changeColors('altColors1.css');return false;" id="altColors1">dark blue on white</a></li> <li><a href="#" onClick="javascript:changeColors('altColors2.css');return false;" id="altColors2">yellow on black</a></li> <li><a href="#" onClick="javascript:changeColors('altColors3.css');return false;" id="altColors3">black on pale yellow</a></li> <li><a href="#" onClick="javascript:changeColors('altColors4.css');return false;" id="altColors4">black on white</a></li> <li><a href="#" onClick="javascript:changeColors('defaultColors.css');return false;" id="default">Reset to default</a></li> </ul> </div> <div id="mainbody"> <h1>Conference report</h1> <p>Last week's conference presented an impressive line-up of speakers...</p> </div>
CSS (抜粋):
In main.css: body{ font-family: Geneva, Arial, Helvetica, sans-serif; margin: 2em; } #mainbody { padding: 1em; } #colorswitch { float: right; width: 12em; border: 1px #000066 solid; padding:0 1em 1em 1em; margin:0; } #colorswitch p { padding-top:.5em; font-weight:bold; } In defaultColors.css: body, p { color:#000000; background-color:#FFFFFF; } h1, h2, h3 { color:#990000; background-color:#FFFFFF; } In altColors1.css: body, h1, h2, h3, p, a { color:#000066; background-color:#FFFFFF; } In altColors2.css: body, h1, h2, h3, p, a { color:#FFFF33; background-color:#000000; } In altColors3.css: body, h1, h2, h3, p, a { color:#000000; background-color:#FFFF99; } In altColors4.css: body, h1, h2, h3, p, a { color:#000000; background-color:#FFFFFF; }
JavaScript (抜粋):
function changeColors (newCSS) { document.getElementById('currentCSS').href = newCSS; }
このコードの実装サンプル: 異なる外部スタイルシートファイルを適用するために JavaScript のコントロールを使う
例 2: CSS プロパティを変更するためにクライアントサイドの JavaScript を使用する
この例はコンテンツの一部分を単純に変更するもので、複雑なサイトやページに対してはあまり実用的なものではないかもしれない。この例では、特定のコンテンツを強調表示するための背景として (あらかじめ用意された選択肢から) 利用者が選択した色を反映させるために、クラス名を変更する目的でクライアントサイドの JavaScript を使用している。
以下のコードには、達成方法を理解しやすくする目的で、XHTML コード内から JavaScript を呼び出す部分が含まれている。しかし、コンテンツ制作者は、JavaScript を組み込むためのその時点でのベストプラクティスを採用することが推奨される (控えめな JavaScript とプログレッシブエンハンスメントについての詳細はリソースを参照)。
XHTML (抜粋):
<h1>Product comparison</h1> <p>The products you selected to compare are listed below. Any differences between the products are highlighted and italicized.</p> <p class="inlinePara">Change hightlight color: </p> <ul class="inline"> <li><a href="#" onClick="changeColor('hghltLightYellow');return false;" class="hghltLightYellow">light yellow</a></li> <li><a href="#" onClick="changeColor('hghltBrightYellow');return false;" class="hghltBrightYellow">bright yellow</a></li> <li><a href="#" onClick="changeColor('hghltLightBlue');return false;" class="hghltLightBlue">light blue</a></li> <li><a href="#" onClick="changeColor('hghltBrightBlue');return false;" class="hghltBrightBlue">bright blue</a></li> <li><a href="#" onClick="changeColor('hghltLightRed');return false;" class="hghltLightRed">light red</a></li> <li><a href="#" onClick="changeColor('hghltDrkRed');return false;" class="hghltDrkRed">dark red</a></li> </ul> <table width="400" border="1"> <tr> <td> </td> <th scope="col">Product 1</th> <th scope="col">Product 2</th> </tr> <tr> <th scope="row">Aspect 1</th> <td>Yes</td> <td>Yes</td> </tr> <tr> <th scope="row">Aspect 2</th> <td class="hghltLightYellow">Yes</td> <td class="hghltLightYellow">No</td> </tr> <tr> <th scope="row">Aspect 3</th> <td>Yes</td> <td>Yes</td> </tr> </table>
CSS (抜粋):
body { color:#000000; background-color:#FFFFFF; } .hghltLightYellow { color: #000000; background-color: #FFFF99; font-style:oblique; } .hghltBrightYellow { color: #000000; background-color: #FFFF00; font-style:oblique; } .hghltLightBlue { color: #000000; background-color: #33FFFF; font-style:oblique; } .hghltBrightBlue { color: #FFFFFF; background-color: #0000FF; font-style:oblique; } .hghltLightRed { color: #000000; background-color: #FF6266; font-style:oblique; } .hghltDrkRed { color: #FFFFFF; background-color: #993300; font-style:oblique; } .inlinePara {display:inline; } .inline {display: inline; margin-left:0px; padding-left:0px; line-height:3em; } .inline li { display:inline; } .inline li a {padding: 0.5em 1em; border: 2px solid #000000; }
JavaScript (抜粋):
function changeColor(hghltColor) { // collects table data cells into an array var els = document.getElementsByTagName('td'); // for each item in the array, look for a class name starting with "hghlt" // if found, change the class value to the current selection // note that this script assumes the 'td' class attribute is only used for highlighting for (var i=0; i<els.length; i++) { if (els[i].className.indexOf("hghlt") == 0) { els[i].className = hghltColor; } } }
このコードの実装サンプル: CSS プロパティを変更するためにクライアント JavaScript を使う
例 3: 異なる外部スタイルシートファイルを適用するために PHP の $_GET を使う
このシンプルな例では、二つあるうちの一つの外部スタイルシートを割り当てるために PHP の $_GET を使用している。同様のことは、PHP の様々な機能を使って実現できる。この例では、現在のページの表示だけに適用される。実際の制作においては、利用者がそのサイトにおいて一度選択すれば済むように、設定をクッキーまたはサーバーサイドのユーザプロファイルに保存することが望ましい。
以下のコードは PHP であるが、同様のアプローチは様々なサーバーサイドのウェブコンテンツ技術によって可能である。
PHP 及び XHTML (抜粋):
At the beginning of the PHP page: <?php $thestyle = $_GET['set']; if ($thestyle == "style1") { $thestyle = "style2"; } else { $thestyle = "style1"; } ?> In the <head> section: <link rel="stylesheet" type="text/css" media="screen" href="<?php echo($thestyle);?>.css" > In <body> section: <?php if ($thestyle == "style1") { echo "<a href=\"index.php?set=style1\">Switch to Style Sheet Two</a>"; } else { echo "<a href=\"index.php?set=style2\">Switch to Style Sheet One</a>"; } ?> <div id="mainbody"> <h1>Conference report</h1> <p>Last week's conference presented an impressive line-up of speakers...</p> </div>
CSS (抜粋):
In style1.css: body, p { color:#000000; background-color:#FFFFFF; } h1, h2, h3 {color:#990000; background-color:#FFFFFF; } In style2.css: body, h1, h2, h3, p, a { color:#FFFF00; background-color:#000000; }
このコードの実装サンプル: 異なる外部スタイルシートファイルを適用するために PHP の $_GET を使う
例 4: 代替スタイルシートを提供するために JSP を使用する
以下の例では二つのファイルを使用している:
- フォームを含む Java Server Page (JSP) 及びフォームの処理コード
- 上記ページ及び同様のスタイルを使用する他のページで使用される関数を含むインクルードファイル
サーバーサイドのコードは、利用者が選択したスタイルシートのための通常の link 要素及び他のスタイル用の「alternate stylesheet」のついた link 要素を出力する。そのコードは、二つめの例にあるように、クライアントサイドのコードのフォールバックとして使用することもできる。
フォームを含む JSP ページ:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><%@include file="_jsp/styleswitch.jsp"%><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>Change Style</title> <% String fStyle = ""; String styleName = "style"; String defaultStyle = "default"; Cookie[] cookies = request.getCookies(); // get style from post request parameters if (request.getMethod().equals("POST") && request.getParameter("styleSelect") != null) { fStyle = request.getParameter("styleSelect"); // code that validates user input (security) not shown if (fStyle.equals("nostyle")) { // user prefers no author style } else { // user requests author style out.println(createStyleLinks(fStyle).toString()); } storeStylePreferenceCookie(request, response, fStyle); } else if (request.getMethod().equals("GET")) { // GET request; get style from cookie; else default style links // get style from cookie if (cookies != null) { // get style from cookies fStyle = getStyleFromCookies(cookies); if ( !fStyle.equals("NULL_STYLE") ) { // user requests author style out.println(createStyleLinks(fStyle).toString()); } else { // no cookie for style; process request for style preference // default style links out.println(createStyleLinks(defaultStyle).toString()); } } else { // GET request without cookies: default styles out.println(createStyleLinks(defaultStyle).toString()); }//end else cookies } %> </head> <body id="home"> <form action="_styleSwitch.jsp" method="post" id="styleswitchform" name="styleswitchform"> <p><label for="styleSelect">Select style: </label> <select id="styleSelect" name="styleSelect"> <option value="default">Default (shades of green)</option> <option value="wonb">White on black</option> <option value="bonw">Black on white</option> </select> <input type="submit" value="Change Style" /> </p> </form> </body> </html>
上記ファイルにインクルードされる「styleswitcher.jsp」ファイル:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%! /** * Get the links (link elements) to the CSS files based on cookies, ... */ private String getStyleLinks(HttpServletRequest request) { String styleLinks = ""; Cookie[] cookies = request.getCookies(); String defaultStyle = "default"; String tempStyle = ""; // GET request; get style from cookie; else default style links // get style from cookie if (cookies != null) { // get style from cookies tempStyle = getStyleFromCookies(cookies); if ( tempStyle.equals("NULL_STYLE") ) { // no cookie for style; process request for style preference // default style links styleLinks = createStyleLinks(defaultStyle).toString(); } else { // user requests author style styleLinks = createStyleLinks(tempStyle).toString(); } } else { // GET request without cookies: default styles styleLinks = createStyleLinks(defaultStyle).toString(); }//end else cookies return styleLinks; } /** * Get style cookie from request */ private String getStyleFromCookies( Cookie[] cookies ) { String fStyle = "NULL_STYLE"; for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; String name = cookie.getName(); if ( name.equals("style") ) { fStyle = cookie.getValue(); // code that validates cookie value (security) not shown } } return fStyle; } /** * Store the style preference in a persistent cookie */ private void storeStylePreferenceCookie(HttpServletRequest request, HttpServletResponse response, String theStyle) { final int ONE_YEAR = 60 * 60 * 24 * 365; Cookie styleCookie = new Cookie("style", theStyle); styleCookie.setMaxAge(ONE_YEAR); response.addCookie(styleCookie); } /** * Create the link elements for the stylesheets */ private StringBuffer createStyleLinks(String prefStyle) { StringBuffer theStyleLinks = new StringBuffer(); //two-dimensional array with identifiers (adding '.css' gives the name of the CSS file) // and strings for the title attribute of the link element // the identifiers must correspond to the in the "value" attributes in the "option" // elements in the style switcher form String [] [] styles = { { "default", "Default style"}, { "wonb", "White on black"}, { "bonw", "Black on white"} }; // loop over 2dim array: if styles[i][1] matches prefStyle, // output as normal, else as alternate stylesheet for (int i = 0; i < styles.length; i++) { if ( styles[i][0].equals(prefStyle) ) { // output pref stylesheet as normal stylesheet theStyleLinks.append("<link rel=\"stylesheet\" href=\"_css/").append(styles[i][0]) .append(".css\" title=\"").append(styles[i][1]).append("\" type=\"text/css\" />").append("\n"); } else { // output other stylesheets as alternate stylesheets theStyleLinks.append("<link rel=\"alternate stylesheet\" href=\"_css/") .append(styles[i][0]).append(".css\" title=\"").append(styles[i][1]) .append("\" type=\"text/css\" />").append("\n"); } } // end for loop return theStyleLinks; } %>
他の JSP ページは、以下のコード (include / scriptlet) を用いてこのコードを使用できる:
<%@include file="_jsp/styleswitch.jsp"%><% out.println(getStyleLinks(request)); %>
参考リソース
参考リソースは、あくまでも情報提供のみが目的であり、推薦などを意味するものではない。
プログレッシブエンハンスメントと控えめな JavaScript
HTML 又は XHTML ページにおける JavaScript 実装をするための現在のベストプラクティスは、構造及び提示からコンテンツの動作をある程度分離させて使用することである。「プログレッシブエンハンスメント」及び「控えめな JavaScript」という用語は、ページの機能を向上又改善するが、JavaScript がサポートされていない場合でもコンテンツが機能し続けられるように優雅に変換するスクリプトを表すのによく使用されている。
より詳しく知るための推奨される情報:
検証
手順
- 利用者が代替となる提示を選択できるようなコントロールがウェブページに含まれていることを確認する。
- 個々の CSS スタイルのプロパティを変更する、又は代替スタイルシートをアクティブにすることによって、コントロールが提示の変更していることを確認する。
- 結果として表示されたページは、元のページの適合している代替版であることを確認する。
期待される結果
- 上記の全ての結果が真である。