【问题标题】:Tumblr style UserHoverCardTumblr 风格的 UserHoverCard
【发布时间】:2015-04-07 07:26:46
【问题描述】:

大家好,我对 ajax 悬停有一个问题。我正在尝试制作像 tumblr 这样的 userHoverCard。但是当我将它与 ajax 一起使用时,悬停动画不起作用。

这是工作 DEMO 没有 ajax 只有 css。在这个演示中,您可以看到当您悬停图像时,.p-tooltip 将以动画效果打开。

但是如果你从我的测试页面点击这个DEMO然后你可以看到当你悬停图像时.p-tooltip将不会以动画效果打开。

HTML

    <div class="p-tooltip"></div>
    <div class="summary" data-id="25">
      <a href=#" class="profile-ava"></a>
    </div>
    <div class="summary" data-id="20">
      <a href=#" class="profile-ava"></a>
    </div>
    <div class="summary" data-id="25">
      <a href=#" class="profile-ava"></a>
    </div>

这是我的 ajax 代码:

$(document).ready(function() { 

        function showProfileTooltip(e, id){ 
           e.append($('.p-tooltip').css({ 
             'top':'20', 
             'left':'80' 
             }).show()); 
            //send id & get info from get_profile.php 
             $.ajax({
             url: 'get_profile.php?uid='+id,
             beforeSend: function(){

             $('.p-tooltip').html('Loading..');
             },
             success: function(html){ 
             $('.p-tooltip').html(html); 
             } 
           }); 
         } 

        function hideProfileTooltip(){ 
        $('.p-tooltip').hide().fadeIn('fast'); 
         } 
        $('.summary a').hover(function(e){ 

          var id = $(this).attr('data-id'); 
          showProfileTooltip($(this), id); 

          }, function(){ 
          setTimeout(function(){ 
          hideProfileTooltip(); 
          },2000); 
         });
    });

这是 CSS 代码:

