RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1597316
Accepted
Daniel Batura
Daniel Batura
Asked:2024-10-21 01:11:20 +0000 UTC2024-10-21 01:11:20 +0000 UTC 2024-10-21 01:11:20 +0000 UTC

将鼠标悬停在内容上的轮播[关闭]

  • 772
关闭。这个问题需要澄清或者补充细节。目前不接受对此问题的答复。

想要改进这个问题吗?通过编辑这篇文章添加更多详细信息并澄清问题。

17 小时前关闭。

改进问题

其中有块的部分,当它们悬停在该部分的左侧时,应该滚动到左侧,相应地,也应该滚动到右侧。

我在网上搜索了很多,找不到解决这个问题的方法。我会自己用js写,但我不太擅长:(

javascript
  • 2 2 个回答
  • 43 Views

2 个回答

  • Voted
  1. Best Answer
    Owlly
    2024-10-21T15:52:53Z2024-10-21T15:52:53Z

    const scrollContainer = document.querySelector('.scroll-container');
    let scrollSpeed = 0;
    let scrollInterval;
    
    scrollContainer.addEventListener('mousemove', (e) => {
      const containerWidth = scrollContainer.offsetWidth;
      const mouseX = e.clientX - scrollContainer.getBoundingClientRect().left;
      const scrollLeftMax = scrollContainer.scrollWidth - containerWidth;
    
      // Наведение на левый край 20%
      if (mouseX < containerWidth * 0.2) {
        scrollSpeed = -5; // Скорость прокрутки влево
      }
      // Наведение на правый край 20%
      else if (mouseX > containerWidth * 0.8) {
        scrollSpeed = 5; // Скорость прокрутки вправо
      }
      // Остановка прокрутки в центре
      else {
        scrollSpeed = 0;
      }
    });
    
    scrollContainer.addEventListener('mouseleave', () => {
      scrollSpeed = 0;
    });
    
    scrollInterval = setInterval(() => {
      if (scrollSpeed !== 0) {
        scrollContainer.scrollLeft += scrollSpeed;
      }
    }, 16);
    .scroll-container {
      width: 100%;
      overflow: hidden;
      position: relative;
    }
    
    .scroll-content {
      display: flex;
      transition: transform 0.3s ease;
      white-space: nowrap;
      width: fit-content;
    }
    
    .block {
      width: 300px;
      margin: 0 10px;
      background-color: #ccc;
      text-align: center;
      line-height: 150px;
      height: 150px;
      display: inline-block;
    }
    <div class="scroll-container">
      <div class="scroll-content">
        <div class="block">Блок 1</div>
        <div class="block">Блок 2</div>
        <div class="block">Блок 3</div>
        <div class="block">Блок 4</div>
        <div class="block">Блок 5</div>
        <div class="block">Блок 6</div>
        <div class="block">Блок 7</div>
        <div class="block">Блок 8</div>
      </div>
    </div>

    • 2
  2. Oliver Patterson
    2024-10-21T08:36:21Z2024-10-21T08:36:21Z

    我决定实现它纯粹是为了兴趣,但我认为 GPT 也能胜任这项任务。
    我不太擅长解释代码,但我用注释标记了一些东西。

    我认为我的解决方案并不理想。

    class AutoScroller
    {
        HOVER_CURSOR_ZONE = 100; // Размер зоны для наведения по краям
        SCROLL_DISTANCE = 100; // Расстояние, на которое прокручивает
        SCROLL_SPEED = 100; // Количество мс между автоматическим скролом
    
        #scrollTimerId;
        #wrapper;
    
        constructor(wrapperSelector)
        {
            this.#wrapper = document.querySelector(wrapperSelector);
    
            this.#init();
        }
    
        #init()
        {
            if (this.#wrapper === null)
            {
                console.error("Wrapper not found");
                return;
            }
    
            this.#wrapper.addEventListener("mouseleave", () => this.#stopScrolling());
            this.#wrapper.addEventListener("mousemove", (event) => this.#handleMouseMove(event));
        }
    
        #handleMouseMove(event)
        {
            const { clientWidth } = this.#wrapper;
            let direction = 0; // -1 - left | 0 - none | 1 - right
    
            // Проверяем, попадает ли курсор в зону наведения
            if (event.clientX >= clientWidth - this.HOVER_CURSOR_ZONE)
            {
                direction = 1; // Двигаем вправо
            }
            else if (event.clientX <= this.HOVER_CURSOR_ZONE)
            {
                direction = -1; // Двигаем влево
            }
    
            if (this.#scrollTimerId)
            {
                this.#stopScrolling();
            }
    
            if (direction !== 0)
            {
                this.#scrollingBlock(direction);
                this.#scrollTimerId = setInterval(() => this.#scrollingBlock(direction), this.SCROLL_SPEED);
            }
        }
    
        #scrollingBlock(direction)
        {
            if (!this.#wrapper)
            {
                return;
            }
    
            this.#wrapper.scrollTo({
                left: this.#wrapper.scrollLeft + (this.SCROLL_DISTANCE * direction),
                behavior: "smooth"
            });
        }
    
        #stopScrolling()
        {
            clearInterval(this.#scrollTimerId);
            this.#scrollTimerId = undefined;
        }
    }
    
    const autoScroller = new AutoScroller(".wrapper");
    .wrapper
    {
        display: flex;
        gap: 8px;
    
        overflow-x: auto;
    
        div
        {
            width: 300px;
            height: 150px;
    
            flex-shrink: 0;
    
            background-color: #DC4242;
            border-radius: 16px;
        
        display: grid;
        place-content: center;
        
        color: #FFF;
        font-size: 3em;
        }
    }
    
    .wrapper::-webkit-scrollbar
    {
        height: 0px !important;
    }
    <div class="wrapper">
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div>
        <div>5</div>
        <div>6</div>
        <div>7</div>
        <div>8</div>
        <div>9</div>
        <div>10</div>
        <div>11</div>
        <div>12</div>
        <div>13</div>
        <div>14</div>
        <div>15</div>
        <div>16</div>
        <div>17</div>
        <div>18</div>
        <div>19</div>
        <div>20</div>
    </div>

    • -1

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5