ฉันจะตรวจสอบว่าแถบเลื่อนปรากฏหรือไม่


277

เป็นไปได้หรือไม่ที่จะตรวจสอบกองoverflow:autoการ?

ตัวอย่างเช่น:

HTML

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

jQuery

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

});

บางครั้งเนื้อหาสั้น (ไม่มีแถบเลื่อน) และบางครั้งก็ยาว (มองเห็นแถบเลื่อน)

คำตอบ:


376

ปลั๊กอินเล็กน้อยสำหรับมัน

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

ใช้มันแบบนี้

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

ผ่านการทดสอบการทำงานกับ Firefox, Chrome, IE6,7,8

แต่ทำงานไม่ถูกต้องบนbodyตัวเลือกแท็ก

การสาธิต


แก้ไข

ฉันพบว่าเมื่อคุณมีแถบเลื่อนแนวนอนที่ทำให้แถบเลื่อนแนวตั้งปรากฏขึ้นฟังก์ชันนี้จะไม่ทำงาน ....

ฉันพบวิธีแก้ไขปัญหาอื่น ... ใช้งาน clientHeight

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

22
หากคุณมีช่องว่างภายในคุณต้องใช้> this.innerHeight(); jsfiddle.net/p3FFL/210
jcubic

2
มีปัญหากับสิ่งนี้หากแถบเลื่อนแนวนอนมีอยู่แล้วสิ่งนี้จะส่งคืนค่าเท็จแม้ว่าจะมีแถบเลื่อนแนวตั้งอยู่จนกระทั่งความสูงลดลงตามความสูงของแถบเลื่อนแนวนอน
พันธมิตร

ทำไมคุณนิยามฟังก์ชั่นเดียวกันสองครั้ง? @jcubic
Nitin Sawant

9
โปรดทราบว่าใน Macs แถบเลื่อนจะลอยอยู่เหนือเนื้อหาและจะหายไปเมื่อไม่ได้ใช้งาน บน Windows จะมองเห็นได้เสมอและกินพื้นที่แนวนอน ดังนั้นเนื่องจากสามารถเลื่อนเนื้อหา (ซึ่งฟังก์ชันนี้ตรวจพบ) ไม่ได้หมายความว่าจำเป็นต้องมีแถบเลื่อน
แอนดรู

2
(function ($) {$ .fn.hasScrollBar = function () {return this.get (0) .scrollWidth> this.width); }}) (jQuery); มันใช้ได้กับแนวราบ ดีสำหรับการตรวจสอบการตอบสนองผ่านมือถือในเว็บไซต์ใน iframes
Alexander Nicholas Popa

57

อาจเป็นทางออกที่ง่ายขึ้น

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

คำตอบนี้ใช้ได้สำหรับฉันหลังจากตรวจสอบว่า DOM พร้อมใช้JQuery.ready()
Simple Sandman

4
นี่ถือว่าแถบเลื่อนอยู่บนหน้าต่างไม่ใช่องค์ประกอบ div เสนอการเปลี่ยนแปลงการอ้างอิงเพื่อแนะนำ: "หากคุณเพียงต้องการทดสอบแถบเลื่อนในหน้าต่างหลักคุณสามารถลอง:"
justdan23 23

43

คุณสามารถทำได้โดยใช้การรวมกันของElement.scrollHeightและElement.clientHeightคุณสมบัติ

ตาม MDN:

Element.scrollHeightอ่านอย่างเดียวแอตทริบิวต์คือการวัดความสูงของเนื้อหาองค์ประกอบรวมทั้งเนื้อหาที่ไม่สามารถมองเห็นบนหน้าจอเนื่องจากล้น ค่า scrollHeight เท่ากับ clientHeight ต่ำสุดที่องค์ประกอบจะต้องมีเพื่อให้พอดีกับเนื้อหาทั้งหมดในมุมมองโดยไม่ต้องใช้แถบเลื่อนแนวตั้ง มันรวมถึงการเติมองค์ประกอบ แต่ไม่ได้กำไร

