Làm cách nào để kiểm tra xem thanh cuộn có hiển thị không?


277

Có thể kiểm tra overflow:autodiv không?

Ví dụ:

HTML

<div id="my_div" style="width: 100px; height:100px; overflow:auto;" class="my_class"> 
  * content
</div>

YÊU CẦU

$('.my_class').live('hover', function (event)
{
    if (event.type == 'mouseenter')
    {
         if( ...  if scrollbar visible ? ... )
         {
            alert('true'):
         }
         else
         {
            alert('false'):
         }
    }

});

Đôi khi là nội dung ngắn (không có thanh cuộn) và đôi khi dài (hiển thị thanh cuộn).

Câu trả lời:


376

một plugin nhỏ cho nó

(function($) {
    $.fn.hasScrollBar = function() {
        return this.get(0).scrollHeight > this.height();
    }
})(jQuery);

sử dụng nó như thế này

$('#my_div1').hasScrollBar(); // returns true if there's a `vertical` scrollbar, false otherwise..

đã thử nghiệm làm việc trên Firefox, Chrome, IE6,7,8

nhưng không hoạt động đúng trên bodybộ chọn thẻ

bản giới thiệu


Biên tập

Tôi phát hiện ra rằng khi bạn có thanh cuộn ngang khiến thanh cuộn dọc xuất hiện, chức năng này không hoạt động ....

Tôi tìm ra một giải pháp khác ... sử dụng clientHeight

return this.get(0).scrollHeight > this.get(0).clientHeight;

22
Nếu bạn có phần đệm, bạn cần sử dụng > this.innerHeight(); jsfiddle.net/p3FFL/210
jcubic

2
Có một vấn đề với điều này, nếu một thanh cuộn ngang cũng tồn tại, thì điều này sẽ trả về sai ngay cả khi thanh cuộn dọc tồn tại cho đến khi chiều cao bị thu hẹp bởi chiều cao của thanh cuộn ngang.
minh

Tại sao bạn đã xác định cùng một chức năng hai lần? @jcubic
Nitin

8
Lưu ý rằng trên máy Mac, thanh cuộn trôi qua nội dung và biến mất khi không sử dụng. Trên Windows, nó luôn hiển thị và chiếm không gian ngang. Do đó, chỉ vì nội dung có thể được cuộn (mà chức năng này phát hiện) không có nghĩa là một thanh cuộn nhất thiết phải có mặt.
Andrew

2
(function ($) {$ .fn.hasScrollBar = function () {return this.get (0) .scrollWidth> this. thong); }}) (jQuery); cái này hoạt động cho lớp phủ ngoài. Tốt để kiểm tra phản ứng di động trên các trang web trong iframe.
Alexander Nicholas Popa

56

Có lẽ một giải pháp đơn giản hơn.

if ($(document).height() > $(window).height()) {
    // scrollbar
}

Câu trả lời này có hiệu quả với tôi sau khi kiểm tra xem DOM đã sẵn sàng sử dụng JQuery.ready()
Simple Sandman

4
Điều này giả sử thanh cuộn nằm trên cửa sổ chứ không phải phần tử div. Đề xuất thay đổi tham chiếu để đề xuất: "Nếu bạn chỉ cần kiểm tra thanh cuộn trên cửa sổ chính, bạn có thể thử:"
justdan23

43

Bạn có thể làm điều này bằng cách sử dụng kết hợp các thuộc tính Element.scrollHeightElement.clientHeight.

Theo MDN:

Các Element.scrollHeight read-only thuộc tính là một phép đo chiều cao của nội dung của một nguyên tố, trong đó có nội dung không hiển thị trên màn hình do tràn. Giá trị scrollHeight bằng với máy khách tối thiểu. Phần tử sẽ yêu cầu để phù hợp với tất cả nội dung trong quan điểm mà không cần sử dụng thanh cuộn dọc. Nó bao gồm phần tử đệm nhưng không phải phần lề của nó.

