You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为聊天列表中动态生成的<li>元素应用CSS样式

解决动态创建带完整样式聊天消息的问题

嘿,我来帮你搞定这个聊天消息动态生成的需求!首先直接回答你的问题:是的,你必须要添加对应的CSS类——因为你静态HTML里的样式全靠那些类来支撑,动态创建元素时如果不加上这些类,新生成的<li>就只会是光秃秃的文本,完全没有你想要的聊天气泡样式。

下面我给你两种实现方式,你可以根据自己的技术栈选择:


方式一:用jQuery实现(更简洁)

既然你用到了Angular的$scope,大概率项目里也引入了jQuery,用它来构建DOM会更省心:

$scope.createQueryNode = function(query) {
  console.log("Inside create node" + query);
  
  // 生成当前时间(用来填充消息的时间戳)
  const now = new Date();
  const displayTime = now.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
  const isoTime = now.toISOString();

  // 1. 构建完整的用户消息<li>容器,添加所有必要的样式类
  const $messageLi = $('<li>').addClass('row msg_container base_sent');

  // 2. 构建消息内容区域(左边的气泡部分)
  const $msgContentCol = $('<div>').addClass('col-md-10 col-xs-10 arrow-right');
  const $msgWrapper = $('<div>').addClass('messages msg_sent');
  // 注意:id不能重复使用"query",这里用时间戳生成唯一id避免DOM冲突
  const $msgText = $('<p>').addClass('blockColor').attr('id', `query-${Date.now()}`).text(query);
  
  $msgWrapper.append($msgText);
  $msgContentCol.append($msgWrapper);

  // 3. 构建头像和时间区域(右边的部分)
  const $avatarCol = $('<div>').addClass('col-md-2 col-xs-2 avatar text-center');
  const $avatarImg = $('<img>').addClass('bdr-rds img-responsive').attr('src', 'http://www.bitrebels.com/wp-content/uploads/2011/02/Original-Facebook-Geek-Profile-Avatar-1.jpg');
  const $timeTag = $('<time>').attr('datetime', isoTime).text(displayTime);
  
  $avatarCol.append($avatarImg).append($timeTag);

  // 4. 把所有部分组装起来,添加到聊天列表
  $messageLi.append($msgContentCol).append($avatarCol);
  $('#chat').append($messageLi);
};

方式二:原生JavaScript实现(无jQuery依赖)

如果项目里不想用jQuery,原生JS也能完成同样的事,只是代码稍微繁琐一点:

$scope.createQueryNode = function(query) {
  console.log("Inside create node" + query);
  
  const now = new Date();
  const displayTime = now.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
  const isoTime = now.toISOString();

  const chatList = document.getElementById("chat");
  
  // 1. 创建<li>容器并添加样式类
  const messageLi = document.createElement('li');
  messageLi.classList.add('row', 'msg_container', 'base_sent');

  // 2. 构建消息内容区域
  const msgContentCol = document.createElement('div');
  msgContentCol.classList.add('col-md-10', 'col-xs-10', 'arrow-right');
  
  const msgWrapper = document.createElement('div');
  msgWrapper.classList.add('messages', 'msg_sent');
  
  const msgText = document.createElement('p');
  msgText.classList.add('blockColor');
  msgText.id = `query-${Date.now()}`;
  msgText.textContent = query;
  
  msgWrapper.appendChild(msgText);
  msgContentCol.appendChild(msgWrapper);

  // 3. 构建头像和时间区域
  const avatarCol = document.createElement('div');
  avatarCol.classList.add('col-md-2', 'col-xs-2', 'avatar', 'text-center');
  
  const avatarImg = document.createElement('img');
  avatarImg.classList.add('bdr-rds', 'img-responsive');
  avatarImg.src = 'http://www.bitrebels.com/wp-content/uploads/2011/02/Original-Facebook-Geek-Profile-Avatar-1.jpg';
  
  const timeTag = document.createElement('time');
  timeTag.datetime = isoTime;
  timeTag.textContent = displayTime;
  
  avatarCol.appendChild(avatarImg);
  avatarCol.appendChild(timeTag);

  // 4. 组装并添加到列表
  messageLi.appendChild(msgContentCol);
  messageLi.appendChild(avatarCol);
  chatList.appendChild(messageLi);
};

关键注意点

  1. 样式类必须完整添加:不管用jQuery的.addClass()还是原生的classList.add(),都要把静态HTML里的所有类(比如rowmsg_containerblockColor等)都加上,这样动态元素才能和静态元素保持一致的样式。
  2. id要唯一:静态里的id="query"只能用一次,动态创建多条消息时,必须生成唯一id(比如用时间戳),否则会导致DOM选择器冲突。
  3. 完整还原DOM结构:不能只创建<li><p>,要把嵌套的<div><img><time>等标签都创建出来,这样布局才会和静态示例完全一致。

内容的提问来源于stack exchange,提问作者Rahul Kalidindi

火山引擎 最新活动