Минималистичный мессенджер на JS
تم الإنشاء في: ١٧ أكتوبر ٢٠٢٤
تمت الإجابة باستخدام O1 Preview بواسطة Chat01
تم الإنشاء في: ١٧ أكتوبر ٢٠٢٤
تمت الإجابة باستخدام O1 Preview بواسطة Chat01
Представь что ты веб разработчик. Твоя цель написать красивый мессенджер на html, css и js. Он будет минималистичен и очень красивым. Наш мессенджер как бы будет находиться в прямоугольнике со скругленными краями, который посередине экрана. Изначально у нас нету никаких чатов, поэтому снизу слева, в углу этого прямоугольника будет кнопка с текстом "Добавить чат". По нажатию откроется всплывающее окно со списком рандомных имен для выбора, и нажав на какое то из них, а затем на кнопку создать в левой части прямоугольника создастся этот чат и он у нас будет открыт, то есть справа этого прямоугольника будет область для сообщений, снизу этой части будет поле для ввода текста и кнопка отправить. Этот чат как я повторяюсь будет слева в маленьком прямоугольнике, в котором будет написано имя пользователя общения. Для создания нового чата мы нажимаем на ту же кнопку создать чат, и при создании второго чата он создаться так же в левой части, но выше предыдущего, то есть предыдущий сместиться вниз, а на его место новый пойдет. При чем при клике слева на мини прямоугольнике с именем справа будет открываться разные чаты то есть как бы показывая что это не один чат а их несколько.
Давайте создадим простой и красивый мессенджер с использованием HTML, CSS и JavaScript, соответствующий вашему описанию.
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>
cssbody { 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// Элементы 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: Логика приложения включает в себя:
Создание нового чата: При нажатии на "Добавить чат" открывается модальное окно со списком рандомных имен. Пользователь выбирает имя и нажимает "Создать", после чего чат добавляется в верх списка.
Отображение чатов: Список чатов обновляется каждый раз при добавлении нового чата, причём новые чаты появляются сверху.
Переключение между чатами: При клике на чат в списке слева открывается соответствующий чат в окне сообщений справа.
Отправка сообщений: В выбранном чате можно отправлять сообщения, которые отображаются в области сообщений.
chats. В реальном приложении для сохранения данных между сессиями потребуется использовать сервер или локальное хранилище.