และ:

คุณสมบัติElement.clientHeight แบบอ่านอย่างเดียวส่งคืนความสูงด้านในขององค์ประกอบเป็นพิกเซลรวมถึงการขยาย แต่ไม่ใช่ความสูงของแถบเลื่อนแนวนอนชายแดนหรือระยะขอบ

clientHeight สามารถคำนวณได้เป็นความสูงของ CSS + การเติม CSS - ความสูงของแถบเลื่อนแนวนอน (ถ้ามี)

ดังนั้นองค์ประกอบจะแสดงแถบเลื่อนถ้าความสูงเลื่อนมากกว่าความสูงของไคลเอ็นต์ดังนั้นคำตอบสำหรับคำถามของคุณคือ:

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

2
ตัวอย่าง: github.com/twbs/bootstrap/blob/master/js/modal.js#L242และ +1 สำหรับคำพูดและคำอธิบายของ MDN!
lowtechsun

ใน chrome หากเนื้อหามีเส้นขอบมากกว่าเนื้อหาที่ไม่รวมอยู่ใน scrollHeight
AT

1
โหวตขึ้นเพื่อไม่ออกและใช้เฟรมเวิร์ก / ไลบรารี
จอห์น

ระวัง - สิ่งนี้ทำให้เกิดการ reflow ซึ่งเป็นตัวระบายประสิทธิภาพ gist.github.com/paulirish/5d52fb081b3570c81e3a
Todd Sjolander

43

ฉันควรเปลี่ยนสิ่งเล็ก ๆ น้อย ๆ ในสิ่งที่ Reigel พูด:

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

innerHeight นับความสูงของตัวควบคุมและการเสริมด้านบนและด้านล่าง


return (this.get (0))? this.get (0) .scrollHeight> this.innerHeight (): false;
commonpike

3
ฉันคิดว่านี่ควรได้รับมอบหมายเป็นคำตอบที่ถูกต้อง สิ่งนี้ใช้ได้กับ FF35, IE11 และ Chrome39
LucasBr

ไม่ได้ตรวจสอบค่า 'ล้น' เพื่อให้แน่ใจว่าแถบเลื่อนจะปรากฏขึ้นเมื่อเงื่อนไข scrollHeight ตรงตามเงื่อนไข
BT

1
@BT แต่ถ้าฉันตั้งค่ามากเกินไปเป็น auto ใน css ของฉันฉันไม่ต้องการการตรวจสอบพิเศษนี้อีกเหรอ? มันเปรียบเทียบขนาดแล้วก็เพียงพอแล้ว ...
Andrew

คำตอบที่เหมาะกับคุณเท่านั้นไม่ใช่คำตอบ .. คุณจะรู้ได้อย่างไรว่าคนอื่นมีอะไรใน css ของพวกเขา คำตอบของคุณไม่ได้กล่าวถึงข้อ จำกัด นั้น หากใครบางคนไม่สามารถตอบคำถามของคุณและทำงานได้มันไม่ใช่คำตอบที่ดี
BT

27

นี่เป็นการขยายคำตอบของ @ Reigel มันจะกลับคำตอบสำหรับแถบเลื่อนแนวนอนหรือแนวตั้ง

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

ตัวอย่าง:

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


8

ฉันสร้าง custom ใหม่: pseudo selector สำหรับ jQuery เพื่อทดสอบว่ารายการมีคุณสมบัติ css อย่างใดอย่างหนึ่งต่อไปนี้หรือไม่:

  1. ล้น: [เลื่อน | อัตโนมัติ]
  2. overflow-x: [เลื่อน | อัตโนมัติ]
  3. ล้น - y: [เลื่อน | อัตโนมัติ]

