【问题标题】:Hiding the mouse cursor when idle using JavaScript使用 JavaScript 在空闲时隐藏鼠标光标
【发布时间】:2011-03-22 05:17:07
【问题描述】:

是否可以使用 JavaScript 将 cursor 属性设置为属性 none 如果鼠标处于非活动状态一段时间(例如,五秒)并在它变为时将其设置回 auto又激活了?

编辑:我意识到none 不是cursor 属性的有效值。尽管如此,许多网络浏览器似乎都支持它。此外,此功能的主要用户是我自己,因此产生混淆的可能性很小。

我有两个脚本可以做类似的事情:

window.addEventListener("mousemove",
    function(){
        document.querySelector("#editor").style.background = "#000";
        setTimeout("document.querySelector('#editor').style.background = '#fff'", 5000);
    }
, true);

var timeout;
var isHidden = false;

document.addEventListener("mousemove", magicMouse);

function magicMouse() {
    if (timeout) {
        clearTimeout(timeout);
    }
    timeout = setTimeout(function() {
        if (!isHidden) {
            document.querySelector("body").style.cursor = "none";
            document.querySelector("#editor").style.background = "#fff";
            isHidden = true;
        }
    }, 5000);
    if (isHidden) {
        document.querySelector("body").style.cursor = "auto";
        document.querySelector("#editor").style.background = "#000";
        isHidden = false;
    }
};

对于这些中的每一个,当鼠标处于非活动状态超过 5 秒时,背景颜色变为白色,而当光标移动时,背景变为黑色。但是,它们不适用于使光标消失。令我惊讶的是,如果我将命令 document.querySelector("body").style.cursor = "none"; 放入 JavaScript 控制台,它会完美运行。在脚本内部,它似乎不起作用。

我已经发布了上面的脚本,因为这是我已经开始让它工作了。我不一定要求修复任何一个脚本。如果您知道隐藏光标的更有效方法,请分享。

