左侧的 DIV 垂直滚动条

IT技术 javascript html css
2021-02-21 08:09:25

是否可以使用 css 将 DIV 的垂直滚动条放在 div 的左侧?jscript呢?

3个回答

我有一个简单的用例,所以选择了一个简单的 css 解决方案:

<div style="direction: rtl; height: 250px; overflow: scroll;">
  <div style="direction: ltr; padding: 3px;">
     Content goes here
  </div>
</div>
很棒,但它似乎不适用于 Safari(现在在 Safari 5.1.7 上测试它并且滚动条在右侧)。
2021-05-13 08:09:25

你可以使用JQuery和这个插件在任何你想要的地方添加一个伪滚动条JScrollPane

jQuery 在这里不是强制性的。在开始之前,请查看 latkinson 的纯 CSS 解决方案(就在下面)
2021-05-07 08:09:25

好的,所以,我写了一个 jQuery 插件来给你一个完全原生的左滚动条。

左滚动条黑客演示

这是它的工作原理:

  1. div在窗格内注入一个内部以允许计算内容宽度 ( content_width)。然后,使用该,天然滚动条宽度可以这样计算:scrollbar_width = parent_width - content_width - horizontal_padding

  2. divs在窗格内制作两个不同的,都填充了内容。

    • 一个人的目的是成为一个“伪装者”。用于滚动条。使用负的左边距,插件将其向左拉,以便只有滚动条在视图中(其内容div在边缘被剪掉)。

    • 另一个div用于实际容纳可见的滚动内容。

  3. 现在,是时候将两者结合在一起了。每 50 毫秒 ( window.setInterval),scrollTop从“装腔作势”偏移量div应用于可见的滚动内容div因此,当您使用左侧的滚动条向上或向下滚动时,滚动偏移会重新应用div到可见内容上。

这个解释可能很糟糕,实际上还有很多我没有描述的,但是,不用多说,这里是:

$.fn.leftScrollbar = function(){
    var items = $(this);
    $(function(){
        items.each(function(){
            var e = $(this);
            var content = e.html();
            var ie = !jQuery.support.boxModel;
            var w = e[ie?'innerWidth':'width'](), h = e[ie?'innerHeight':'height']();
            //calculate paddings
            var pad = {};
            $(['top', 'right', 'bottom', 'left']).each(function(i, side){
                pad[side] = parseInt(e.css('padding-' + side).replace('px',''));
            });
            //detect scrollbar width
            var xfill = $('<div>').css({margin:0, padding:0, height:'1px'});
            e.append(xfill);
            var contentWidth = xfill.width();
            var scrollerWidth = e.innerWidth() - contentWidth - pad.left - pad.right;
            e.html('').css({overflow:'hidden'});
            e.css('padding', '0');

            var poserHeight = h - pad.top - pad.bottom;
            var poser = $('<div>')
                .html('<div style="visibility:hidden">'+content+'</div>')
                .css({
                    marginLeft: -w+scrollerWidth-(ie?0:pad.left*2),
                    overflow: 'auto'
                })
                .height(poserHeight+(ie?pad.top+pad.bottom:0))
                .width(w);

            var pane = $('<div>').html(content).css({
                width: w-scrollerWidth-(ie?0:pad.right+pad.left),
                height: h-(ie?0:pad.bottom+pad.top),
                overflow: 'hidden',
                marginTop: -poserHeight-pad.top*2,
                marginLeft: scrollerWidth
            });

            $(['top', 'right', 'bottom', 'left']).each(function(i, side){
                 poser.css('padding-'+side, pad[side]);
                 pane.css('padding-'+side, pad[side]);
            });
            e.append(poser).append(pane);

            var hRatio = (pane.innerHeight()+pad.bottom) / poser.innerHeight();
            window.setInterval(function(){
                pane.scrollTop(poser.scrollTop()*hRatio);
            }, 50);
        });
    });
};

在页面中包含 jQuery 和此插件后,应用左侧滚动条:

$('#scrollme').leftScrollbar();

#scrollmeCSS 选择器替换为您希望应用左滚动条的元素。

(而且,显然,这会很好地降级)

您应该考虑使用jsfiddleCodepen(或任何类似这两个服务)来展示演示。如前所述,考虑到 latkinson 的纯 CSS 解决方案,这里实际上不需要 jquery。在 jquery 中重建滚动条或其他原生 UI 项显然是一种矫枉过正。
2021-04-17 08:09:25
代替 setInterval,尝试为 DOMAttrModified(或 IE 的 onpropertychange 事件)添加事件侦听器
2021-04-20 08:09:25
@jcm:固定!对于那个很抱歉。
2021-04-23 08:09:25
我会在一天左右的时间里做一个演示......努力建立我的博客。
2021-04-29 08:09:25
@Gfra54 谢谢你的智慧——这是 2009 年的
2021-05-17 08:09:25