Và:

Các Element.clientHeight read-only lợi nhuận bất động sản chiều cao bên trong của một phần tử bằng pixel, bao gồm cả đệm nhưng không phải là chiều cao thanh cuộn ngang, biên giới, hoặc lợi nhuận.

clientHeight có thể được tính là chiều cao CSS + đệm CSS - chiều cao của thanh cuộn ngang (nếu có).

Do đó, phần tử sẽ hiển thị thanh cuộn nếu chiều cao cuộn lớn hơn chiều cao của máy khách, vì vậy câu trả lời cho câu hỏi của bạn là:

function scrollbarVisible(element) {
  return element.scrollHeight > element.clientHeight;
}

2
ví dụ: github.com/twbs/bootstrap/blob/master/js/modal.js#L242 và +1 cho trích dẫn và giải thích MDN!
lowTechsun

trong chrome nếu nội dung có đường viền hơn nó không được bao gồm trong scrollHeight
AT

1
Được bình chọn vì không bỏ qua và sử dụng khung / thư viện.
John

Cẩn thận - điều này gây ra một dòng chảy lại, đó là một cống hiệu suất. gist.github.com/paulirish/5d52fb081b3570c81e3a
Todd Sjolander

43

Tôi nên thay đổi một chút về những gì Reigel nói:

(function($) {
    $.fn.hasScrollBar = function() {
        return this[0] ? this[0].scrollHeight > this.innerHeight() : false;
    }
})(jQuery);

InternalHeight đếm chiều cao của điều khiển và phần đệm trên cùng và dưới cùng của nó


return (this.get (0))? this.get (0) .scrollHeight> this.innerHeight (): false;
phổ biến

3
Tôi nghĩ rằng điều này nên được chỉ định là câu trả lời đúng. Điều này hoạt động trên FF35, IE11 và Chrome39.
LucasBr 2/2/2015

Nó không kiểm tra giá trị 'tràn' để đảm bảo các thanh cuộn sẽ xuất hiện khi điều kiện cuộn đó được đáp ứng.
BT

1
@BT Nhưng nếu tôi có chế độ tràn được đặt thành tự động trong css của mình, thì tôi không cần kiểm tra thêm này? Nó so sánh kích thước và thế là đủ ...?
Andrew

Một câu trả lời chỉ có hiệu quả với bạn không phải là một câu trả lời .. làm thế nào để bạn biết những gì người khác có trong css của họ? Câu trả lời của bạn không đề cập đến giới hạn đó. Nếu ai đó không thể trả lời câu hỏi của bạn và làm cho nó hoạt động, đó không phải là một câu trả lời hay.
BT

27

Điều này mở rộng trên câu trả lời của @ Reigel. Nó sẽ trả về một câu trả lời cho thanh cuộn ngang hoặc dọc.

(function($) {
    $.fn.hasScrollBar = function() {
        var e = this.get(0);
        return {
            vertical: e.scrollHeight > e.clientHeight,
            horizontal: e.scrollWidth > e.clientWidth
        };
    }
})(jQuery);

Thí dụ:

element.hasScrollBar()             // Returns { vertical: true/false, horizontal: true/false }
element.hasScrollBar().vertical    // Returns true/false
element.hasScrollBar().horizontal  // Returns true/false


8

Tôi đã thực hiện một tùy chỉnh mới: bộ chọn giả cho jQuery để kiểm tra xem một mục có một trong các thuộc tính css sau không:

  1. tràn: [cuộn | tự động]
  2. tràn-x: [cuộn | tự động]
  3. tràn-y: [cuộn | tự động]

Tôi muốn tìm cha mẹ có thể cuộn gần nhất của một phần tử khác vì vậy tôi cũng đã viết một plugin jQuery nhỏ khác để tìm cha mẹ gần nhất có tràn.

