CSS实现一个简单的微信聊天气泡
问题描述:
想实现一个聊天气泡框时需要一个突出的尖角,于是想到了借助伪元素来实现
实现目标:
实现一个可以动态变长的聊天气泡(如图所示)
实现过程:
版本一:使用absout+relative定位实现,bubble元素使用relative定位,然后bubble::after元素使用absolute定位,但是定位时使用的是px为单位,实现要求的样式是可以的,但是消息的长度是不定的,使用px来定位不符合变长的要求。
版本二:基于版本一的改进,把px改为百分比。但是当长度变化时突出的尖角和气泡内容部分无法贴合。(如图所示)
版本三:使用dispaly:table,定位时只用指定为元素的top,left就不用管了。直接上代码。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Demo</title> </head> <style> .bubble{ position: relative; height: 30px; line-height: 30px; border-radius: 4px; background-color: rgba(0, 0, 0, 50%); display: table;
//word-break: break-all;
//wihte-space: normal;
} .bubble::after { position: absolute; top: 32%; content: ''; border: 4px solid transparent; border-left-color: rgba(0, 0, 0, 50%); } </style> <body> <span class="bubble"> 1313113123123 </span> <script> let oContent = document.querySelector('.bubble'); oContent.innerHTML = '123'.repeat(20) </script> </body> </html>
实现效果:完美解决。
这里涉及到很多知识点,于是乎总结一下:
dispaly: table的特点:
1、表格的 display:table,既不是行内元素也不是块级元素
2、宽度,高度,全部都是以内容为主-自适应
3、独自成行
在解析dispaly为table的元素时,浏览器不会立马显示内容,而是等内容渲染好再显示,而dispaly为block的元素则是,一行一行的渲染并显示。
值得改进的地方:文本只能显示在同一行,无法换行。
文本换行: (样式详细见:https://blog.csdn.net/wang_yu_shun/article/details/124854767)
word-break: break-all;
white-space: normal;
flex容器内部元素换行:
flex-wrap: wrap;
大家可以自己尝试改进一下。
什么?你不想尝试?
好
我替你尝试
实现换行效果:
直接上代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Demo</title> </head> <style> .bubble{ position: relative; display: table; height: 30px; max-width: 300px; padding:3px 6px; line-height: 30px; border-radius: 4px; background-color: #9cda62; overflow-wrap: anywhere; font-size: 8px; } .bubble::after { position: absolute; right: -8px; top: 10px; content: ''; border: 4px solid transparent; border-left-color: #9cda62; } </style> <body> <span class="bubble"> 1313113123123 </span> <script> let oContent = document.querySelector('.bubble'); oContent.innerHTML = '你大爷'.repeat(20) </script> </body> </html>
用了一下max-width限制气泡宽度,然后overflow-wrap: anywher让文字换行。还有就是把气泡的尖角固定了,不然会有奇妙的问题。
至此大功告成!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-09-27 vue3环境搭建