用Fancybox 2制作“Facebook Photo Viewer”

时间:2013-11-25 07:01:42

标签: jquery facebook fancybox-2 facebook-comments

http://xinhsangchanh.com/demos/FancyBoxDemo.html

这是我的演示页面,展示如何使用Fancybox 2制作“Facebook Photo Viewer”

jQuery& Fancybox 2

<script src="http://xinhsangchanh.com/Scripts/jquery/js/jquery.js"></script>
<script src="http://xinhsangchanh.com/Scripts/fancybox/jquery.fancybox.pack.js"></script>
<link href="http://xinhsangchanh.com/Scripts/fancybox/jquery.fancybox.css" rel="stylesheet" />

CSS

<link href="http://xinhsangchanh.com/App_Themes/Web/css/global.css" rel="stylesheet" />

Facebook API

<script type="text/javascript">
    (function (d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=339062419468905";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
</script>

Javascript制作“Facebook Photo Viewer”

<script type="text/javascript">
    var mainUrl = location.href;
    var photoDetailUrl;
    var fancyBoxIsOpen = false;
    var isChrome = window.chrome;
    var is_fullscreen = false;
    var is_ff = function () { return (/Firefox/).test(navigator.userAgent); };
    var is_chrome = window.chrome;
    var is_opera = window.opera;
    var is_safari = navigator.userAgent.indexOf("Safari") > -1;
    if ((is_chrome) && (is_safari)) { is_safari = false; }

    /* Full Screen API */
    function exitFullScreen(mainUrl, photoDetailUrl) {
        if (document.cancelFullScreen) {
            document.cancelFullScreen();
        } else if (document.mozCancelFullScreen) {
            document.mozCancelFullScreen();
        } else if (document.webkitCancelFullScreen) {
            document.webkitCancelFullScreen();
        }

        if (isChrome) {
            //push url for the main page
            history.pushState('', '', mainUrl);

            //push url for the page in the popup
            history.pushState('', '', photoDetailUrl);
        }
    }

    function enterFullScreen(mainUrl, photoDetailUrl) {
        if (document.documentElement.requestFullscreen) {
            document.documentElement.requestFullscreen();
        } else if (document.documentElement.mozRequestFullScreen) {
            document.documentElement.mozRequestFullScreen();
        } else if (document.documentElement.webkitRequestFullscreen) {
            document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
        }

        if (!isChrome) {
            //push url for the main page
            history.pushState('', '', mainUrl);

            //push url for the page in the popup
            history.pushState('', '', photoDetailUrl);
        }
    }

    function toggleFullScreen(mainUrl, photoDetailUrl) {
        if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) {
            is_fullscreen = true;
            enterFullScreen(mainUrl, photoDetailUrl);
        } else {
            is_fullscreen = false;
            exitFullScreen(mainUrl, photoDetailUrl);
        }
    }
    /* END Full Screen API */

    function InitFancyBox() {
        $(".fancybox").attr('rel', 'gallery').fancybox({
            width: '100%',
            height: '100%',
            padding: 0,
            margin: 0,
            nextEffect: 'fade',
            prevEffect: 'fade',
            openEffect: 'none',
            closeEffect: 'none',
            autoCenter: true,
            autoSize: false,
            aspectRatio: false,
            afterLoad: function () {
                var owner = $(this.element).attr('data-t');
                var pid = $(this.element).attr('data-pid');
                var albumUrl = $(this.element).attr('data-aurl');
                var albumName = $(this.element).attr('data-aname');
                var caption = $('#fancybox-caption-' + pid).html();
                photoDetailUrl = albumUrl;

                // PUSH STATE
                if (history.pushState && history.replaceState) {

                    if (!isChrome) {
                        //push url for the main page
                        history.pushState(null, null, mainUrl);

                        //push url for the page in the popup
                        history.pushState(null, null, photoDetailUrl);
                    }
                    else if (isChrome && !is_fullscreen) {
                        //push url for the main page
                        history.pushState(null, null, mainUrl);

                        //push url for the page in the popup
                        history.pushState(null, null, photoDetailUrl);
                    }

                    //this executes when you use the back button
                    window.onpopstate = function () {
                        $.fancybox.close();
                    };
                }

                var isFullscreen = ((typeof document.webkitIsFullScreen) !== 'undefined') ? document.webkitIsFullScreen : document.mozFullScreen;
                var paddingCss = is_ff ? (isFullscreen ? "padding-right: 0;" : "padding-right: 333px;") :
                    (is_fullscreen ? "padding-right: 0;" : "padding-right: 333px;");

                var html = "<div class='photo-viewer-wrapper' style='" + paddingCss + " height:100%; overflow: hidden;'>";

                html += "<div class='photo-viewer-image' style='float: left; width: 100%; display: block;'>";
                html += "<img src='" + this.href + "' alt='' />";

                if (!is_safari) {
                    html += "<div class='fullScreenSwitch' id='fullScreenSwitch'><a href='javascript:;' onclick=\"toggleFullScreen('" + mainUrl + "', '" + photoDetailUrl + "'); ResizeFancyBox(); return false;\" title='Enter Fullscreen'></a></div>";
                }

                html += "<div class='mediaTitleInfo'>";
                html += "<span><a href='" + albumUrl + "'>" + albumName + "</a></span>";
                html += "<span class='photo_count'>" + (this.index + 1) + " of " + this.group.length + "</span>";
                html += "<span class='photo_download'><a href='" + this.href + "?dl=1'>Download</a></span>";

                if (!is_safari) {
                    html += "<span class='fullscreen_button'><a href='javascript:;' onclick=\"toggleFullScreen('" + mainUrl + "', '" + photoDetailUrl + "'); ResizeFancyBox(); return false;\">Enter Full Screen</a></span>";
                }

                html += "</div>"; /* END mediaTitleInfo */

                html += "<a class='btnPrev' onclick='$.fancybox.prev();'></a>";
                html += "<a class='btnNext' onclick='$.fancybox.next();'></a>";
                html += "</div>"; /* END photo-viewer-image */

                var cssDisplay = !is_ff
                        ? (is_fullscreen ? "display: none;" : "display: block;")
                        : (isFullscreen ? "display: none;" : "display: block;");

                html += "<div class='photo-view-info' style='float: left; width: 333px; margin-right: -333px; " + cssDisplay + "'>";

                /* Close Button */
                html += "<a id='myFancyCloseButton' style='" + cssDisplay + "' title='Press Esc to close' href='javascript:;' onclick='$.fancybox.close();'></a>";

                // Person info, you can load ajax here
                html += "<div class='person-info' id='person_" + owner + "'>";
                html += "<div class='person-container'>";
                html += "<div class='person-image'><a href='#'><img src='https://fbcdn-profile-a.akamaihd.net/hprofile-ak-frc3/373319_159983480792077_2067967797_t.jpg' alt='Xinh - Sang - Chảnh'></a></div>";
                html += "<div class='person-name'><a href='#'>Xinh - Sang - Chảnh</a></div>";
                html += "<div class='date-posted'>Friday, November 15, 2013</div>";
                html += "</div>"; // end person-container
                html += "<div class='c10'></div>";

                /* Facebook Like - Captions - Comments */
                html += "<div class='facebook_like_buttons'>";
                html += "<div class='fb-like' data-href='" + photoDetailUrl + "' data-layout='standard' data-action='like' data-show-faces='true' data-share='false'></div>";
                html += "</div>"; // end facebook_like_buttons
                if (caption.length > 0) html += "<div class='person-caption'>" + caption + "</div>";
                html += "<div class='highslide_fbcomment'><fb:comments href='" + photoDetailUrl + "' num_posts='5' width='320' publish_feed='true' xid='id" + pid + "'></fb:comments></div>";
                /* END Facebook Like - Captions - Comments */

                html += "</div>"; /* END person-info */

                html += "</div>"; /* END photo-view-info */
                html += "<div class='clear'></div>";
                html += "</div>"; /* END photo-viewer-wrapper' */

                var widthPercent = is_safari ? "95%" : "85%";
                var heightPercent = is_safari ? "95%" : "85%";

                $.extend(this, {
                    aspectRatio: false,
                    type: 'html',
                    width: widthPercent,
                    height: heightPercent,
                    content: html
                });
            },
            beforeShow: function () {
                try {
                    // ReSharper disable UseOfImplicitGlobalInFunctionScope
                    FB.XFBML.parse();
                    // ReSharper restore UseOfImplicitGlobalInFunctionScope
                } catch (e) {

                }
            },
            afterShow: function () {
                fancyBoxIsOpen = true;
            },
            beforeClose: function () {
                fancyBoxIsOpen = false;

                window.history.pushState('', '', mainUrl);

                exitFullScreen();
            }
        });
    }

    function ResizeFancyBox_RemoveFullScreen() {
        $('.photo-view-info, .fancybox-close').css({
            display: 'block',
        });

        $('.photo-viewer-wrapper').css({
            'padding-right': '333px',
        });

        $('html').removeClass('fancybox-fullscreen');
    }

    function ResizeFancyBox() {
        if (is_fullscreen) {
            $('.photo-view-info, .fancybox-close').css({
                display: 'none',
            });

            $('.photo-viewer-wrapper').css({
                'padding-right': '0',
            });

            $('html').addClass('fancybox-fullscreen');
        } else {
            ResizeFancyBox_RemoveFullScreen();
        }

        $.fancybox.update();
        $.fancybox.reposition();
    }

    $(document).ready(function () {
        InitFancyBox();

        $(document).bind("fullscreenerror", function () {
            alert("Browser rejected fullscreen change");
        });

        $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange', function () {
            var isFullscreen = ((typeof document.webkitIsFullScreen) !== 'undefined') ? document.webkitIsFullScreen : document.mozFullScreen;
            if (is_ff && !isFullscreen) {
                ResizeFancyBox_RemoveFullScreen();
                $.fancybox.update();
                $.fancybox.reposition();
            }
        });

        $(document).on('keyup', function (e) {
            if (e.keyCode == 27) {
                if (is_fullscreen) {
                    /* FixBugs Chrome FullScreen with history.PushState */
                    if (isChrome) {
                        //push url for the main page
                        history.pushState('', '', mainUrl);

                        //push url for the page in the popup
                        history.pushState('', '', photoDetailUrl);
                    }

                    is_fullscreen = false;
                }

                /* Resize FancyBox */
                if (fancyBoxIsOpen) {
                    ResizeFancyBox();
                }
            }
        });
    });;
