【问题标题】:User Inputted live Color Scheme Change用户输入的实时配色方案更改
【发布时间】:2017-10-06 19:47:42
【问题描述】:

我设计了一个网站,以便更改两种用户输入的颜色会改变整个网站的配色方案。

实现这一点的最佳方法是什么。我知道我必须将项目保存在数据库中并在每次用户登录时提取,以便在每次登录时实现配色方案。

但目前我更担心用户更改 html 颜色值后会立即进行实时更改。

我知道一个选项,我可以将 CSS 类添加到每个会更改的组件中,例如 ....primaryColor.secondaryColor。然后使用该类更改所有元素。 React 或其他 CSS/Javascript 解决方案是否有更好的方法?

另外一个复杂的问题是,当用户加载其他尚未渲染的组件时,更改仍然有效。

【问题讨论】:

  • 用户是在创建任意主题,还是在几个预定义的主题之间进行选择?当前的解决方案似乎假设用户在几个预定义的主题之间进行选择。
  • @speckledcarp 你是对的。所以我开始在 Redux 状态下保存 primaryColor 和 secondaryColor。该解决方案听起来如何?我现在的问题是如何在存储状态后实现它。我一直在每个元素上使用样式标签。似乎重复。
  • @speckledcarp 当然我刚刚遇到了一个问题,即应用样式标签会取消任何 :hover 或 :focus 元素......我可以使用 Radium,但我宁愿不必包括镭在项目中只是为了这个...

标签: css reactjs themes


【解决方案1】:

一种可能的解决方案是使用<style> 元素加上dangerouslySetInnerHTML,就像这样。 (注意 CSS 周围的反引号 ` - 它是一个内插的字符串文字。)

const Theme = props => {
  <style dangerouslySetInnerHTML={{__html: `
    .styled { color: ${props.userColor} }
    `}} 
  />
}

那么使用主题的组件就是&lt;div className="styled" /&gt;

我想到了这个解决方案here

如果您使用此方法,请务必小心使用经过清理的变量来创建 CSS 主题。否则,存在注入攻击的潜在问题。

【讨论】:

  • 哇!这绝对完美。谢谢。
【解决方案2】:

我会在输入上使用事件侦听器,读取值,如果它与您想要触发配色方案更改的任何内容匹配,则将主题值应用于根元素上的数据属性并使用 CSS 来控制颜色计划。

var input = document.getElementById('input'),
    body = document.getElementsByTagName('body')[0];
input.addEventListener('keyup',function() {
  var val = this.value;
  if (this.value == 'foo') {
    body.setAttribute('data-theme','secondary');
  } else if (this.value == 'bar') {
    body.setAttribute('data-theme','primary');
  } else {
    body.setAttribute('data-theme','');
  }
  // ajax request to save theme pref in db
})
/* defaults */

body {
  color: #333;
}

/* primary theme */

[data-theme="primary"] {
  color: red;
}

[data-theme="primary"] p {
  background: yellow;
}

/* secondary theme */

[data-theme="secondary"] {
  color: blue;
}

[data-theme="secondary"] ul {
  background: grey;
}
<input id="input" placeholder="enter 'foo' or 'bar'">

<p>
  paragraph
</p>

<ul>
  <li>list</li>
</ul>

【讨论】:

  • 有趣。真的很简单。谢谢!
  • Michael Coker - 这个解决方案不是直接操作 DOM 吗?如果是这样,@Sequential 很可能会遇到与他们实现 jQuery 解决方案时相同的问题。
  • @speckledcarp 他们在哪里说他们不想直接操作 DOM?我不太使用 react,但似乎也可以通过 react 轻松完成。
  • React 想要管理 DOM 本身。当你使用 React 时,所有东西都会被渲染到一个虚拟 DOM,而 React 会管理更新 DOM 本身。如果您在 React 应用程序中进行直接 DOM 更新,您必须非常小心,否则 React 会在重新渲染时覆盖您的更改。可以解决,但有时很困难。
  • 现在道歉,我明白答案了。 @speckledcarp 是正确的。
【解决方案3】:

你可以使用 js 轻松做到这一点。 只需使用 jQuery addClass() 方法添加您的类 .primaryColor, .secondaryColor 。 选择元素

示例: $(selector).addClass(classname,function(index,currentclass))

更多示例:https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_html_addclass

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2017-10-30
  • 1970-01-01
  • 2013-04-19
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多