我如何创建这样的聊天气泡。更具体地说,如何将一种类型的用户将两个或多个连续消息分组为整个泡泡。例如FOR THE SENDER - 第一条消息的右下边框为0,其间的消息右上角,下边距为0边框半径,最后一条消息右上角为0边框半径。我是否必须使用javascript或者可以使用css完成。
HTML结构可以
<ul>
<li class="him">By Other User</li>
<li class="me">By this User, first message</li>
<li class="me">By this User, secondmessage</li>
<li class="me">By this User, third message</li>
<li class="me">By this User, fourth message</li>
</ul>
我应该使用哪种css类/样式?
答案 0 :(得分:18)
这是一个相当基本的例子,但它应该解释你需要的所有基础知识。
大多数解决方案都位于+
adjacent sibling selector内。在这种情况下,它用于将不同的边界半径应用于同一个人的一行中的多个消息。
ul{
list-style: none;
margin: 0;
padding: 0;
}
ul li{
display:inline-block;
clear: both;
padding: 20px;
border-radius: 30px;
margin-bottom: 2px;
font-family: Helvetica, Arial, sans-serif;
}
.him{
background: #eee;
float: left;
}
.me{
float: right;
background: #0084ff;
color: #fff;
}
.him + .me{
border-bottom-right-radius: 5px;
}
.me + .me{
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.me:last-of-type {
border-bottom-right-radius: 30px;
}
&#13;
<ul>
<li class="him">By Other User</li>
<li class="me">By this User, first message</li>
<li class="me">By this User, secondmessage</li>
<li class="me">By this User, third message</li>
<li class="me">By this User, fourth message</li>
</ul>
&#13;
答案 1 :(得分:2)
你需要一个开始和结束类,比如这个
li {
border: 1px solid black;
list-style-type: none;
margin: 2px 0;
padding: 2px 5px;
}
.him {
float: left;
border-radius: 0 10px 10px 0;
clear: both;
}
.me {
float: right;
border-radius: 10px 0 0 10px;
clear: both;
}
.him.start {
border-top-left-radius: 10px;
}
.him.end {
border-bottom-left-radius: 10px;
}
.me.start {
border-top-right-radius: 10px;
}
.me.end {
border-bottom-right-radius: 10px;
}
<ul>
<li class="him start">By Other User</li>
<li class="him">By Other User</li>
<li class="him end">By Other User</li>
<li class="me start">By this User, first message</li>
<li class="me">By this User, secondmessage</li>
<li class="me">By this User, third message</li>
<li class="me end">By this User, fourth message</li>
<li class="him start">By Other User</li>
<li class="him">By Other User</li>
<li class="him end">By Other User</li>
<li class="me start">By this User, first message</li>
<li class="me">By this User, secondmessage</li>
<li class="me">By this User, third message</li>
<li class="me end">By this User, fourth message</li>
</ul>
答案 2 :(得分:2)
这是一个纯粹的CSS解决方案,但它取决于您在发送组的最终消息时检测并应用chat__bubble--stop
类的能力。不幸的是,伪类:last-of-type
不能使用;正如其他人所指出的那样,群组中的最后一条消息不一定是对话的最后一条消息。它还使用了相邻的兄弟选择器(+
)。
.chat {
list-style-type: none;
width: 20em;
}
.chat__bubble {
margin-bottom: 3px;
padding: 5px 10px;
clear: both;
border-radius: 10px 10px 2px 2px ;
}
.chat__bubble--rcvd {
background: #f2f2f2;
color: black;
float: left;
border-bottom-right-radius: 10px;
}
.chat__bubble--sent {
background: #0066ff;
color: white;
float: right;
border-bottom-left-radius: 10px;
}
.chat__bubble--sent + .chat__bubble--sent {
border-top-right-radius: 2px;
}
.chat__bubble--rcvd + .chat__bubble--rcvd {
border-top-left-radius: 2px;
}
.chat__bubble--stop {
border-bottom-right-radius: 10px;
border-bottom-left-radius: 10px;
}
<ul class="chat">
<li class="chat__bubble chat__bubble--rcvd chat__bubble--stop">What are you up to?</li>
<li class="chat__bubble chat__bubble--sent">Not much.</li>
<li class="chat__bubble chat__bubble--sent">Just writing some CSS.</li>
<li class="chat__bubble chat__bubble--sent">I just LOVE writing CSS.</li>
<li class="chat__bubble chat__bubble--sent chat__bubble--stop">Do you?</li>
<li class="chat__bubble chat__bubble--rcvd">Yeah!</li>
<li class="chat__bubble chat__bubble--rcvd">It's super fun.</li>
<li class="chat__bubble chat__bubble--rcvd chat__bubble--stop">... SUPER fun.</li>
</ul>
答案 3 :(得分:1)
在建议文本气泡时,我建议您阅读本文的帮助: https://www.templatemonster.com/blog/chat-bubbles-css-ui-tutorial/
对于开始和结束的气泡,使用JQuery根据其父容器识别和更改其CSS属性。 如果你想要发送的图像,你需要将它们包裹在li里面并向右浮动,或者在相对对象(li)中的绝对位置。
<ul class="ulContainer">
<li>test1</li>
<li>test1</li>
<li>test1</li>
</ul>
的CSS:
.ulContainer li{
width:200px;
height:20px;
background-color:#9abff9;
list-style-type:none;
margin:10px 0 10px 0;
padding: 3px 3px 3px 5px;
border-radius: 10px 2px 2px 10px;
}
使用以下脚本更改第一个和最后一个li:
$('.ulContainer li:first').css('border-top-right-radius','10px');
$('.ulContainer li:last').css('border-bottom-right-radius','10px');
这是JSFiddle:https://jsfiddle.net/s60dgfw2/
根据您的评论进行更新:
我相信这是您可以在不使用JQuery的情况下获得的最接近的内容。您需要高级选择器,只能通过JQuery从.each()语句中进行分组。或者通过向列表添加多个css类。
请参阅response by LGSon's了解如何使用多个CSS类。
或者见下文:
https://jsfiddle.net/5dcto0td/
.fancyContainer{
border: 1px solid #555;
position:relative;
width:300px;
padding:5px;
overflow:hidden;
}
.chatBox {
width: 300px;
list-style: none;
margin: 0 0 0 -40px;
position:0;
}
.chatBox li {
margin: 5px 0 5px 0;
padding: 3px 5px 3px 5px;
}
/*Set up initial chat element for .me*/
.chatBox .me {
min-height: 20px;
float:right;
clear: both;
background-color: #34a1ef;
border-radius: 10px 2px 2px 10px;
}
/*Set up initial chat element for .him*/
.chatBox .him {
min-height: 20px;
float:left;
clear: both;
background-color: #ddd;
border-radius: 2px 10px 10px 2px;
}
/*Set up grouped radius*/
.him + .me {
border-top-right-radius:10px;
}
.me + .him {
border-top-left-radius:10px;
}
.me + .me {
border-bottom-right-radius:2px;
}
.him + .him {
border-bottom-left-radius:2px;
}
/*Set up First and Last radius for .me*/
.chatBox > .me:first-child {
border-top-right-radius:10px;
}
.chatBox > .me:last-child{
border-bottom-right-radius:10px;
}
/*Set up First and Last radius for .him*/
.chatBox > .him:first-child{
border-top-left-radius:10px;
}
.chatBox > .him:last-child{
border-bottom-left-radius:10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="fancyContainer">
<ul class="chatBox">
<li class="him">Hello... This is a chatbox.</li>
<li class="me">Well well. I guess this is a chatbox.</li>
<li class="me">I'll have to talk about this some other time.</li>
<li class="me">No wait. I might change my mind</li>
<li class="him">Nonesense good sir! We'll have this talk right now and here.</li>
<li class="him">I Like...</li>
<li class="him">popsicles.</li>
<li class="me">I can't believe you've done this to me!</li>
</ul>
</div>