CSS
开发过程中经常遇到过好多次需要手动实现 tooltip 样式了,总结一下以便复制粘贴。
2021-07-08-08-23-16-332839.jpeg
如上图,常见的 tooltip 总共有 3 种类型,纯背景色无边框、有边框、包含背景图,其中的小三角可能是纯色、尖尖有弧度。
下边介绍四种常用的方法来实现 tooltip。

贴图

简单方便快捷,一个三角形的图定下位即可。用 AI 成功画了三种三角形。
2021-07-08-08-23-16-427880.jpeg
下边只需要把三角形贴到矩形下边即可。

纯背景色三角形

  1. .wxml
  2. <view class="tooltip">
  3. <view class="tooltip-text">我是一句提示内容</view>
  4. <image class="tooltip-triangle" src="https://windliangblog.oss-cn-beijing.aliyuncs.com/tooltip-01.png" />
  5. </view>
  6. .wxss
  7. .tooltip {
  8. width: 400rpx;
  9. margin: 100rpx;
  10. position: relative;
  11. }
  12. .tooltip-text {
  13. height: 60rpx;
  14. line-height: 60rpx;
  15. background: #F5F8FF;
  16. color: #494949;
  17. border-radius: 5rpx;
  18. padding: 0 20rpx;
  19. }
  20. .tooltip-triangle {
  21. position: absolute;
  22. width: 30rpx;
  23. height: 30rpx;
  24. top: 60rpx;
  25. left: 200rpx;
  26. }

2021-07-08-08-23-16-538875.jpeg

带边框的三角形和三角形圆角

  1. .wxml
  2. <view class="tooltip">
  3. <view class="tooltip-text">我是一句提示内容</view>
  4. <image class="tooltip-triangle" src="https://windliangblog.oss-cn-beijing.aliyuncs.com/tooltip-02.png" />
  5. </view>
  6. .wxss
  7. .tooltip {
  8. width: 400rpx;
  9. margin: 100rpx;
  10. position: relative;
  11. }
  12. .tooltip-text {
  13. height: 60rpx;
  14. line-height: 60rpx;
  15. background: #f5f8ff;
  16. color: #494949;
  17. border-radius: 5rpx;
  18. padding: 0 20rpx;
  19. border: 2px solid #002fa7;
  20. }
  21. .tooltip-triangle {
  22. position: absolute;
  23. width: 30rpx;
  24. height: 30rpx;
  25. top: 62rpx;
  26. left: 200rpx;
  27. }

2021-07-08-08-23-16-621873.jpeg
发现原有的 border 没有盖住,然后从重新做了一张上边延伸背景色的图。
2021-07-08-08-23-16-710838.png
2021-07-08-08-23-16-803196.jpeg
圆角的三角同理,换下 imagesrc 即可。
2021-07-08-08-23-16-915239.jpeg

利用 border

经常写 border ,可有没有想过它的四个角的连接处是什么样的?
2021-07-08-08-23-17-033197.jpeg
将连接处放大:
2021-07-08-08-23-17-118198.jpeg
会发现每条边其实是一个梯形,然后互相接起来。那么如果 border 中内容的宽高都是 0 会怎么样呢?
2021-07-08-08-23-17-201200.jpeg

  1. .border {
  2. border-width: 4px;
  3. border-color: #F00 #0F0 #00F #0FF;
  4. border-style: solid;
  5. width: 0px;
  6. height: 0px;
  7. }

2021-07-08-08-23-17-309230.jpeg
三角形出现了!只需要将左边下边右边的 border 颜色设置为透明就是要的三角形了,border-color: #F00 transparent transparent transparent;
此外,虽然底部 boder 设置为透明了,但是还占据高度,可以将它的 width 设为 0border-bottom-width: 0
不同样式 tooltip 对话框小三角的 CSS 实现 - 图12
然后只需要将之前使用的图片替换掉即可。

  1. .wxml
  2. <view class="tooltip">
  3. <view class="tooltip-text">我是一句提示内容</view>
  4. <view class="tooltip-triangle"></view>
  5. </view>
  6. .wxss
  7. .tooltip {
  8. max-width: 400rpx;
  9. margin-left: 20rpx;
  10. position: relative;
  11. }
  12. .tooltip-text {
  13. padding: 15rpx;
  14. background: #002FA7;
  15. color: #fff;
  16. border-radius: 5rpx;
  17. }
  18. .tooltip-triangle {
  19. position: absolute;
  20. top: 62rpx;
  21. left: 200rpx;
  22. border-width: 30rpx;
  23. border-color: #002FA7 transparent transparent transparent;
  24. border-style: solid;
  25. width: 0px;
  26. height: 0px;
  27. }

效果如下:
2021-07-08-08-23-17-543196.jpeg
三角形形状的话,可以通过 border-width 属性去调整高低胖瘦。

带边框三角

上边的矩形和三角形都没有边框,如果是有边框的,下边这种该怎么实现呢?
2021-07-08-08-23-17-638195.jpeg
其实很简单,只需要在原有三角形的位置写一个一样的三角形,然后颜色设置为对话框的背景色,向上偏移一定位置即可。
把覆盖的三角形颜色设置为红色,这样看起来就很明显了,如下图:
2021-07-08-08-23-17-728202.jpeg
代码如下:

  1. .wxml
  2. <view class="tooltip">
  3. <view class="tooltip-text">我是一句提示内容</view>
  4. <view class="tooltip-triangle-top"></view>
  5. <view class="tooltip-triangle"></view>
  6. </view>
  7. .wxss
  8. .tooltip {
  9. max-width: 400rpx;
  10. margin-left: 20rpx;
  11. position: relative;
  12. }
  13. .tooltip-text {
  14. padding: 15rpx;
  15. background: #fff;
  16. border-radius: 5rpx;
  17. border: 5rpx solid #002FA7;
  18. }
  19. .tooltip-triangle-top {
  20. position: absolute;
  21. top: 71rpx;
  22. left: 200rpx;
  23. border-width: 30rpx;
  24. border-left-width: 20rpx;
  25. border-right-width: 20rpx;
  26. border-color: #FFF transparent transparent transparent;
  27. border-style: solid;
  28. width: 0px;
  29. height: 0px;
  30. z-index: 10;
  31. }
  32. .tooltip-triangle {
  33. position: absolute;
  34. top: 76rpx;
  35. left: 200rpx;
  36. border-width: 30rpx;
  37. border-left-width: 20rpx;
  38. border-right-width: 20rpx;
  39. border-color: #002FA7 transparent transparent transparent;
  40. border-style: solid;
  41. width: 0px;
  42. height: 0px;
  43. }

