You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于PHP循环生成多卡片的对应悬停弹出框Javascript实现求助

解决方案

第一步:修复PHP循环结构

当前你的弹窗代码写在while循环外部,只会生成1个弹窗,需要移到循环内部,才能生成和卡片一一对应的多个弹窗,修正后的PHP代码如下:

<?php 
$counter = 1; // 提前初始化计数器
while ($post_query->have_posts()) {?>
   <?php $post_query->the_post();?>
   <div class="card" id="card-0<?php echo $counter; ?>">
      <h4 class="post-title">“<?php echo get_the_title(); ?>”</h4>
   </div>

   <div class="popup" id="popup-0<?php echo $counter++; ?>">
      <h4 class="post-title">“<?php echo get_the_title(); ?>”</h4>
      <p class="blurb"><?php echo get_field('blurb'); ?></p>
   </div>
<?php }?>

第二步:通用JS hover逻辑实现

不需要提前知道卡片/弹窗的数量,自动匹配所有动态生成的元素,代码如下:

$(document).ready(function(){
  // 给所有class为card的元素批量绑定hover事件
  $(".card").hover(function(){
    // 提取当前卡片id,替换前缀得到对应弹窗的id
    const targetPopupId = '#' + $(this).attr('id').replace('card', 'popup');
    $(targetPopupId).css("opacity", "1");
  }, function(){
    const targetPopupId = '#' + $(this).attr('id').replace('card', 'popup');
    $(targetPopupId).css("opacity", "0");
  });
});

可选优化方案(更稳定)

如果担心后续id命名规则变动导致匹配失效,可以通过data属性做显式绑定,修改PHP中卡片的代码,新增自定义属性:

<div class="card" id="card-0<?php echo $counter; ?>" data-popup-target="popup-0<?php echo $counter; ?>">

对应的JS代码可以改为直接读取绑定的属性值,无需依赖id前缀规则:

$(document).ready(function(){
  $(".card").hover(function(){
    const targetPopup = '#' + $(this).data('popup-target');
    $(targetPopup).css("opacity", "1");
  }, function(){
    const targetPopup = '#' + $(this).data('popup-target');
    $(targetPopup).css("opacity", "0");
  });
});

如果需要弹窗显示/隐藏有过渡效果,可以补充CSS样式:

.popup {
  transition: opacity 0.2s ease;
  /* 保留原有popup的其他样式即可 */
}

内容的提问来源于stack exchange,提问作者jguiles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 05:09:02