Минималистичный мессенджер на JS

创建于:2024年10月17日

使用 O1 Preview 回答 Chat01

问题

Представь что ты веб разработчик. Твоя цель написать красивый мессенджер на html, css и js. Он будет минималистичен и очень красивым. Наш мессенджер как бы будет находиться в прямоугольнике со скругленными краями, который посередине экрана. Изначально у нас нету никаких чатов, поэтому снизу слева, в углу этого прямоугольника будет кнопка с текстом "Добавить чат". По нажатию откроется всплывающее окно со списком рандомных имен для выбора, и нажав на какое то из них, а затем на кнопку создать в левой части прямоугольника создастся этот чат и он у нас будет открыт, то есть справа этого прямоугольника будет область для сообщений, снизу этой части будет поле для ввода текста и кнопка отправить. Этот чат как я повторяюсь будет слева в маленьком прямоугольнике, в котором будет написано имя пользователя общения. Для создания нового чата мы нажимаем на ту же кнопку создать чат, и при создании второго чата он создаться так же в левой части, но выше предыдущего, то есть предыдущий сместиться вниз, а на его место новый пойдет. При чем при клике слева на мини прямоугольнике с именем справа будет открываться разные чаты то есть как бы показывая что это не один чат а их несколько.

思考

Пертурбация видимой картины

Я начинаю думать о проектировании красивого мессенджера с минималистичным дизайном, используя HTML, CSS и JS. Мессенджер будет расположен в прямоугольнике с округленными углами, который центрируется на экране, с кнопкой 'Добавить чат' в нижнем левом углу.

Открываю окно

Когда нажимаю, появляется всплывающее окно с именами для выбора. После выбора и нажатия 'Создать', чат появляется слева, сообщения идут справа.

Разрабатываю дизайн

Пользователь просит создать минималистичный мессенджер с несколькими чатами, отображающимися при нажатии на мини-прямоугольник.

Предоставляю пример

Я предлагаю пример кода, обязывающего передать основные требования. Включаю HTML и CSS для стилизации, чтобы создать прямоугольник с округлыми углами и кнопку 'Добавить чат'.

Разрабатываю интерфейс

Создаю черновик интерфейса с HTML и CSS, добавляя прямоугольник с округлыми углами и кнопку 'Добавить чат'.

Создаю стили и функции

Планирую стили для минималистичного дизайна с закругленными углами и центровкой. Открывающий всплывающий список имен и создание чата.

Разъясняю допустимое

Рассматриваю разрешение кода. Это подсказывает, что предоставление кода допустимо.

Определяю параметры

Ограничиваю выдержки до 70 символов для текста с авторскими правами.

回答

Давайте создадим простой и красивый мессенджер с использованием HTML, CSS и JavaScript, соответствующий вашему описанию.

HTML

html
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title>Минималистичный Мессенджер</title> <link rel="stylesheet" href="styles.css"> </head> <body> <div class="messenger"> <div class="chat-list"> <button id="addChatBtn">Добавить чат</button> <div id="chatsContainer"></div> </div> <div class="chat-window"> <div id="chatHeader">Выберите чат</div> <div id="messagesContainer"></div> <div class="message-input"> <input type="text" id="messageInput" placeholder="Введите сообщение..."> <button id="sendBtn">Отправить</button> </div> </div> </div> <!-- Модальное окно для добавления чата --> <div id="modal" class="modal"> <div class="modal-content"> <h2>Выберите имя пользователя</h2> <ul id="namesList"></ul> <button id="createChatBtn">Создать</button> </div> </div> <script src="script.js"></script> </body> </html>

CSS (styles.css)

