Jadi saya menulis skrip kecil ini di mana saya mempunyai dua senarai - Tugasan Selesai/Aktif, anda boleh menukar senarai tugasan dengan mengklik pada butang, dan anda boleh membaca maklumat lanjut tentang tugasan dengan mengklik pada "Maklumat Lanjut". Apabila maklumat lanjut diklik, elemen div baharu dicipta dan saya mahu mengikut kedudukan Y elemen hosnya, dan ia berfungsi separuh jalan. Beginilah rupanya: Masukkan penerangan imej di sini
Ini adalah pepijat yang saya agak pasti berlaku apabila elemen boleh tatal scrollTop
bukan 0 (ia dicipta dengan cara yang betul, setiap kali saya mula menatal ia terus melompat ke atas dan menimpa tugas itu sendiri) : Masukkan perihalan imej di sini.
Ini adalah bahagian kod saya yang bertanggungjawab untuk mengenal pasti jumlah px untuk menatal, arah tatal dan mengalihkan elemen div "maklumat lanjut", dan bahagian yang bertanggungjawab untuk menciptanya, saya tidak tahu di mana ini masalahnya kerana Saya mengekodkan keseluruhan Ia masih baru, dan saya tidak begitu biasa dengan css/html.
createTooltip() { const tooltipElement = document.createElement('div'); tooltipElement.className = 'card'; const toolTipTemplate = document.getElementById('tooltip'); const tooltipBody = document.importNode(toolTipTemplate.content, true); tooltipBody.querySelector('p').textContent = this.text; tooltipElement.append(tooltipBody); const hostElPosLeft = this.hostElement.offsetLeft; const hostElPostop = this.hostElement.offsetTop; const hostElHeight = this.hostElement.clientHeight; const parentElementScrolling = this.hostElement.parentElement.scrollTop; const x = hostElPosLeft + 20; const y = hostElPostop + hostElHeight - parentElementScrolling - 10; tooltipElement.style.position = 'absolute'; tooltipElement.style.left = x + 'px'; tooltipElement.style.top = y + 'px'; const scrollHandler = () => { ulElement.addEventListener('scroll', yLogger); }; tooltipElement.addEventListener('click', this.closeToolTip); tooltipElement.addEventListener('click', scrollHandler); this.element = tooltipElement; const ulElement = this.hostElement.parentElement; console.log(ulElement); let pxPosition = [0]; let currentY = y; const yLogger = () => { let scrollDirection; let pxScrolled = 0; if (pxPosition.length <= 1) { pxPosition.push(ulElement.scrollTop); } else { pxPosition.push(ulElement.scrollTop); pxPosition.shift(ulElement); } console.log(pxPosition); if (pxPosition[1] < pxPosition[0]) { scrollDirection = 'up'; pxScrolled = pxPosition[0] - pxPosition[1]; } else if (pxPosition[0] < pxPosition[1]) { scrollDirection = 'down'; pxScrolled = pxPosition[1] - pxPosition[0]; } console.log(pxScrolled); console.log(scrollDirection); if (scrollDirection === 'down') { currentY = currentY - pxScrolled; console.log(currentY); tooltipElement.style.top = currentY + 'px'; } else { scrollDirection === 'up'; currentY = currentY + pxScrolled; console.log(currentY); tooltipElement.style.top = currentY + 'px'; } }; this.hostElement.closest('ul').addEventListener('scroll', yLogger); } }
Saya menambah coretan HTML dan CSS, walaupun saya rasa ia tidak perlu kerana ia ditulis oleh pengajar kursus yang saya ambil.
Ini ialah coretan HTML:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Project Board</title> <link rel="stylesheet" href="assets/styles/app.css" /> <script src="assets/scripts/app.js" defer></script> </head> <body> <template id="tooltip"> <h2>More Info</h2> <p></p> </template> <header id="main-header"> <h1>Project Planner</h1> </header> <section id="active-projects"> <header> <h2>Active Projects</h2> </header> <ul> <li id="p1" data-extra-info="Got lifetime access, but would be nice to finish it soon!" class="card" draggable="true" > <h2>Finish the Course</h2> <p>Finish the course within the next two weeks.</p> <button class="alt">More Info</button> <button>Finish</button> </li> <li id="p2" data-extra-info="Not really a business topic but still important." class="card" draggable="true" > <h2>Buy Groceries</h2> <p>Don't forget to pick up groceries today.</p> <button class="alt">More Info</button> <button>Finish</button> </li> </ul> </section> <section id="finished-projects"> <header> <h2>Finished Projects</h2> </header> <ul> <li id="p3" data-extra-info="Super important conference! Fictional but still!" class="card" draggable="true" > <h2>Book Hotel</h2> <p> Academind conference takes place in December, don't forget to book a hotel. </p> <button class="alt">More Info</button> <button>Activate</button> </li> </ul> </section> <footer> <button id="im-done-btn">I'm Done!</button> </footer> </body> </html>
Berikut ialah coretan CSS yang berkaitan:
* { box-sizing: border-box; } html { font-family: sans-serif; } body { margin: 0; } #main-header { width: 100%; height: 6rem; display: flex; justify-content: center; align-items: center; background: #ff0062; } #main-header h1 { color: white; margin: 0; } footer { position: absolute; bottom: 0; left: 0; width: 100%; text-align: center; } ul { list-style: none; margin: 0; padding: 0; } li { margin: 1rem 0; } section { margin: 1rem auto; width: 40rem; max-width: 90%; } section ul { padding: 1rem; max-height: 20rem; overflow: scroll; } section > h2 { color: white; margin: 0; } button { font: inherit; background: #ff0062; color: white; border: 1px solid #ff0062; padding: 0.5rem 1.5rem; cursor: pointer; } button.alt { background: white; color: #ff0062; } button:focus { outline: none; } button:hover, button:active { background: #ff2579; border-color: #ff2579; color: white; } .card { border-radius: 10px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26); padding: 1rem; background: white; } .droppable { background: #ffe0ec } #active-projects { border: 1px solid #870099; } #active-projects > header { background: #870099; padding: 1rem; display: flex; justify-content: space-between; align-items: center; } #active-projects header h2 { color: white; margin: 0; } #finished-projects { border: 1px solid #535353; } #finished-projects > header { background: #535353; padding: 1rem; display: flex; justify-content: space-between; align-items: center; } #finished-projects header h2 { color: white; margin: 0; }
Masalah ini boleh diselesaikan dengan CSS, anda boleh mengalih keluar yang berikut daripada kod Javascript anda:
Sebaliknya, tukar CSS dengan menambah yang berikut:
Untuk melakukan ini, cipta elemen anak bagi elemen
div.card
元素必须是相应li.card
yang anda buat dalam kod Javascript. Saya juga (mungkin tersilap) menganggap bahawa kod asal anda adalah serupa dengan kod yang saya temui sebelum ini dan menyiarkannya dalam ulasan soalan anda kerana saya tidak dapat menjalankan kod asal anda.Anda
position:absolute
最初不起作用,因为li.card
父级的位置未明确设置,默认为static
.EDITTerlupa untuk menyebut bit indeks z. Ini diperlukan kerana kotak maklumat anda tidak akan kelihatan sepenuhnya (ia akan berada di bawah elemen
li.card
seterusnya).