ฉันต้องการค้นหาพาเรนต์ที่เลื่อนได้ใกล้เคียงที่สุดขององค์ประกอบอื่นดังนั้นฉันจึงเขียนปลั๊กอิน jQuery ตัวเล็ก ๆ อีกหนึ่งตัวเพื่อค้นหาพาเรนต์ที่ใกล้เคียงที่สุดที่มีโอเวอร์โฟลว์

วิธีนี้อาจไม่ได้ผลดีที่สุด แต่ก็ใช้งานได้ดี ฉันใช้ร่วมกับปลั๊กอิน $ .scrollTo บางครั้งฉันจำเป็นต้องรู้ว่าองค์ประกอบอยู่ในคอนเทนเนอร์เลื่อนได้อื่นหรือไม่ ในกรณีนั้นฉันต้องการเลื่อนองค์ประกอบที่สามารถเลื่อนได้หลักกับหน้าต่าง

ฉันน่าจะสรุปได้ในปลั๊กอินเดียวและเพิ่มตัวเลือก psuedo เป็นส่วนหนึ่งของปลั๊กอินเช่นเดียวกับการเปิดเผยวิธี 'ใกล้เคียง' เพื่อค้นหาคอนเทนเนอร์ที่เลื่อนได้ (แม่) ที่ใกล้เคียงที่สุด

เอาล่ะ .... นี่ไง

$ .isScrollable 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'
    );
};

$ (': เลื่อนได้') ตัวเลือกหลอก jQuery:

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

$ .scrollableparent () ปลั๊กอิน jQuery:

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

การติดตั้งใช้งานง่าย

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

UPDATE:ฉันพบว่า Robert Koritnik มีตัวเลือกที่มีประสิทธิภาพมากขึ้น: ตัวเลือกหลอกแบบเลื่อนได้ที่จะระบุแกนเลื่อนและความสูงของคอนเทนเนอร์แบบเลื่อนได้ซึ่งเป็นส่วนหนึ่งของปลั๊กอิน $ .scrollintoview () jQuery ของเขา ปลั๊กอินเลื่อนมุมมอง

นี่คือตัวเลือกหลอกหลอกของเขา (อุปกรณ์ประกอบฉาก):

    $.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

วิธีแก้ปัญหาแรกข้างต้นใช้งานได้เฉพาะใน IE โซลูชันที่สองด้านบนใช้งานได้เฉพาะใน FF

การรวมกันของฟังก์ชั่นทั้งสองนี้ทำงานในเบราว์เซอร์ทั้งสอง:

//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");
}​
  • ห่อในเอกสารพร้อม
  • monitorWidth1: div ที่โอเวอร์โฟลว์ถูกตั้งค่าเป็น auto
  • mtc: div คอนเทนเนอร์ภายใน monitorWidth1
  • AdjustOverflowWidth: คลาส css ที่ใช้กับ #mtc div เมื่อใช้งาน Scrollbar * ใช้การแจ้งเตือนเพื่อทดสอบเบราว์เซอร์ข้ามจากนั้นใส่เครื่องหมายความคิดเห็นสำหรับรหัสการผลิตขั้นสุดท้าย

HTH


6

(scrollWidth / Height - clientWidth / Height) เป็นตัวบ่งชี้ที่ดีสำหรับแถบเลื่อน แต่มันจะให้คำตอบที่ "ผิดพลาด" ในหลายโอกาส หากคุณต้องการความถูกต้องฉันขอแนะนำให้ใช้ฟังก์ชันต่อไปนี้ แทนที่จะพยายามเดาว่าองค์ประกอบเลื่อนหรือไม่ - คุณสามารถเลื่อน ...

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>


ในกรณีใดบ้างที่จะให้ผลบวกที่ผิดพลาด
GaloisGirl

5

ฮึคำตอบของทุกคนในที่นี่ไม่สมบูรณ์และให้หยุดใช้ jquery ในคำตอบ SO แล้วได้โปรด ตรวจสอบเอกสารของ jquery หากคุณต้องการข้อมูลเกี่ยวกับ jquery

