根据左侧元素向左显示悬停卡?

时间:2017-10-06 21:36:04

标签: javascript jquery css

我的HTML有一个div,当我将鼠标悬停在div时,右侧会显示一张卡片。当div在左侧时,这仍然显示右侧。当我减小浏览器宽度时,此卡部分显示详细信息。

如何使用jquery自动定位。 enter image description here

var thisEl = $(this); 
var offsets = thisEl.offset();
var thisElTopOffset = offsets.top;
var thisElLeftOffset = offsets.left;

这将显示为我在图像中提到的。但是当元素在右边时,我尝试将div放在左边。

代码:我到目前为止尝试了

allHoverCardTriggers.on({
                click: function(event) {
                event.preventDefault();                 
                    var thisEl = $(this);
                    cardTimer = setTimeout(function(){
                        var docWidth = $(document).width();
                        var rightSide = false;

                        //return user id
                        var userLink = thisEl.attr('href');
                        if($('.ViewProfilePage').length && $('img.lia-user-avatar-profile',thisEl).length){
                            var userLink = document.location.href;
                        } else if(thisEl.attr('href')=='#'){
                            return false;
                        }

                        var thisLen = (userLink).split('/');
                        thisUserID = (thisLen)[thisLen.length-1];
                        var thisCard = $('.profileCard[data-user='+thisUserID+']',cardWrapper);

                        var offsets = thisEl.offset();
                        var thisElTopOffset = offsets.top;
                        var thisElLeftOffset = offsets.left;

                            if(thisCard.length && $('.profileCard[data-user='+thisUserID+'] .preloader',cardWrapper).length<1)
                            {
                                $('.profileCard',cardWrapper).hide();
                                rightSide?thisCard.addClass('rightArrow'):thisCard.removeClass('rightArrow');
                                thisCard.delay(500).css({'top':thisElTopOffset,'left':thisElLeftOffset}).stop().show();
                            } 
                            else 
                            {
                                var ajaxReturn = '';

                                thisCard.remove();

                                //profile card wrapper markup
                                var rightArrowClass = rightSide?'rightArrow':'';
                                var profileCardHtml = '<div class="profileCard '+rightArrowClass+'" style="display:block;top:'+thisElTopOffset+'px;left:'+thisElLeftOffset+'px;" data-user="'+thisUserID+'"><div class="inner"><img src="/html/assets/feedback_loading_trans.gif" class="preloader" style="margin:80px auto;display:block;" /></div></div>';

                                $.when(
                                    //get the background
                                    $.ajax({
                                        type: 'GET',
                                        url: userApiUrl+thisUserID,
                                        dataType: 'html',
                                        success: function(data) {
                                            $('.profileCard',cardWrapper).hide();
                                            ajaxReturn = data;
                                        }
                                    })
                                    )
                                    .done(function(){
                                        cardWrapper.append(profileCardHtml);
                                        $('.profileCard[data-user='+thisUserID+']',cardWrapper).eq(0).empty().html(ajaxReturn);
                                        if($('.profileCard[data-user='+thisUserID+'] .preloader',cardWrapper).length){
                                            $('.profileCard[data-user='+thisUserID+'] .preloader',cardWrapper).parents('div.profileCard').remove();
                                        }
                                    })
                                    .fail(function(){
                                        // Hide if failed request
                                        $('.profileCard',cardWrapper).hide();
                                    });
                            }
                        }
                    },400);
                },
                mouseleave: function() {
                    clearTimeout(cardTimer);
                    if($('.profileCard[data-user='+thisUserID+']',cardWrapper).length){
                        $('.profileCard[data-user='+thisUserID+']',cardWrapper).delay(500).fadeOut('fast');
                    }
                }
            });
        }

1 个答案:

答案 0 :(得分:1)

这是一个jQuery解决方案。在显示弹出窗口之前,脚本会检查触发器div加上弹出窗口width的偏移位置是否超出屏幕width,并相应地调整弹出窗口位置。

&#13;
&#13;
hover = function(e) {
  //var position = e.position();
  var popup = $('.popup');
  popup.attr('style', '');
  
  if (e.offsetLeft + popup.outerWidth() > $( window ).width()) {
    // adjust for screen width
    popup.css({ 
      right: $( window ).width() - e.offsetLeft - e.offsetWidth + 'px',
      top: e.offsetTop - popup.outerHeight()
      });
  }
  else {
    // position normally
    popup.css({
      left: e.offsetLeft,
      top: e.offsetTop - popup.outerHeight()
    });
  }
  popup.show();
}

hide = function() {
 $('.popup').hide();
}
&#13;
.left-hover {
  position:absolute;
  left:20px;
  top:80px;
  border:1px solid black;
}

.right-hover {
  position:absolute;
  right:20px;
  top:80px;
  border:1px solid black;
}

.popup {
  position:absolute;
  display:none;
  border:1px solid red;
  width:100px;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="left-hover" onmouseover="hover(this)" onmouseout="hide()">Hover me</div>
<div class="right-hover" onmouseover="hover(this)" onmouseout="hide()">Hover me</div>
<div class="popup">My popup</div>
&#13;
&#13;
&#13;