Giải pháp này có thể không hoạt động tốt nhất, nhưng có vẻ như nó hoạt động. Tôi đã sử dụng nó cùng với plugin $ .scrollTo. Đôi khi tôi cần biết liệu một phần tử có nằm trong một thùng chứa có thể cuộn khác hay không. Trong trường hợp đó, tôi muốn cuộn phần tử cuộn cha mẹ so với cửa sổ.

Tôi có lẽ nên gói nó trong một plugin và thêm bộ chọn psuedo như một phần của plugin, cũng như hiển thị phương thức 'gần nhất' để tìm thùng chứa có thể cuộn (cha mẹ) gần nhất.

Dù sao đi nữa .... đây rồi.

$ .isScrollable plugin jQuery:

$.fn.isScrollable = function(){
    var elem = $(this);
    return (
    elem.css('overflow') == 'scroll'
        || elem.css('overflow') == 'auto'
        || elem.css('overflow-x') == 'scroll'
        || elem.css('overflow-x') == 'auto'
        || elem.css('overflow-y') == 'scroll'
        || elem.css('overflow-y') == 'auto'
    );
};

$ (': có thể cuộn') Bộ chọn giả jQuery:

$.expr[":"].scrollable = function(a) {
    var elem = $(a);
    return elem.isScrollable();
};

Trình cắm jQuery $ .scrollableparent ():

$.fn.scrollableparent = function(){
    return $(this).closest(':scrollable') || $(window); //default to $('html') instead?
};

Thực hiện khá đơn giản

//does a specific element have overflow scroll?
var somedivIsScrollable = $(this).isScrollable();
//use :scrollable psuedo selector to find a collection of child scrollable elements
var scrollableChildren = $(this).find(':scrollable');
//use $.scrollableparent to find closest scrollable container
var scrollableparent = $(this).scrollableparent();

CẬP NHẬT: Tôi thấy rằng Robert Koritnik đã đưa ra một công cụ chọn giả có thể cuộn mạnh hơn nhiều, sẽ xác định các trục có thể cuộn và chiều cao của các thùng chứa có thể cuộn, như là một phần của plugin jQuery .scrollintoview () của anh ấy. plugin scrollintoview

Đây là bộ chọn giả (đạo cụ) lạ mắt của anh ấy:

    $.extend($.expr[":"], {

    scrollable: function (element, index, meta, stack) {

        var direction = converter[typeof (meta[3]) === "string" && meta[3].toLowerCase()] || converter.both;

        var styles = (document.defaultView && document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(element, null) : element.currentStyle);

        var overflow = {

            x: scrollValue[styles.overflowX.toLowerCase()] || false,

            y: scrollValue[styles.overflowY.toLowerCase()] || false,

            isRoot: rootrx.test(element.nodeName)

        };



        // check if completely unscrollable (exclude HTML element because it's special)

        if (!overflow.x && !overflow.y && !overflow.isRoot)

        {

            return false;

        }



        var size = {

            height: {

                scroll: element.scrollHeight,

                client: element.clientHeight

            },

            width: {

                scroll: element.scrollWidth,

                client: element.clientWidth

            },

            // check overflow.x/y because iPad (and possibly other tablets) don't dislay scrollbars

            scrollableX: function () {

                return (overflow.x || overflow.isRoot) && this.width.scroll > this.width.client;

            },

            scrollableY: function () {

                return (overflow.y || overflow.isRoot) && this.height.scroll > this.height.client;

            }

        };

        return direction.y && size.scrollableY() || direction.x && size.scrollableX();

    }

});

6

Giải pháp đầu tiên ở trên chỉ hoạt động trong IE Giải pháp thứ hai ở trên chỉ hoạt động trong FF

Sự kết hợp của cả hai chức năng này hoạt động trong cả hai trình duyệt:

//Firefox Only!!
if ($(document).height() > $(window).height()) {
    // has scrollbar
    $("#mtc").addClass("AdjustOverflowWidth");
    alert('scrollbar present - Firefox');
} else {
    $("#mtc").removeClass("AdjustOverflowWidth");
}

