You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现聊天框中不同用户消息分左右两侧显示

聊天消息左右交替布局修复方案

问题描述

所有消息都显示在同一侧(通常是左侧),想要实现不同用户的消息分别显示在左右两侧(交替排列)。尝试用float属性调整位置,但消息框变成了并排显示。以下是原始代码:

原始JavaScript代码

const chatMessages = document.getElementById("chat-messages");
const chatInput = document.getElementById("chat-input");
const sendButton = document.getElementById("send-button");
const nameInput = document.getElementById("name-input");
const deleteButton = document.getElementById("delete-button");

let lastUser = null;

// 生成随机用户名
function generateUserName() {
    const adjectives = ["Homer", "Marge", "Bart", "Lisa", "Maggie"];
    const nouns = ["Simpson"];
    const randomAdjective = adjectives[Math.floor(Math.random() * adjectives.length)];
    const randomNoun = nouns[Math.floor(Math.random() * nouns.length)];
    const userName = nameInput.value.trim();
    if (userName === "") {
        return { name: `${randomAdjective} ${randomNoun}`, color: getRandomColor() };
    } else {
        return { name: userName, color: getRandomColor() };
    }
}

// 生成随机颜色
function getRandomColor() {
    const letters = "0123456789ABCDEF";
    let color = "#";
    for (let i = 0; i < 6; i++) {
        color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
}

function addMessage(message, color, position) {
    const p = document.createElement("p");
    p.textContent = message;

    const messageContainer = document.createElement("div");
    messageContainer.classList.add("message-container");
    messageContainer.style.backgroundColor = color;
    messageContainer.style.block = position;
    messageContainer.style.alignItems = position;

    messageContainer.appendChild(p);
    chatMessages.appendChild(messageContainer);
}

// 发送消息函数
function sendMessage() {
    const message = chatInput.value.trim();
    if (message !== "") {
        const user = generateUserName();
        let position = "right"
        if (lastUser !== null && lastUser !== user.name) {
            position = "left";
        }
        addMessage(`${user.name}: ${message}`, user.color, position);
        lastUser = user;
        chatInput.value = "";
    }
}

// 删除对话函数
function deleteConversation() {
    chatMessages.innerHTML = "";
    lastUser = null;
}

// 事件监听
sendButton.addEventListener("click", sendMessage);
chatInput.addEventListener("keyup", function (event) {
    if (event.key === "Enter" && chatInput.value.trim() !== "") {
        sendMessage();
    }
});
deleteButton.addEventListener("click", deleteConversation);

原始CSS代码

#chat-container {
    width: 600px;
    margin: 0 auto;
    padding: 20px;
    background-color: #f9f9f9;
    border: 1px solid #ddd;
    border-radius: 5px;
    box-shadow: 0px 0px 10px #ccc;
    background-color: violet;
}

#chat-header {
    background-color: yellow;
    font-size: 24px;
    font-weight: bold;
    margin-bottom: 10px;
    text-align: center;
}

#chat-messages {
    height: 400px;
    overflow-y: scroll;
    margin-bottom: 15px;
    background-color: blue;
}

.message-container {
    background-color: rgb(22, 12, 12);
    max-width: 35%;
    margin-bottom: 5px;
    padding: 2px;
    border-radius: 5px;
    color: #fff;
    word-wrap: break-word;
    float: inline-start;
}

#chat-input-container {
    background-color: brown;
    display: flex;
    margin-bottom: 10px;
}

#chat-input {
    background-color: aqua;
    flex: 1;
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
}

修复步骤

1. 修正用户身份判断逻辑

原代码每次发送消息都会生成新用户,导致lastUser永远和当前用户不一致,所有消息都显示在左侧。修改后仅在用户输入变化或首次发送时生成新用户:

function sendMessage() {
    const message = chatInput.value.trim();
    if (message !== "") {
        let user;
        const inputName = nameInput.value.trim();
        // 仅在无历史用户或输入名称变化时生成新用户
        if (!lastUser || (inputName && lastUser.name !== inputName)) {
            user = generateUserName();
        } else {
            // 沿用历史用户信息
            user = lastUser;
        }
        // 不同用户切换位置,同一用户保持同侧
        let position = lastUser === null ? "right" : (lastUser.name !== user.name ? "left" : "right");
        
        addMessage(`${user.name}: ${message}`, user.color, position);
        lastUser = user;
        chatInput.value = "";
    }
}

2. 修复消息容器布局

移除无效的style设置,通过动态添加类名实现左右浮动,并添加clearfix解决换行问题:

function addMessage(message, color, position) {
    const p = document.createElement("p");
    p.textContent = message;

    const messageContainer = document.createElement("div");
    messageContainer.classList.add("message-container");
    // 根据位置添加对应类
    messageContainer.classList.add(position === "left" ? "message-left" : "message-right");
    messageContainer.style.backgroundColor = color;

    messageContainer.appendChild(p);
    chatMessages.appendChild(messageContainer);
    
    // 添加clearfix元素,确保每条消息独占一行
    const clearDiv = document.createElement("div");
    clearDiv.style.clear = "both";
    chatMessages.appendChild(clearDiv);
}

3. 更新CSS样式

调整浮动规则和消息样式,优化视觉效果:

#chat-messages {
    height: 400px;
    overflow-y: scroll;
    margin-bottom: 15px;
    background-color: blue;
    padding: 10px; /* 添加内边距避免消息贴边 */
}

.message-container {
    max-width: 35%;
    margin-bottom: 10px;
    padding: 8px 12px;
    border-radius: 5px;
    color: #fff;
    word-wrap: break-word;
}

/* 左侧消息样式 */
.message-left {
    float: left;
    border-bottom-left-radius: 0; /* 调整圆角符合聊天习惯 */
}

/* 右侧消息样式 */
.message-right {
    float: right;
    border-bottom-right-radius: 0; /* 调整圆角符合聊天习惯 */
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:59:56