.summary {
  margin: 50px auto 0;
  width: 50px;
  height: 50px;
  position: relative;
}
.profile-ava {
  width: 50px;
  height: 50px;
  background-image: url(http://gravatar.com/avatar/3913c4e14034c0a7f28db2c632290c21?s=80);
  border-radius: 3px;
  background-size: 50px 50px;
  display: block;
}

.summary a:hover:before {
  content: '';
  position: absolute;
  display: block;
  bottom: -10px;
  left: 0;
  height: 10px;
  width: 100%;
  z-index: 2;
}


.p-tooltip {
  position: absolute;
  margin-top: 10px;
  top: 100%;
  left: 50%;
  margin-left: -140px;
  width: 280px;
  max-height: 120px;
  border-radius: 5px;
  overflow: hidden;
  background-color: #F0F0F0;
  visibility: hidden;
  opacity: 0;
  transition: all 0.5s ease;
}
.profile-header {
  height: 120px;
  background-image: url(https://pbs.twimg.com/profile_banners/571038694/1395748220/1500x500);
  background-size: auto 120px;
  background-position: 50%;
}
.profile-navigation {
  position: absolute;
  top: 0;
  left: 0;
  padding: 10px;
  width: 100%;
  box-sizing: border-box;
}
.profile-nick {
  color: #fff;
  margin: 0;
  padding: 0.4em 0;
  font-size: 0.8em;
  font-weight: bold;
}
.profile-action {
  float: right;
  background-color: #eee;
  padding: 0.4em;
  border-radius: 2px;
  color: inherit;
  text-decoration: none;
  font-size: 0.8em;
  font-weight: bold;
}


.p-tooltip .profile-ava {
  margin: -40px auto 0;
  width: 80px;
  height: 80px;
  background-size: 80px;
  border: 3px solid #F0F0F0;
  border-radius: 5px;
}

.profile-info {
  text-align: center;
  padding: 10px;
  opacity: 0;
}
.profile-title {font-size: 1.6em; margin: 0;}
.profile-description {
  margin: 0;
  font-size: 0.8em;
}

.profile-items {margin: 0px; padding: 10px;}
.profile-items:after {
  content: '';
  display: table;
  clear: both;
}
.profile-items li {  
  width: 80px;
  height: 80px;
  background-size: cover;
  background-position: center;
  float: left;
  display: block;
  border-radius: 3px;
}
.profile-items li:not(:first-child) {margin-left: 10px;}
.profile-items li:nth-child(1) {
  background-image: url(https://o.twimg.com/1/proxy.jpg?t=FQQVBBgwaHR0cHM6Ly9pLnl0aW1nLmNvbS92aS9CM3lna2lYRXVyWS9ocWRlZmF1bHQuanBnFAIWABIA&s=z1wybbbNHF0pyLthl3xhxVBNjbYlAEWEzPd-dUtrWOY);
}
.profile-items li:nth-child(2) {
  background-image: url(https://pbs.twimg.com/media/B7pkXfgCIAAwoY0.jpg:thumb);
}
.profile-items li:nth-child(3) {
  background-image: url(https://pbs.twimg.com/media/B7A3NHjIIAIt6eg.png:large);
}


.profile-header {
  -webkit-transform: translate(0, -50px);
  -moz-transform: translate(0, -50px);
  transform: translate(0, -50px);

  -webkit-transition: all 0.2s ease-out;
  -moz-transition: all 0.2s ease-out;
  transition: all 0.2s ease-out;

  -webkit-transition-delay: 0.1s;
  -moz-transition-delay: 0.1s;
  transition-delay: 0.1s;

  opacity: 0;
}
.profile-info {
  -webkit-transform: translate(0, 50px);
  -moz-transform: translate(0, 50px);
  transform: translate(0, 50px);

  -webkit-transition: all 0.3s ease-out;
  -moz-transition: all 0.3s ease-out;
  transition: all 0.3s ease-out;

  -webkit-transition-delay: 0.1s;
  -moz-transition-delay: 0.1s;
  transition-delay: 0.1s;
}
.p-tooltip .profile-ava {
  -webkit-transform: scale(0.5) translate(0, -10px);
  -moz-transform: scale(0.5) translate(0, -10px);
  transform: scale(0.5) translate(0, -10px);

  -webkit-transition: all 0.5s ease-out;
  -moz-transition: all 0.5s ease-out;
  transition: all 0.5s ease-out;

  -webkit-transition-delay: 0.1s;
  -moz-transition-delay: 0.1s;
  transition-delay: 0.1s;

  opacity: 0;
}
.profile-items li {
  -webkit-transform: translate(0, 50px);
  -moz-transform: translate(0, 50px);
  transform: translate(0, 50px);

  -webkit-transition: all 0.3s ease-out;
  -moz-transition: all 0.3s ease-out;
  transition: all 0.3s ease-out;

  -webkit-transition-delay: 0.3s;
  -moz-transition-delay: 0.3s;
  transition-delay: 0.3s;
  opacity: 0;
}
.profile-items li:nth-child(2) {
  -webkit-transition-delay: 0.35s;
  -moz-transition-delay: 0.35s;
  transition-delay: 0.35s;
}
.profile-items li:nth-child(3) {
  -webkit-transition-delay: 0.4s;
  -moz-transition-delay: 0.4s;
  transition-delay: 0.4s;
}


.summary:hover .p-tooltip {
  visibility: visible;
  opacity: 1;
  max-height: 600px;
}
.summary:hover .profile-header,
.summary:hover .profile-info,
.summary:hover .p-tooltip .profile-ava,
.summary:hover .profile-items li {
  -webkit-transform: translate(0,0) scale(1);
  -moz-transform: translate(0,0) scale(1);
  transform: translate(0,0) scale(1);
  opacity: 1;
}

任何人都可以帮助我!

【问题讨论】:

  • 悬停时,您正在使用 jQuery 更改工具提示的 CSS。不要这样做。检查此fiddle。由于我无权访问您的 get_profile.php 页面,因此无法通过 ajax 调用帮助您。我还删除了一些不必要的代码。试试小提琴,看看它是否有效。
  • @Preetesh.Dev 啊我知道这认为我需要调用 css。没有e.append($('.p-tooltip').css({'top':'20','left':80'}).show());,它就无法工作
  • 没错,如果没有e.append,什么是行不通的?你的问题是关于动画的,如果你删除那些不必要的代码,它就可以正常工作。
  • @Preetesh.Dev 当您悬停图像时,ajax 会使用 id 调用用户信息。 id 是用户 id。如果我删除 e.append($('.p-tooltip').css({'top':'20','left':80'}).show()); 然后 .p-tooltip 现在将显示在图片的底部。
  • @Preetesh.Dev 我更新了我的问题,现在有一个&lt;div class="summary" data-id="25"&gt; &lt;a href=#" class="profile-ava"&gt;&lt;/a&gt; &lt;/div&gt;

标签: javascript jquery css ajax


【解决方案1】:

基本上,我已经创建了一个非常聪明的解决方法。它是一个遮罩,在加载 html 之前覆盖图像(不可见),然后在 z-index 降低后发生悬停 css。悬停的 javascript 在容器上。

FIDDLE

.summary {
    margin: -50px auto 0;
    width: 50px;
    height: 50px;
    position: relative;
    z-index: 0;
}
.summary-mask {
    margin: 50px auto 0;
    width: 50px;
    height: 50px;
    position: relative;
    z-index: 1;
}
.loaded .summary-mask {
    z-index: -1;
}

HTML

<div class="the-container">
    <div class="summary-mask"></div>
    <div class="summary" data-id="100"> <a href="http://kraigo.tumblr.com/" class="profile-ava"></a>

        <div class="user-container"></div>
    </div>
</div>

JS

var response = '<div class="p-tooltip"> <div class="profile-header"></div> <div class="profile-navigation"> <a href="http://kraigo.tumblr.com/" class="profile-action">Follow</a> <p class="profile-nick"> <a href="http://kraigo.tumblr.com/">Page Name</a> </p> </div> <div class="profile-ava"></div> <div class="profile-info"> <h1 class="profile-title">Username</h1> <p class="profile-description">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy ..</p> </div> <ul class="profile-items"> <li></li> <li></li> <li></li> </ul> </div>';

$(document).ready(function () {

    function showProfileTooltip(e, id) {
        //send id & get info from get_profile.php 
        $.ajax({
            url: '/echo/html/',
            data: {
                html: response,
                delay: 0
            },
            method: 'post',
            success: function (returnHtml) {
                e.find('.user-container').html(returnHtml).promise().done(function () {
                    $('.the-container').addClass('loaded');
                });
            }
        });

    }

    function hideProfileTooltip() {
        $('.the-container').removeClass('loaded');
    }
    $('.the-container').hover(function (e) {

        var id = $(this).find('.summary').attr('data-id');
        showProfileTooltip($(this), id);

    }, function () {
        hideProfileTooltip();
    });
});

【讨论】:

  • 我收到未定义的错误:http://localhost:8888/get_profile.php?uid=undefined&amp;html=%3Cdiv+class%3D%22p-tooltip%2......Fdiv%3E&amp;delay=0 我的 php 部分没有问题。这里有什么问题?
  • 仔细检查此行是否正确:var id = $(this).find('.summary').attr('data-id'); 我什至会将其更改为var id = $(this).find('.summary').data('id');
  • 如何在发送前添加加载动画?我想添加我的加载动画。这就是我要添加的内容:DEMO 我仍然尝试添加此加载 div,但它没有工作
  • 当我悬停任何图像时,.ajax-loader 显示所有图像 fiddle
  • 亲爱的朋友你能帮我解答这个问题吗:LINK
【解决方案2】:

当您显示卡片时,它只包含加载消息。当内容到达并将其放入卡片中时,这不是 CSS 更改,因此不会激活过渡。

如果您等到内容到达才显示卡片,则可以制作动画。

【讨论】:

  • @innovation:将e.append($('.p-tooltip').css({ top:'20', left:'80' }).show()); 放在$('.p-tooltip').html(html); 之后。
  • 一切都一样,没什么变化。
  • @innovation:啊哈,也是加载消息搞砸了动画。如果您只是删除加载消息,则动画效果很好。考虑为加载消息使用不同的元素,或者在将加载的内容放入元素之前隐藏加载消息。
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
相关资源
最近更新 更多