কোনও স্ক্রোলবার দৃশ্যমান কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


277

ডিভের চেক করা কি সম্ভব overflow:auto?

উদাহরণ স্বরূপ:

এইচটিএমএল

<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'):
         }
    }

});

কখনও কখনও সামগ্রীটি ছোট (কোনও স্ক্রোলবার নয়) এবং কখনও কখনও দীর্ঘ (স্ক্রোলবার দৃশ্যমান) থাকে visible

উত্তর:


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

ফায়ারফক্স, ক্রোম, আই 6,7,8 এ কাজ করার পরীক্ষা করেছে

তবে bodyট্যাগ সিলেক্টারে সঠিকভাবে কাজ করছেন না

ডেমো


সম্পাদন করা

আমি জানতে পেরেছিলাম যে যখন আপনার অনুভূমিক স্ক্রোলবার থাকে যার ফলে উল্লম্ব স্ক্রোলবার প্রদর্শিত হয়, তখন এই ফাংশনটি কাজ করে না ...

আমি আরও একটি সমাধান খুঁজে পেয়েছি ... ব্যবহার clientHeight

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

22
আপনার যদি প্যাডিং থাকে আপনার > this.innerHeight(); jsfiddle.net/p3FFL/210
jcubic

2
এটির সাথে একটি সমস্যা রয়েছে, যদি একটি অনুভূমিক স্ক্রোল বারটিও উপস্থিত থাকে, তবে এটি উল্লম্বভাবে ফিরে আসবে এমনকি যদি উলম্ব স্ক্রোল বারটি উপস্থিত না হয়ে অবধি অনুভূমিক স্ক্রোল বারের উচ্চতা দ্বারা সঙ্কুচিত না হয়।
মিত্র

আপনি দুটি বার একই ফাংশন সংজ্ঞায়িত করেছেন কেন? @ জেকিউবিক
নিতিন সাওয়ান্ত

8
নোট করুন যে ম্যাক্সে স্ক্রোলবারটি সামগ্রীটিতে ভাসমান এবং ব্যবহারে না থাকলে অদৃশ্য হয়ে যায়। উইন্ডোজ এ সর্বদা দৃশ্যমান এবং অনুভূমিক স্থান গ্রহণ করে। এর জন্য, কেবলমাত্র সামগ্রীতে স্ক্রোল করা যায় (যা এই ফাংশনটি সনাক্ত করে) এর অর্থ এই নয় যে কোনও স্ক্রোলবার অগত্যা উপস্থিত রয়েছে।
অ্যান্ড্রু

2
(ফাংশন ($) {$ .fn.hasScrolBar = ফাংশন () {এই.টাকে ফিরিয়ে দিন (0) .স্ক্রোলউইথ> এটি.উইথ); }}) (jQuery); এটি অনুভূমিক ওভারফোলোর জন্য কাজ করে। আইফ্রেমে ওয়েবসাইটগুলিতে মোবাইল প্রতিক্রিয়াশীলতা যাচাই করার জন্য ভাল।
আলেকজান্ডার নিকোলাস পোপা

56

হতে পারে আরও সহজ সমাধান।

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

এই উত্তরটি আমার জন্য কাজ করেছে কিনা পরীক্ষা করার পরে যদি ডকুম জিকিউরি.ready()
সিম্পল স্যান্ডম্যান

4
এটি ধরে নেয় যে স্ক্রোলবারটি উইন্ডোতে রয়েছে এবং কোনও ডিভ উপাদান নয়। প্রস্তাবনাটি উল্লেখ করার জন্য রেফারেন্সটি পরিবর্তনের প্রস্তাব করুন: "যদি আপনাকে কেবল মূল উইন্ডোতে স্ক্রোলবার পরীক্ষা করার প্রয়োজন হয়, আপনি চেষ্টা করতে পারেন:"
justdan23

43

আপনি এটি Element.scrollHeightএবং Element.clientHeightবৈশিষ্ট্যের সংমিশ্রণটি ব্যবহার করে এটি করতে পারেন ।

এমডিএন অনুসারে:

Element.scrollHeight শুধুমাত্র পাঠযোগ্য অ্যাট্রিবিউট একটি উপাদান বিষয়বস্তুর উচ্চতার একটি পরিমাপ, বিষয়বস্তু ওভারফ্লো কারণে পর্দায় দৃশ্যমান নয় সহ হয়। স্ক্রোলহাইট মানটি ন্যূনতম ক্লায়েন্টের সমান হুইটিক্যাল স্ক্রোলবার ব্যবহার না করেই ভিউপয়েন্টে সমস্ত সামগ্রী ফিট করার জন্য উপাদানটির উচ্চমাত্রার উচ্চমাত্রার প্রয়োজন হয়। এটিতে এলিমেন্ট প্যাডিং অন্তর্ভুক্ত রয়েছে তবে এর মার্জিনটি নেই।

