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。運用管理の面でも最強です。

最近の記事

投稿を公開したときに指定したページにアクセスする

この記事では「管理画面で投稿やカスタム投稿の公開ステータスを更新したときに何かしらの処理をする」方法の備忘録です。 functions.php を修正し・・・

WordPress

ローカルフォントをWebフォント指定する

Google Fonts はとても便利だが、適用するまでの遅延が気になったので、同様の効果をローカルにあるフォントを利用して実現させる。 事前に用意する・・・

CSS

[ソフト] Web font用のwoff、woff2にフォントを変換する無料サービス

WOFFコンバータ ダウンロードhttps://opentype.jp/woffconv.htm 以下、リンク先の「概要」を抜粋。 フォント・・・

CSS

JSON

JSON.parse() 配列とオブジェクトのリテラル記法を組み合わせた文字列をデータとして取り扱えるようにする。 // JSONデータ let ・・・

JavaScript

いろいろな判定

真の場合。偽の場合は、!== を使う。 プリミティブ値の判定 文字列の判定 if (typeof a === 'string') {} ・・・

JavaScript

Custom Post Type UI で 投稿画面にタクソノミー が表示されなくなった場合 → REST API

数ヶ月前、WordPress本体をバージョンアップして、エディタがガラリと変わった。その際、それまでサイドナビに、Custom Post Type UI(CP・・・

WordPress

なるほどデザイン

書籍「なるほどデザイン」を読んだときにメモしたノートが出てきた。3, 4年前に読んだ本。テキストのみで備忘録として残しておくが実際はイラストと合わせ・・・

デザイン

グーグルの考えるデザインガイドライン

使えるデザインになっている?→ デザインは正しいインプットによって、人の暮らしや夢を助けるツールサクサクと動く、機能するデザインになっている?→ デザインが機・・・

デザイン

売れるデザイン

書籍「売れるデザインのしくみ」を読んだときにメモしたノートが出てきた。3, 4年前に読んだ本。2009年に出版されたと知って驚き。10年前と言えば、・・・

マーケティング・ブランディング

スタバに学ぶ。

書籍「スターバックスはなぜ値下げもテレビCMもしないのに強いブランドでいられるのか?」を読んだときにメモしたノートが出てきた。3, 4年前に読んだ本。20・・・

マーケティング・ブランディング

人気の記事

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

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

JavaScript

iframeの高さを自動調整する

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

JavaScript

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

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

WordPress

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

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

MAMP

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

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

Illustorator

背景画像の拡大・縮小 → background-size !

W3Cで「モジュール背景とボーダー」について2011年2月15日付けで更新されてますね。 CSS3では、背景画像の幅・高さを拡大・縮小するプロパティが追加され・・・

CSS

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

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

WordPress

Advanced Custom Fields を使った条件分岐(セレクトボックス、チェックボックス、ラジオボタン、真偽)のテンプレート記述方法

前回、「入力フォームを自由にカスタマイズできる「Advanced Custom Fields」」で基本的なフィールド名を出力方法を紹介したが、今度は条件分岐に関・・・

WordPress

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

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

WordPress

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

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

JavaScript

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