2015-02-09 57 views
28

我很喜欢React中的inline CSS patternvideo),我正在考虑使用它。不过,我有一个类似this one的问题。React中的内联CSS样式:如何实现媒体查询?

如何使用React的内联CSS模式去实现应用程序的媒体查询。

+0

请具体说明您的问题,如果网站上有类似问题,请尝试在该问题上撰写评论,以便您能够得到答案,而且没有人会有时间浏览您的链接并总结,然后给出答案。 – Chella 2015-02-09 08:28:22

回答

21

你不能。有一些CSS功能,如@media查询,必须在样式表的declaration block中定义。

尽管内联CSS适用于大多数可用于键值对的样式属性,但它并不完全替代专用样式表。

编辑:

有在某些浏览器(Chrome的9+,IE 10,Firefox的6+),允许您添加事件侦听器现有的实验对象时,媒体查询的文档的变化,如MediaQueryList

有一个新生的React项目名为Radium,它提供了mixins,用于根据活动媒体查询应用条件样式,使用底层的MediaQueryList

+0

对于某些伪类也是如此。 – 2015-02-10 00:51:39

+3

加1为镭。 – n1k1ch 2016-01-13 18:54:51

+1

关于媒体查询API的当前状态http://caniuse.com/#search=matchMedia – 2016-04-18 17:56:56

12

你不能做像媒体查询和伪元素没有样式表的事情。但是,您可以访问它们在JavaScript中构建的信息。例如,一个天真的实现调整大小混入的:

var ResizeMixin = { 
    componentDidMount: function(){ 
     window.addEventListener('resize', this._resize_mixin_callback); 
    }, 
    _resize_mixin_callback: function(){ 
     this.setState({ 
      viewport: { 
       width: document.documentElement.clientWidth, 
       height: document.documentElement.clientHeight 
      } 
     }); 
    }, 
    componentWillUnmount: function(){ 
     window.removeEventListener('resize', this._resize_mixin_callback); 
    } 
}; 

然后,您可以包括在您的组件,并有呈现,看起来像这样:

render: function(){ 
    var style; 

    if (this.state.viewport.width > 900) { 
    style = {width: '45%', margin: '2.5%'}; 
    } 
    else { 
    style = {width: '100%', margin: '0'}; 
    } 
    ... 
} 

我不知道这是一个好主意,但它可以完成。


'天真的执行'我的意思是它有性能问题。 addEventListener实际上很沉重,所以你想把它包装在一个简单的js事件发射器中。您也可以只有一个视口对象实例来保存一些GC压力。而且你想限制事件发生,因为浏览器在拖动窗口时会非常快地发出它。

就像所有抽象的抽象一样,当你有空闲时你可以进行这些优化,并且你不需要使用它来修改组件。

+0

答案在这里:http://stackoverflow.com/a/35075190/564872解释了这个问题的REDX风格的解决方案。 – Civilian 2016-03-25 22:16:52

1

This library将允许您使用某种媒体查询的用例。

它可以让你用媒体规范包装反应元素元素。只有符合媒体规范时,才会呈现包裹的元素。这不是一个通用的解决方案,因为它不允许添加任意的CSS属性。

+0

请在链接中添加上下文。只包含多个链接的答案可能会被删除。 – 2017-08-13 04:18:44

+0

尽管此链接可能会回答问题,但最好在此处包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/17017726) – 2017-08-13 04:23:33

+0

感谢您的反馈:)增加了一个更详细的解释,说明它是如何工作的,以及它何时有用。 – Kat 2017-08-13 04:54:55