youtubeをレスポンシブして背景にする

いつも使ってたプラグインjQuery tubularと、解析タグが衝突を起こして不定期にバグが起きる症状に悩まされたので、自分で背景スクリプトを書いてみました。
jQuery1.8.3で動作しますが、それ以前でも以後でも動く気はします。

html

bodyの開始タグの直後がおすすめ

<div id="bg">
	<div id="bgPlayer"></div>
	<div class="overlay"></div>
</div>

css

#bg{
	width: 100%;
	height: 100%;
	z-index: 1;
	position: fixed;
	overflow: hidden;
	left: 0;
	top: 0;
}
#bgPlayer{
	position: absolute;
}
.overlay{
	width: 100%;
	height: 100%;
	z-index: 2;
	position: fixed;
	left: 0;
	top: 0;
}

JavaScript


var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;

function onYouTubeIframeAPIReady() {
	player = new YT.Player('bgPlayer', {
	  height: '315',
	  width: '560',
	  videoId: '2bJ49dOSP9o',
	  playerVars: { 'autoplay': 1,
			'controls': 0,
			'showinfo': 0,
			'rel' : 0,
			'modestbranding': 1,
			'loop': 1,
			'playlist': '2bJ49dOSP9o',
			'wmode': 'transparent'
		},
	  events: {
		'onReady': onPlayerReady,
	  }
	});
}

	function onPlayerReady(event) {
		event.target.mute();
		event.target.playVideo();
	}


$(function(){
	var ratio = 16/9;
	$('html,body').css({'width': '100%', 'height': '100%'});
	function setSize(){
        var width = $(window).width(),
            pWidth,
            height = $(window).height(),
            pHeight,
            $bgPlayer = $('#bgPlayer');

        if (width / ratio < height) {
            pWidth = Math.ceil(height * ratio);
            $bgPlayer.width(pWidth).height(height).css({left: (width - pWidth) / 2, top: 0});
        } else {
            pHeight = Math.ceil(width / ratio);
            $bgPlayer.width(width).height(pHeight).css({left: 0, top: (height - pHeight) / 2});
        }
	}

	setSize();

	$(window).resize(function() {
		setSize();
	});
});

参考サイト

jQuery tubular
http://www.seanmccambridge.com/tubular/

YouTube JavaScript Player API Reference
https://developers.google.com/youtube/js_api_reference?hl=ja

YouTube 埋め込みプレーヤーとプレーヤーのパラメータ
https://developers.google.com/youtube/player_parameters?hl=ja

別窓を開いてシェアしつつ、元々の窓ではシェアありがとう画面を表示する

<a href="https://www.facebook.com/sharer/sharer.php" target="_blank" class="shareBtn">Facebookでシェアする</a>
<a href="https://twitter.com/share?text=share!" target="_blank" class="shareBtn">Twitterでシェアする</a>
$(function(){
	$('.shareBtn').on('click', function(event) {
		window.location.href = 'thanks.html'
	});
});

jquery.infinitescroll をクリックで読み込む(改)

jquery.infinitescroll をクリックで読み込む方法はこちらが詳しいです。

【jQuery】無限スクロール[Infinite Scroll]を極限までカスタマイズ。

だけど、この方法のままだともう読み込むものが無い状態でも、「続きを見る」が表示され、クリックした後に読み込むものが無いことがわかる、というちょっと不親切な状況になってしまいます。
なので、ちょっと改善。
(変更したのはグレーのハイライト部分です)
読み込むページ数を指定して、そのページ数を読みきったらボタンを非表示にしてしまいます。

<script src="js/jquery.infinitescroll.min.js"></script>
$(function(){
	//ページ数を増やしたらpageMaxの数字を変更する
	var pageMax = 5;
	var pageNow = 1;
	$('#thanks .clearfix').infinitescroll({
		navSelector  	: '#infinitBox .btn',
		nextSelector 	: '#infinitBox .btn',
		itemSelector 	: '#infinitBox ul li',
		dataType		: 'html',
		loading: {
			finishedMsg: '<p class="loadingMessage">全ての画像を読み込みました!</p>',
			img: 'img/loading.gif',
			msgText: '<p class="loadingMessage">画像を読み込み中です</p>',
			speed: 'fast'
		}
	},
	function(newElements) {
		$(newElements).hide().delay(100).fadeIn(600);
		if (pageMax <= pageNow+1) {
			$btn.hide();
		} else {
			pageNow ++;
			$("#infinitBox .btn").appendTo("#infinitBox .wrap").delay(300).fadeIn(600);
		};
	});
	$('#infinitBox .clearfix').infinitescroll('unbind'); // 初期化
	$("#infinitBox .btn").click(function(){
		$('#infinitBox .clearfix').infinitescroll('retrieve');
		return false;
	});
});

iphoneやAndroid2.3でもちょっとはマシな背景画像fix方法

iphoneやAndroid2.3で背景画像固定を実現する方法のメモ。(要jQuery)

まずは横幅640px
縦幅適当(iPhoneの縦の高さをカバーできるくらい)の画像を用意。

html

<html>
<header>
	<!--略-->
</header>
<body>
	<div id="main">
		<p>コンテンツ</p>
	</div>
</body>
</html>

js

これで背景画像を追加してます

$(function(){
	$('body').prepend('<img src="img/bg_sub02.jpg" id="allBg">');
});

css

背景画像をfixedさせて、z-indexをメインのコンテンツより下に。
メインのコンテンツを背景画像よりz-index上にしてposition:relativeする。
横幅を100%にするかはお好みで。

/*body*/
body{
	background-color: #000;
}

/*背景の設定*/
body #allBg{
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	z-index: 1;
}

