我有以下JQuery代码:
$(document).ready(function () {
var $containerHeight = $(window).height();
if ($containerHeight <= 818) {
$('.footer').css({
position: 'static',
bottom: 'auto',
left: 'auto'
});
}
if ($containerHeight > 819) {
$('.footer').css({
position: 'absolute',
bottom: '3px',
left: '0px'
});
}
});
唯一的问题是,这仅在浏览器首次加载时有效,我还要在调整窗口大小时检查containerHeight
吗?
有什么想法吗?
答案 0 :(得分:313)
以下是使用jQuery,javascript和css处理调整大小事件的示例。
(如果您只是在调整大小(媒体查询)时设置样式,那么你最好的选择)
http://jsfiddle.net/CoryDanielson/LAF4G/
.footer
{
/* default styles applied first */
}
@media screen and (min-height: 820px) /* height >= 820 px */
{
.footer {
position: absolute;
bottom: 3px;
left: 0px;
/* more styles */
}
}
window.onresize = function() {
if (window.innerHeight >= 820) { /* ... */ }
if (window.innerWidth <= 1280) { /* ... */ }
}
$(window).on('resize', function(){
var win = $(this); //this = window
if (win.height() >= 820) { /* ... */ }
if (win.width() >= 1280) { /* ... */ }
});
这是绑定到resize时您会注意到的第一个问题。当用户手动调整浏览器大小时,调整大小代码会被称为LOT,并且感觉非常笨拙。
要限制调整调整代码的频率,您可以使用debounce&amp;中的throttle或underscore方法。 lowdash个库。
debounce
只会在最后一次调整大小事件后的X个毫秒内执行调整大小代码。当您只想在用户调整浏览器大小后调用调整大小代码时,这是理想的选择。这对于更新每个调整大小事件可能都很昂贵的图形,图表和布局很有用。throttle
只会每X毫秒执行一次调整大小代码。它“限制”代码被调用的频率。这不经常用于调整大小事件,但值得注意。如果您没有下划线或低位,您可以自己实施类似的解决方案: JavaScript/JQuery: $(window).resize how to fire AFTER the resize is completed?
答案 1 :(得分:54)
将您的javascript移动到一个函数中,然后将该函数绑定到窗口调整大小。
$(document).ready(function () {
updateContainer();
$(window).resize(function() {
updateContainer();
});
});
function updateContainer() {
var $containerHeight = $(window).height();
if ($containerHeight <= 818) {
$('.footer').css({
position: 'static',
bottom: 'auto',
left: 'auto'
});
}
if ($containerHeight > 819) {
$('.footer').css({
position: 'absolute',
bottom: '3px',
left: '0px'
});
}
}
答案 2 :(得分:9)
jQuery有一个resize事件处理程序,您可以将其附加到窗口.resize()。因此,如果您放置$(window).resize(function(){/* YOUR CODE HERE */})
,那么每次调整窗口大小时都会运行您的代码。
所以,你想要的是在第一次加载页面后以及调整窗口大小时运行代码。因此,您应该将代码拉入自己的函数并在两个实例中运行该函数。
// This function positions the footer based on window size
function positionFooter(){
var $containerHeight = $(window).height();
if ($containerHeight <= 818) {
$('.footer').css({
position: 'static',
bottom: 'auto',
left: 'auto'
});
}
else {
$('.footer').css({
position: 'absolute',
bottom: '3px',
left: '0px'
});
}
}
$(document).ready(function () {
positionFooter();//run when page first loads
});
$(window).resize(function () {
positionFooter();//run on every window resize
});
答案 3 :(得分:8)
试试这个解决方案。仅在页面加载后触发,然后在窗口调整大小时以预定义的resizeDelay
激活。
$(document).ready(function()
{
var resizeDelay = 200;
var doResize = true;
var resizer = function () {
if (doResize) {
//your code that needs to be executed goes here
doResize = false;
}
};
var resizerInterval = setInterval(resizer, resizeDelay);
resizer();
$(window).resize(function() {
doResize = true;
});
});
答案 4 :(得分:4)
答案 5 :(得分:3)
也可以使用它
function getWindowSize()
{
var fontSize = parseInt($("body").css("fontSize"), 10);
var h = ($(window).height() / fontSize).toFixed(4);
var w = ($(window).width() / fontSize).toFixed(4);
var size = {
"height": h
,"width": w
};
return size;
}
function startResizeObserver()
{
//---------------------
var colFunc = {
"f10" : function(){ alert(10); }
,"f50" : function(){ alert(50); }
,"f100" : function(){ alert(100); }
,"f500" : function(){ alert(500); }
,"f1000" : function(){ alert(1000);}
};
//---------------------
$(window).resize(function() {
var sz = getWindowSize();
if(sz.width > 10){colFunc['f10']();}
if(sz.width > 50){colFunc['f50']();}
if(sz.width > 100){colFunc['f100']();}
if(sz.width > 500){colFunc['f500']();}
if(sz.width > 1000){colFunc['f1000']();}
});
}
$(document).ready(function()
{
startResizeObserver();
});
答案 6 :(得分:3)
function myResizeFunction() {
...
}
$(function() {
$(window).resize(myResizeFunction).trigger('resize');
});
这将导致调整大小处理程序在窗口调整大小和文档就绪时触发。当然,如果希望.trigger('resize')
在页面加载时运行,可以在文档就绪处理程序之外附加调整大小处理程序。
更新:如果您不想使用任何其他第三方库,这是另一种选择。
此技术为您的目标元素添加了一个特定的类,因此您可以通过CSS控制样式(并避免内联样式)。
它还确保仅在触发实际阈值点时添加或删除类,而不是在每次调整大小时。它仅在一个阈值点触发:当高度从&lt; = 818变为&gt;时819或反之亦然,而不是每个区域内多次。它不关心 width 的任何变化。
function myResizeFunction() {
var $window = $(this),
height = Math.ceil($window.height()),
previousHeight = $window.data('previousHeight');
if (height !== previousHeight) {
if (height < 819)
previousHeight >= 819 && $('.footer').removeClass('hgte819');
else if (!previousHeight || previousHeight < 819)
$('.footer').addClass('hgte819');
$window.data('previousHeight', height);
}
}
$(function() {
$(window).on('resize.optionalNamespace', myResizeFunction).triggerHandler('resize.optionalNamespace');
});
例如,您可能会将以下内容作为一些CSS规则:
.footer {
bottom: auto;
left: auto;
position: static;
}
.footer.hgte819 {
bottom: 3px;
left: 0;
position: absolute;
}
答案 7 :(得分:2)
使用此:
window.onresize = function(event) {
...
}
答案 8 :(得分:1)
您可以使用.resize()
绑定resize
并在调整浏览器大小时运行代码。您还需要在else
语句中添加if
条件,以便您的css值切换旧的和新的,而不是仅设置新的。