【问题讨论】:

    标签: javascript css mousemove mouse-cursor


    【解决方案1】:

    在 CSS 2 中,none 不是 cursor property 的有效值。但是,它在 CSS 3 中有效。

    否则,您也许可以使用从简单透明的 URI 加载的自定义光标。

    不过,我认为这会极大地分散用户的注意力,因此我不建议您实际这样做。

    【讨论】:

    • +1 将用户与这样的事情混淆并不是很好的用户体验。
    • 如果有一些媒体正在播放或者不打算使用鼠标进行交互,我可以看到这样做的一些价值
    • 即使某些东西不打算与鼠标交互,还有什么替代方法?触碰?笔?无论如何,两者都会隐藏正常的鼠标指针,并将其替换为一旦你知道你击中的位置就会消失的东西。对于媒体播放器来说,这可能值得商榷,但我想一旦浏览器为视频增加全屏功能,这也将不再是问题。一般来说,隐藏鼠标指针的正当理由很少,尤其是当它只是屏幕的一部分时(例如,您的网页或其中的一个元素)。
    • 我在 --kiosk 模式下使用 chrome 构建 kiosk 系统,并在操作系统之外处理屏幕空白,此时光标隐藏是合适且可接受的。我怀疑有很多地方隐藏光标不会“分散注意力”或混淆。我还怀疑还有 许多 其他正当理由。跳出框框思考,我们并不是所有想要与用户搞砸的大猩猩营销垃圾邮件发送者——我怀疑在 SO 上发布问题的类型非常多。
    【解决方案2】:

    以下内容在 Firefox 3.6.13 中适用于我,只要光标位于没有非默认光标的实际元素上(因此,如果光标位于表单元素或链接上,则它不起作用,例如),尽管总的来说我建议不要这样做,因为它是非标准的并且可用性极差。

    另外:当有替代品时,不使用querySelector() 更兼容,例如document.bodydocument.getElementById()

    (function() {
        var mouseTimer = null, cursorVisible = true;
    
        function disappearCursor() {
            mouseTimer = null;
            document.body.style.cursor = "none";
            cursorVisible = false;
        }
    
        document.onmousemove = function() {
            if (mouseTimer) {
                window.clearTimeout(mouseTimer);
            }
            if (!cursorVisible) {
                document.body.style.cursor = "default";
                cursorVisible = true;
            }
            mouseTimer = window.setTimeout(disappearCursor, 5000);
        };
    })();
    

    【讨论】:

    • 你可以通过document.body.style.cursor = ""; 让它作用于任何元素。
    • 这对我正在建造的信息亭非常有用。移动鼠标,它会短暂出现以制作/或退出全屏
    【解决方案3】:

    这对我有用(取自https://gist.github.com/josephwegner/1228975)。

    注意对带有 id 包装器的 html 元素的引用。

    //Requires jQuery - http://code.jquery.com/jquery-1.6.4.min.js
    $(document).ready(function() { 
    
    
        var idleMouseTimer;
        var forceMouseHide = false;
    
        $("body").css('cursor', 'none');
    
        $("#wrapper").mousemove(function(ev) {
                if(!forceMouseHide) {
                        $("body").css('cursor', '');
    
                        clearTimeout(idleMouseTimer);
    
                        idleMouseTimer = setTimeout(function() {
                                $("body").css('cursor', 'none');
    
                                forceMouseHide = true;
                                setTimeout(function() {
                                        forceMouseHide = false;
                                }, 200);
                        }, 1000);
                }
        });
    });
    

    【讨论】:

    • 不错,我用这个效果很好。我用body 替换了#wrapper,这样我就可以将鼠标留在页面上的任何位置。此外,Chrome 每隔一秒左右就会行为不端并触发 mousemove - 为了解决这个问题,我每次都存储鼠标坐标,然后立即在 mousemove 部分内将 ev.clientX / Y 与存储的值进行比较。
    【解决方案4】:

    如果有人在 2019 年仍在寻找答案(就像我一样),这种方法适用于 FF 71 和 Chrome 78:

    var DEMO = {
      INI: {
        MOUSE_IDLE: 3000
      },
      hideMouse: function() {
        $("#game").css('cursor', 'none');
        $("#game").on("mousemove", DEMO.waitThenHideMouse);
      },
      waitThenHideMouse: function() {
        $("#game").css('cursor', 'default');
        $("#game").off("mousemove", DEMO.waitThenHideMouse);
        setTimeout(DEMO.hideMouse, DEMO.INI.MOUSE_IDLE);
      },
      showMouse: function() {
        $("#game").off("mousemove", DEMO.waitThenHideMouse);
        $("#game").css('cursor', 'default');
      },
    };
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    简单明了。这个版本使用DEMO.hideMouse()开始隐藏鼠标,DEMO.showMouse()取消事件。将 #game 更改为您选择的 div ...

    使用 onoff 开关和命名函数而不是 lambda 会更清晰。

    我知道 OP 没有指定使用 JQuery 的答案是预期的,但根据我的经验:我总是很高兴看到不同的学习方法。

    【讨论】:

      【解决方案5】:

      在我的自助服务终端应用程序中,确保在移出屏幕保护程序时不会丢失“按下”字符(它们通常通过条形码扫描仪或 rfid 阅读器发送到 PC)并确保屏幕返回在立即上,我使用以下代码以及透明的cur 光标文件,并禁用主机操作系统中的所有屏幕保护/省电选项。这适用于 Chrome 12,可能还有许多其他浏览器。我不认为有任何特定于 Chrome 的代码——它只是自动启动到 kiosk 模式的最简单的事情。

      需要遍历 INPUT 元素的草率位,因为这些表单部分将保持其默认(通常为白色)背景。

      如果您使用图像、彩色文本或其他此类对象,您需要弄清楚如何处理这些对象。我只是在构建数据采集应用程序,所以它只是屏幕上的黑色文本。将页面背景设置为黑色会使整个屏幕变黑,并防止烧屏。

      这可以而且应该通过 JS 应用各种 CSS 位来完成,但它工作得很好,而且它都在代码中的一个位置,所以很容易粘贴到像这样的地方。

      <body onkeydown="unSS();" id="thePage">
      

      onkeydown 触发 unSS 在正文中,因此每次看到按键按下都会重置计时器。

      <script type="text/javascript">
      
      var ScreenSaver = 10; // minutes
      
      SS(); // start the timer up
      
      function unSS()
      {
          document.getElementById('thePage').style.background='White';
          for (var i = 0; i < document.getElementsByTagName('INPUT').length; i++)
              {
                  document.getElementsByTagName('INPUT')[i].style.background='White';
              }
      
          //put the cursor back.
          document.getElementById('thePage').style.cursor = 'default';
      
          ScreenSaver=10;
      }
      
      function SS()
      {
          ScreenSaver = ScreenSaver-1;  //decrement. sorry for the vb-style. get over it.
      
          if (ScreenSaver<=0)
              {
                  document.getElementById('thePage').style.background='Black';
                  for (var i = 0; i < document.getElementsByTagName('INPUT').length; i++)
                      {
                          document.getElementsByTagName('INPUT')[i].style.background='Black';
                      }
                     //change the cursor to a transparent cursor. 
                     //you can find the file on the web. 
                     //Search for "transparent cursor cur download"
                     document.getElementById('thePage').style.cursor = 'url(transparentCursor.cur)';
              }
      
          setTimeout("SS();",60000);  // fire the thing again in one minute.
          }
      ...
      

      【讨论】:

        【解决方案6】:

        有一个 jquery 插件idletimer 可以检查用户是否处于非活动状态。

        【讨论】:

          【解决方案7】:

          我找到了一个解决间歇性无光标问题的简单解决方法,就是创建一个透明的&lt;div id="overlay"&gt; &lt;/div&gt; 作为页面上的最后一个元素,并将 css 样式属性设置为:

          #overlay {
            position: absolute;
            left: 0;
            top: 0;
            height: 100%;
            width: 100%;
            background-color: transparent;
            cursor: none;
            margin: 0;
            padding: 0;
            border: 0;
          }
          

          使 javascript 将可见性更改为“可见”或“隐藏”。 “可见”层将隐藏光标。隐藏层反之亦然。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-24
            • 2013-09-16
            相关资源
            最近更新 更多