এবং:

Element.clientHeight প্যাডিং কিন্তু অনুভূমিক স্ক্রলবার উচ্চতা, সীমান্ত, অথবা মার্জিন সহ পিক্সেল, এ শুধুমাত্র পাঠযোগ্য সম্পত্তি আয় একটি উপাদান অভ্যন্তরীণ উচ্চতা।

ক্লায়েন্টহাইটটি সিএসএস উচ্চতা + সিএসএস প্যাডিং - অনুভূমিক স্ক্রোলবারের উচ্চতা (উপস্থিত থাকলে) হিসাবে গণনা করা যেতে পারে।

সুতরাং, যদি স্ক্রোলের উচ্চতা ক্লায়েন্টের উচ্চতার চেয়ে বেশি হয় তবে উপাদানটি একটি স্ক্রোলবার প্রদর্শন করবে, সুতরাং আপনার প্রশ্নের উত্তরটি হ'ল:

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

2
উদাহরণ: github.com/twbs/bootstrap/blob/master/js/modal.js#L242 এবং MDN এর উদ্ধৃতি এবং ব্যাখ্যার জন্য +1!
lowtechsun

Chrome এ বিষয়বস্তু তুলনায় এটি scrollHeight এ অন্তর্ভুক্ত নেই সীমান্ত হয়েছে থাকে
যেমন AT

1
বিলম্ব না করে এবং ফ্রেমওয়ার্ক / লাইব্রেরি ব্যবহার না করার জন্য আপ-ভোট দিয়েছেন।
জন

সাবধান - এটি একটি প্রতিস্থাপনের কারণ, যা একটি পারফরম্যান্স ড্রেন। gist.github.com/paulirish/5d52fb081b3570c81e3a
টড সজোল্যান্ডার

43

রিইগেল যা বলেছিল তার একটা ছোট্ট জিনিস আমার পরিবর্তন করা উচিত:

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

অভ্যন্তরীণ উচ্চতা নিয়ন্ত্রণের উচ্চতা এবং এর শীর্ষ এবং নীচের প্যাডিংগুলি গণনা করে


ফিরুন (this.get (0))? this.get (0)। স্ক্রোলহাইট> this.innerHeight (): মিথ্যা;
কমনপাইক

3
আমি মনে করি এটি সঠিক উত্তর হিসাবে দেওয়া উচিত। এটি FF35, IE11 এবং Chrome39 এ কাজ করেছে।
LucasBr

স্ক্রোলহাইট শর্তটি পূরণ হওয়ার পরে স্ক্রোল বারগুলি উপস্থিত হবে কিনা তা নিশ্চিত করতে এটি 'ওভারফ্লো' মানটি পরীক্ষা করে না।
বিটি

1
@ বিটি তবে আমার সিএসএসে যদি আমার ওভারফ্লো সেট হয়ে থাকে তবে আমার এই অতিরিক্ত চেকের দরকার নেই? এটি আকারের তুলনা করে এবং এটি যথেষ্ট ...?
অ্যান্ড্রু

একটি উত্তর যা কেবল আপনার জন্য কাজ করে তা কোনও উত্তর নয় .. আপনি কীভাবে জানবেন যে অন্য লোকেরা তাদের সিএসএসে কী আছে? আপনার উত্তরে সেই সীমাবদ্ধতার উল্লেখ নেই। যদি কেউ আপনার উত্তরটি ফেলে দিতে না পারে এবং এটি কাজ করতে পারে তবে এটি ভাল উত্তর নয়।
বিটি

27

এটি @ রিগেলের উত্তরে প্রসারিত হয়। এটি অনুভূমিক বা উল্লম্ব স্ক্রোলবারগুলির জন্য একটি উত্তর প্রদান করবে।