//Internet Explorer Only!!
(function($) {
    $.fn.hasScrollBar = function() {
        return this.get(0).scrollHeight > this.innerHeight();
    }
})(jQuery);
if ($('#monitorWidth1').hasScrollBar()) {
    // has scrollbar
    $("#mtc").addClass("AdjustOverflowWidth");
    alert('scrollbar present - Internet Exploder');
} else {
    $("#mtc").removeClass("AdjustOverflowWidth");
}​
  • Gói trong một tài liệu đã sẵn sàng
  • MonitorWidth1: div nơi tràn được đặt thành tự động
  • mtc: một div container bên trong màn hìnhWidth1
  • Điều chỉnhOverflowWidth: một lớp css được áp dụng cho div #mtc khi Thanh cuộn đang hoạt động * Sử dụng cảnh báo để kiểm tra trình duyệt chéo, sau đó nhận xét về mã sản xuất cuối cùng.

HTH


6

(scrollWidth / Chiều cao - clientWidth / Chiều cao) là một chỉ báo tốt cho sự hiện diện của thanh cuộn, nhưng nó sẽ cho bạn câu trả lời "dương tính giả" trong nhiều trường hợp. Nếu bạn cần chính xác, tôi sẽ đề nghị sử dụng chức năng sau. thay vì cố gắng đoán xem phần tử có cuộn được không - bạn có thể cuộn nó ...

function isScrollable( el ){
  var y1 = el.scrollTop;
  el.scrollTop  += 1;
  var y2 = el.scrollTop;
  el.scrollTop  -= 1;
  var y3 = el.scrollTop;
  el.scrollTop   = y1;
  var x1 = el.scrollLeft;
  el.scrollLeft += 1;
  var x2 = el.scrollLeft;
  el.scrollLeft -= 1;
  var x3 = el.scrollLeft;
  el.scrollLeft  = x1;
  return {
    horizontallyScrollable: x1 !== x2 || x2 !== x3,
    verticallyScrollable: y1 !== y2 || y2 !== y3
  }
}
function check( id ){
  alert( JSON.stringify( isScrollable( document.getElementById( id ))));
}
#outer1, #outer2, #outer3 {
  background-color: pink;
  overflow: auto;
  float: left;
}
#inner {
  width:  150px;
  height: 150px;
}
button {  margin: 2em 0 0 1em; }
<div id="outer1" style="width: 100px; height: 100px;">
  <div id="inner">
    <button onclick="check('outer1')">check if<br>scrollable</button>
  </div>
</div>
<div id="outer2" style="width: 200px; height: 100px;">
  <div id="inner">
    <button onclick="check('outer2')">check if<br>scrollable</button>
  </div>
</div>
<div id="outer3" style="width: 100px; height: 180px;">
  <div id="inner">
    <button onclick="check('outer3')">check if<br>scrollable</button>
  </div>
</div>


Vào những dịp nào nó sẽ cho một dương tính giả?
GaloisGirl

5

Các câu trả lời của mọi người ở đây chưa đầy đủ, và hãy ngừng sử dụng jquery trong các câu trả lời SO. Kiểm tra tài liệu của jquery nếu bạn muốn biết thông tin về jquery.

Đây là một hàm javascript thuần túy tổng quát để kiểm tra xem một phần tử có thanh cuộn theo cách hoàn chỉnh hay không:

// dimension - Either 'y' or 'x'
// computedStyles - (Optional) Pass in the domNodes computed styles if you already have it (since I hear its somewhat expensive)
function hasScrollBars(domNode, dimension, computedStyles) {
    dimension = dimension.toUpperCase()
    if(dimension === 'Y') {
        var length = 'Height'
    } else {
        var length = 'Width'
    }

    var scrollLength = 'scroll'+length
    var clientLength = 'client'+length
    var overflowDimension = 'overflow'+dimension

    var hasVScroll = domNode[scrollLength] > domNode[clientLength]


    // Check the overflow and overflowY properties for "auto" and "visible" values
    var cStyle = computedStyles || getComputedStyle(domNode)
    return hasVScroll && (cStyle[overflowDimension] == "visible"
                         || cStyle[overflowDimension] == "auto"
                         )
          || cStyle[overflowDimension] == "scroll"
}

