Pendengar acara tatal ditambahkan pada elemen tetapi hanya bergerak dengan betul jika scrollTop tidak sama dengan 0
P粉427877676
P粉427877676 2024-04-01 11:03:26
0
1
605

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;
}

P粉427877676
P粉427877676

membalas semua(1)
P粉885035114

Masalah ini boleh diselesaikan dengan CSS, anda boleh mengalih keluar yang berikut daripada kod Javascript anda:

tooltipElement.style.position = 'absolute';
tooltipElement.style.left = x + 'px';
tooltipElement.style.top = y + 'px';

Sebaliknya, tukar CSS dengan menambah yang berikut:

li.card {
    position: relative;
}
div.card {
    position: absolute;
    top: 0; /* or some other value, experiment until you find the one which works for you */
    left: 0; /* same as above */
    z-index: 1;
}

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).

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan