我想使用媒体查询根据div
其所在元素的大小来调整元素的大小。我不能使用屏幕大小,因为div
就像网页中的小部件一样使用,它的大小可以变化。
更新资料
看来现在正在对此进行处理:https : //github.com/ResponsiveImagesCG/cq-demos
我想使用媒体查询根据div
其所在元素的大小来调整元素的大小。我不能使用屏幕大小,因为div
就像网页中的小部件一样使用,它的大小可以变化。
看来现在正在对此进行处理:https : //github.com/ResponsiveImagesCG/cq-demos
Answers:
不,媒体查询并非旨在基于页面中的元素来工作。它们被设计为基于设备或媒体类型工作(因此,它们被称为媒体查询)。width
,height
和其他基于尺寸的媒体功能均指的是基于屏幕的媒体中视口或设备屏幕的尺寸。它们不能用于引用页面上的某个元素。
如果您需要根据页面上某个div
元素的大小来应用样式,则必须使用JavaScript来观察该div
元素的大小变化,而不是使用媒体查询。
@element
查询。W3C拥有有关@media
查询的押韵/原因的一些很好的文档:w3.org/TR/css3-mediaqueries/#width(此链接将您带到讨论宽度的部分---介质类型的宽度,而不是其中包含的元素)
我刚刚创建了一个JavaScript填充程序来实现此目标。如果需要,请看一下,这是一个概念证明,但请注意:这是一个早期版本,仍然需要一些工作。
min-width
更新哪些元素属性;我需要手动编写启用了min-width
续订的CSS类列表,标记的元素吗?
如@BoltClock在接受的答案中所写,当前仅靠CSS是不可能的,但是您可以使用JavaScript来解决。
我创建了一个容器查询(aka元素查询)prolyfill以解决此类问题。它的工作方式与其他脚本略有不同,因此您不必编辑元素的HTML代码。您所要做的就是包括脚本并在CSS中使用它,如下所示:
.element:container(width > 99px) {
/* If its container is at least 100px wide */
}
几年前,我遇到了同样的问题,并资助了一个插件的开发以帮助我的工作。我已将该插件作为开源发布,因此其他人也可以从中受益,您可以在Github上获取它: https //github.com/eqcss/eqcss
根据对页面元素的了解,可以采用几种方法来应用不同的响应样式。以下是EQCSS插件将允许您使用CSS编写的一些元素查询:
@element 'div' and (condition) {
$this {
/* Do something to the 'div' that meets the condition */
}
.other {
/* Also apply this CSS to .other when 'div' meets this condition */
}
}
那么,使用EQCSS支持响应样式的条件是什么?
px
%
px
%
px
%
px
%
在EQCSS元素查询中,您还可以使用三个特殊的选择器,这些选择器使您可以更具体地应用样式:
$this
(与查询匹配的元素)$parent
(与查询匹配的元素的父元素)$root
(文档的根元素<html>
)元素查询使您可以根据各个响应式设计模块来构成布局,每个模块对它们在页面上的显示方式都有一些“自我意识”。
使用EQCSS,您可以设计一个小部件,使其看起来从150像素宽一直到1000像素宽为止都不错,然后您可以放心地使用任何模板(在任何网站上)将该小部件拖放到任何页面的任何侧边栏中,并且
从布局的角度来看,可以使用现代技术。
它由Heydon Pickering组成(我相信)。他在这里详细介绍了该过程: http //www.heydonworks.com/article/the-flexbox-holy-albatross
克里斯·科耶尔(Chris Coyier)挑选了它,并在此处通过演示进行了工作:https : //css-tricks.com/putting-the-flexbox-albatross-to-real-use/
要重申的问题,下面我们看到同样的组件3,每个组成的标记三个橘的div a
,b
和c
。
后两个块垂直显示,因为它们限制在水平空间中,而顶部组件3块水平放置。
它使用flex-basis
CSS属性和CSS变量来创建此效果。
.panel{
display: flex;
flex-wrap: wrap;
border: 1px solid #f00;
$breakpoint: 600px;
--multiplier: calc( #{$breakpoint} - 100%);
.element{
min-width: 33%;
max-width: 100%;
flex-grow: 1;
flex-basis: calc( var(--multiplier) * 999 );
}
}
Heydon的文章用1000个单词详细解释,我强烈建议您阅读。
这个问题很模糊。正如BoltClock所说,媒体查询仅知道设备的尺寸。但是,您可以结合使用媒体查询和下降选择器来执行调整。
.wide_container { width: 50em }
.narrow_container { width: 20em }
.my_element { border: 1px solid }
@media (max-width: 30em) {
.wide_container .my_element {
color: blue;
}
.narrow_container .my_element {
color: red;
}
}
@media (max-width: 50em) {
.wide_container .my_element {
color: orange;
}
.narrow_container .my_element {
color: green;
}
}
唯一的其他解决方案需要JS。
我认为可以完全使用css完成您想要的事情的唯一方法是对部件使用可变的容器。如果容器的宽度是屏幕的百分比,那么您可以使用媒体查询来根据容器的宽度设置样式,因为您现在将知道每个屏幕的尺寸是什么。例如,假设您决定使容器的屏幕宽度为50%。然后对于1200px的屏幕宽度,您知道您的容器为600px
.myContainer {
width: 50%;
}
/* you know know that your container is 600px
* so you style accordingly
*/
@media (max-width: 1200px) {
/* your css for 600px container */
}
我也在考虑媒体查询,但是后来发现:
只需创建一个<div>
具有百分比值的包装器padding-bottom
,如下所示:
div {
width: 100%;
padding-bottom: 75%;
background:gold; /** <-- For the demo **/
}
<div></div>
它将导致<div>
高度等于其容器宽度的75%(长宽比为4:3)。
该技术还可以与媒体查询和有关页面布局的一些专门知识相结合,以实现更精细的控制。
足以满足我的需求。可能也足以满足您的需求。
您可以使用ResizeObserver API。它仍处于早期阶段,因此尚不被所有浏览器支持(但是可以使用多种polyfill来帮助您)。
基本上,此API允许您将事件侦听器附加到DOM元素的调整大小。
对于我来说,我是通过设置div的最大宽度来做到这一点的,因此对于小窗口小部件将不会受到影响,并且由于最大宽度样式,将对大窗口小部件进行调整大小。
// assuming your widget class is "widget"
.widget {
max-width: 100%;
height: auto;
}
.widget
只是小部件的div类的一个示例。