我已经开始了一个Django项目,根据用户的学校颜色,在很多配色方案中使用UI会很棒。我有这个幻想,有一个基本的variables.less文件以及一堆编译成style.css的其他.less文件。
但是一旦用户设置了他们的学校颜色,它就会生成一个blue.variables.less文件(如果他们选择了蓝色预设)或者school123.variables.less文件(如果他们非常喜欢并使用颜色选择器来制作他们自己的配色方案),然后将所有内容编译为blue.style.css或school123.style.css,然后我们在为页面提供时加载的.css文件。
我可以想象很多方法可以垮掉。比如当我将更新推送到forms.less或layout.less时,如何重新处理所有这些文件。
有更好的方法吗?我用手指搜索我的手指,但没有发现任何人试图这种疯狂。
答案 0 :(得分:2)
有很多方法可以实现您的目标,即能够拥有特定于用户的配色方案,但它们各有优缺点。
我假设您正在使用Bootstrap这样的框架和您命名的文件。
选项1:颜色特定样式的内联CSS(首选)
由于性能和简单性,这是我的首选方案。您可以为每个用户存储每种自定义颜色,甚至可以创建模型,以便您可以重复使用代表特定学校的颜色。它存储在数据库中,可以扩展为大量的配色方案,而不会生成大量非常相似的文件。
在模板代码中创建一个snippet,其中包含任何使用颜色变量的样式。
base.html文件
{% include "color-snippet.css" with main-color="{{ user's main color }}" alt-color="{{ user's alt color }}" %}
color-snippet.css(请注意,此文件将位于模板目录中,因为它正由模板引擎处理
<style>
.some-style {
color: {{ main-color }} !important;
}
</style>
所以最大的缺点就是你需要在变量之外自定义Bootstrap。您需要通过较少的文件来查找将生成的所有类,并将样式复制到css中的代码段而不是更少。当您想要升级到更新的Bootstrap时,它需要预先投入一些工作,但它允许您在运行时动态派生样式的颜色部分。
我更喜欢这种方法,因为你不需要在收集阶段之外处理较少的编译。
选项2:LESS的客户端编译
您可以让Django提供动态创建的文件,并返回您想要的变量。然后你可以让less.js在客户端上编译它。
这将涉及向您的基本模板添加由Django处理的URL路径,该路径不是静态路径的一部分(例如/ style / variables),在视图中创建处理程序,然后返回将成为您的文本内容文件变量较少。
选项3:LESS的服务器端编译
我使用Django Pipeline进行少到css的服务器端编译。使用Django应用程序需要一些设置。在开发模式下,Django Pipeline将在每个请求上编译相关的较少文件到CSS文件中。在生产模式下,它将指向编译文件的相应文件路径。它挂钩到collectstatic
,因此当你collectstatic
时,你的编译就会被编译。
此方法的最大问题是您的静态文件的映射(少于+ css文件编译为css)在您的设置文件中定义。这需要在更新时重新启动服务器。您可以根据Django Pipeline的工作原理,将您自己的服务器端编译为较少的编译,但是具有映射逻辑,而不是在需要重新启动服务器的东西中定义它。
这是一项很多工作,而且每次请求都需要对Bootstrap进行较少的编译。
如果您创建了自己的映射,不需要重新启动Django服务器进程,则可以始终只运行collectstatic来创建新的css文件。这样可以避免在每次请求时进行编译。
虽然这最后一种方法与你提到的最接近,但它似乎比仅仅分离颜色特定的样式和使用django模板来定制它更多的工作和容易出错。
如果您的方案数量相当低,那么最后一种方法也很有效,因为您可以提前创建所有映射,而不是让人们在运行时生成自己的映射。他们可以建议他们,你可以定期更新它们。