work.log

元エンジニアの備忘録的ブログ

TwentyFourteenでスマホ表示のhoverが戻らない問題を解消する

投稿:2014-01-21 19:26  更新:

WordPress のテーマ TwentyFourteen のカスタマイズ記事です。

TwentyFourteen のカスタマイズで :hover を使いクリック (およびタップ) 時に色を変えたりしているのですが、スマホのブラウザで「戻る」を押すと色が戻らない (押されたままの状態) になるというバグがあります。

状況がわかりづらいと思うので下記にそのスクリーンショットを掲載します。

タイトルをクリックしてページ遷移

twentyfourteen-customize-005-01

ブラウザの「戻る」で前回のページを表示

twentyfourteen-customize-005-02

このように色が変わったままで、リロードされない限り色が戻りません。iPhone しか持っていないので確認していませんが、Android でもこうなる様子。

調べても根本解決というのがないっぽくて、対処方法としては「CSS で hover 時の処理を変更」か javascrpt で何とかするという方法になるみたいです。

ただ、CSS を見直すのは面倒なので今回は javascript で何とかしてみようと思います。

hover 時の動作を制御する処理を追加

今回は下記ページで紹介されているコードをそのまま使わせていただきました。

上記のページではコードとともに細かい解説がされていますので必読です。

TwentyFourteen に読み込ませる javascript は、下記のコードを「touch.js」というファイル名で保存しておきます。保存先は TwentyFourteen 子テーマ内に「js」ディレクトリを作ってそこに保存します。

(function ($) {

	var linkTouchStart = function(){
		thisAnchor = $(this);
		touchPos = thisAnchor.offset().top;
		moveCheck = function(){
			nowPos = thisAnchor.offset().top;
			if(touchPos == nowPos){
				thisAnchor.addClass("hover");
			}
		}
		setTimeout(moveCheck,100);
	}

	var linkTouchEnd = function(){
		thisAnchor = $(this);
		hoverRemove = function(){
			thisAnchor.removeClass("hover");
		}
		setTimeout(hoverRemove,500);
	}

	$(document).on('touchstart mousedown','a',linkTouchStart);
	$(document).on('touchend mouseup','a',linkTouchEnd);

})(jQuery);

マウス操作時の処理も入っていますが、スマホ操作時は「指が触れたら」、「指が離れたら」という感じで動作します。通常は「指が離れたら」動作をするようなので hover 時の動作が遅くなるようです。

保存後は、TwentyFourteen でこのコードを読み込むように設定してあげます。設定は子テーマ内の functions.php で行います。(functions.php はなければ作成)

if ( ! is_admin() ) {

	function deregister_script() {
		wp_deregister_script( 'jquery' );
		wp_deregister_script( 'jquery-migrate' );
	}

	function register_script() {

		$jsdir = get_stylesheet_directory_uri();

		wp_register_script(
			'jquery',
			'//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js',
			false,
			'1.10.2',
			true
		);

		wp_register_script(
			'jquery-migrate',
			'//cdnjs.cloudflare.com/ajax/libs/jquery-migrate/1.2.1/jquery-migrate.min.js',
			array( 'jquery' ),
			'1.2.1',
			true
		);

		wp_register_script(
			'touch',
			"$jsdir/js/touch.js",
			array( 'jquery' ),
			'1.0',
			true
		);

	}

	function add_script() {
		deregister_script();
		register_script();
		wp_enqueue_script( 'jquery' );
		wp_enqueue_script( 'jquery-migrate' );
		wp_enqueue_script( 'touch' );
	}
	add_action( 'wp_enqueue_scripts', 'add_script' );

}

今回は初編集だったのでこのようにしてみました。

親テーマから呼ばれている jquery, jquery-migrate は一度取り消して CDN 経由にしています。

後はスマホから動作確認をして問題なければ OK です。

実の所、これを実装しても「戻る」直後は色が戻っていないのですが、何かしらの動作 (どこかをタッチ) すると色が戻るので大分良くなった感じです。

簡単でしたが「TwentyFourteenでスマホ表示のhoverが戻らない問題を解消する」は以上になります。