画面の縦の高さが足りない時にフッターの高さを高くして調整する

画面の縦の高さが足りない時
フッターを画面の最下部にくっつけるというアプローチもいい。
だが今日は背景色をいろいろ追加するデザインをいただいていて、
bodyとフッターの背景色を別色に設定していた。
なので、フッターの高さを画面ピッタリにして調整するというアプローチをしてみた。

windowsの
IE8 IE11 chrome33 safari5
で検証済み

$(function(){
	footerHeight = function (){
		var footerWrap = $('div#footerWrap');
		//フッターの高さをリセット
		footerWrap.css({height:'auto'});
		//フッターのトップからの距離
		var ft = footerWrap.offset();
		//フッターの高さ
		var fh = footerWrap.height();
		//ウィンドウの高さ(スクロールバー領域を含む)
		//var wh = window.innerHeight;
		//ウィンドウの高さ(スクロールバー領域を含まない)		
		var dh = document.documentElement.clientHeight;
		if(ft.top+fh<dh){
			/* ウインドウの高さから、フッターのトップからの距離分と、フッターのボーダーの分引いた値がフッターの高さです */
			var fh = dh - ft.top - 2 + "px";
			footerWrap.css({height:fh});
		}
	};
	
	window.onload = function(){
		footerHeight();
	}
	
	$(window).resize(function() {
		footerHeight();
	});
});

フッターを下部に固定するfooterFixed.jsを、メインエリアの背景が切れないように改造してみた

MITライセンスのfooterFixed.js
http://blog.webcreativepark.net/2007/11/16-012253.html
すご~く便利なのだけど、メインエリアの背景が切れてしまうので、改造してみた。
要jQuery
JavaScriptだけで改造できるとかっこいいんだろうな……。

HTML(だいたい。)footerがfooterWrapに直してないのはちょっと恥ずかしいかなと思いつつ、そのまま公開。
気になるようなら個人的に直すといいんだろうな。

<div id="#headerWrap">
</div>
<div id="#mainWrap">
</div>
<div id="footer">
</div>

footerFixed.jsの改造部分。
30行目付近から。

		if(ft+fh<wh){
//追記部分開始
			var mainH = wh - fh - $('#headerWrap').height();
//追記終了
//記述変更
//			document.getElementById(footerId).style.position = "relative";
//			document.getElementById(footerId).style.top = (wh-fh-ft-1)+"px";
			document.getElementById(footerId).style.top = (wh-fh-ft)+"px";
//追記部分開始
			$('#mainWrap').css({height:mainH});
//追記終了
		}

ソーシャルボタンが配置されているページの描画の高速化

非同期通信を有効化することで、ソーシャルボタンが配置されているページの描画を高速化できるみたい。
本当に描画が早くなった!!

facebook

<script type="text/javascript">// <![CDATA[(略)

の部分に変更

変更前の行

js = d.createElement(s); js.id = id;

変更後の行

js = d.createElement(s); js.id = id; js.async = true;

twitter

!function(d,s,id)(略)

の部分に変更

変更前の行

js=d.createElement(s);js.id=id;

変更後の行

js=d.createElement(s);js.id=id;js.async = true;

google+