</script>

HTML

<div id="fb-root"></div>
<div class="wrapper">
    <a data-pid="1" data-aurl="http://xinhsangchanh.com/pages/model.ngoctrinh89/photos_albums/534945013187112_1073741870/c-t-thoi-trang-cuoc-song/" data-aname="C&T - Thời Trang&Cuộc Sống" class="fancybox"
        href="https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-frc3/a920x920/1395393_742419162439695_1843666743_o.jpg">
        <img src="https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-frc3/s720x720/1395393_742419162439695_1843666743_n.jpg" alt="" />
        <div class="fancybox-caption" id="fancybox-caption-1">
            Description image 1
        </div>
    </a>
    <a data-pid="2" data-aurl="http://xinhsangchanh.com/pages/xinhsangchanh/photos_albums/159983480792077_1073741861/co-dai/" data-aname="♥ Cỏ Dại ♥" class="fancybox"
       href="https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-ash4/a920x920/1452326_225031824287242_634947362_o.jpg">
        <img src="https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-ash4/s720x720/1452326_225031824287242_634947362_n.jpg" alt="" />
        <div class="fancybox-caption" id="fancybox-caption-2">
            Description image 2
        </div>
    </a>
    <a data-pid="3" data-aurl="http://xinhsangchanh.com/pages/xinhsangchanh/photos_albums/159983480792077_1073741856/si-thanh/" data-aname="♥ Sĩ Thanh ♥" class="fancybox"
       href="https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-prn2/a920x920/1463654_224327864357638_843264111_o.jpg">
        <img src="https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-prn2/s720x720/1463654_224327864357638_843264111_n.jpg" alt="" />
        <div class="fancybox-caption" id="fancybox-caption-3">
            Description image 3
        </div>
    </a>
    <a data-pid="4" data-aurl="http://xinhsangchanh.com/pages/xinhsangchanh/photos_albums/159983480792077_6930/phuong-ltf/" data-aname="♥ Phương Ltf ♥" class="fancybox"
       href="https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-ash4/a920x920/1424263_225004224290002_1852999001_o.jpg">
        <img src="https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-ash4/s720x720/1424263_225004224290002_1852999001_n.jpg" alt="" />
        <div class="fancybox-caption" id="fancybox-caption-4">
            Description image 4
        </div>
    </a>
    <a data-pid="5" data-aurl="http://xinhsangchanh.com/pages/xinhsangchanh/photos_albums/159983480792077_1073741859/linh-pham/" data-aname="♥ Linh Phạm ♥" class="fancybox"
        href="https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-frc3/a920x920/1476303_224794277644330_557943496_o.jpg">
        <img src="https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-frc3/s720x720/1476303_224794277644330_557943496_n.jpg" alt="" />
        <div class="fancybox-caption" id="fancybox-caption-5">
            Description image 5
        </div>
    </a>
</div>

您可以在我的演示页面上查看和查看完整的来源:http://xinhsangchanh.com/demos/FancyBoxDemo.html

1 个答案:

答案 0 :(得分:4)

这是一种更简单的方法。

1-在你的fancybox右侧添加填充

2-将内容插入$ .fancybox.inner并且position:absolute,right:minusTheSizeOfTheInsertedContent

$(".fancybox-thumb").fancybox({
     padding     : [15, 325, 15, 15],
     nextEffect  : 'fade',
     prevEffect  : 'fade',
     autoSize    : true,
     beforeShow: function(){
          var fancyNewContent = $('<div class="fancybox-New"></div>');
          this.inner.append(fancyNewContent);
     }
});

在css文件中:

.fancybox-New{
    position: absolute;
    right: -310px;
    width: 300px;
    height: 250px;
    background-color: #ccc;
}

我已使用此方法添加广告。