カテゴリー: jQuery

  • Nivo Sliderのエフェクトを動的に変更したよ!!!!

    Nivo Sliderといえば、もう定番のコンテンツスライダーのjQueryプラグインですよね。エフェクトもたくさんあるし、使い方も簡単ですし。

    そのエフェクトなんですけど、

    「左の矢印と右の矢印で動きを変えたい!!!!!!」

    って思ったことないですか?戻るボタンで左にスライドとか、次へボタンで右にとか。まぁ、別に僕も人から言われて「確かに!」って思ったんですけど。。。。。。

    そんなの機能としてあるでしょ!とか呑気に思っていたら、どうやらそんなものはないようなので、JQueryをガリガリ書く羽目になったわけで。そのコードをさらしたいと思います。

    [js]
    $(window).load(function() {
    var $slider = $(‘#slider’);
    $slider.nivoSlider({
    effect: "sliceUpRight",
    afterChange: function(){
    $slider.find("img").attr("data-transition","sliceUpLeft");
    }
    });

    $(".nivo-prevNav").on( "click", function(){
    $slider.find("img").attr("data-transition","sliceUpRight");
    });
    $(".nivo-nextNav").on( "click", function(){
    $slider.find("img").attr("data-transition","sliceUpLeft");
    });
    });
    [/js]

    Nivo Slider 3.2で動作を確認しています。
    Nivo Sliderはスライドする要素にdata-transitionを設定しておくと、そこに設定されているエフェクトでその要素にスライドします。その値を書き換えているだけという、なんとも単純な作りです。

    普段何気なく使っているプラグインもソースを眺めてみると、意外にあんなこともこんなこともできるんだ!って発見がありますよねぇ~。

  • プリロード付のロールオーバーを実装するjQuery

    普段は画像置換+CSS Spriteでロールオーバーをやっつけています。リクエストが少ないし、CSSだけなので、高速です。

    でも、画像の差し替えなどは若干手間なのでメンテナンス性などを考えたときはJavascriptで実装した方が良い場合もあったり。
    ただ、javascriptで普通にsrcを書き換えると、そこから画像のダウンロードが始まるので、マウスオーバーとのタイムラグが発生したりで、どうも頂けない。

    そんなわけで、jQueryでプリロード付のロールオーバーを実装するスクリプトを書いてみました。

    [js]
    jQuery(function(){
    var supfix = "_on";
    $("img.rollover").hover(
    function(){
    $(this).attr("src",$(this).attr("src").replace(/^(.+)(\.[a-z]+)$/, "$1"+supfix+"$2"));
    },
    function(){
    $(this).attr("src",$(this).attr("src").replace(/^(.+)_on(\.[a-z]+)$/, "$1$2"));
    }
    ).each(
    function(){//preload
    $("<img>").attr("src",$(this).attr("src").replace(/^(.+)(\.[a-z]+)$/, "$1"+supfix+"$2"));
    });
    });
    [/js]

    使い方

    ロールオーバーさせたいimgタグにrolloverクラスをつけるだけです。
    img.gifにマウスオーバーすると、img_on.gifに変わります。
    supfixの値を変更すれば”_on”以外のものでも使えます。

    [html]
    <img src="img.gif" alt="" class="rollover" />
    [/html]

    jQueryの$()とかjQuery()ってセレクタを入れてjQueryオブジェクトを取得するだけのものと思いがちですが、中身にHTML文字列をぶち込んであげることで、非表示のjQueryオブジェクトを作成できるんですよね。

    jQuery(html, [ownerDocument]) – jQuery 日本語リファレンス

    良く$.ajaxで取得したHTMLから要素をDOMエレメントを作成してappendするような使い方をします。

    これを活用して、画像のプリロードを実現している訳です。
    まぁ、それでも、読み込まれて実行されるまでは使えないので、そこら辺はCSSの方が強いですね。また、Jsの実行速度や、読み込むスクリプトの量にも左右されると思うので何でもかんでもjsでって訳にはいかないですね。そこら辺は使い分けましょう。

  • iframeで読み込んだYouTubeの動画を一定時間後に自動再生する

    現在制作中のサイトで、最初にスプラッシュを入れて、そのあと、Youtubeの動画を再生しようという事をすることになりました。

    普通に、swfobjectを使ったりして、YouTube JavaScript Player APIを使えば、

    [js]
    window.setTimeout(function() { ytplayer.playVideo }, 3000);
    [/js]

    とかやれば良いのですが、今時iPhone等のFlashが使えない媒体もあるので、できれば、HTML5プレーヤーを使いたいんですよね。しかしYouTubeからHTML5のAPIはたぶん提供されていないようなので、されていたとしても、Flashとの切り替えなども実装するのは正直面倒。というわけで、何とかYouTubeが提供しているiframeでの埋め込みコードを使ってなんとか実現しようと思います。

    というわけで、jQueryで書いてみました。無駄にdelayメソッドを使ってみました。何かの要素を表示した後にとか、そういう使い方もできます。

    [js]
    jQuery(document).ready(function(){
    $(this).delay(3000).queue(function(){
    $("#mainMovie").html(‘<iframe width="960" height="540" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/ID?autoplay=1"></iframe>’);
    $(this).dequeue();
    });
    });
    [/js]

    別に、ロードしてから3秒とかなら、
    [js]
    jQuery(document).ready(function(){
    setTimeout(function(){
    $("#mainMovie").html(‘<iframe width="960" height="540" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/ID?autoplay=1"></iframe>’);
    }, 3000);
    });
    [/js]

    でも全然動きます。むしろこっちの方がベターな気もします。

    やってることは、
    YouTube 埋め込みプレーヤーのパラメータ:http://code.google.com/intl/ja/apis/youtube/player_parameters.htmlを使って、自動再生するようにしたiframe型の埋め込みプレーヤーを、DOMを書き換えて一定時間後に、読み込み→再生をやらせているだけです。

    自動再生させるには、動画のURLの最後に?autoplay=1をつければ良いだけです。

    もっとスマートな実装方法が出てくればイイですよね。

  • 今更人に聞けない、jQueryでCSSの操作のやり方。

    jQueryがJavascriptのフレームワークとして、ものすごーい普及してますね。
    そんなわけで、今更ですが、jQueryでのCSSの操作の仕方。

    .css( propertyName, value )

    こんな感じ。普通にCSS書くのあんまり変わらないですね。
    [js]
    $(".red").css("background-color","#F00");
    [/js]

    でもこれだと複数プロパティを設定する場合、
    [js]
    $(".red").css("background-color","#F00").css("color","#FFF").css("width","300px");
    [/js]
    となって、読みづらいし、css()を何度も呼んでいるのでいまいち効率が悪い。。。。。

    そんなわけで、別の書き方があります。

    .css( map )

    変数に連想配列で、CSSのプロパティを渡すことができます。

    [js]
    $(".red").css({
    backgroundColor:"#F00",
    color:"#FFF",
    width:"300px"
    });
    [/js]

    これだと、複数プロパティを一度に設定できます。

    ただし、注意しなければいけないのが、配列のキーにプロパティ名が入るのですが、ここが、キャメルケースになってます。

    要は、

    background-color -> backgroundColor
    z-index -> zIndex

    と、ハイフンを消し、その後に続く文字を大文字にするということです。

    また、クオートで挟む必要もありません。

    JavaScriptを触ったことがある人だったら別にどうでも無いんでしょうが、自分が初めてjQueryを触ったときは、キャメルケースがさっぱりわけわかめでしたので。。。

    ちなみに、連想配列での渡し方は.animate()メソッドでも一緒ですので、これが使えると、ちょっと、jQueryが楽しくなると思いますよ!!!

  • 横幅いっぱいのコンテンツスライダーつくりました。

    jQueryで横幅いっぱいのコンテンツスライダー、jQuery Full-width Sliderというプラグインをつくりました。
    トップページのメインビジュアルとかで使えると思います。というか昔の案件で使ったものをブラッシュアップしたものです。画像以外も使えます。

    jquery.fullwidthslider.1.0

    デモ:http://demo.torounit.com/fullwidthslider/
    2012-02-09:デモのCSSを修正。IE対応。

    デモの写真はFree.Stockerのを使わせて頂いています。良い写真いっぱいありますよねここ。

    使い方

    js
    [js]
    $(function(){
    $(".slide").fullWidthSlider({
    width:640,
    height:480
    });
    })
    [/js]

    html
    [html]
    <div class="slide">
    <ul class="stage">
    <li><img src="slideImage/demo1.jpg" alt="" width="640" height="480" /></li>
    <li><img src="slideImage/demo2.jpg" alt="" width="640" height="480" /></li>
    <li><img src="slideImage/demo3.jpg" alt="" width="640" height="480" /></li>
    </ul>
    </div>
    [/html]

    こんな感じです。

    .stageの下にa.leftNav,a.rightNavという要素を生成します。(オプションで消せます。)
    それがそれぞれ左右のナビゲーションになってます。適当に半透明の画像などを背景に指定してあげたりすれば良いと思います。

    CSSの書き方はデモを参照下さい。

    オプション値

    オプション 説明 デフォルト
    width スライドの横幅 960
    height スライドの高さ 400
    time 切り替わるスピード(ミリ秒) 5000
    slideStage スライドのステージ
    (スライド群を格納する要素)
    “.stage”
    slideMember スライドする要素 “li”
    nav スライドのナビゲーションを使うかどうか true
    slideNavi ナビゲーションのクラス “.slideNavi”
    mouseoverStop マウスオーバーで止める true

    一応テストはしてないこともないですが・・・って程度なので、何かバグとか発見しましたらToro_Unitまでリプライ下さい。

  • jQuery.uploadを使った、画像のサムネイルを表示するフォームのデモを作りました。

    以前、jQuery.uploadでアップロード画像のサムネイルの作成というエントリーを書いたので、それの実装を作ってみました。アップロードする画像を選択すると、アップロードされ、それのサムネイルが表示されます。

    また、ページを離れるときに画像をJavascriptで削除していますが、実際に使うときは使わない場面も多いと思いますので、その部分は適当に削除するなり、なんなりして下さい。

    デモ:http://demo.torounit.com/jquery.upload/

    script.js(ajaxでのアップロード等々)

    [js]
    jQuery(function($){
    //送信ボタンの非表示
    $(‘#submit’).hide();

    //フォームの内容が変更されたとき
    $(‘#img’).change(function() {
    var preview = $(‘#preview’);

    //現在表示されているものを消す。
    preview.find("img").fadeOut(300);

    //アップロード
    $(this).upload(
    ‘upload.php’,
    $("form").serialize(),
    function(html){
    //サムネイルの表示
    preview.html(html).animate({"height":preview.find("img").height()+"px"},300,function(){
    preview.find("img").hide().fadeIn(300);
    });
    },’html’);
    });

    //離れるときに画像を削除
    $(window).bind("beforeunload",function(){
    var unlinkFile = $("#postPhotoName").val();
    $.ajax({
    async: false,
    cache: false,
    type: "POST",
    url: "upload.php",
    data: "postPhotoName="+unlinkFile

    });

    });

    });
    [/js]

    upload.php(アップロードしたファイルを加工するスクリプト)

    [php]
    <?php

    //前にアップロードされた写真のファイル名
    $postPhotoName = $_POST["postPhotoName"];

    //古いファイルの削除
    if($postPhotoName){

    unlink("./img/".$postPhotoName);
    unlink("./img/thumb-".$postPhotoName);
    }

    $result = false;

    if($_FILES[‘img’][‘name’] == "") {
    die("ファイルがないぜよ。");

    }else{
    //アップロードされたファイルの情報を取得
    $fileName = basename(date("U")."-".$_FILES[‘img’][‘name’]);
    $fileType = $_FILES[‘img’][‘type’];
    $fileTmpName = $_FILES[‘img’][‘tmp_name’];

    if(!preg_match("/jpeg/",$fileType)){

    unlink($fileTmpName);
    die( "jpegじゃないぜよ。");

    }else{
    //ファイルの保存
    if (!move_uploaded_file($fileTmpName, ‘./img/’ . $fileName)) {

    die(‘保存にしっぱいしたぜよ。’);

    } else {

    //サムネイル作成
    include(‘class.image.php’);
    list($width, $height, $type, $attr) = getimagesize(‘img/’.$fileName);

    $thumb = new Image(‘img/’.$fileName);
    $thumb->name(‘thumb-‘.basename($fileName,".jpg"));

    if($width>$height){
    if($width > 500) $thumb->width(500);
    }else{
    if($height > 500) $thumb->height(500);
    }

    $thumb->save();
    $result = true;
    }

    }

    }

    if($result == true){
    ?>

    <img src="<?php echo ‘./img/thumb-‘.$fileName;?>">
    <input type="hidden" value="<?php echo $fileName?>" name="postPhotoName" id="postPhotoName">
    <?php
    }

    [/php]

    HTML

    [html]
    <form method="post" enctype="multipart/form-data" action="upload.php">
    <input type="file" value="" id="img" name="img" size="50" />
    <input type="submit" id="submit" />
    <div id="preview"><div>ここにプレビューが表示されます</div></div>
    </form>
    [/html]

    このままつかうのはちょっとあれかもですけど、アイデア次第で色々使い道がありそうです。

  • ユーザーエージェントでブラウザの判別をするPHPとかjQueryを書いてみた。

    自分でコピペできるように、browser判別のTipsを貼っておきます。

    PHPで判別

    [php]
    function browser_class(){
    $classes = "";
    $agent = getenv( "HTTP_USER_AGENT" );

    if(strstr($agent,"MSIE")){
    $classes .= "msie ";
    if(strstr($agent,"MSIE 6.0")) $classes .= "ie6 lt7 lt8 lt9";
    if(strstr($agent,"MSIE 7.0")) $classes .= "gt6 ie7 lt8 lt9";
    if(strstr($agent,"MSIE 8.0")) $classes .= "gt6 gt7 ie8 lt9";
    if(strstr($agent,"MSIE 9.0")) $classes .= "gt6 gt7 gt8 ie9";
    }
    else {
    $classes .= "noie ";
    if( strstr($agent,"Firefox")) {
    $classes .= "firefox gecko";
    }
    elseif( strstr($agent,"Safari")) {
    $classes .= "safari webkit";
    }
    elseif( strstr($agent,"Chrome")) {
    $classes .= "Chrome webkit";
    }
    elseif( strstr($agent,"Opera")) {
    $classes .= "opera presto";
    }
    //ここからは気休め。
    //AppleWebKit/534.30 (KHTML, like Gecko) なので先に記述
    elseif( stristr($agent,"WebKit")) {
    $classes .= "webkit";
    }
    //AppleWebKit/534.30 (KHTML, like Gecko) なので先に記述
    elseif( stristr($agent,"KHTML")) {
    $classes .= "khtml";
    }
    elseif(stristr($agent,"Gecko")) {
    $classes .= "gecko";
    }else {
    $classes .= "other";
    }
    }
    return $classes;
    }
    [/php]

    ついでにwordpressのbody_classに追加するなら、
    [php]
    function add_browser_class($classes){
    $classArr = explode(" ",browser_class());
    $return = array_merge($classes,$classArr);
    return $return
    }

    add_filter("body_class","add_browser_class");
    [/php]

    とかやればうまく行ける気がします。

    jQueryで判別

    参考:
    jQuery.supportでのブラウザ判別
    http://w3g.jp/blog/tools/jquery_browser_sniffing

    [js]
    jQuery(function($){

    $html = $("html");

    if(!$.support.checkOn && $.support.checkClone){
    $html.addClass("webkit noie");
    }else if($.support.checkOn && $.support.noCloneEvent && window.globalStorage){
    $html.addClass("firefox noie");
    }else if($.support.checkOn && $.support.noCloneEvente && !window.globalStorage){
    $html.addClass("opera noie");
    }else if(!$.support.noCloneEvent && $.support.opacity){
    $html.addClass("gt6 gt7 gt8 ie9 msie");
    }else if(!$.support.opacity){
    if(!$.support.style){
    if (typeof document.documentElement.style.maxHeight != "undefined") {
    $html.addClass("gt6 ie7 lt8 lt9 msie");
    } else {
    $html.addClass("ie6 lt7 lt8 lt9 msie");
    }
    }else{
    $html.addClass("gt6 gt7 ie8 lt9 msie");
    }
    }else{
    $html.addClass("other");
    }
    });
    [/js]

  • jQueryのキュー(queue)って何なんですか・・・?

    jQueryで、CSSを操作して、アニメーションをしたい時があると思います。
    そんなときはたいてい、

    [js]
    $("#box1").css({color:"#F00"}).animate({left:"300px"},4000);
    [/js]
    の様なscriptを書くと思います。

    また、
    “アニメーションしてから、文字色変えたい!!”
    なんてことはよくあると思います。
    そして、きっと僕みたいな人は、こんなコードを想像するわけです。
    [js]
    $("#box2").animate({left:"300px"},4000).css({color:"#F00"});
    [/js]

    しかし、現実は、こちらのデモのように、CSSが操作されてから、アニメーションをしてしまうのです。一番最初の例と全く変わらない動作をしてしまいます。

    現実というのは時に残酷ですね。

    実は、jQueryのanimateというメソッドは「アニメーションをしなさい」という命令ではなく、
    「アニメーションをキューに登録しなさい!」
    という意味なのです。
    キュー、queueは平たく行ってしまうと、アニメーション等の台本みたいなもので、キューに溜まっている処理は上から順番に処理されます。

    jQueryにはたくさんのメソッドがありますが、大きく分けると、css()等のCSS操作、append()等のDOM操作その他、キューを使わないメソッドと、animate()やfadeIn()、fadeOut()、fadeTo()、等キューを使うメソッドに分かれます。ついでに言うなら、stop()はキュー上の処理の停止をするメソッドなのです。

    キューを使うメソッドは基本的にはアニメーション等の処理に時間を設定するものがほとんどだと思います。ちゃんと本家のリファレンスを隅まで熟読したわけではないのでちょっとあれですが・・・

    こんな時、一つは、callbackを使えば解決できます。

    animate等のcallbackを使う

    [js]
    $("#box3").animate({left:"300px"},4000,function(){
    $(this).css({color:"#F00"});
    })
    [/js]
    しかし、いまいちスマートじゃないですし、メソッドチェーンをここからつないでいくのは可読性的に宜しくない気がします。昔これでネストさせすぎてよく分からないコードになってしまったことがあったりなかったり・・・

    そこで、queue(callback)を使います。

    queue(callback)を使う

    [js]
    $("#box4").animate({left:"300px"},4000).queue(function(){
    $(this).css({color:"#F00"}).dequeue();
    });
    [/js]

    としてあげると、これもちゃんと動作します。
    これを使う一番のメリットとしては、delay()等のメソッドが使えるということです。

    dequeue()について

    また、ここでdequeue()という見慣れないメソッドが出てきました。dequeue()はキューに溜まっている先頭の処理を実行するというメソッドです。
    通常、キューを使わないメソッドには、次の処理を実行する機能がありません。
    こちらのデモを見てもらうとわかると思いますが、dequeueしていない#box1の方は最後のanimate()が実行されずに停止しています。

    animate()などは、dequeue()を勝手にやっているのですが、css()等はそういうわけにもいかないので、最後には必ず、
    [js]
    $(this).dequeue();
    [/js]
    を追加しておきましょう。お行儀みたいなものですね。

    これでみんなも立派なjQueryアニメーター、デビュー!

    jQueryはとても手軽で便利でハードルが低いですが、ちょっと突っ込んだことをして躓くと逆にjQuery流で解決しないといけない気がするものなのでちょっと面倒ですね。
    まぁフレームワークなど、高度に抽象化されたものにはどうしても付いて回るものなのだとは思いますが、ちゃんと一度はソースを読んで理解しておきたいですね。僕は全くやれていないですが・・・

  • jQueryに独自の関数を追加

    jQueryを使っているとやっぱり独自の関数を作りたくなってきますよね。

    hoge()とhogehoge()というjQueryで使える関数を作ります。

    [js]
    jQuery.fn.extend({
    hoge:function(vars){
    jQuery(this).addClass("hoge").css({color:"#FFF"});
    return this;
    },
    hogehoge:function(){
    var $this = jQuery(this);
    $this.html("hogehoge");
    return this;
    }
    });
    [/js]

    こんな感じで独自の関数を定義できます。コードの再利用が簡単になるので、覚えておいて損はないです。
    return thisを返しておくと、メソッドチェーンができるようになるので、忘れずに入れましょう。

  • 学び処 立志塾様のサイトを制作させて頂きました。

    学び処 立志塾 | 長野県松本市 完全1対1個別指導の学習塾です

    この度、学び処 立志塾様のウェブサイトの新規立ち上げさせて頂きました。
    細かい気遣いが売りだということだったので、サイトの方もいろいろと細かい事をしています。

    技術的なことを言うと、
    jquery hashchange eventでページ遷移は実現しています。
    サイドバーはcss3のtransitionです。やっぱり軽快ですね。
    またブログなんかはカスタム投稿やカスタム分類使ってみたり。

    松本市在住で中高生のお子さんが居らっしゃる方は是非一度ご覧くださいm(_ _)m

  • jQueryで他のページの情報を読み込む

    jQueryでAjaxをやるのって実際とても簡単なのです。
    RSSリーダーやTwitterのFeed等を簡単に遅延読み込みとかできたり、ページ遷移無しに他のコンテンツをロードなど、色々できてしまいます。

    load( url, data, callback )

    超お手軽Ajax関数です。urlのページを表示します。また、urlの後ろにスペースを空け、続けてセレクタを書くと、その要素だけとってくることができます。

    [js]
    $("#loadArea").load("/hoge/ #hogehoge ul");
    [/js]

    で、/hoge/の
    [html]
    <div id="hogehoge">
    <ul>
    <li>list1</li>
    <li>list2</li>
    <li>list3</li>
    </ul>
    </div>

    [/html]

    ul以下を#loadAreaに表示します。

    簡単ですよね?

    jQuery.ajax()

    jQueryでAjaxをやるときの親玉的存在です。
    .load()のような手軽さは無いですが、色々細かい設定ができます。

    [js]
    $.ajax({
    url: /hoge/,
    context:this,
    success:function(loadData){
    var dataDom = $(loadData);
    $(‘#hoge’, dataDom).appendTo("#loadArea");
    },
    error:function(){
    $("#loadArea").html("エラーが発生しました");
    }
    });
    [/js]

    loadDataには、取得したテキストデータが格納されています。

    また、jQuery1.5から
    [js]
    $.ajax({ url: "/hoge/" })
    .success(function() {console.log("success");})
    .error(function() {console.log("error"); })
    .complete(function() {console.log("complete");});
    [/js]

    のような書き方ができるようになったみたいです。解りやすいですねー。
    また、xmlとかもdataTypeを指定するととってこれるので、他のAPIとかとの連携も楽ちんです。

    jQueryを使うとAjaxとかが、思いの外簡単にできてしまいます。これであなたも楽しいAjaxライフを満喫できること間違いなし!

  • jQuery.uploadでアップロード画像のサムネイルの作成

    Ajaxを使ったメールフォームとかってやっぱり素敵ですよね。
    以前仕事で写真投稿付きのフォームを作らざるを得なかったので、どうせならということでAjax化しました。
    というわけでjQuery.uploadを使って写真をアップロードして、サムネイルを表示するチュートリアルです。

    2011-12-03追記:デモ作りました。jQuery.uploadを使ったフォームのデモを作りました。

    (さらに…)