(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

আমি একটি নতুন কাস্টম তৈরি করেছি: jQuery এর জন্য সিউডো সিলেক্টরটি পরীক্ষা করার জন্য আইটেমের মধ্যে একটি সিএসএস বৈশিষ্ট্য রয়েছে:

  1. উপচে পড়া: [স্ক্রোল | অটো]
  2. ওভারফ্লো-এক্স: [স্ক্রোল | অটো]
  3. ওভারফ্লো-ওয়াই: [স্ক্রোল | অটো]

আমি অন্য একটি উপাদানটির নিকটতম স্ক্রোলযোগ্য পিতামাতার সন্ধান করতে চেয়েছিলাম তাই আমি ওভারফ্লো সহ নিকটতম পিতামাতাকে খুঁজে পেতে আরও একটি ছোট্ট jQuery প্লাগইন লিখেছিলাম।

এই সমাধানটি সম্ভবত সেরাটি সম্পাদন করে না তবে এটি কাজ করে বলে মনে হচ্ছে। আমি এটি sc। স্ক্রোলটো প্লাগইনের সাথে একযোগে ব্যবহার করেছি। কখনও কখনও আমার জানা দরকার যে কোনও উপাদান অন্য স্ক্রোলযোগ্য ধারকটির ভিতরে রয়েছে কিনা। সেক্ষেত্রে আমি উইন্ডো বনাম প্যারেন্ট স্ক্রোলযোগ্য উপাদানটি স্ক্রোল করতে চাই।

আমার সম্ভবত এটি একটি একক প্লাগইনে আবৃত হওয়া উচিত ছিল এবং প্লাগইনের অংশ হিসাবে পিচুয়েডো নির্বাচক যুক্ত করা উচিত, পাশাপাশি নিকটতম (পিতামাতার) স্ক্রোলযোগ্য ধারকটি সন্ধান করার জন্য একটি 'নিকটতম' পদ্ধতিটি প্রকাশ করা উচিত।

যাইহোক .... এখানে।

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

sc। 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();

আপডেট: আমি দেখতে পেয়েছি যে রবার্ট করিতনিক ইতিমধ্যে আরও অনেক শক্তিশালী হয়ে উঠেছে: স্ক্রোলযোগ্য সিউডো সিলেক্টর যা স্ক্রোলযোগ্য অক্ষগুলি এবং স্ক্রোলযোগ্য পাত্রে উচ্চতা সনাক্ত করবে, তার sc। স্ক্রোলিনটোভিউ () 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

উপরের প্রথম সমাধানটি কেবল আইইতে কাজ করে উপরের দ্বিতীয় সমাধানটি কেবল এফএফ-তে কাজ করে

উভয় ফাংশনের এই সংমিশ্রণ উভয় ব্রাউজারে কাজ করে:

//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");
}​
  • প্রস্তুত একটি দস্তাবেজ মোড়ানো
  • মনিটরউইথথ 1: ডিভ যেখানে ওভারফ্লো অটোতে সেট করা আছে
  • এমটিসি: মনিটরউইথথ 1 এর ভিতরে একটি ধারক ডিভ
  • অ্যাডজাস্টওভারফ্লোউইথ: স্ক্রোলবার সক্রিয় থাকাকালীন # এমটিসি ডিভিতে একটি সিএসএস শ্রেণি প্রয়োগ করা হয়েছে * ক্রস ব্রাউজারটি পরীক্ষা করতে সতর্কতাটি ব্যবহার করুন, এবং তারপরে চূড়ান্ত উত্পাদন কোডের জন্য মন্তব্য করুন।

আছে HTH


6

(স্ক্রোলউইথ / উচ্চতা - ক্লায়েন্টউইথ / উচ্চতা) একটি স্ক্রোলবারের উপস্থিতির জন্য একটি ভাল সূচক, তবে এটি আপনাকে অনেক ক্ষেত্রে "মিথ্যা ইতিবাচক" উত্তর দেয়। আপনার যদি সঠিক হওয়া প্রয়োজন তবে আমি নীচের ফাংশনটি ব্যবহার করার পরামর্শ দেব। উপাদানটি স্ক্রোলযোগ্য কিনা অনুমান করার চেষ্টা করার পরিবর্তে - আপনি এটিকে স্ক্রোল করতে পারেন ...

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>


কোন উপলক্ষে এটি একটি মিথ্যা ইতিবাচক দেবে?
গ্যালোইজগার্ল

5

উগ্র এখানে সবার উত্তর অসম্পূর্ণ, এবং ইতিমধ্যে দয়া করে এসও উত্তরগুলিতে jquery ব্যবহার বন্ধ করতে দেয়। আপনি jquery সম্পর্কিত তথ্য চাইলে jquery এর ডকুমেন্টেশন পরীক্ষা করুন।

কোনও উপাদানটির সম্পূর্ণ উপায়ে স্ক্রোলবার রয়েছে কি না তা পরীক্ষা করার জন্য এখানে একটি সাধারণ খাঁটি-জাভাস্ক্রিপ্ট ফাংশন রয়েছে:

// 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 ডকুমেন্টেশন অংশে লিঙ্কগুলি যোগ করুন।
কেপুল 1

6
@ kpull1 অনেক লোক তাদের কাছে থাকা প্রতিটি জাভাস্ক্রিপ্ট প্রশ্নটিতে jQuery ট্যাগ করে। এই প্রশ্নের 0 টি jQuery এর সাথে সম্পর্কিত। সেখানে হয় jQuery এর ডকুমেন্টেশন, উত্তর আছে যে কারণ jQuery এর এই কাজ করে না কোন অংশ, না এটা উচিত।
বিটি

