JavaScript

デバイス別、クロスブラウザ別対応 - not useragent

もはや他ブラウザでも問題ないようにクロスブラザ対応だけでなく、スマートフォンやタブレット端末などマルチデバイスに対応できるようになっておかなければ、という時代になって1,2年が経ちました。
「プログレッシブエンハンスメント」や「グレイスフルデグラデーション」、「メディアクエリ」、「CSSスプライト」、「モバイルファースト」というキーワードも聞かれるようになりました。
あ、最大のキーワードは「html5」。これは広義にも狭義にも使われてますね。

このような流れを受けてか、ビジュアルデザインは大きく、フォントも大きくなったサイトを見かけることが多くなった気がします。
結果見やすく、アクセシビリティにも良い印象。個人的にも素材を大きくダイナミックな表現は好みなので見てて楽しいです。
っとデザインの話しではなく、クロスブラウザ、マルチデバイスにどう対応するか。

そのコンテンツのユーザーは誰か?をデバイスごとに考える

「そのコンテンツのユーザーは誰か?」だけではなく、これからは、この問いを「デバイスごとに」しっかり考えたい。
ここができなければ、そもそもあえてマルチデバイス対応する必要は「絶対ない」と思う。そんなコンテンツは制作者のスキルアップ以外、ただのリソースの無駄だ。資源は大切にしたい。

ここを踏まえた上で、マルチデバイス対応を考えたときに、その手法は大きく分けて2つ。

  1. デバイス別にマークアップ(each device)
  2. 1ソースマルチデバイス(one for all)

デバイス別にマークアップ(each device)

デバイス別に表現したい内容が異なる場合や表現方法自体異なる場合に最適。
運用負荷は高くなってしまうが、カスタマイズする自由度は高い。

1ソースマルチデバイス(one for all)

PCサイトとスマートフォンサイトで見せたい内容はほぼ同じ場合に最適。
htmlソースはひとつで、端末別に読み込むCSSを変えてデザインを変更するのが基本。
運用中、あるデバイス用にhtmlの骨格自体を修正する必要が出た場合、管理がカオスになる危険があるが、通常の運用負荷は低い。

useragentを使わずにデバイス別、クロスブラウザ別対応する

ぼくはCSSハックが大嫌い(大概のことはhtmlとcssを見直せばハックの必要がない)。クロスブラウザ対応と言ってユーザーエージェント使ってブラウザ別にCSSを組むなんてあり得ない(大概のことはhtmlとcssを見直せばハックの必要がない!)。
そんなタイプなので、デバイス判別にユーザーエージェントは使わずに対応したい。これはその後のメンテも必要ないのでハッピー。

と、スーパー前置きが長くなりました。いきなり本題です。

html(CSSメディアクエリ)
<link rel="stylesheet" href="smartphone.css" media="screen and (max-width: 480px)" type="text/css" />
<link rel="stylesheet" href="smartphone.css" media="screen and (max-height: 480px)" type="text/css" />
javascript

if ("object" == typeof document.documentElement.ontouchend) {
// 【type A】これはスマートフォンかタブレット端末です。
}

if ("undefined" == typeof document.documentElement.style.maxHeight) {
// 【type B】これはレガシーブラウザです。
}

この組み合わせで、クロスブラウザ対応、マルチデバイス対応を実現できます。

  CSSメディアクエリ JS
スマートフォン ○【type A】
タブレット × ○【type A】
レガシーブラウザ △(ウィンドウサイズによる) ○【type B】
モダンブラウザ △(ウィンドウサイズによる) ×

下記は、bodyタグのid名にデバイス別に値をセットするサンプルJavaScriptです。

window.onload = function () {
var type_device = 'normal';
if ("object" == typeof document.documentElement.ontouchend) {
// これはスマートフォンかタブレット端末です。
type_device = 'smartphoneOrTablet';
} else if ("undefined" == typeof document.documentElement.style.maxHeight) {
// これはレガシーブラウザです。
type_device = 'legacy';
}
document.getElementsByTagName('body')[0].setAttribute('id', type_device);
}

Windows PhoneなどWebkit以外のスマホが普及してきたら、IEかどうかの判別が必要になるかもですね。
ちなみにIEかどうかの判別もuseragentを使わずに簡単にできます。
JavaScriptでIEかどうかの判別

さいごに

スマートフォン普及の原動力、iPhone。そのAppleのサイトはスマートフォンで見るとどうなるんだろう?と思って見て、その選択に妙に納得。ピンチイン・ピンチアウトは重要なUX。運用管理の面でも最強です。

最近の記事

インタラクションデザイン

5年くらい前に購入した書籍「インタラクションデザイン」。この書籍内ではたくさんの事例が紹介されている。残念ながらその多くは現在閲覧することができなくなっていた・・・

