2

我正在开发一个为网站提供附加工具的项目,该工具大量使用了 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 键移动到下一个,看看会发生什么。

4

2 回答 2

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();
            });
          }
        }
      }); 
    }
  });

不得不等待滚动有点烦人,但我没有看到任何其他选择。

于 2012-05-01T17:46:46.237 回答
0

我理解你的问题..但是很难找到一个好的解决方案。您可以尝试在表单元素上设置焦点事件。并让这个事件触发tinyscrollbar的scrollbar_update函数。您可以将当前具有焦点的表单元素的 offsetTop 设置为方法参数。我认为那会奏效。

$('formelements').focus(function(){ YourScrollbar.tinyscrollbar_update(this.offsetTop); });

于 2011-08-18T09:50:45.030 回答