Auto Scaling图像注释

时间:2017-10-11 21:11:27

标签: javascript jquery

Scalize是一个jQuery插件,用于向容器或图像添加自定义标记(热点)和自定义弹出框和动画。

但是现在当我在指针上一个一个地点击时它会一个接一个地显示但是我只想显示一个,所以当点击另一个指针将关闭已经打开的另一个时。

这是我的EXAMPLE

    (function(jQuery) {
    "use strict";

    //----------------------------------------//
    // Variable
    //----------------------------------------//
    var variable = {
        width : 0,
        height : 0,
        selector : '.item-point',
        styleSelector : 'circle',
        animationSelector : 'pulse2',
        animationPopoverIn : 'flipInY',
        animationPopoverOut : 'flipOutY', 
        onInit : null,
        getSelectorElement : null,
        getValueRemove : null
    }

    //----------------------------------------//
    // Scaling
    //----------------------------------------//
    var scaling = {
        settings : null,
        //----------------------------------------//
        // Initialize
        //----------------------------------------//
        init: function(el, options){
            this.settings = jQuery.extend(variable, options);
            this.event(el);            

            scaling.layout(el);
            jQuery(window).on('load', function(){
                scaling.layout(el);
            });
            jQuery(el).find('.target').on('load', function(){
                scaling.layout(el);
            });
            jQuery(window).on('resize', function(){
                scaling.layout(el);
            });
        },

        //----------------------------------------//
        // Event
        //----------------------------------------//
        event : function(elem){
            // Set Style Selector
            if ( this.settings.styleSelector ) {
                jQuery(this.settings.selector).addClass( this.settings.styleSelector );
            }

            // Set Animation
            if ( this.settings.animationSelector ) {
                if( this.settings.animationSelector == 'marker' ){
                    jQuery(this.settings.selector).addClass( this.settings.animationSelector );
                    jQuery(this.settings.selector).append('<div class="pin"></div>')
                    jQuery(this.settings.selector).append('<div class="pulse"></div>')
                }else{
                    jQuery(this.settings.selector).addClass( this.settings.animationSelector );
                }
            }

            // Event On Initialize
            if ( jQuery.isFunction( this.settings.onInit ) ) {
                this.settings.onInit();
            }

            // Content add class animated element
            jQuery(elem).find('.content').addClass('animated');

            // Wrapper selector
            jQuery(this.settings.selector).wrapAll( "<div class='wrap-selector' />");

            // Event Selector
            jQuery(this.settings.selector).each(function(){

                // Toggle
                jQuery('.toggle', this).on('click', function(e){
                    e.preventDefault();
                    jQuery(this).closest(scaling.settings.selector).toggleClass('active');

                    // Selector Click
                    var content = jQuery(this).closest(scaling.settings.selector).data('popover'),
                        id = jQuery(content);

                    if(jQuery(this).closest(scaling.settings.selector).hasClass('active') && !jQuery(this).closest(scaling.settings.selector).hasClass('disabled')){
                        if ( jQuery.isFunction( scaling.settings.getSelectorElement ) ) {
                            scaling.settings.getSelectorElement(jQuery(this).closest(scaling.settings.selector));
                        }
                        id.fadeIn(500,function(){

                            if( getBrowserName() == "Safari" ){
                                setTimeout(function(){
                                    id.removeClass('flipInY');
                                },125);

                            }
                        });
                        scaling.layout(elem);
                        id.removeClass(scaling.settings.animationPopoverOut);
                        id.addClass(scaling.settings.animationPopoverIn);
                    }else{
                        if(jQuery.isFunction( scaling.settings.getValueRemove )){
                            scaling.settings.getValueRemove(jQuery(this).closest(scaling.settings.selector));
                        }
                        id.removeClass(scaling.settings.animationPopoverIn);
                        id.addClass(scaling.settings.animationPopoverOut);
                        id.delay(500).fadeOut();
                    }
                });

                // Exit
                var target = jQuery(this).data('popover'),
                    idTarget = jQuery(target);
                idTarget.find('.exit').on('click', function(e){
                    e.preventDefault();
                    // selector.removeClass('active');
                    jQuery('[data-popover="'+ target +'"]').removeClass('active');
                    idTarget.removeClass(scaling.settings.animationPopoverIn);
                    idTarget.addClass(scaling.settings.animationPopoverOut);
                    idTarget.delay(500).fadeOut();
                });
            });
        },

        //----------------------------------------//
        // Layout
        //----------------------------------------//
        layout : function(elem){

            // Get Original Image
            var image = new Image();
            image.src = elem.find('.target').attr("src");

            // Variable
            var width = image.naturalWidth,
                height = image.naturalHeight,
                getWidthLess = jQuery(elem).width(),
                setPersenWidth = getWidthLess/width * 100,
                setHeight = height * setPersenWidth / 100;

            // Set Heigh Element
            jQuery(elem).css("height", setHeight);

            // Resize Width
            if( jQuery(window).width() < width ){
                jQuery(elem).stop().css("width","100%");
            }else{
                jQuery(elem).stop().css("width",width);
            }

            // Set Position Selector
            jQuery(this.settings.selector).each(function(){
                if( jQuery(window).width() < width ){
                    var getTop = jQuery(this).data("top") * setPersenWidth / 100,
                        getLeft = jQuery(this).data("left") * setPersenWidth / 100;
                }else{
                    var getTop = jQuery(this).data("top"),
                        getLeft = jQuery(this).data("left");
                }
                jQuery(this).css("top", getTop + "px");
                jQuery(this).css("left", getLeft + "px");

                // Target Position
                var target = jQuery(this).data('popover'),
                    allSize = jQuery(target).find('.head').outerHeight() + jQuery(target).find('.body').outerHeight() + jQuery(target).find('.footer').outerHeight();
                jQuery(target).css("left", getLeft + "px");
                jQuery(target).css("height", allSize + "px");

                if(jQuery(target).hasClass('bottom')){
                    var getHeight = jQuery(target).outerHeight(),
                        getTopBottom = getTop - getHeight;
                    jQuery(target).css("top", getTopBottom + "px");
                }else if(jQuery(target).hasClass('center')){
                    var getHeight = jQuery(target).outerHeight() * 0.50,
                        getTopBottom = getTop - getHeight;
                    jQuery(target).css("top", getTopBottom + "px");
                }else{
                    jQuery(target).css("top", getTop + "px");
                }

                jQuery('.toggle', this).css('width', jQuery(this).outerWidth());
                jQuery('.toggle', this).css('height', jQuery(this).outerHeight());

                // Toggle Size
                if(jQuery(this).find('.pin')){
                    var widthThis = jQuery('.pin', this).outerWidth(),
                        heightThis = jQuery('.pin', this).outerHeight();
                    jQuery('.toggle', this).css('width', widthThis);
                    jQuery('.toggle', this).css('height', heightThis);                    
                }
            });
        }

    };

    //----------------------------------------//
    // Scalize Plugin
    //----------------------------------------//
    jQuery.fn.scalize = function(options){
        return scaling.init(this, options);
    };

}(jQuery));