4
Tại sao tránh sử dụng jquery cho một câu hỏi được đặt ra là jquery? Vui lòng thêm liên kết đến một phần của tài liệu jquery mà bạn đề cập.
kpull1

6
@ kpull1 Quá nhiều người gắn thẻ jQuery trên mỗi câu hỏi javascript duy nhất họ có. Câu hỏi này có 0 liên quan đến jQuery. Có không có phần nào của tài liệu hướng dẫn jQuery có câu trả lời, bởi vì jQuery không làm điều này, và cũng không nên nó.
BT

4

Tôi sẽ mở rộng thêm về điều này hơn nữa cho những linh hồn nghèo khổ, giống như tôi, sử dụng một trong các khung js hiện đại chứ không phải JQuery và đã bị những người trong chuỗi này bỏ rơi hoàn toàn:

điều này đã được viết trong Angular 6 nhưng nếu bạn viết React 16, Vue 2, Polymer, Ionic, React-Native, bạn sẽ biết phải làm gì để điều chỉnh nó. Và đó là toàn bộ thành phần nên dễ dàng.

import {ElementRef, AfterViewInit} from '@angular/core';

@Component({
  selector: 'app',
  templateUrl: './app.html',
  styleUrls: ['./app.scss']
})
export class App implements AfterViewInit {
scrollAmount;

constructor(
  private fb: FormBuilder,
  private element: ElementRef 
) {}

ngAfterViewInit(){
  this.scrollAmount = this.element.nativeElement.querySelector('.elem-list');
  this.scrollAmount.addEventListener('wheel', e => { //you can put () instead of e
  // but e is usefull if you require the deltaY amount.
    if(this.scrollAmount.scrollHeight > this.scrollAmount.offsetHeight){
       // there is a scroll bar, do something!
    }else{
       // there is NO scroll bar, do something!
    }
  });
}
}

trong html sẽ có một div với lớp "elem-list" được cách điệu trong css hoặc scss để có một giá trị heightvà không có overflowgiá trị hidden. (nên autohoặc sroll)

Tôi kích hoạt eval này khi có sự kiện cuộn vì mục tiêu cuối cùng của tôi là có "cuộn lấy nét tự động" quyết định xem họ có cuộn toàn bộ bộ linh kiện theo chiều ngang hay không nếu các thành phần nói không có cuộn dọc có sẵn và nếu không chỉ cuộn phần bên trong của một trong các các thành phần theo chiều dọc.

nhưng bạn có thể đặt eval ở nơi khác để kích hoạt nó bằng thứ khác.

Điều quan trọng cần nhớ ở đây là bạn không bao giờ bị ép buộc sử dụng JQuery, luôn có cách để truy cập các chức năng tương tự mà không có nó.


1
Tò mò tại sao bạn đang lắng nghe các sự kiện bánh xe để kiểm tra xem có thanh cuộn hay không.
mix3d

3
Ngoài ra, vì bạn đang sử dụng các hàm mũi tên, thisgiữ phạm vi cha; th = this;là không cần thiết
mix3d

1
@ mix3d Cá nhân tôi sử dụng mã này để tự động chuyển đổi giữa cuộn ngang và cuộn dọc dựa trên đó có hướng cuộn tại phần tử nhọn đã cho là động
tatsu

1
Re: này; về cơ bản, đó là đường cú pháp (cộng với tốc ký tốt đẹp) chofunction(){}.bind(this)
mix3d

1

