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

时间:2018-09-18 14:10:11

标签: php google-chrome firefox safari macos-mojave

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

2 个答案:

答案 0 :(得分:2)

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

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

  • Google的Thomas Steiner(@DenverCoder9)提出了实施Proposed server-side client hint的建议,但这尚未被W3C或浏览器采用。

  • p>
  • 无论哪种方式-服务器端检测(都有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>

然后您的PHP将像这样检测该cookie:

  $color_scheme = isset($_COOKIE["color_scheme"]) ? $_COOKIE["color_scheme"] : false;
  if ($color_scheme === false) $color_scheme = 'light';  // fallback

您可以用来加载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
  }

或者,像这样:

  ?>You are in <?= $color_scheme ?> mode.<?php

答案 1 :(得分:0)

由于PHP是在服务器上执行的,而不需要客户端的任何知识,因此没有直接的方法可以找到答案。

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