4

আমি আরও এই দুর্বল আত্মাদের জন্য আরও প্রসারিত করতে যাচ্ছি, যারা আমার মতো, আধুনিক জেএস ফ্রেমওয়ার্ক ব্যবহার করেন এবং জিকুয়ারি নয় এবং এই থ্রেডের লোকেরা পুরোপুরি ত্যাগ করেছেন:

এটি কৌণিক 6 এ লেখা হয়েছিল তবে আপনি যদি প্রতিক্রিয়া 16, ভ্যু 2, পলিমার, আয়নিক, প্রতিক্রিয়া-নেটিভ লিখেন তবে এটিকে খাপ খাইয়ে নিতে কী করতে হবে তা আপনি জানেন। এবং এটি সম্পূর্ণ উপাদান তাই এটি সহজ হওয়া উচিত।

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 এ বর্গ সঙ্গে "ELEM-তালিকা" যা আছে CSS বা SCSS মধ্যে stylized হয় একটি div সেখানে হবে heightএবং একটি overflowনয় মান hidden। (তাই autoবা sroll)

আমি এই ক্রমটি একটি স্ক্রোল ইভেন্টের উপর ট্রিগার করেছি কারণ আমার শেষ লক্ষ্যটি ছিল "স্বয়ংক্রিয় ফোকাস স্ক্রোলগুলি" ছিল যা সিদ্ধান্ত নিয়েছিল যে তারা উপাদানগুলির পুরো সেটটিকে অনুভূমিকভাবে স্ক্রোল করছে কিনা যদি বলা হয় যে উপাদানগুলির কোনও উল্লম্ব স্ক্রোল উপলব্ধ নেই এবং অন্যথায় কেবল একটির অভ্যন্তরের স্ক্রোলটি স্ক্রোল করা হচ্ছে উল্লম্বভাবে উপাদান।

তবে আপনি অন্য কোথাও এটিকে ট্রিগার করার জন্য এওয়ালটি অন্য কোথাও রাখতে পারেন।

এখানে গুরুত্বপূর্ণ বিষয়টি মনে রাখবেন, আপনি কখনই জিকুয়েরি ব্যবহারে জোর করে ফিরে আসছেন না, সর্বদা এটির ব্যবহার না করেই একই কার্যকারিতা অ্যাক্সেস করার উপায় রয়েছে।


1
আপনি চাকা ইভেন্টগুলি কেন শুনছেন তা জানতে আগ্রহী যে কোনও স্ক্রোলবার রয়েছে কিনা তা পরীক্ষা করতে।
মিশ্র 3 ডি

3
এছাড়াও, যেহেতু আপনি তীর ফাংশনগুলি ব্যবহার করছেন thisতাই পিতামাতার সুযোগটি রাখে; th = this;অপ্রয়োজনীয়
মিশ্র 3 ডি

1
@ মিক্সড 3 ডি আমি ব্যক্তিগতভাবে এই কোডটি ব্যবহার করে স্বয়ংক্রিয়ভাবে অনুভূমিক এবং উল্লম্ব স্ক্রোলিংয়ের মধ্যে স্যুইচ করতে যা ভিত্তিক নির্দেশিত উপাদানটিতে স্ক্রোলের দিক রয়েছে যা গতিশীল
তাতসু

1
পুন: এই; এটি মূলত সিনট্যাকটিক চিনি (প্লাস চমৎকার শর্টহ্যান্ড)function(){}.bind(this)
মিশ্র

1

এখানে ইভানের উত্তরের একটি উন্নত সংস্করণ রয়েছে যা মনে হয় যে ওভারফ্লো যুক্তির জন্য সঠিকভাবে অ্যাকাউন্ট রয়েছে।

            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

উপরে প্রদত্ত সমাধানগুলি বেশিরভাগ ক্ষেত্রে কাজ করবে, তবে স্ক্রোলহাইট এবং ওভারফ্লো পরীক্ষা করা কখনও কখনও পর্যাপ্ত হয় না এবং এখানে যেমন দেহ এবং এইচটিএমএল উপাদানগুলির জন্য ব্যর্থ হতে পারে: 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

এখানে আমার উন্নতি: যোগ করা পার্সেন্ট। কিছু অদ্ভুত কারণে এটি কাজ করে না।

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

কমপক্ষে আরও নতুন সংস্করণগুলিতে ক্রোম , এজ , ফায়ারফক্স এবং অপেরাতে কাজ করে ।

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

এটি আপনার পাদলেখ সিএসএস এ যুক্ত করুন:

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

কোনও ফ্রেমওয়ার্ক জাভাস্ক্রিপ্ট পদ্ধতির নয়, উল্লম্ব এবং অনুভূমিক উভয়ের জন্য পরীক্ষা করে

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