css
body { margin: 0; padding: 0; font-family: Arial, sans-serif; background-color: #f0f0f0; } .messenger { width: 80%; max-width: 900px; height: 600px; margin: 50px auto; display: flex; border-radius: 20px; overflow: hidden; box-shadow: 0 5px 15px rgba(0,0,0,0.1); background-color: #fff; } .chat-list { width: 30%; background-color: #2c3e50; color: #ecf0f1; position: relative; padding: 20px; } #addChatBtn { position: absolute; bottom: 20px; left: 20px; padding: 10px 20px; background-color: #27ae60; border: none; border-radius: 10px; color: #fff; cursor: pointer; } #chatsContainer { margin-top: 20px; overflow-y: auto; max-height: 500px; } .chat-item { padding: 15px; background-color: #34495e; border-radius: 10px; margin-bottom: 10px; cursor: pointer; } .chat-item.active { background-color: #16a085; } .chat-window { width: 70%; padding: 20px; display: flex; flex-direction: column; } #chatHeader { font-size: 24px; margin-bottom: 20px; } #messagesContainer { flex: 1; overflow-y: auto; padding-right: 10px; } .message { margin-bottom: 15px; } .message-input { display: flex; margin-top: 20px; } #messageInput { flex: 1; padding: 10px; border: 2px solid #bdc3c7; border-radius: 10px; margin-right: 10px; } #sendBtn { padding: 10px 20px; background-color: #2980b9; border: none; border-radius: 10px; color: #fff; cursor: pointer; } /* Стили для модального окна */ .modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); } .modal-content { background-color: #fff; width: 300px; margin: 100px auto; padding: 20px; border-radius: 10px; } #namesList { list-style: none; padding: 0; max-height: 150px; overflow-y: auto; margin-bottom: 20px; } #namesList li { padding: 10px; border-bottom: 1px solid #ecf0f1; cursor: pointer; } #namesList li.selected { background-color: #bdc3c7; } #createChatBtn { padding: 10px 20px; background-color: #27ae60; border: none; border-radius: 10px; color: #fff; cursor: pointer; }

JavaScript (script.js)

javascript
// Элементы DOM const addChatBtn = document.getElementById('addChatBtn'); const modal = document.getElementById('modal'); const namesList = document.getElementById('namesList'); const createChatBtn = document.getElementById('createChatBtn'); const chatsContainer = document.getElementById('chatsContainer'); const chatHeader = document.getElementById('chatHeader'); const messagesContainer = document.getElementById('messagesContainer'); const messageInput = document.getElementById('messageInput'); const sendBtn = document.getElementById('sendBtn'); let chats = []; let currentChatId = null; // Список рандомных имен const randomNames = ['Алексей', 'Мария', 'Иван', 'Екатерина', 'Дмитрий', 'Ольга', 'Сергей', 'Анна', 'Николай', 'Елена']; addChatBtn.addEventListener('click', () => { namesList.innerHTML = ''; randomNames.forEach(name => { const li = document.createElement('li'); li.textContent = name; li.addEventListener('click', () => { document.querySelectorAll('#namesList li').forEach(item => item.classList.remove('selected')); li.classList.add('selected'); selectedName = name; }); namesList.appendChild(li); }); modal.style.display = 'block'; }); let selectedName = null; createChatBtn.addEventListener('click', () => { if (selectedName) { const chatId = Date.now(); chats.unshift({ id: chatId, name: selectedName, messages: [] }); renderChats(); openChat(chatId); modal.style.display = 'none'; selectedName = null; } }); function renderChats() { chatsContainer.innerHTML = ''; chats.forEach(chat => { const chatItem = document.createElement('div'); chatItem.classList.add('chat-item'); if (chat.id === currentChatId) { chatItem.classList.add('active'); } chatItem.textContent = chat.name; chatItem.addEventListener('click', () => { openChat(chat.id); }); chatsContainer.appendChild(chatItem); }); } function openChat(chatId) { currentChatId = chatId; const chat = chats.find(c => c.id === chatId); chatHeader.textContent = chat.name; renderChats(); renderMessages(); } function renderMessages() { messagesContainer.innerHTML = ''; const chat = chats.find(c => c.id === currentChatId); chat.messages.forEach(message => { const messageDiv = document.createElement('div'); messageDiv.classList.add('message'); messageDiv.textContent = message; messagesContainer.appendChild(messageDiv); }); messagesContainer.scrollTop = messagesContainer.scrollHeight; } sendBtn.addEventListener('click', () => { const messageText = messageInput.value.trim(); if (messageText && currentChatId) { const chat = chats.find(c => c.id === currentChatId); chat.messages.push(messageText); messageInput.value = ''; renderMessages(); } }); // Закрытие модального окна при клике вне его window.addEventListener('click', (e) => { if (e.target === modal) { modal.style.display = 'none'; } });

Объяснение кода

  • HTML: Структура мессенджера состоит из двух основных частей: списка чатов слева и окна сообщений справа. Кнопка "Добавить чат" находится в левом нижнем углу. Модальное окно используется для выбора рандомного имени пользователя при создании нового чата.

  • CSS: Стили оформляют внешний вид мессенджера, делая его минималистичным и современным. Используются гибкие размеры, закругленные углы и тени для создания приятного интерфейса.

  • JavaScript: Логика приложения включает в себя:

    • Создание нового чата: При нажатии на "Добавить чат" открывается модальное окно со списком рандомных имен. Пользователь выбирает имя и нажимает "Создать", после чего чат добавляется в верх списка.

    • Отображение чатов: Список чатов обновляется каждый раз при добавлении нового чата, причём новые чаты появляются сверху.

    • Переключение между чатами: При клике на чат в списке слева открывается соответствующий чат в окне сообщений справа.

    • Отправка сообщений: В выбранном чате можно отправлять сообщения, которые отображаются в области сообщений.

Как использовать

  1. Добавить чат: Нажмите кнопку "Добавить чат", выберите имя из списка и нажмите "Создать".
  2. Переключение между чатами: Кликайте по чатам в левом списке для переключения.
  3. Отправка сообщений: Введите текст в поле ввода снизу и нажмите "Отправить".

Замечания

  • Для простоты реализации данные хранятся в оперативной памяти в массиве chats. В реальном приложении для сохранения данных между сессиями потребуется использовать сервер или локальное хранилище.
  • Стили и функциональность можно расширять и улучшать по мере необходимости, добавляя, например, поддержку отправки сообщений по нажатию Enter, время отправки сообщений, аватары пользователей и т.д.

分享这个问答