Đây là một phiên bản cải tiến của câu trả lời của Evan dường như giải thích chính xác cho logic tràn.

            function element_scrollbars(node) {
                var element = $(node);
                var overflow_x = element.css("overflow-x");
                var overflow_y = element.css("overflow-y");
                var overflow = element.css("overflow");
                if (overflow_x == "undefined") overflow_x == "";
                if (overflow_y == "undefined") overflow_y == "";
                if (overflow == "undefined") overflow == "";
                if (overflow_x == "") overflow_x = overflow;
                if (overflow_y == "") overflow_y = overflow;
                var scrollbar_vertical = (
                    (overflow_y == "scroll")
                    || (
                        (
                            (overflow_y == "hidden")
                            || (overflow_y == "visible")
                        )
                        && (
                            (node.scrollHeight > node.clientHeight)
                        )
                    )
                );
                var scrollbar_horizontal = (
                    (overflow_x == "scroll")
                    || (
                        (
                            (overflow_x == "hidden")
                            || (overflow_x == "visible")
                        )
                        && (
                            (node.scrollWidth > node.clientWidth)
                        )
                    )
                );
                return {
                    vertical: scrollbar_vertical,
                    horizontal: scrollbar_horizontal
                };
            }

1

Các giải pháp được cung cấp ở trên sẽ hoạt động trong hầu hết các trường hợp, nhưng kiểm tra cuộnHeight và tràn đôi khi không đủ và có thể thất bại đối với các phần tử cơ thể và html như được thấy ở đây: https://codepen.io/anon/pen/EvzXZw

1. Giải pháp - Kiểm tra xem phần tử có cuộn được không:

function isScrollableY (element) {
  return !!(element.scrollTop || (++element.scrollTop && element.scrollTop--));
}

Lưu ý: các phần tử overflow: hiddencũng được coi là có thể cuộn ( thêm thông tin ), vì vậy bạn cũng có thể thêm một điều kiện chống lại điều đó nếu cần:

function isScrollableY (element) {
    let style = window.getComputedStyle(element);
    return !!(element.scrollTop || (++element.scrollTop && element.scrollTop--)) 
           && style["overflow"] !== "hidden" && style["overflow-y"] !== "hidden";
}

Theo tôi biết phương pháp này chỉ thất bại nếu phần tử có scroll-behavior: smooth.

Giải thích: Thủ thuật là, nỗ lực cuộn xuống và hoàn nguyên nó sẽ không được trình duyệt hiển thị. Hàm trên cùng cũng có thể được viết như sau:

2. Giải pháp - Thực hiện tất cả các kiểm tra cần thiết:

function isScrollableY (element) {
  const style = window.getComputedStyle(element);

  if (element.scrollHeight > element.clientHeight &&
      style["overflow"] !== "hidden" && style["overflow-y"] !== "hidden" &&
      style["overflow"] !== "clip" && style["overflow-y"] !== "clip"
  ) {
    if (element === document.documentElement) return true;
    else if (style["overflow"] !== "visible" && style["overflow-y"] !== "visible") {
      // special check for body element (https://drafts.csswg.org/cssom-view/#potentially-scrollable)
      if (element === document.body) {
        const parentStyle = window.getComputedStyle(element.parentElement);
        if (parentStyle["overflow"] !== "visible" && parentStyle["overflow-y"] !== "visible" &&
            parentStyle["overflow"] !== "clip" && parentStyle["overflow-y"] !== "clip"
        ) {
          return true;
        }
      }
      else return true;
    }
  }

  return false;
}

0

Đây là cải tiến của tôi: thêm parseInt. vì một số lý do kỳ lạ, nó đã không hoạt động mà không có nó.

// usage: jQuery('#my_div1').hasVerticalScrollBar();
// Credit: http://stackoverflow.com/questions/4814398/how-can-i-check-if-a-scrollbar-is-visible
(function($) {
    $.fn.hasVerticalScrollBar = function() {
        return this.get(0) ? parseInt( this.get(0).scrollHeight ) > parseInt( this.innerHeight() ) : false;
    };
})(jQuery);

