Retina画像対応、動作も安定、jQuery非依存で軽量の「image-map-resizer」
<script src="https://cdnjs.cloudflare.com/ajax/libs/image-map-resizer/1.0.10/js/imageMapResizer.min.js"></script> <script> imageMapResize(); </script>
Retina画像対応、動作も安定、jQuery非依存で軽量の「image-map-resizer」
<script src="https://cdnjs.cloudflare.com/ajax/libs/image-map-resizer/1.0.10/js/imageMapResizer.min.js"></script> <script> imageMapResize(); </script>
ページ内リンクをスムーズスクロールするjQueryプラグイン(Inside Scroll)を使わせていただいています。
ページ内リンクをクリックすると、シュルシュルとスムーズにスクロースする、アレです。
この機能はもちろん大変ありがたいですが、このページは、jQuery Easing Plugin のエフェクトの確認として秀逸です。
アレどうやって動くんだっけと疑問になったときは、ここで確認です。
可変グリッドレイアウトjQueryプラグイン(jquery.vgrid.js)を某プロジェクトで使わせていただいています。
用途としては、固定幅のコンテンツなんで可変である必要はないんですが、リロードするたびにランダムに並び順が変わるという効果として使っています。
こういう固定幅のコンテンツの場合、再描画で各画像のポジション計算が狂って上の方に重なって表示される場合があります。(easingのパラメータの調整で出にくくすることもできますが、完全に出ないわけではありません)
たぶん、ウィンドウサイズが変わった場合の再描画では問題がないのでしょうから、ウィンドウサイズが変わらないような状況で使っている方が悪いのですが、たまにでも、画像が上の方に重なるといろいろ不都合が。(「表示上の問題なんです、F5キーを押してください」と言いたいところですが、見た目、いかにもなにか重大なバグが発生したように見えて、結構厳しいです)
初期化のあと、すぐ vgrefresh() してみたり、vgsort() してみたり、あと、一緒に動く JSがあるとそうなる頻度が上がるので、後ろの方にずらしてみたりしたんですが、なかなかこれといった対策もなく。
外そうかなと思った瞬間、パッと思いつきました。
#grid-content { display:none; display:block\9; /* IE7, IE8 */ overflow:hidden; height:0; margin-left:-1px; }
「最初は消しときゃええやん」と。これでばっちりです。IEだけは消しとくとほんとに出てこなくなりましたので、出しときました。
作者さま、ありがとうございました。
追記:これだとページ内ジャンプのとき、やっぱり表示できないケースがありました。なので、上のIE対応は止めて、基本表示しないで別のタイミング(他のJSが動くとき)、これ(↓)を入れることにしました。
$("#grid-content").css('display', 'block');なんか泥縄式になっているような気がするのは気のせい?
再追記:これでもうまくいかないことがあったので、更に vgrefresh() を足しました。いよいよ泥縄(泥船)です。$("#grid-content").css('display', 'block'); $("#grid-content").vgrefresh();
ちなみにランダムの方は上流(コンテンツを準備する側)でやることにしました。
query_posts('category_name=top&posts_per_page=-1&orderby=rand');
posts_per_page=-1 は無制限、orderby=rand が並び順ランダムです。
長年の懸案だった、Thickboxが IEでうまく動かない件がやっと解決しました。それも自力で。エライね>自分。
懸案事項は次の2点。
本来は、どのような状況でもウィンドウは画面中央にきて、スクロールは背面の画面がスクロールするだけでウィンドウの位置は変わらないというのが正しい挙動です。もちろん、オフィシャルサイトのデモはそういう動きをしています。
それがどうしておかしくなるかというと、DOCTYPEの「標準モード」と「互換モード」の違いでした。
上が互換モードで、下が標準モードです。
Thickboxを互換モードで動かそうとすると、IEに限って、上のような現象に遭遇します。Firefoxとか Chromeは大丈夫なのが現象をわかりづらくしてますね。
PHPで複数ファイルのアップロードをなるべくスマートにやる方法はないかなぁと探し回ってたどり着いたのが、コレ。
自分的にはベストな解答です、たぶん。
詳しい使い方は「Ajax風にファイルをアップロードするjQueryプラグイン「Uploadify」の使い方」が超詳しいので、こちらを参照のこと。
以下は自分的にポイントとなったところ。
$(document).ready(function() { $("#uploadify").uploadify({ 'uploader' : '<!--{$TPL_DIR}-->js/uploadify/uploadify.swf', 'script' : '<!--{$TPL_DIR}-->js/uploadify/uploadify.php?rand_no=<!--{$rndNo}-->', 'cancelImg' : '<!--{$TPL_DIR}-->js/uploadify/cancel.png', 'folder' : '<!--{$smarty.const.IMAGE_TEMP_URL}-->', 'queueID' : 'fileQueue', 'auto' : false, 'buttonText' : 'Select Files...', 'multi' : true }); }); <div> <p style="margin:0">画像ファイルを選択して、Uploadしてください。</p> <div></div> <div style="float:right"><a href="fnModeSubmit('upload_image','image_key','sub_image'); tb_remove();">Close Window</a></p></div> <p><a href="$('#uploadify').uploadifyUpload();">Upload Files</a> <a href="jQuery('#uploadify').uploadifyClearQueue()">Cancel All Uploads</a></p> </div>
ちょっと見慣れない細工コードが入っているのは無視無視。たったこれだけでアップローダ定義完了。
<a href="#TB_inline?height=430&width=405&inlineId=upload&modal=true" title="Uploadify" class="thickbox">Uploadify</a>
こうすると本体のHTMLを汚さなくて済むからいいよね。で、Close Windowのとき、fnModeSubmit()といういままでアップロードボタンに割りつけていた関数を呼んでフックをかけると。
if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $targetPath = str_replace('//','/', $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/'); $targetFile = $targetPath . $_FILES['Filedata']['name']; move_uploaded_file($tempFile,$targetFile); $_FILES['Filedata']['tmp_name'] = $targetFile; $fp = fopen($targetPath.$_REQUEST['rand_no'], "a"); fputs($fp, serialize($_FILES['Filedata'])."\n"); fclose($fp); echo "1"; }
複数ファイルをまとめてアップロードすると、この PHPが回数分呼ばれることになる。
やってることは、渡されたファイルをフォルダに移して、なんのファイルを移したかファイルに記録しておくだけ。
このときのファイル名に例のランダム文字列を使ってる。
$no = 0; $buf = @file(IMAGE_TEMP_DIR . $this->rndNo); if ($buf) { foreach ($buf as $e) { $no++; $key = "sub_image".$no; $_FILES[$key] = unserialize($e); $this->arrErr[$key] = $this->objUpFile->makeTempFile($key, IMAGE_RENAME); } @unlink(IMAGE_TEMP_DIR . $this->rndNo); unset($_POST['rand_no']); unset($this->rndNo); }
EC-CUBEのコードにがっつり入り込んでいるのでわかりにくいけど、シリアライズされたファイルを読んで、アンシリアライズしたものを $_FILESにセットして、処理を継続しているだけ。終わったら、後始末しておく。
こんな感じで活用させていただいてます。ありがとう、Uploadify。
いつもお世話になっている Thickboxですが、画像の拡大表示くらいしか使っていなかったんですけど、よんどころない事情でインライン表示を使うことになって、いまさらながらのポイントもわかり、きっとあとで見ると思うので、メモメモ。
<a href="#TB_inline?height=xxx&width=xxx&inlineId=divID" class="thickbox">EXAMPLE</a> <a href="#TB_inline?height=xxx&width=xxx&inlineId=divID&modal=true" class="thickbox">EXAMPLE</a> <a href="http://url.com?keepThis=true&TB_iframe=true&height=xxx&width=xxx" title="xxx" class="thickbox">EXAMPLE</a> <a href="http://url.com?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=xxx&width=xxx&modal=true" title="xxx" class="thickbox">EXAMPLE</a>
keepThis や placeValuesBeforeTB_ はなくてもへっちゃらみたいです。