在Rails应用程序上添加一个黑暗主题到Ruby

2021-03-16 09:47:40

使用SCS和资产管道在Rails应用程序上添加一个黑暗的主题替代品的替代品。

黑暗主题最近引起了很多关注,因为苹果或谷歌等大多数操作系统部署的企业 - IOS,MacOS,Android - ,替代默认接口颜色的替代品主要是光线。

微软遵循了趋势,并在风OWS上添加了相同的选择。虽然允许人们在晚上使用他们的电脑或移动而不会伤害他们的眼睛是一个很好的功能,但这种实现是不完整的。实际上,为了使这个功能真的很闪耀,使操作系统接口黑暗是不够的。开发人员必须遵循规则,并将一个黑暗的主题添加到他们的软件上。否则,这是毫无意义的。

更重要的是,Web开发人员还要考虑以否则为他们的网站添加一个黑暗的主题选项,无论您的操作系统接口都很亮,网站仍然会像以前一样。如果,就像谷歌的主页一样,它充满了白色而且非常明亮,如果你的OS接口设置为黑暗,那就太糟糕了。

幸运的是,由于CSS规范中的“Preves-Color-Spection”属性,很容易快速创建一个暗版本的网站。

CSS媒体特征更喜欢 - 颜色方案可以采用两个值:“光”或“暗”。它允许Web开发人员在用户的操作系统接口设置为默认值(大多数时间,“暗”一个)或“黑暗”之后,调整其网站的设计。

例如,如果我们想将我们网站的背景更改为黑色,如果用户在其操作系统上启用了黑暗模式选项,则可以简单地执行以下操作:

/ * style.css * // *如果操作系统在黑暗模式* / @media(更喜欢 - 颜色方案:暗){body {背景 - 颜色:#000!重要; }}

这是非常方便的,因为我们现在可以检测用户的接口模式并调整我们网站的颜色来匹配它。

更有趣的是,此CSS功能将立即检测OS接口更改。例如,在MACOS上,您可以安排操作系统自动在日落时从灯切换到黑暗。与日出相反。

每个应用程序都会改变其颜色。这很酷。如果在浏览使用更喜欢颜色方案的网站时发生此开关,它将自动使用深色,而无需刷新页面。

对于我的大多数Web项目,我喜欢在Rails上使用Ruby进行快速原型设计,用于在生产中部署的实际项目。这是Whaththemovie.com的情况,电影测验游戏,人们上传电影快照,另一名玩家必须猜测图像所拍摄的电影。

如果您有兴趣,我对此项目进行了两篇文章,我解释了我如何创建数据集和AI模型,以建议电影快照包含或属于的标记。

与许多其他Rails应用程序一样,它大量使用资产管道处理资产 - 图像,JavaScript,字体,样式表等。

不幸的是,我们的设计非常过时,而不是现代 - 它来自2008年,从字面上开始。例如,我们的按钮源自图像,以在现在,您可以简单地使用线性渐变CSS函数来执行相同的功能,在一行!我的观点是:如果你的设计老了,它会更加困难,需要更多的工作。

如果您使用例如CSS变量,您将看到创建黑暗模式并更快地更容易,因为您基本上只需更改这些变量的颜色,并且您就完成了。

我们要做的第一件事是保留档案组织并尊重资产管道指南。因此,要创建我们的黑暗主题,我们将在应用/资产/样式表中添加一个名为DarkMode.scss的新文件。

我们还必须确保我们的Rails应用程序现在将此文件和其内容集成到我们将在生产中的CSS文件中。为此,我们在应用/资产/样式表/ application.scs中添加了对我们新的SCSS文件的引用。

确保在已包含其他所有内容之后,请务必终止SCSS文件。由于我们将更改或覆盖样式,因此在设置所有设置后添加黑暗主题是很重要的。

现在是时候用一些深色的方式了解我们的网站!为此,我们将使用SCSS函数的组合,例如Mixin,包括HTML数据属性和Ruby Gem以保存和检索用户偏好。