นี่คือฟังก์ชั่น pure-javascript ทั่วไปสำหรับการทดสอบว่าองค์ประกอบมีแถบเลื่อนในลักษณะที่สมบูรณ์หรือไม่:

// 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
เหตุใดหลีกเลี่ยงการใช้ jQuery ในคำถามที่มีลักษณะเป็น jquery โปรดเพิ่มลิงค์ไปยังส่วนของเอกสาร jquery ที่คุณพูดถึง
kpull1

6
@ kpull1 มีคนจำนวนมากแท็ก jQuery ในคำถามจาวาสคริปต์ทุกครั้งที่มี คำถามนี้มีความสัมพันธ์กับ jQuery 0 มีเป็นส่วนหนึ่งของเอกสาร jQuery ที่มีคำตอบเพราะ jQuery ไม่ทำเช่นนี้ไม่มีและไม่ควรมัน
BT

4

ฉันจะขยายขอบเขตต่อไปสำหรับผู้ยากไร้เหล่านั้นผู้ซึ่งอย่างฉันใช้กรอบ js ที่ทันสมัยและไม่ใช่ JQuery และถูกทิ้งร้างโดยคนในหัวข้อนี้:

สิ่งนี้เขียนใน Angular 6 แต่ถ้าคุณเขียน React 16, Vue 2, Polymer, Ionic, React-Native คุณจะรู้ว่าต้องทำอย่างไรเพื่อปรับให้เข้ากับมัน และมันก็เป็นองค์ประกอบทั้งหมดดังนั้นมันควรจะง่าย

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

ใน HTML จะมี div กับชั้น "elem รายการ" ซึ่งเก๋ใน CSS หรือ SCSS ที่จะมีได้heightและค่าที่ไม่overflow hidden(ดังนั้นautoหรือsroll)

ฉันเรียกใช้สิ่งนี้จากเหตุการณ์การเลื่อนเพราะเป้าหมายสุดท้ายของฉันคือการ "เลื่อนโฟกัสอัตโนมัติ" ซึ่งตัดสินใจว่าจะเลื่อนองค์ประกอบทั้งชุดในแนวนอนหรือไม่ถ้าส่วนประกอบดังกล่าวไม่มีการเลื่อนในแนวตั้งและอย่างอื่นเพียงเลื่อนอวัยวะภายในของ ส่วนประกอบในแนวตั้ง

แต่คุณสามารถวาง eval ไว้ที่อื่นเพื่อให้มันถูกทริกเกอร์โดยอย่างอื่น

สิ่งสำคัญที่ต้องจำที่นี่คือคุณไม่เคยถูกบังคับให้กลับมาใช้ JQuery มีวิธีเข้าถึงฟังก์ชั่นเดียวกับที่เคยใช้โดยไม่ต้องใช้มัน


1
สงสัยว่าทำไมคุณกำลังฟังเหตุการณ์วงล้อเพื่อตรวจสอบว่ามีแถบเลื่อนหรือไม่
mix3d

3
นอกจากนี้เนื่องจากคุณใช้ฟังก์ชันลูกศรthisรักษาขอบเขตหลัก th = this;ไม่จำเป็น
mix3d

1
@ mix3d ฉันใช้รหัสนี้เป็นการส่วนตัวเพื่อสลับระหว่างการเลื่อนแนวนอนและแนวตั้งโดยอัตโนมัติตามที่มีทิศทางการเลื่อนที่ส่วนปลายที่กำหนดซึ่งเป็นแบบไดนามิก
tatsu

1
เรื่องนี้; มันเป็นน้ำตาล syntactic โดยทั่วไป (บวกชวเลขที่ดี) สำหรับfunction(){}.bind(this)
mix3d

1

ต่อไปนี้เป็นคำตอบของ Evan ที่ได้รับการปรับปรุงซึ่งดูเหมือนว่าจะอธิบายถึงตรรกะการล้นอย่างถูกต้อง

            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

