Учебный проект 2 - текст выходит за карточку и проблема с всплывающей подсказкой
Всем привет, друзья!
Делаю очередной учебный проект и вот опять что-то подвисла на несколько дней с двумя непонятками. 1. У меня есть карточка заметки, textarea, и когда я пишу одну сплошную строку, например qwertyqwertyqwertyqwerty без пробелов, оно не переносится автоматически, а просто выталкивает рядом стоящую кнопку Edit и в итоге текст с кнопкой вылазят да пределы карточки. Понятно, что вряд ли кто-то в заметке будет писать такие слова без пробелов, но все же очень интересно, можно ли как-то поменять это поведение? Перепробовала кучу вариантов сделать это при помощи CSS. А вот на JS вообще нет идей, как это сделать. 2. При помощи CSS навесила на кнопку Edit всплывающую подсказку при наведении на кнопку. На первой кнопке вке ок, она появляется, а вот на последующих карточках, когда навожу на Edit, подсказка все-равно продолжает появляться на первой кнопке Edit. Как сделать чтоб именно возле каждой кнопки она появлялась? Ниже выложу JS и CSS коды. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="style.css" /> <link rel="preconnect" href="https://fonts.gstatic.com" /> <link href="https://fonts.googleapis.com/css2?family=Hind+Siliguri&family=Open+Sans&family=Prosto+One&family=Roboto:wght@100&family=Rowdies:wght@300&family=Teko:wght@300&family=Unbounded:wght@200&family=Yeon+Sung&display=swap" rel="stylesheet" /> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" rel="stylesheet" /> <title>Notes App</title> </head> <body> <div class="container"> <div class="header"> <h1>Notes App</h1> <button class="note-add" data-tooltip="Add" type="button"> <i class="fa-sharp fa-solid fa-heart-circle-plus"></i> </button> </div> <div class="notes"></div> </div> <script src="app.js"></script> </body> </html> const notesEl = document.querySelector(".notes"); const addBtn = document.querySelector(".note-add"); // 1) Write a function createNote // 2) Add button and handler on adding the card // 3) Add styles // 4) Make the redaction possible function createNote(title, text) { const noteEl = document.createElement("div"); noteEl.classList.add("note"); // adding a style noteEl.innerHTML = ` <div class="note-header"> <p id="note-title">${title}</p> <textarea id="note-title-input" class="hidden">${title}</textarea> <div> <button class="note-edit"><i class="fa-solid fa-cat"></i></button> <button class="note-delete"><i class="fa-solid fa-trash"></i></button> </div> </div> <p id="note-text">${text}</p> <textarea id="note-textarea" class="hidden">${text}</textarea> `; //lowim knopki, naweschiwaem obrabotchiki dlja edit i delete const editBtn = noteEl.querySelector(".note-edit"); const deleteBtn = noteEl.querySelector(".note-delete"); const titleEl = noteEl.querySelector("#note-title"); const textEl = noteEl.querySelector("#note-text"); const titleInputEl = noteEl.querySelector("#note-title-input"); const textInputEl = noteEl.querySelector("#note-textarea"); editBtn.addEventListener("click", (e) => { titleEl.classList.toggle("hidden"); // dobawlenie i udalenie klassow textEl.classList.toggle("hidden"); titleInputEl.classList.toggle("hidden"); textInputEl.classList.toggle("hidden"); titleInputEl.textContent = ""; textInputEl.textContent = ""; titleInputEl.placeholder = "Header"; textInputEl.placeholder = "Your text"; }); deleteBtn.addEventListener("click", (e) => { noteEl.remove(); //udalit opredelennij dom uzel }); titleInputEl.addEventListener("input", (e) => { titleEl.innerText = e.target.value; // tut lezhit zna4enie na to, 4to wwodim pri inpute }); //naweschiwaem obrabot4iki na textarea textInputEl.addEventListener("input", (e) => { textEl.innerText = e.target.value; }); //naweschiwaem obrabot4iki na textarea return noteEl; } addBtn.addEventListener("click", (e) => { const el = createNote("Header", "Your text"); //wiziwaet funkciju createNote notesEl.append(el); }); * { margin: 0px; padding: 0px; box-sizing: border-box; } body { background-color: blanchedalmond; font-family: 'Courier New', Courier, monospace; } .container { max-width: 1200px; margin: 0 auto; } .header { display: flex; align-items: center; } .note-header { display: flex; justify-content: space-between; margin-bottom: 8px; } .notes { display: flex; flex-direction: row; } .note { background-color:fuchsia; padding: 16px; margin: 8px; border-radius: 10px; height: 300px; width: 240px; box-shadow: 2px 2px 5px 2px blueviolet; } .note-add { padding: 8px; margin: 8px; cursor: pointer; } .note-edit { padding: 4px; cursor: pointer; } .note-delete { padding: 4px; cursor: pointer; } .hidden { display: none; resize: none; } /* делаем подсказку прозрачной и убираем её со страницы, чтобы она не появлялась при наведении на место, где она должна появиться */ button.note-add:before, button.note-add:after{ position: absolute; opacity: 0; visibility: hidden; } /* стили для всплывающего блока с текстом */ button.note-add:before{ content: attr(data-tooltip); width: 40px; height: 22px; line-height: 25px; left: calc(25% - 40px); } button.note-add:hover:before, button.note-add:hover:after { opacity: 10; visibility: visible; background-color: lightpink; border: 1px solid black; } /* добавляем эффект движения */ button.note-add:hover:before { bottom: 570px; right: 1200px; } button.note-add:hover:after { bottom: 550px; position: static; } button.note-edit:before, button.note-edit:after{ position: absolute; opacity: 0; visibility: hidden; } /* стили для всплывающего блока с текстом */ button.note-edit:before{ content: "Edit"; width: 22px; height: 22px; line-height: 25px; left: calc(21% - 25px); } button.note-edit:hover:before, button.note-edit:hover:after { opacity: 10; visibility: visible; } /* добавляем эффект движения */ button.note-edit:hover:before { bottom: 548px; right: 120px; } button.note-edit:hover:after { bottom: 550px; /* position:-webkit-sticky; */ } |
Alina Sarbu,
а можно всё целиком? [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Цитата:
Что бросается в глаза. У вас задано /* добавляем эффект движения */ button.note-edit:hover:before { bottom: 548px; right: 120px; } Но от чего вы отсчитываете координаты? От родительского элемента? Нет! Координаты отсчитываются от родительского элемента с position не static. (или от body если нет такого) А у вас родительские элементы не имеет position - значит static. Попробуйте задать им position: relative. Еще недостаток. У вас в создаваемом блоке есть элементы с заданными id. Если карточек будет несколько, то и элементов с одним и тем же id будет несколько. Это неправильно! id должен быть уникальным на странице. В данном случае это может ни на что и не влияет, но в будущем может создать неприятности. Можно идентифицировать такие элементы не с помощью id, а каким- нибудь атрибутом data- (например data-id). ну и обращаться к ним соответственно <p data-id="note-title">${title}</p> и const titleEl = noteEl.querySelector('[data-id="note-title"]'); Подписи к элементам ввода обычно задаются элементом <label>. Вот так надо <label data-id="note-title">${title}<br> <textarea data-id="note-title-input" class="hidden">${title}</textarea> </label> |
Цитата:
|
Alina Sarbu,
целиком, это так ))) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <style type="text/css"> * { margin: 0; padding: 0; box-sizing: border-box; } body { background-color: blanchedalmond; font-family: 'Courier New', Courier, monospace; } .container { max-width: 1200px; margin: 0 auto; } .header { display: flex; align-items: center; } .note-header { width: 210px; display: flex; justify-content: space-between; margin: 8px auto; } .notes { display: flex; flex-direction: row; } .note { background-color: fuchsia; padding: 16px; margin: 8px; border-radius: 10px; height: 300px; width: 240px; box-shadow: 2px 2px 5px 2px blueviolet; position: relative; display: flex; flex-wrap: wrap; justify-content: flex-end; } .note-add { padding: 8px; margin: 8px; cursor: pointer; } .note-edit { padding: 4px; cursor: pointer; height: 32px; margin-right: 4px; } .note-delete { padding: 4px; cursor: pointer; height: 32px; } .hidden { display: none; } button.note-add:before { position: absolute; opacity: 0; visibility: hidden; } button.note-add:before { content: attr(data-tooltip); width: 40px; height: 22px; line-height: 25px; left: calc(25% - 40px); } button.note-add:hover:before, button.note-add:hover:after { opacity: 10; visibility: visible; background-color: lightpink; border: 1px solid black; } button.note-add:hover:before { bottom: 570px; right: 1200px; } button.note-add:hover:after { bottom: 550px; position: static; } button.note-edit:before { content: 'Edit'; width: 22px; height: 22px; line-height: 25px; top: -3px; right: 48px; position: absolute; opacity: 0; } button.note-edit:hover:before { opacity: 10; } .note-title, .note-text { width: 200px; word-break: break-all; } .txt{ flex-grow: 1; height: 70%; } .note-title-input, .note-textarea{ width: 100%; } </style> <link rel="preconnect" href="https://fonts.gstatic.com" /> <link href="https://fonts.googleapis.com/css2?family=Hind+Siliguri&family=Open+Sans&family=Prosto+One&family=Roboto:wght@100&family=Rowdies:wght@300&family=Teko:wght@300&family=Unbounded:wght@200&family=Yeon+Sung&display=swap" rel="stylesheet" /> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" rel="stylesheet" /> <title>Notes App</title> </head> <body> <div class="container"> <div class="header"> <h1>Notes App</h1> <button class="note-add" data-tooltip="Add" type="button"> <i class="fa-sharp fa-solid fa-heart-circle-plus"></i> </button> </div> <div class="notes"></div> </div> <script> const notesEl = document.querySelector(".notes"); const addBtn = document.querySelector(".note-add"); function createNote(title, text) { const noteEl = document.createElement("div"); noteEl.classList.add("note"); // adding a style noteEl.innerHTML = ` <button class="note-edit"><i class="fa-solid fa-cat"></i></button> <button class="note-delete"><i class="fa-solid fa-trash"></i></button> <div class="note-header"> <p class="note-title">${title}</p> <textarea class="hidden note-title-input">${title}</textarea> </div> <div class="txt" > <p class="note-text">${text}</p> <textarea class="note-textarea hidden">${text}</textarea> </div> `; const editBtn = noteEl.querySelector(".note-edit"); const deleteBtn = noteEl.querySelector(".note-delete"); const titleEl = noteEl.querySelector(".note-title"); const textEl = noteEl.querySelector(".note-text"); const titleInputEl = noteEl.querySelector(".note-title-input"); const textInputEl = noteEl.querySelector(".note-textarea"); editBtn.addEventListener("click", (e) => { titleEl.classList.toggle("hidden"); textEl.classList.toggle("hidden"); titleInputEl.classList.toggle("hidden"); textInputEl.classList.toggle("hidden"); titleInputEl.textContent = ""; textInputEl.textContent = ""; titleInputEl.placeholder = "Header"; textInputEl.placeholder = "Your text"; }); deleteBtn.addEventListener("click", (e) => { noteEl.remove(); //udalit opredelennij dom uzel }); titleInputEl.addEventListener("input", (e) => { titleEl.innerText = e.target.value; }); textInputEl.addEventListener("input", (e) => { textEl.innerText = e.target.value; }); return noteEl; } addBtn.addEventListener("click", (e) => { const el = createNote("Header", "Your text"); notesEl.append(el); }); </script> </body> </html> |
Цитата:
|
Цитата:
И спасибо также за пример вставления всего кода целиком, а то я перед этим не совсем верно поняла, но теперь буду знать :victory: |
Цитата:
|
Часовой пояс GMT +3, время: 23:04. |