Javascript 浮动div-可变高度和可变列-无间隙
我已使用小提琴进行了更新,请参见底部 我正在开发一个wordpress主题,用于iphone、iPad和其他webkit设备 我正在使用媒体查询根据设备的大小和方向更改div的宽度 但是,这些div向左浮动,以填充设备屏幕 我的问题是浮动div的高度是可变的。而高于一些的div导致了浮动元素的差距问题 我需要一个可能的修复建议,这样就永远不会有任何间隙,元素总是浮动的,即使它的路径中有一个更高的div 是否有一种可能的方法将div高度均衡到最高div,唯一的问题是它需要在iPad上改变方向。在iPhone上也没那么糟糕,因为只有一列。但在iPad上,肖像有2列,风景有3列 请参见下面的图表解释我的问题。Javascript 浮动div-可变高度和可变列-无间隙,javascript,css,dynamic,css-float,orientation,Javascript,Css,Dynamic,Css Float,Orientation,我已使用小提琴进行了更新,请参见底部 我正在开发一个wordpress主题,用于iphone、iPad和其他webkit设备 我正在使用媒体查询根据设备的大小和方向更改div的宽度 但是,这些div向左浮动,以填充设备屏幕 我的问题是浮动div的高度是可变的。而高于一些的div导致了浮动元素的差距问题 我需要一个可能的修复建议,这样就永远不会有任何间隙,元素总是浮动的,即使它的路径中有一个更高的div 是否有一种可能的方法将div高度均衡到最高div,唯一的问题是它需要在iPad上改变方向。在i
当前CSS
/* GLOBAL STYLE ( which iPhone uses first - 1 column ) ----------- */
.module {
display: block;
overflow: hidden;
width: 100%;
float: left;
}
/* IPADS (PORTRAIT - 2 column ) ----------- */
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : portrait) {
.module {
width: 50%;
}
}
/* IPADS (LANDSCAPE - 3 Column ) ----------- */
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : landscape) {
.module {
width: 33.33%;
}
}
基本标记
<div>
<div class="module"></div>
<div class="module"></div>
<div class="module"></div>
<div class="module"></div>
<div class="module"></div>
<div class="module"></div>
<div class="module"></div>
<div class="module"></div>
<div class="module"></div>
<div class="module"></div>
</div>
下面的小提琴模拟iPad(纵向)两列 请参见样式
.module
-宽度:50%
,它模拟了此@media查询的外观
@media only screen
and (min-device-width : 320px)
and (max-device-width : 480px)
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : portrait) {
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : landscape) {
下面的提琴模拟iPad(横向)-三列 请参见样式
.module
-宽度:33.33%
,它模拟了此@media查询的外观
@media only screen
and (min-device-width : 320px)
and (max-device-width : 480px)
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : portrait) {
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : landscape) {
这不能简单地通过浮动来解决-唯一的选择是使所有这些模块的大小相同(或为较小的模块添加一些余量)您可以使用JavaScript将所有模块的高度设置为相等 这是缩小的jQuery插件:
(function(a){a.fn.equalHeight=function(){var b=0;this.each(function(){var c=a(this).height();c>b&&(b=c)});this.each(function(){a(this).height(b)})}})($);
您可以这样使用:
$('#modules').children().equalHeight();
另一个好的解决方案是CSS显示表。看看这篇文章:就像我在评论中说的那样,你需要用javascript计算,并使用绝对定位。以下是一个例子:
//为每个模块生成随机高度,通常不需要这样做,因为
//在一个真正的应用程序中,它们有各种各样的内容。
$(“.module”)。每个(函数(i){
变量高度=(150+(Math.random()*100 | 0));
this.style.height=高度+px;
});
$(窗口)。绑定(“方向更改大小”,函数(e){
变量模块=$(“.module”),
columnWidth=模块[0]。偏移网络宽度,
保证金=10,
parentWidth=$(“.modules”).width(),
拟合=数学地板(parentWidth/(columnWidth+边距*2)),
columnHeights={},
我
对于(i=0;i
您需要绝对定位它们,并使用javascript手动计算位置。请看,它使用javascript来适应所有框(如果快速滚动,很容易看到,那么新框将不会立即出现)-它填充列,而不是我在DOM中假设的行,它们使用position:absolute是的,我看到了,但可能@Esailija方法也在做类似的事情,但是当我将position absolute添加到.module div中时,我的containing div callapses to nothing(如果您将任何内容定位为绝对值,它会这样做)Esalija和Eliseu方法都使用脚本来适应它——这是唯一的替代解决方案。但最稳定的解决方案是简单地使所有高度相同,这样它就会浮动。Position absolute会导致以百分比为单位的宽度出现一些滞后。另一种解决方案是使用javascript(使用removeChild/appendChild)创建列并填充它们。尝试过这种方法后,效果不错,但在方向上出现了问题。猜测,因为这与dom有关。无论如何谢谢你什么意思?方向改变事件?试试这个(jQ 1.7+,对其他人使用.bind):$(document).on('orientationchange',function(){$('#modules').children().equalHeight();})@媒体方向-好的,我将开始。$(窗口)。绑定(“方向更改调整大小”,函数(e){$('#模块')。子对象()。相等高度();})。触发器(“调整大小”);我已经试过了,但是在方向改变时,它没有更新,它使用了页面加载的原始高度。感谢您花时间做了一个JSFIDLE。虽然一旦我将position absolute添加到.module中,我的contain div就会崩溃。如果我真的成功了,你认为它会在@media-orientation(从横向到纵向)上起作用吗?我的包含div的宽度是100%,768px可能导致它无法工作。@user801773要做到这一点,您需要对javascript中的方向动态做出反应(“onorientationchange”
,“onresize”
),并重新计算和重新定位javascript中的所有内容(以及模块容器)。具有100%
宽度的父项不是问题,您只需要在每次发生更改时动态检索父项宽度。在本例中,它被设置为static768
,但我也可以设置parentDiv.offsetWidth
。使用positionabsolute
,所有位置计算都留给您,css不会为您做任何事情。这对我来说很棘手,我会尝试并坚持下去。奇怪的是,这么简单的东西怎么用CSS解决不了。我正在努力改变javascript的方向,当然javascript的方向改变必须重新加载页面才能进行必要的DOM改变,不是吗?CSS@media-orientations对我来说要简单得多,而且是webkit的充分证明:/@user801773不,它们不需要pagerelo