โซลูชันที่ให้ไว้ข้างต้นจะใช้งานได้ในกรณีส่วนใหญ่ แต่การตรวจสอบ scrollHeight และ overflow นั้นไม่เพียงพอและอาจล้มเหลวสำหรับองค์ประกอบ body และ html ดังที่เห็นที่นี่: https://codepen.io/anon/pen/EvzXZw

1. การแก้ไข - ตรวจสอบว่าองค์ประกอบเลื่อนได้หรือไม่:

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

หมายเหตุ:องค์ประกอบที่overflow: hiddenได้รับการปฏิบัติด้วยเป็นแบบเลื่อนได้ ( ข้อมูลเพิ่มเติม ) ดังนั้นคุณอาจเพิ่มเงื่อนไขเช่นกันหากจำเป็น:

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

scroll-behavior: smoothเท่าที่ผมรู้ว่าวิธีการนี้เฉพาะล้มเหลวถ้าองค์ประกอบมี

คำอธิบาย:เคล็ดลับคือความพยายามในการเลื่อนลงและการคืนค่าเบราว์เซอร์จะไม่ถูกแสดงผล ฟังก์ชั่นสูงสุดสามารถเขียนได้ดังนี้:

2. วิธีแก้ไข - ทำการตรวจสอบที่จำเป็นทั้งหมด:

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

นี่คือการปรับปรุงของฉัน: เพิ่ม parseInt ด้วยเหตุผลแปลก ๆ บางอย่างมันไม่ทำงานหากไม่มีมัน

// 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

ใช้งานได้กับChrome , Edge , FirefoxและOperaอย่างน้อยในเวอร์ชันที่ใหม่กว่า

ใช้ JQuery ...

ตั้งค่าฟังก์ชันนี้เพื่อแก้ไขส่วนท้าย:

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

ส่งคืนฟังก์ชัน ทำวิธีนี้เพื่อตั้งค่าร่างกายและส่วนท้ายเพียงครั้งเดียว

จากนั้นตั้งค่านี้เมื่อเอกสารพร้อม

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

เพิ่มไปยังส่วนท้ายของคุณ CSS:

footer {
    bottom: 0;
}

0

คำตอบส่วนใหญ่ที่นำเสนอมานั้นทำให้ฉันใกล้เคียงกับที่ฉันต้องการ แต่ก็ไม่มากนัก

โดยทั่วไปเราต้องการประเมินว่าแถบเลื่อน - จะ - ปรากฏให้เห็นในสถานการณ์ปกติหรือไม่โดยนิยามนั้นหมายความว่าขนาดขององค์ประกอบร่างกายมีขนาดใหญ่กว่าพอร์ตดู นี่ไม่ใช่วิธีการแก้ปัญหาที่นำเสนอซึ่งเป็นสาเหตุที่ฉันส่งมัน

หวังว่ามันจะช่วยให้ใครบางคน!

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

เป็นหลักเรามีhasScrollbarฟังก์ชั่น แต่กลับถ้าองค์ประกอบที่ร้องขอมีขนาดใหญ่กว่าพอร์ตดู $(window).height()สำหรับขนาดของมุมมองพอร์ตเราก็ใช้ เปรียบเทียบอย่างรวดเร็วกับขนาดองค์ประกอบให้ผลลัพธ์ที่ถูกต้องและพฤติกรรมที่พึงประสงค์


0

ค้นหาพาเรนต์ขององค์ประกอบปัจจุบันที่มีการเลื่อนแนวตั้งหรือร่างกาย

$.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;
};

มันอาจจะใช้ในการหมุนอัตโนมัติเพื่อองค์ประกอบปัจจุบันผ่าน:

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

0

A No Framework JavaScript Approach ตรวจสอบทั้งแนวตั้งและแนวนอน

 /*
 * 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};
}

ใช้มันแบบนี้

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

        if(document.getElementsByTagName("body")[0].hasScrollBars().horizontal){
            alert("horizontal");
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.