0

Hoạt động trên Chrome , Edge , FirefoxOpera , ít nhất là trong các phiên bản mới hơn.

Sử dụng JQuery ...

Thiết lập chức năng này để sửa chân trang:

function fixFooterCaller()
{
    const body = $('body');
    const footer = $('body footer');

    return function ()
    {
        // If the scroll bar is visible
        if ($(document).height() > $(window).height())
        {
            // Reset
            footer.css('position', 'inherit');
            // Erase the padding added in the above code
            body.css('padding-bottom', '0');
        }
        // If the scrollbar is NOT visible
        else
        {
            // Make it fixed at the bottom
            footer.css('position', 'fixed');
            // And put a padding to the body as the size of the footer
            // This makes the footer do not cover the content and when
            // it does, this event fix it
            body.css('padding-bottom', footer.outerHeight());
        }
    }
}

Nó trả về một hàm. Làm theo cách này chỉ để đặt cơ thể và chân trang một lần.

Và sau đó, thiết lập điều này khi tài liệu đã sẵn sàng.

$(document).ready(function ()
{
    const fixFooter = fixFooterCaller();

    // Put in a timeout call instead of just call the fixFooter function
    // to prevent the page elements needed don't be ready at this time
    setTimeout(fixFooter, 0);
    // The function must be called every time the window is resized
    $(window).resize(fixFooter);
});

Thêm phần này vào css chân trang của bạn:

footer {
    bottom: 0;
}

0

Hầu hết các câu trả lời được trình bày đã đưa tôi đến gần nơi tôi cần, nhưng không hoàn toàn ở đó.

Về cơ bản, chúng tôi muốn đánh giá xem các thanh cuộn - có thể nhìn thấy trong một tình huống bình thường hay không, theo định nghĩa đó có nghĩa là kích thước của phần tử cơ thể lớn hơn cổng xem. Đây không phải là một giải pháp được trình bày, đó là lý do tại sao tôi gửi nó.

Hy vọng nó sẽ giúp được ai đó!

(function($) {
    $.fn.hasScrollBar = function() {
        return this.get(0).scrollHeight > $(window).height();
    }
})(jQuery);

Về cơ bản, chúng ta có hasScrollbarchức năng, nhưng trả về nếu phần tử được yêu cầu lớn hơn cổng xem. Để xem kích thước cổng, chúng tôi chỉ sử dụng $(window).height(). So sánh nhanh so với kích thước phần tử, mang lại kết quả chính xác và hành vi mong muốn.


0

Tìm cha mẹ của phần tử hiện tại có cuộn dọc hoặc thân.

$.fn.scrollableParent = function() {
    var $parents = this.parents();

    var $scrollable = $parents.filter(function(idx) {
        return this.scrollHeight > this.offsetHeight && this.offsetWidth !== this.clientWidth;
    }).first();

    if ($scrollable.length === 0) {
        $scrollable = $('html, body');
    }
    return $scrollable;
};

Nó có thể được sử dụng để tự động ghi lại thành phần hiện tại thông qua:

var $scrollable = $elem.scrollableParent();
$scrollable.scrollTop($elem.position().top);

0

Phương pháp tiếp cận JavaScript không có khung, kiểm tra cả dọc và ngang

 /*
 * hasScrollBars
 * 
 * Checks to see if an element has scrollbars
 * 
 * @returns {object}
 */
Element.prototype.hasScrollBars = function() {
    return {"vertical": this.scrollHeight > this.style.height, "horizontal": this.scrollWidth > this.style.width};
}

Sử dụng nó như thế này

if(document.getElementsByTagName("body")[0].hasScrollBars().vertical){
            alert("vertical");
}

        if(document.getElementsByTagName("body")[0].hasScrollBars().horizontal){
            alert("horizontal");
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.