function getBrowserName() {
    var name = "Unknown";
    if(navigator.userAgent.indexOf("MSIE")!=-1){
        name = "MSIE";
    }
    else if(navigator.userAgent.indexOf("Firefox")!=-1){
        name = "Firefox";
    }
    else if(navigator.userAgent.indexOf("Opera")!=-1){
        name = "Opera";
    }
    else if(navigator.userAgent.indexOf("Chrome") != -1){
        name = "Chrome";
    }
    else if(navigator.userAgent.indexOf("Safari")!=-1){
        name = "Safari";
    }
    return name;   
}

2 个答案:

答案 0 :(得分:2)

将此添加到您的初始化中:

        getSelectorElement: function(el) {
          $('.item-point.active').not($(el)[0]).find('.toggle').click();
        }

这会挂钩Scalize插件中的getSelectorElement方法,并触发任何与最近点击的项目不匹配的活动(开放)元素的点击。

像这样添加:

   $(document).ready(function(){
        $('.scalize').scalize({
            styleSelector: 'circle',
            animationPopoverIn: 'fadeIn',
            animationPopoverOut: 'fadeOut',
            animationSelector: 'pulse2',
            getSelectorElement: function(el) {
              $('.item-point.active').not($(el)[0]).find('.toggle').click();
            }
        });         
    });  

注意,因为这是插入插件中的现有方法,它更安全一些(没有不可预测的副作用,加上你在消失的元素上得到预期的转换)。 Fiddle

答案 1 :(得分:1)

我已修改您的jsFiddle以便工作。

TL; DR:任何时候点击一个点,如果有其他活动的兄弟,则循环它们并隐藏它们的弹出窗口。

这不是一个很好的方式,但它在小提琴中工作。

VehicleModelViewModel
相关问题