前段时间我在stackoverflow上找到了以下脚本,它似乎运行良好...对于初始页面加载,但我需要以某种方式使这更具响应性。当浏览器改变大小并在页面加载后出现div时,我需要以某种方式触发它。基本上"生活"并在需要时一直开火。我试过调整它但总是失败。我还需要两个不同的目标div。任何提示非常感谢:)
(function($) {
$.fn.has_scrollbar = function() {
var divnode = this.get(0);
if(divnode.scrollHeight > divnode.clientHeight)
return true;
}
})(jQuery);
example:
if($('#scrollable').has_scrollbar()) { $("#scrollable").css({"width":"97%"});
}
更新:
这非常接近工作,如果滚动条消失,我需要一种撤消宽度调整的方法。 if / else语句是否会这样做,或者我需要一个新函数来检测是否存在滚动条,然后运行一个新的document.ready包装器说#xxx width 100%?
function bindHasScrollbar() {
(function($) {
$.fn.has_scrollbar = function() {
var divnode = this.get(0);
if(divnode.scrollHeight > divnode.clientHeight)
return true;
}
})(jQuery);
}
$(document).ready(function() {
// Initial
bindHasScrollbar();
$("#story").css({"width":"97%"});
$("#minigallery").css({"width":"97%"});
// Refresh
$(window).resize(function() {
bindHasScrollbar();
$("#story").css({"width":"97%"});
$("#minigallery").css({"width":"97%"});
});
});
答案 0 :(得分:1)
制作包装器最简单,因此您可以动态重新绑定您的函数。我现在无法测试,但这个想法是正确的:
function bindHasScrollbar() {
(function($) {
$.fn.has_scrollbar = function() {
var divnode = this.get(0);
if(divnode.scrollHeight > divnode.clientHeight)
return true;
}
})(jQuery);
}
$(document).ready(function() {
// Initial
bindHasScrollbar();
// Refresh
$(window).resize(function() {
bindHasScrollbar();
});
});
答案 1 :(得分:0)
我建议使用live extensions来解决此类问题。看看"元素媒体查询"来自article的部分。
答案 2 :(得分:0)
检测滚动条更改(clientHeight / clientWidth与scrollHeight / scrollWidth的更改)是没有" direct"解。 solution有助于检测容器调整大小,但是,它很丑陋。
最好的crossbrowser解决方案是每隔300-500毫秒用setInterval检查容器大小的变化。使用这种方式你应该记住最后的高度/宽度,并在高度或宽度改变时重新检查容器滚动条,因为以这个小间隔运行的函数应该尽可能少地执行代码。
更好的方法是将MutationObserver用于现代浏览器(以及旧版本的间隔)。我还没有检查过这种方式,但我希望在对它进行研究后,它将帮助我完成自己的任务。
如果你只想隐藏垂直滚动条 - 即使它是可见的也不要显示它,你可以使用下一个技术:用overflow:hidden
将容器包装到另一个容器中,但没有高度/宽度,设置内部容器overflow-y:scroll
始终显示垂直滚动条,margin-right:-17px
使滚动条不在父容器中,滚动条将被隐藏。请注意,滚动条宽度可能因您使用的浏览器而异,因此您必须以某种方式检测它。但这是另一个问题。此外,滚动条宽度取决于缩放级别,这不太重要。