#main{
	position: relative;
	top: 0;
	left: 0;
	z-index: 2;
}

Colorboxの改造メモ

ライトボックス系プラグインで扱いやすいcolorboxと改造したのでメモ

Colorboxの表示画像にaltを追加したい

まずはリンク元にtitleをつけておく(ここまでは標準機能でタイトルを表示させる方法と同じ)

jquery.colorbox.jsを開きます。

979行目にこちらの一行を追加。

		.attr('alt', settings.get('title'))

キャプションのみ非表示にする

837行目辺りのここをコメントアウト。
キャプション表示機能をオプションでfalseにすると、alt自体も無効になってしまうので。

//		$title.html(settings.get('title')).show();

リンク元をtitleでなくaltで設定したい

86行目辺りを以下のように改造。

	title: function() {
//		return this.title;
		return $(this).attr('alt');
	},

alt以外にキャプションも設定したい

リンク元に
data-caption=”キャプションの文言”
を追加

90行目辺りにこれを追加

	caption: function() {
		return $(this).data('caption');
	},

840行目辺りのここを改造。
キャプション表示機能をオプションでfalseにすると、alt自体も無効になってしまうので。

//		$title.html(settings.get('title')).show();
		$title.html(settings.get('caption')).show();

要素を表示したり消したりの一覧

jQueryでアニメーションをする時、要素を表示したり消したりする手段がいろいろあるのでメモしました。

/*透過を含む画像はIE9以上で使いましょう*/
.show(1000);
.hide(1000);
.fadeIn(1000);
.fadeOut(1000);
.animate({opacity:'1'},1000);
.animate({opacity:'0'},1000);
.css({opacity:'1'});
.css({opacity:'0'});

/*IE8でもOK*/
.css({visibility:'visible'});
.css({visibility:'hidden'});
.css({display:'block'});
.css({display:'none'});

スマートフォン用にアニメーションをjQueryとcss3で作ったので便利だったページをメモ

PCサイト用のFlashをスマートフォン用にjQueryとcss3で書きなおしました。
便利だったページをメモします。

基本機能を確認

jQueryの日本語リファレンス
http://js.studio-kingdom.com/

jQueryのイージングプラグインの動きまとめ
http://easings.net/ja

CSS3でアニメーション!transitionとanimationまとめ(サンプル付き)
http://www.flapism.jp/html/416/

ベンダープレフィックスの扱い

ベンダープレフィックスの整理整頓
https://w3g.jp/blog/vendor_prefix_cleaning

ベンダープレフィックスの順序
http://kojika17.com/2013/02/ordering-vender-prefix.html

Androidの限界

@keyframesとAndroid(CSS3のアニメーションのバグのまとめ)
http://blog.webcreativepark.net/2012/02/12-141313.html

Android2.3ではCSS3でイージングは使えないみたい。
回転軸の指定とかも難しいかも。
あと、Android2.3ではメモリの限界?で、同一画面内で複数箇所以上アニメーションさせると動かなくなりました。
どの要素をアニメーションさせるか取捨選択は必要ですね。

$(document).on(‘click’,’.selector’, function(){}); と $(‘.selector’).on({ ‘click’: function() {} });の違い

var $jqObj = <div class="btn"></div>
$('.box').append($jqObj);

のようにして、
新たに追加した要素に対して。

$(document).on('click','.btn', function(){});

であれば操作できた要素が

$('.box').on({ 'click': function() {} });

であると操作できなかった。
この二点の本質的な違いはなんなんだろ~か。
jQuery読みこめばわかるんだろうなあ。
わかんないけど、そういう事象があるということをメモ。

フッターで停止する追尾メニュー

フッターで停止する追尾メニュー。
jQuery使用(1.7.2と1.9.1では動いた)
但しメニューが縦に長過ぎると見にくいので、ご利用は計画的に!!
(関数名が「オートスクロール」以外になんかいいのないかな。。。)

$(function(){
//追尾メニュー
	var nav = $('#nav');
	var footer = $("#footer");
	var navTop;
	var navBottom;
	var winTop;

	function autoscroll(){
		//後からのコンテンツの追加に対応できるよう常に計算する
		navBottom = footer.offset().top - nav.height();
		winTop = $(this).scrollTop();
		if (winTop >= navTop && winTop <= navBottom) {
			nav.css({
				position: 'fixed',
				top: '0px'
			});
		}else if(winTop <= navTop){
			nav.css({
				position: 'relative',
				top: '0px'
			});
		}else if(winTop >= navBottom){
			nav.css({
				position: 'absolute',
				top: navBottom + 'px'
			});
		}
	}

	window.onload = function() {
		navTop = nav.offset().top;
		autoscroll();
	}

	//スクロールをするたびに実行
	$(window).scroll(function () {
		autoscroll();
	});
});

3月6日追記
スクロールする度にfooter.offset().topを計算し直すように変更しました。
重くなるじゃん!と思ったけど、コンテンツが後から追加された場合に対応せねばならないので。

簡単に間欠処理してイベント負荷を抑制

スクロールに応じてパララックス処理をするなんて時に、
スクロールの度に処理を走らせると、IEでは重くなる。(IE11でも重い)
なので、指定ミリ秒以下の処理は無視するようにした。
間欠処理は、このエントリでもちらっと触れてたな。
jQueryでTwitter用文字数カウント

jQueryを使った場合。

$(function(){
	var timer = null;
	$(window).on('scroll',function() {
		clearTimeout( timer );
		timer = setTimeout(function() {
			//処理内容
		}, 12 );
	});
});

参考サイト様
https://w3g.jp/blog/tools/intermittent_event_load_reduce