头图

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层

1. 两个元素实现

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>纯 CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层</title>
  <style>
    *{
      padding: 0;
      margin: 0;
      list-style: none;
    }

    .item {
      position: relative;
      display: inline-block;
      margin: 10px;
    }

    .name {
      cursor: pointer;
      padding: 5px;
    }

    .desc {
      display: none;
      position: absolute;
      top: 130%;
      left: 50%;
      transform: translateX(-50%) translateY(-10px);
      background-color: rgba(0, 0, 0, 0.8);
      color: #fff;
      padding: 5px 10px;
      border-radius: 4px;
      white-space: nowrap;
      z-index: 100;
      opacity: 0;
      transition: opacity 0.3s ease, transform 0.3s ease;
    }

    .desc::before {
      content: '';
      position: absolute;
      top: -10px;
      left: 50%;
      transform: translateX(-50%);
      border-width: 5px;
      border-style: solid;
      border-color: transparent transparent rgba(0, 0, 0, 0.8) transparent;
    }

    .item:hover .desc {
      display: block;
      opacity: 1;
      transform: translateX(-50%) translateY(0);
    }
  </style>
</head>
<body>
  <ul class="item-list">
    <li class="item">
      <span class="name">a</span>
      <span class="desc">aa</span>
    </li>
    <li class="item">
      <span class="name">b</span>
      <span class="desc">bb</span>
    </li>
    <li class="item">
      <span class="name">c</span>
      <span class="desc">ccdddd</span>
    </li>
  </ul>
</body>
</html>

2. 通过 ::after 和 ::before 实现

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>纯 CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层</title>
  <style>
    *{
      padding: 0;
      margin: 0;
      list-style: none;
    }

    .item-list {
      display: flex;
      gap: 20px;
    }

    .item {
      position: relative;
    }

    .name {
      position: relative;
      cursor: pointer;
      padding: 5px;
    }

    .name::after {
      content: attr(data-desc);
      display: none;
      position: absolute;
      top: 100%;
      left: 50%;
      transform: translateX(-50%) translateY(5px);
      background-color: rgba(0, 0, 0, 0.8);
      color: #fff;
      padding: 5px 10px;
      border-radius: 4px;
      white-space: nowrap;
      z-index: 100;
      opacity: 0;
      transition: opacity 0.3s ease, transform 0.3s ease;
    }

    .name:hover::after {
      display: block;
      opacity: 1;
      transform: translateX(-50%) translateY(0);
    }

    .name::before {
      content: '';
      display: none;
      position: absolute;
      top: calc(100% - 5px);
      left: 50%;
      transform: translateX(-50%) translateY(-5px);
      border-width: 5px;
      border-style: solid;
      border-color: transparent transparent rgba(0, 0, 0, 0.8) transparent;
    }

    .name:hover::before {
      display: block;
    }
  </style>
</head>
<body>
  <ul class="item-list">
    <li class="item">
      <span class="name" data-desc="aa">a</span>
    </li>
    <li class="item">
      <span class="name" data-desc="bb">b</span>
    </li>
    <li class="item">
      <span class="name" data-desc="ccddddd">c</span>
    </li>
  </ul>
</body>
</html>

3. 实现 Tooltip 上下左右四个位置展示

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>纯 CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层</title>
  <style>
  .tooltip-container {
    position: relative;
    display: inline-block;
    margin: 100px;
    border-bottom: 1px dotted black;
    cursor: pointer;
  }
  
  .tooltip-container::after {
    content: attr(data-tooltip);
    position: absolute;
    z-index: 1;
    
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.3s;
    
    background: #333;
    color: white;
    padding: 5px 10px;
    border-radius: 4px;
    font-size: 14px;
    white-space: nowrap;
  }
  
  .tooltip-container::before {
    content: '';
    position: absolute;
    z-index: 1;
    border: 5px solid transparent;
    
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.3s;
  }
  
  .tooltip-container:hover::after,
  .tooltip-container:hover::before {
    opacity: 1;
    visibility: visible;
  }
  
  .tooltip-top::after {
    bottom: 100%;
    left: 50%;
    transform: translateX(-50%);
    margin-bottom: 10px;
  }
  
  .tooltip-top::before {
    bottom: calc(100% - 5px);
    left: 50%;
    transform: translateX(-50%);
    margin-bottom: 5px;
    border-top-color: #333; /* 箭头方向 */
  }
  
  .tooltip-bottom::after {
    top: 100%;
    left: 50%;
    transform: translateX(-50%);
    margin-top: 10px;
  }
  
  .tooltip-bottom::before {
    top: calc(100% - 5px);
    left: 50%;
    transform: translateX(-50%);
    margin-top: 5px;
    border-bottom-color: #333;
  }
  
  .tooltip-right::after {
    top: 50%;
    left: 100%;
    transform: translateY(-50%);
    margin-left: 10px;
  }
  
  .tooltip-right::before {
    top: 50%;
    left: calc(100% - 5px);
    transform: translateY(-50%);
    margin-left: 5px;
    border-right-color: #333;
  }
  
  .tooltip-left::after {
    top: 50%;
    right: 100%;
    transform: translateY(-50%);
    margin-right: 10px;
  }
  
  .tooltip-left::before {
    top: 50%;
    right: calc(100% - 5px);
    transform: translateY(-50%);
    margin-right: 5px;
    border-left-color: #333;
  }
  </style>
</head>
<body>

<div class="tooltip-container tooltip-top" data-tooltip="Top Tooltip">
  顶部显示
</div>

<div class="tooltip-container tooltip-bottom" data-tooltip="Bottom Tooltip">
  下方显示
</div>

<div class="tooltip-container tooltip-left" data-tooltip="Left Tooltip">
  左侧显示
</div>

<div class="tooltip-container tooltip-right" data-tooltip="Right Tooltip">
  右侧显示
</div>

</body>
</html>


月恒
43 声望5 粉丝

前端