デザイン

Advanced Custom Fields 名前を変更して、データも反映させる

WordPressを自作する上でもはや欠かせないプラグインの一つが、「Advanced Custom Fields」。 名前を変更しようと思って、Wor・・・

WordPress

配列の重複を削除する

配列の場合 /** * 配列の重複を削除する * * @param {array} ary* * @return {array} 処理後のary・・・

JavaScript

MAMP を 5.7 から 6.2 にアップデートした

5年以上前と比べると、アップデートが簡単で驚く。とくに記事にするまでもないと思いつつ、一応備忘録。 インストールすると、既存のディレクトリはそのままに別・・・

MAMP

Briefly unavailable for scheduled maintenance. Check back in a minute. → . maintenance を削除

プラグインを更新中に、誤って、違うページにアクセスしまいました。すると、管理画面だけでなく、公開中のすべての画面が「briefly unavailable f・・・

WordPress

GulpでERRが出てテンパった → gyp: No Xcode or CLT version detected! → PostCSS plugin autoprefixer requires PostCSS 8

Gulp。いつもは正常に動いている環境をそのままコピーして再利用するようにしている。そうすることで、案件ごとに毎回環境作りをする手間を省くことができ、何よりG・・・

制作効率化

ビジネス前提ワークシート

書籍「LEAN UX リーン思考によるユーザエクスペリエンス・デザイン」から抜粋。 「前提の宣言」「MVPの作成」「実験の実行」「フィードバックとリサー・・・

知識編

リーン思考のUXデザイン

LEAN UX は、コラボレーションと部門/領域横断的な手法によって、製品の本質を素早く明らかにするための実践的手法であり、これによって文書への過度な依存を減・・・

知識編

ES6(ES2015)の主な変更点

オブジェクト指向 クラス定義 JavaScriptは厳密にはクラスがない、プロトタイプベースのオブジェクト指向言語。ES6でclass構文が導入さ・・・

JavaScript

JavaScriptスタイルガイド

書籍「メンテナブルJavaScript」と Google JavaScript Style Guide 和訳 を参考に自分なりのJavaScriptスタイルガ・・・

JavaScript

人気の記事

WP_Queryを使って絞り込み検索するのにコレは便利!

めっちゃ参考になるページを見つけた。 絞り込みをするたびに色々ググっていたが、これがあればほとんどのことが解決できそうな気がする。 参考: これは便利!Word・・・

WordPress

overflowをautoにした要素のスクロール位置を変更する → scrollTop scrollLeft

まずはサンプル。 これは、overflowをautoにした要素のスクロール位置を変更するサンプルです。 これは、overflowをautoにした要素のスクロ・・・

JavaScript

http://localhost:8888/ → http://localhost/

http://localhost:8888/ での参照ではなく、http://localhost/ で参照できるようにします。 MAMPの設定を変更する M・・・

MAMP

アーカイブページでカスタムフィールドやタクソノミーで絞り込みした状態でリスト表示する

<?php $args = array( 'paged' => 1, 'posts_per_page' => 20, 'post・・・

WordPress

iframeの高さを自動調整する

iframeで呼び出した際、iframe自体はスクロールさせずに高さを取得してiframe全体を表示させます。 サンプル:iframeの高さを自動調整するデモ・・・

JavaScript

イラストレーターでレイヤーごとにPNGで書き出す

【2020年07月13日】 macOS Catalina(10.15.5) / Adobe iLLustrator 2020(24.2.1) にて動作確認済・・・

Illustorator

WordPressのカテゴリー一覧ページでカテゴリー名とスラッグを取得する → get_queried_object()

やりたいこと カテゴリー一覧ページで、そのカテゴリー一覧ページに属する記事一覧を取得するためにループさせるのとは別に、タイトルやカテゴリー別にデザインを変・・・

WordPress

カウントアップ、カウントダウンするJavaScript

ポイントを使ったり、増やしたりしたときに、結果のポイント数に差し替えるのではなくて、カウントアップしたり、カウントダウンして動的に動かそうと思って作ってみた。・・・

JavaScript

MAMPの日時(タイムゾーン)を変更する

MAMPを使用していて、日時の情報を制御しようとしたとき、取得している日時が日本時間ではないことに気がついた。 時差を計算してPHPでプログラミングしていたが、・・・

MAMP

管理画面のカスタム投稿一覧で並び順を変更する

WordPressの管理画面。「投稿」や「固定ページ」の一覧は、公開日順に並んでいる。ところが、カスタム投稿を追加した場合、公開順ではなく名前順に並んでいること・・・

WordPress

WEB制作マークアップJavaScriptデバイス別、クロスブラウザ別対応 - not useragent | シンプルシンプルデザイン