React中的内联CSS样式:如何实现媒体查询
Inline CSS styles in React: how to implement media queries?
我很喜欢React中的内联CSS模式(视频),我正在考虑使用它。然而,我有一个类似的问题。
如何使用React的内联CSS模式为应用程序实现媒体查询。
你不能。有些CSS特性,如@media
查询,必须在样式表的声明块中定义。
虽然内联CSS对于大多数可以应用于键值对的样式属性来说都很好,但它并不能完全取代专用样式表。
编辑:
某些浏览器(Chrome 9+、IE 10+、Firefox 6+)中提供了一些实验对象,允许您在文档上的媒体查询发生更改时添加事件侦听器,例如MediaQueryList。
有一个名为Radium的新生React项目,它提供了基于活动媒体查询的条件样式应用的mixin,在后台使用MediaQueryList
。
如果没有样式表,就无法执行媒体查询和伪元素之类的操作。但是,您可以访问它们在JavaScript中构建的信息。例如,一个调整大小的mixin:的天真实现
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压力。您希望对事件进行节流,因为浏览器在拖动窗口时会很快发出事件。
与所有好的抽象一样,您可以在有空闲时间时进行这些优化,并且不需要使用它修改组件。
React Responsive将允许您使用媒体查询的特定用例。
它允许您使用媒体规范包装react元素。只有在满足媒体规范的情况下,才会呈现封装的元素。它不是一个通用的解决方案,因为它不允许您添加任意的css属性。
在以下方便的步骤中为我工作:
-
在mediacss文件中为您想要的项目设置一个类,例如
@media (max-width: 768px){ .sidebar-show{ display: block; } .sidebar-hide{ display: none; }}
-
react中的条件呈现,例如:(例如,
showSideBar
是状态变量)<aside className={`col-md-3 ${showSideBar?"sidebar-show":"sidebar-hide"}`}>
我参加聚会迟到了,但我仍然希望我能帮忙。您可以使用";useMediaQuery";钩子,然后如果钩子返回true,则动态应用内联样式。
const useMediaQuery = (query) => {
const [matches, setMatches] = useState(false);
useEffect(() => {
const media = window.matchMedia(query);
if (media.matches !== matches) {
setMatches(media.matches);
}
const listener = () => setMatches(media.matches);
window.addEventListener("resize", listener);
return () => window.removeEventListener("resize", listener);
}, [matches, query]);
return matches;
}
export default useMediaQuery;
您只需导入radium包并使用StyleRoot组件,就可以将媒体查询与radium包一起使用。
import Radium, { StyleRoot } from 'radium';
但是请记住,您不能直接在StyleRoot下使用媒体查询
,您必须将StyleRoot的内容放在一个单独的组件
- 如何使用动画实现纸张推车
- 客户端服务器REST API captcha实现
- 如何实现此布局
- Meteor忘记了密码的实现
- 使用Native Sockets在Android中实现WebSockets
- 在样板文件中实现Ajax
- instanceof是如何在JavaScript中实现的
- 如何正确实现Jquery多选小部件
- 实现一个建立在google.com之上的自定义搜索引擎
- 多个组件是如何实现的
- window.location使用jquery mobile实现chrome跳转
- 如何在OpenERP中实现网络摄像头
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- javascript加密实现,包括可信否认
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- 如何让程序员在javascript中实现正确的回调
- 如何使用自定义辅助对象(handler)实现嵌套的每个循环
- AngularJS智能表全局配置实现
- Expressjs/AngularJS:实现req-flash后出错
- Java' Rhino实现实现了哪个JavaScript (ECMAScript)版本(更新策略是什么?)