请参阅SCSS Mixin功能作为定义要在稍后重新使用的样式的方式,而无需维护许多版本的同一次。我们将创建一个名为“黑暗”的Mixin,它将包含任何使我们的元素,选择器,标识符,更暗的更改。

/ *应用程序/资产/样式表/暗声。 @Media(更喜欢 - 颜色方案:黑暗){@include黑暗; }

Mixin“暗”的内容将自动包含在所谓的部分中。这是介绍概念的愚蠢示例。

现在,我们需要考虑如何处理用户真正想要的东西。每个可能的场景。

在创建将自动遵循的网站的替代暗版本,而用户OS接口颜色可能不尊重用户真正希望的内容。

例如,用户可能希望使用浅色的OS接口,但浏览网站并启用了暗主题。在相反的方向上同样:与其OS接口设置为黑暗的用户可能仍然希望浏览我们的网站与旧的光线。

因此,我们有三种方案来处理和提供给用户的选项:

自动模式:此选项描述了我们迄今讨论的。该网站将自动遵循用户OS接口颜色。如果OS接口设置为灯,则网站上的主题是光线。如果它是黑暗的,那么主题将是黑暗的;

轻质主题:此选项强制使用旧光主题,无论用户OS接口设置为何;

黑暗主题:此选项迫使使用新的黑暗主题,无论设置为用户OS接口是否设置为。这是友好的,因为许多用户在提供了光和黑暗模式的操作系统上运行。因此,如果他们想使用黑暗的主题,这是唯一的方法。

这是SCSS功能和HTML数据属性真正闪耀的位置。要处理这三种方案,我们将使用称为数据颜色模式的数据属性,可以采用三个值:“自动”,“光”或“黑暗”。我们将使用它,与Mixin结合,包括和更喜欢的颜色方案,为每个人提供这个黑暗的主题:

/ *应用程序/资产/样式表/暗摩尔兹/ @mixin暗{/ *所有颜色/ css更改为使网站黑暗* /} / *当OS接口为Light * / @Media时强制暗模式(更喜欢-Color-scheme:light){[数据 - 颜色模式="黑暗"] {@include黑暗; }} / *遵循操作系统界面颜色或强制暗主题* / @Media(更喜欢 - 颜色方案:暗){[数据 - 颜色模式="自动"],[数据颜色 - mode ="黑暗"] {@include黑暗; }}

使用此代码段,我们现在处理三种可能的方案:如果用户对灯光设置为光线但是要使用黑暗主题等。我们现在必须让用户选择它喜欢的选择,保存,检索它并将其设置为HTML数据属性数据颜色模式。

要在我们的网站上保持用户设置,我们使用Ruby GEM首选项。使用很简单,使用简单。我强烈推荐它。要将用户设置添加到存储,我们将此行添加到用户型号:

使用这一行,我们将用户偏好存储为网站设计为“主题”,并将其设置为“自动”默认情况下。

现在让我们编辑用户设置表单以添加更改主题的功能并保存用户选择:

#应用/视图/用户/设置.html.erb [...]< h2>外观< / h2> < p>选择WTM如何了解您。设置主题首选项以遵循您的系统设置,或选择始终使用光线或暗主题。< / p> < ul class =" standard_form"> < li> < div类="标题">主题< / div> < div类="内容"> <%= f.radio_button(:prefers_theme," auto")%> < =&#34的标签; user_theme_auto">默认为系统< / label> <%= f.radio_button(:prefers_theme,"光和#34;)%> < for =&#34的标签; user_theme_light">光< / label> <%= f.radio_button(:prefers_theme,"黑暗")%> < =&#34的标签; user_theme_dark">暗< / label> < / div> < / li> < / ul>

最后要做的是在我们的主应用程序布局中添加我们的HTML数据属性数据颜色模式,并将其值设置为从数据库中检索的用户首选项,以便使我们的SCSS功能工作:

我们利用安全导航运营商&在Ruby 2.3中介绍,处理当前访问者/用户未登录的情况。如果尚未登录,则会返回nil并将数据颜色模式值设置为“自动”。如果登录当前用户,它将检索其关于网站主题的首选项,并在数据属性中设置正确的值。

由于我们的设计很古老,这种方法非常好,易于实施。不幸的是,它带来了一些奇怪的行为。实际上,SCSS和资产管道生成的CSS文件在我们的情况下非常大。

似乎编译器需要在每个元素,选择器或标识符,数据属性的前面添加:

[数据 - 颜色模式="自动"] ul.disclist li a,[data-color-mode ="自动"] .profile_info a,[data-color-mode =& #34;自动"] .profile_user_links li a,[data-color-mode ="自动"] .thumb_overlay a span,[data-color-mode ="自动"] Li.sotd H4a,[数据 - 颜色模式="自动"] #online_users .footer_box a,[data-color-mode ="黑暗"] ul.disclist li a, [数据 - 颜色模式="黑暗"] .profile_info a,[data-color-mode ="黑暗"] .profile_user_links li a,[data-color-mode =&# 34;黑暗"] .thumb_overlay a span,[data-color-mode ="黑暗"] li.sotd h4a,[data-color-mode ="黑暗"] #online_users .footer_box a {颜色:#7c7c7c!重要; }

它会导致具有大量行生成的文件。虽然这对我们来说可能不是那么多问题,但它可能对你来说。除非我们早先谈论它,否则您的设计很好并使用CSS变量。在这种情况下,生成的代码将非常小,因为您只需要更改CSS变量值。

即使我不推荐它,我发现了一种方法,通过将该值设置为“自动”或“黑暗”时,通过组合数据属性,找到了一种方法来优化编译的CSS文件。

/ * app /资产/ styleshss / darkmode.scss * / @mixin暗{} @media(prefers-color-scheme:light){[data-color-mode * =" d"] {@include黑暗的; @Media(喜欢 - 颜色方案:暗){[数据 - 颜色模式* =" A"] {@include黑暗; }}

此技巧利用* =属性选择器,基本上说:如果数据颜色模式值包含字母“A”,则执行某些内容。由于“自动”和“黑暗”包含这封信,但不是“光”,它有效!

我用[Data-Color-Mode * =" D"]的[Data-Color-Mode ="暗"]的[Data-Color-Mode ="]。这种小方法导致去除超过400行。

我发布在stackoverflow上,要求帮助优化它,而无需重新制作我的所有设计,但到目前为止,没有答案。如果您有任何想法,请分享它们!

当您开始为您的网站制作黑暗主题时,您必须记住的东西是可访问性的。在暗中选择文本颜色时,在暗背景上读取文本没有什么比在暗背景上更痛苦的了。

当您创建深模式颜色调色板时,请考虑它:文本是否可读?这两个元素之间的对比是否足够?

GitHub,最近发布了一个黑暗主题的网站,因为某些元素之间缺乏对比,对此受到了一些批评。

幸运的是,Web内容可访问性指南(WCAG)有助于我们通过计算元素之间的对比度来选择正确的颜色。

在AAA水平应该是目标的地方,AACHIVE AA已经很好。

为了帮助我们计算元素之间的对比度,您可以使用浏览器的开发人员工具:

如在Chrome上看到的,当您打开文本元素的颜色选择器时,可以看到与其背景的对比度和两个级别阈值。在此示例中,两个级别都受到尊重。

如果您的浏览器没有这样的功能,则Webaim或CooloR等多个网站提供了一种方法来轻松计算两种颜色之间的对比度。

如果没有那么多工作,我们就可以向我们现有的Ruby上添加一个黑暗的主题。 尽管没有Web开发人员或网络设计师,我们的小主题似乎似乎取得了一些成功:超过74%的活动用户默认启用它,它不包括启用“自动”的用户 自动将主题从“灯”切换到“暗”,反之亦然。 当您考虑它时,有关电影的网站,展示使用电影院的电影快照和周围的窗帘提供了有意义的,为用户提供了更好的体验。