window.___gcfg = {lang: 'ja'};
(function() {(略)

の部分に変更

変更前の行

var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;

変更後の行

var po = document.createElement('script'); po.type = 'text/javascript';

参考サイト様

http://ora.geo.jp/?p=474

jQueryでタブ切り替え。バグるコードとバグらないコードを比較してみた。

タブ切り替え的なUIを作った。
バグるコードとバグらないコードをメモしておく。

バグるコード。
chrome33で、
素早くタブ切り替えをするとバグる。
フラグで切り替えたりしてても時々バグる。
処理中に別の処理が並行して走るからバグってしまうみたい。
比較的処理がゆっくりなIE8とかだとバグらない。
具体的にどこでエラーを起こしてるのかはよくわからなかった。

$(function(){
	//画像の先読み
	jQuery.preloadImages = function(){
		for(var i = 0; i<arguments.length; i++){
			jQuery('<img>').attr('src', arguments[i]);
		}
	};
	$.preloadImages('/img/btn01_on.png','/img/btn02_on.png','/img/btn03_on.png','/img/btn04_on.png','/img/btn05_on.png','/img/btn01_selected.png','/img/btn02_selected.png','/img/btn03_selected.png','/img/btn04_selected.png','/img/btn05_selected.png','/img/tab02.jpg','/img/tab03.jpg','/img/tab04.jpg','/img/tab05.jpg');
	
	
	$(window).load(function(){
		var onName = '_on';
		var offName = '_off';
		var selectedName = '_selected';	
		var imgBefore = '/img/btn_';
		var imgAfteron = '_on.png';
		var imgAfteroff = '_off.png';
		var imgAfterselected = '_selected.png';
		
		//サムネイルクリック時の挙動
		
		var changeflag = true;
		
		function changeImg() {
			$('#packageWrap li img').each(function(){
				var	thisattr = $(this).attr('src').replace(selectedName, offName).replace(onName, offName);
				$(this).attr('src',thisattr);
			});
		};
		
		$('#packageWrap li img').on({
			'click':function(){
				if(changeflag = true){
					changeflag = false;
					$('#packageWrap li img').removeClass('selected');
					$(this).addClass('selected');
					changeImg();
					$('#detailBox>div').hide();
					openDiv = '#' + $(this).attr('src').replace(imgBefore, '').replace(imgAfteroff, '').replace(imgAfteron, '').replace(imgAfterselected, '');
					$(openDiv).show();
					this.setAttribute('src', this.getAttribute('src').replace(offName, selectedName).replace(onName, selectedName));
					changeflag = true;
				}else{
					return false;
				};
			},
			'mouseenter':function(){
				if($(this).attr('class') == 'selected'){
					return false;
				}else{
					this.setAttribute('src', this.getAttribute('src').replace(offName, onName));
				}
			},
			'mouseleave':function(){
				if($(this).attr('class') == 'selected'){
					return false;
				}else{
					this.setAttribute('src', this.getAttribute("src").replace(onName, offName));				
				}
			}
		});
	});
});

バグらないコード。
ひとつひとつif文で分岐しているからバグらない。
手抜きしないで丁寧に分岐させてあげるのが大事みたい。

$(function(){
	//画像の先読み
	jQuery.preloadImages = function(){
		for(var i = 0; i<arguments.length; i++){
			jQuery('<img>').attr('src', arguments[i]);
		}
	};
	$.preloadImages('/img/btn01_on.png','/img/btn02_on.png','/img/btn03_on.png','/img/btn04_on.png','/img/btn05_on.png','/img/btn01_selected.png','/img/btn02_selected.png','/img/btn03_selected.png','/img/btn04_selected.png','/img/btn05_selected.png','/img/tab02.jpg','/img/tab03.jpg','/img/tab04.jpg','/img/tab05.jpg');
	
	
	$(window).load(function(){
		pageTab();
	});
	
	function pageTab() {
		var imgBefore = '/img/btn_';
		var imgAfteron = '_on.png';
		var imgAfteroff = '_off.png';
		var imgAfterselected = '_selected.png';
		
		//クリックの処理
		$('#packageWrap li img').click(function(){
			$('#packageWrap li img').each(function(){
			if(String($(this).attr('src')).match(/_selected\.(.*)$/)){
				$(this).attr('src',$(this).attr('src').replace('_selected','_off'));
			}
			});

			if(String($(this).attr('src')).match(/_off\.(.*)$/)){
				$(this).attr('src',$(this).attr('src').replace('_off','_selected'));
			}else
	
			if(String($(this).attr('src')).match(/_on\.(.*)$/)){
				$(this).attr('src',$(this).attr('src').replace('_on','_selected'));
			}
			
			$('#detailBox>div').hide();
			openDiv = '#' + $(this).attr('src').replace(imgBefore, '').replace(imgAfteroff, '').replace(imgAfteron, '').replace(imgAfterselected, '');
			$(openDiv).show();
		});
	
	
		//ボタンのロールオーバー
		$('#packageWrap li img').hover(function(){
			$(this).attr('src',$(this).attr('src').replace('_off','_on'));
		},function(){
			$(this).attr('src',$(this).attr('src').replace('_on','_off'));
		});
	};
});

javascriptで:beforeや:afterなど擬似要素のプロパティや値を編集するには

直接編集することはできないので、
CSSルールを追加してやるといい(未検証)

function addCSSRule(selector, css) { 
 var sheets = document.styleSheets, 
  sheet = sheets[sheets.length - 1]; 
 
 if(sheet.insertRule) { 
  sheet.insertRule(selector + '{' +  css + '}', sheet.cssRules.length); 
 }else if(sheet.addRule) { 
  sheet.addRule(selector, css, -1); 
 } 
} 
 
addCSSRule('hoge:after', 'background: red');

参考サイト
http://w3q.jp/t/3571

14年3月9日 追記
chrome33
IE8testerで正常な動作を確認しました。

指定した領域の中に画像を散らす

jqueryとjQueryRotateを使って、ランダムに画像を散らします。

jQueryRotateはこちらから
https://code.google.com/p/jqueryrotate/downloads/list

【動作確認済】
全てWINです。
IE7(tester)
IE8(winXP)
IE10(win7)
IE11(win8)
safari最新
chrome最新

画像サイズとが角度がランダム版

<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="jQueryRotate.js"></script>
<script type="text/javascript">
$(function(){
//配置したい画像
	Imgset = new Array();
	Imgset[0] = "img/bg_01.png";
	Imgset[1] = "img/bg_02.png";
//配置したい画像の数
	Imgn=20;
//画像を配置したい場所
	var ImgWrap = '#inBg'
//画像のサイズ
	var img_width = 100;
	var doc_width = $(ImgWrap).width();
	var doc_height= $(ImgWrap).height();

//画像を配置する
	for (i=0; i < Imgn; i++){
		n = Math.floor(Math.random()*Imgset.length);
		xpx = Math.floor(doc_width*Math.random()); 
		ypx = Math.floor(doc_height*Math.random());
		wpx = Math.floor(img_width*Math.random());
		var nowRotateClass = 'rotateClass' + i;
		var rotateAngle = Math.random()*360;
		ribon="<div style='position:absolute;left:"+ xpx +"px;top:"+ ypx +"px;'><img src='"+Imgset[n]+"' class='"+nowRotateClass+"' width='"+wpx+"'></div>";
		/*document.write(star);*/
		var selectNowRotateClass = '.' + nowRotateClass
		$(ImgWrap).append(ribon);
		$(selectNowRotateClass).rotate(rotateAngle);
	}
});
</script>

画像サイズとが角度が指定できる版

<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="jQueryRotate.js"></script>
<script type="text/javascript">
$(function(){
//配置したい画像
	Imgset = new Array();
	Imgset[0] = "img/bg_01.png";
	Imgset[1] = "img/bg_02.png";
//配置したい角度
	rotateAngle = new Array();
	rotateAngle[0] = 30;
	rotateAngle[1] = 330;
//配置したい画像の数
	Imgn=20;
//画像を配置したい場所
	var ImgWrap = '#inBg'
//配置したい画像のサイズ
	imgWidth = new Array();
	imgWidth[0] = 68;
	imgWidth[1] = 40;
	var doc_width = $(ImgWrap).width();
	var doc_height= $(ImgWrap).height();

//画像を配置する
	for (i=0; i < Imgn; i++){
		n = Math.floor(Math.random()*Imgset.length);
		n2 = Math.floor(Math.random()*rotateAngle.length);
		n3 = Math.floor(Math.random()*imgWidth.length);
		xpx = Math.floor(doc_width*Math.random()); 
		ypx = Math.floor(doc_height*Math.random());
		var nowRotateAngle = rotateAngle[n2];
		var nowImgWidth = imgWidth[n3];
		var nowRotateClass = 'rotateClass' + i;
		ribon="<div style='position:absolute;left:"+ xpx +"px;top:"+ ypx +"px;'><img src='"+Imgset[n]+"' class='"+nowRotateClass+"' width='"+nowImgWidth+"'></div>";
		/*document.write(star);*/
		var selectNowRotateClass = '.' + nowRotateClass
		$(ImgWrap).append(ribon);
		$(selectNowRotateClass).rotate(nowRotateAngle);
	}
});
</script>

ユーザーエージェントによって読み込むcssとスクリプトを変更する。

iOSとそれ以外で分岐さす例。
納期直前にバグが出ても、ある程度はリカバリできるかも(厭だけど。)

<script type="text/javascript">
	useragentcheck();
	function useragentcheck(){
		var agent = navigator.userAgent;
		if(agent.search(/iPhone/) != -1 || agent.search(/iPad/) != -1 || agent.search(/iPod/) != -1){
			require('js/custom.js');
		}else{
			loadingcss('css/noios.css');
			require('js/customnoios.js');
		}
	}

	function require(src){
		var element=document.createElement('script');
		element.type='text/javascript';
		element.src=src;
		document.getElementsByTagName('head')[0].appendChild(element);
	}

	function loadingcss(href){
		var element=document.createElement('link');
		element.rel='stylesheet';
		element.href=href;
		document.getElementsByTagName('head')[0].appendChild(element);
	}
</script>

パソコンサイトからスマホサイトへの導線3

今度はキャッシュなしバージョン
こちらを参考にして書き換えました。

http://zuboraism.com/javascript/28.html

<script type="text/javascript">
useragentcheck();
function useragentcheck(){
	var agent = navigator.userAgent;
	if(agent.search(/iPhone/) != -1 || agent.search(/iPad/) != -1 || agent.search(/iPod/) != -1 || agent.search(/Android/) != -1 || agent.search(/Windows Phone/) != -1 || agent.search(/Symbian/) != -1 || agent.			search(/BlackBerry/) != -1 ){
	redirect();
	}
}
function redirect(){
	if(confirm('スマートフォン版ではお手持ちのスマートフォン内のアルバムやInstagramからアップロードしてTシャツを作成出来ます。スマートフォン用サイトを開きますか?')){
location.href = '/sp/';}
}
</script>

ユーザーエージェントによって読み込むスクリプトを変更する

これができるとイロイロと便利です。

<script type="text/javascript">
$(function(){
	var _ua = (function(){
	 return {
	  ltIE6:typeof window.addEventListener == "undefined" && typeof document.documentElement.style.maxHeight == "undefined",
	  ltIE7:typeof window.addEventListener == "undefined" && typeof document.querySelectorAll == "undefined",
	  ltIE8:typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined",
	  ltIE9:document.uniqueID && !window.matchMedia,
	  gtIE10:document.uniqueID && document.documentMode >= 10,
	  Trident:document.uniqueID,
	  Gecko:'MozAppearance' in document.documentElement.style,
	  Presto:window.opera,
	  Blink:window.chrome,
	  Webkit:!window.chrome && 'WebkitAppearance' in document.documentElement.style,
	  Touch:typeof document.ontouchstart != "undefined",
	  Mobile:typeof window.orientation != "undefined",
	  Pointer:window.navigator.pointerEnabled,
	  MSPoniter:window.navigator.msPointerEnabled
	 }
	})();
	
	function require(src){
	var element=document.createElement('script');
	element.type='text/javascript';
	element.src=src;
	document.getElementsByTagName('head')[0].appendChild(element);
	}
	
	if(_ua.ltIE8 || _ua.Gecko || _ua.Webkit){
		$('#wrapper').css("background","#000000");
		require('js/sample_ie.js');
	}else{
		require('js/sample.js');
	}
});
</script>

参考ページ
https://w3g.jp/blog/tools/js_browser_sniffing
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1161871241