矩形旋转

只需要两个同样位置的矩形,然后旋转上边的矩形即可。旋转过来的三角形的长边就是原来矩形的长,三角形边长比是1 比 1 比根号 2。所以原有矩形的长宽比应该为根号 2 比 1。即,width = 1.41 * height
2021-07-08-08-23-17-847199.jpeg
代码的话,用伪元素矩形旋转,另一个矩形设置 overflow:hidden 即可。

  1. .wxml
  2. <view class="tooltip">
  3. <view class="tooltip-text">我是一句提示内容</view>
  4. <view class="tooltip-triangle"></view>
  5. </view>
  6. .wxss
  7. .tooltip {
  8. max-width: 400rpx;
  9. position: relative;
  10. }
  11. .tooltip-text {
  12. padding: 15rpx;
  13. background: #002FA7;
  14. border-radius: 5rpx;
  15. color: #FFF;
  16. }
  17. .tooltip-triangle {
  18. position: relative;
  19. left: 150rpx;
  20. width: calc(30rpx * 1.41);
  21. height: 30rpx;
  22. overflow: hidden;
  23. }
  24. .tooltip-triangle::before {
  25. content: '';
  26. width: 100%;
  27. height: 100%;
  28. background: #002FA7;
  29. display: block;
  30. transform: rotate(-45deg);
  31. transform-origin: left top;
  32. }

不同样式 tooltip 对话框小三角的 CSS 实现 - 图17
由于三角形是由矩形生成的,所以带边框的 tooltip 相对 border 的方法就容易多了。
只需要给伪元素设置边框即可。

  1. .wxss
  2. .tooltip {
  3. max-width: 400rpx;
  4. position: relative;
  5. }
  6. .tooltip-text {
  7. padding: 15rpx;
  8. background: #f5f8ff;
  9. color: #494949;
  10. border-radius: 5rpx;
  11. border: 4rpx solid #002fa7;
  12. }
  13. .tooltip-triangle {
  14. position: relative;
  15. left: 150rpx;
  16. width: calc(30rpx * 1.41);
  17. height: 30rpx;
  18. overflow: hidden;
  19. }
  20. .tooltip-triangle::before {
  21. content: '';
  22. border: 4rpx solid #002fa7;
  23. background: #f5f8ff;
  24. width: 100%;
  25. height: 100%;
  26. display: block;
  27. transform: rotate(-45deg);
  28. transform-origin: left top;
  29. box-sizing: border-box;
  30. border-radius: 8rpx;
  31. }

此时出现了一个问题,上边矩形的 border 露了出来。
2021-07-08-08-23-18-143195.jpeg
这里用一个 trick 的方法,在原有矩形上边加一个 border 盖住上边矩形的边框。
.wxss 添加下边的属性

  1. .tooltip-triangle {
  2. border-top: 4rpx solid #f5f8ff;
  3. bottom: 8rpx;
  4. }

2021-07-08-08-23-18-245205.jpeg
此外,带弧角的三角形,也只需要在伪元素矩形上设置圆角即可。
.wxss 添加下边的属性

  1. .tooltip-triangle::before
  2. border-radius: 8rpx;
  3. }

2021-07-08-08-23-18-354197.jpeg

clip-path

下边这种 tooltip 类型,小三角延伸了背景图片(背景图片 url 可能不是固定的),上边几种方法都是无能为力的。
2021-07-08-08-23-18-437194.jpeg
此时就需要 clip-path 属性了,可以在 clippy 快速生成需要的多边形路径。
https://bennettfeely.com/clippy/
2021-07-08-08-23-18-533196.jpeg
polygon 就是画多边形,然后给定各个点的坐标即可,代码中各个颜色和图片中的各个点是对应的。
然后把上边的代码复制过来即可。

  1. .wxml
  2. <view class="tooltip">
  3. <image src="https://windliangblog.oss-cn-beijing.aliyuncs.com/meituan4.jpg" class="tooltip-text"></image>
  4. </view>
  5. .wxss
  6. .tooltip {
  7. max-width: 400rpx;
  8. position: relative;
  9. }
  10. .tooltip-text {
  11. width: 400rpx;
  12. height: 200rpx;
  13. overflow: hidden;
  14. clip-path: polygon(0% 0%, 100% 0%, 100% 80%, 70% 80%, 63% 100%, 55% 80%, 1% 80%);
  15. }

使用 clip-path 的话 border 和圆角就比较难搞了,因为最下边的边其实是被截掉了。
2021-07-08-08-23-18-660233.jpeg
在 Web 页面中可以使用 SVG 来实现想要的效果,可以 参考这里 的一个回答。
https://stackoverflow.com/questions/31854185/how-to-add-border-in-my-clip-path-polygon-css-style
2021-07-08-08-23-18-809196.jpeg

总结

上边主要介绍了贴图、border、矩形旋转、clip-path四种方法。