CSS-聊天气泡渐变

39 阅读2分钟

今天在群里看到一个特别有意思的小交互,分享给大家。类似于抖音的聊天气泡,气泡是渐变的形式并且随着滚动变化。

1. 设计图

image.png

2. 代码实现

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>聊天气泡渐变</title>
    <style>
      :root {
        --gradient-from: 100px;
        --gradient-to: 300px;
      }
      * {
        margin: 0;
        padding: 0;
      }
      body {
        background: #e0e0e0;
      }
      .chatbox {
        max-height: 100vh;
        padding: 20px;
        box-sizing: border-box;
        overflow-x: hidden;
      }
      .chat-message {
        padding: 16px;
        border-radius: 10px 10px 0 10px;
        color: white;
        font-size: 14px;
        margin-bottom: 30px;
        background-image: linear-gradient(
          to bottom,
          #509cff var(--gradient-from),
          #6a68f3 var(--gradient-to)
        );
        background-attachment: fixed;
      }
    </style>
  </head>
  <body>
    <div class="chatbox">
      <div class="chat-message" v-for="item in chatList">{{ item }}</div>
    </div>
  </body>
  <script src="//unpkg.com/vue@2.7.16/dist/vue.js"></script>
  <script>
    new Vue({
      el: ".chatbox",
      data: {
        chatList: [
          "你好,我最近心里特别难受,感觉自己快撑不下去了。 所以想来咨询一下。(闭着眼)",
          "你好,111111",
          "你好,我最近心里特别难受,感觉自己快撑不下去了。 所以想来咨询一下。(闭着眼)",
          "你好,111111",
          "你好,我最近心里特别难受,感觉自己快撑不下去了。 所以想来咨询一下。(闭着眼)",
          "你好,111111",
          "你好,我最近心里特别难受,感觉自己快撑不下去了。 所以想来咨询一下。(闭着眼)",
          "你好,111111",
          "你好,我最近心里特别难受,感觉自己快撑不下去了。 所以想来咨询一下。(闭着眼)",
          "你好,111111",
          "你好,我最近心里特别难受,感觉自己快撑不下去了。 所以想来咨询一下。(闭着眼)",
          "你好,111111",
          "你好,我最近心里特别难受,感觉自己快撑不下去了。 所以想来咨询一下。(闭着眼)",
          "你好,111111",
          "你好,我最近心里特别难受,感觉自己快撑不下去了。 所以想来咨询一下。(闭着眼)",
          "你好,111111"
        ]
      },
      mounted() {
        const chatboxBoundary = document.querySelector(".chatbox").getBoundingClientRect();
        document.documentElement.style.setProperty("--gradient-from", chatboxBoundary.top + "px");
        document.documentElement.style.setProperty("--gradient-to", chatboxBoundary.bottom + "px");
      }
    });
  </script>
</html>