我正在开发一个项目,为网站提供一个强大的工具,大量使用jQuery。演示/设计是至关重要的,我想将浏览器应用的标准(丑陋)滚动条替换为具有溢出内容的html元素,具有更好的外观。
有许多jQuery插件可以应用自定义滚动条并允许通过CSS进行样式设置很棒,但是我尝试过的所有插件似乎都遇到了同样的问题:如果可滚动内容包含一个表单使用文本字段等,字段之间的选项卡不会激活滚动条,在某些情况下可能会完全搞砸自定义滚动条布局。
我尝试过两个插件示例:
http://manos.malihu.gr/jquery-custom-content-scroller http://baijs.nl/tinyscrollbar/
我也尝试了其他人,但在所有演示/示例中,内容都是纯文本。我已经对此进行了大量的搜索,但似乎没有人尝试过将这些插件用于基于表单的内容。
所有这些插件似乎都或多或少地以同样的方式工作,我可以确切地看到发生了什么以及为什么,但只是想知道是否有其他人遇到过这个问题和/或找到了解决方案?
此问题可以轻松复制如下(使用tinyscrollbar插件):
将其添加到标准的html测试页面 -
CSS:
<style>
#tinyscrollbartest { width: 520px; height: 250px; padding-right: 20px; background-color: #eee; }
#tinyscrollbartest .viewport { width: 500px; height: 200px; overflow: hidden; position: relative; }
#tinyscrollbartest .overview { list-style: none; position: absolute; left: 0; top: 0; }
#tinyscrollbartest .scrollbar { position: relative; float: right; width: 15px; }
#tinyscrollbartest .track { background: #d8eefd; height: 100%; width: 13px; position: relative; padding: 0 1px; }
#tinyscrollbartest .thumb { height: 20px; width: 13px; cursor: pointer; overflow: hidden; position: absolute; top: 0; }
#tinyscrollbartest .thumb .end { overflow: hidden; height: 5px; width: 13px; }
#tinyscrollbartest .thumb, #tinyscrollbartest .thumb .end { background-color: #003d5d; }
#tinyscrollbartest .disable { display: none; }
</style>
HTML:
<div id="tinyscrollbartest">
<div class="scrollbar">
<div class="track">
<div class="thumb">
<div class="end"></div>
</div>
</div>
</div>
<div class="viewport">
<div class="overview">
</p>Here's a text field: <input type="text"/><p>
...
// lots of content to force scrollbar to appear,
// and to push the next field out of sight ..
...
<p>Here's another field: <input type="text"/></p>
</div>
</div>
</div>
插件引用(假设还引用了jquery库等):
<script type="text/javascript" src="scripts/jquery.tinyscrollbar.min.js"></script>
Jquery代码:
<script type="text/javascript">
$(document).ready(function () {
$('#tinyscrollbartest').tinyscrollbar();
});
</script>
现在点击第一个文本字段,使其具有焦点,点击Tab键移动到下一个,看看会发生什么。
答案 0 :(得分:0)
我理解你的问题..但很难找到一个好的解决方案。您可以尝试在表单元素上设置焦点事件。并让此事件触发tinyscrollbar的scrollbar_update函数。您可以将当前具有焦点的表单元素的offsetTop设置为methods参数。我认为这样可行。
$( 'formelements')。对焦(函数(){ YourScrollbar.tinyscrollbar_update(this.offsetTop); });
答案 1 :(得分:0)
我不得不用自己的标签覆盖标准标签功能:
$(".scrollable").each(function() {
if (!$(this).data("scrollbar"))
{
$(this).data("scrollbar", new Scrollbar({
holder:$(this)
}));
$(this).find("input").bind("keydown", function(e)
{
var keyCode = e.keyCode || e.which;
if (keyCode == 9)
{
e.preventDefault();
var scrollTo = $(this);
if (e.shiftKey)
{
var nextInput = $(this).prevAll("input:not([type=hidden])").first();
scrollTo = nextInput.prevAll("input:not([type=hidden]), label").first();
}
else
{
var nextInput = $(this).nextAll("input:not([type=hidden])").first();
}
if (nextInput.length)
{
console.log(scrollTo);
$(this).closest(".scrollable").data("scrollbar").scrollTo(scrollTo, function()
{
nextInput.focus().select();
});
}
}
});
}
});
等待滚动有点烦人但我没有看到任何其他选项。