(PHP) 如何检测用户的计算机/浏览器处于黑暗模式?

uiu*_*uii 8 php safari firefox google-chrome macos-mojave

最近,我正在更新我的软件以支持暗模式,以响应研究表明看着纸白色背景显示器对眼睛和睡眠节奏不利。有没有办法从 PHP 检测用户的浏览器和/或操作系统设置为暗模式?如何检测它设置为夜间模式(减少蓝色)?

Vin*_*ino 7

不幸的是,服务器端处理(包括 PHP)不存在暗模式检测方法。

  • 迄今为止,W3C(及其赞助商)所做的所有努力都集中在客户端/Jamstack 上,媒体查询级别 5规范使用prefers-color-scheme媒体查询进行检测。这在 CSS 和 JavaScript 中都很有用。

  • 谷歌的 Thomas Steiner ( @DenverCoder9 )建议实施建议的服务器端客户端提示,但这还没有被 W3C 或浏览器采用(还没有?)。

  • 无论哪种方式 - 服务器端检测都有一个明显的缺点(Thomas 的建议和我的解决方案都在下面),因为服务器只会知道下一个状态的变化(例如,当夜幕降临时 macOS 的“自动”模式)服务器请求,或者更明显的是,页面的第一次加载。

  • 建议将这种检测留在客户端,像vinorodrigues/bootstrap-dark这样的项目展示了这有多容易 - 无需服务器端处理。

话虽如此 - 有一个解决方法:

最有效的方法是利用js-cookie/js-cookie项目,并将以下代码包含到您的 HTML 页面中:

  <script src="https://cdn.jsdelivr.net/npm/js-cookie/dist/js.cookie.min.js"></script>
  <script>
    // code to set the `color_scheme` cookie
    var $color_scheme = Cookies.get("color_scheme");
    function get_color_scheme() {
      return (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) ? "dark" : "light";
    }
    function update_color_scheme() {
      Cookies.set("color_scheme", get_color_scheme());
    }
    // read & compare cookie `color-scheme`
    if ((typeof $color_scheme === "undefined") || (get_color_scheme() != $color_scheme))
      update_color_scheme();
    // detect changes and change the cookie
    if (window.matchMedia)
      window.matchMedia("(prefers-color-scheme: dark)").addListener( update_color_scheme );
  </script>
Run Code Online (Sandbox Code Playgroud)

然后你的 PHP 会像这样检测这个 cookie:

  $color_scheme = isset($_COOKIE["color_scheme"]) ? $_COOKIE["color_scheme"] : false;
  if ($color_scheme === false) $color_scheme = 'light';  // fallback
Run Code Online (Sandbox Code Playgroud)

您可以使用它来加载 CSS:

  // Load the CSS for the correct color-scheme
  if ($color_scheme == 'dark') {
    ?><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vinorodrigues/bootstrap-dark@0.0/dist/bootstrap-night.min.css"><?php
  } else {
    ?><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0.css/bootstrap.css"><?php
  }
Run Code Online (Sandbox Code Playgroud)

或者,像这样:

  ?>You are in <?= $color_scheme ?> mode.<?php
Run Code Online (Sandbox Code Playgroud)


小智 3

由于 PHP 在服务器上执行,而客户端对此一无所知,因此没有直接的方法可以找出这一点。

如果可以在 JS 中检测颜色模式,您可以将一个小的 JS 脚本嵌入到您的站点中,以设置 cookie。Cookie 根据请求传输到服务器,因此 PHP 能够查询它们。

  • 需要对浏览器进行修改才能将此信息发送到网络服务器。 (4认同)