স্ক্রলিং শিশু ডিভ উইন্ডো স্ক্রল করে, আমি কীভাবে এটি থামাব?


96

আমার একটি ডিভ আছে, একটি স্ক্রোল বার সহ, এটি শেষের দিকে পৌঁছে গেলে আমার পৃষ্ঠাটি স্ক্রোলিং শুরু হয়। আমি কি এই আচরণ বন্ধ করতে পারি?


4
@ এনজিএলএন একটি সদৃশ, ভিন্ন প্রশ্ন নয়।
পাশেরউইঞ্জু

উত্তর:


68

আপনি এর মতো কিছু করে পুরো পৃষ্ঠার স্ক্রোলিং নিষ্ক্রিয় করতে পারেন:

<div onmouseover="document.body.style.overflow='hidden';" onmouseout="document.body.style.overflow='auto';"></div>

33
ভাল, তবে আপনি যখনই ডিভের উপরে ঘুরে দেখেন এটি ব্রাউজারের স্ক্রোলবার অদৃশ্য করে দেয়।
cstack

@ স্ট্যাক আপনি ঠিক বলেছেন সে কারণেই ওপি (জীবন) এর নিজের উত্তর আরও ভাল।
ইমরান বুঘিও

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

পৃষ্ঠাটি যদিও iframe এ এম্বেড করা হয় তখন এই সমাধানটি কাজ করে না।
গৌতম কৃষ্ণান

4
একটি সমাধান না। ওভারফ্লো গোপনে সেট করা স্ক্রোলবারকে আড়াল করে যা হঠাৎ করে বাইরের উপাদানটির সমস্ত বিষয়বস্তু পুনরায় ফর্ম্যাট করে। এছাড়াও, এটি বাহ্যিক উপাদানটি দেহটিকে ধরে নিয়েছে তবে এটি অন্য স্ক্রোলিং ডিভ হতে পারে।
রবিস্রোব

43

সমাধান খুঁজে পেয়েছি।

http://jsbin.com/itajok

এই আমার প্রয়োজন ছিল।

এবং এই কোড।

http://jsbin.com/itajok/edit#javascript,html

একটি jQuery প্লাগ-ইন ব্যবহার করে।


অবহেলা বিজ্ঞপ্তির কারণে আপডেট

থেকে jQuery-mousewheel :

ইভেন্ট হ্যান্ডলারে তিনটি আর্গুমেন্ট ( delta, deltaXএবং deltaY) যুক্ত করার পুরানো আচরণটি এখন অবচয় করা হয়েছে এবং পরবর্তী প্রকাশে মুছে ফেলা হবে।

তারপরে, event.deltaYএখন অবশ্যই ব্যবহার করা উচিত:

var toolbox = $('#toolbox'),
    height = toolbox.height(),
    scrollHeight = toolbox.get(0).scrollHeight;

toolbox.off("mousewheel").on("mousewheel", function (event) {
  var blockScrolling = this.scrollTop === scrollHeight - height && event.deltaY < 0 || this.scrollTop === 0 && event.deltaY > 0;
  return !blockScrolling;
});

ডেমো


6
আপনার লিঙ্কটি জেএস
মাইকেল জে।

উভয় jsbins Chrome ডিভাইস এমুলেটর এবং আইফোনে কাজ করছে বলে মনে হয় না। কেউ কি জানেন যে এটি এখনও কাজ করে?
ডার্ক বোয়ার

4
আপনার "সমাধান" কেবলমাত্র মাউস স্ক্রোল ইভেন্টগুলির জন্য কাজ করে, পৃষ্ঠা আপ / ডাউন বা তীর কীগুলি নয়।
স্কট

এখানে "বন্ধ" কেন প্রয়োজনীয়?
ব্র্যাড জনসন

16

নির্বাচিত সমাধানটি একটি শিল্পকর্ম। ভেবেছি এটি একটি প্লাগইন পাওয়ার যোগ্য ...

$.fn.scrollGuard = function() {
    return this
        .on( 'wheel', function ( e ) {
            var event = e.originalEvent;
            var d = event.wheelDelta || -event.detail;
            this.scrollTop += ( d < 0 ? 1 : -1 ) * 30;
            e.preventDefault();
        });
};    

এটি আমার জন্য একটি চলমান অসুবিধা হয়ে দাঁড়িয়েছে এবং আমার দেখা অন্যান্য হ্যাকের তুলনায় এই সমাধানটি এতটাই পরিষ্কার। এটি কীভাবে কাজ করে এবং এটি কীভাবে ব্যাপকভাবে সমর্থিত হবে সে সম্পর্কে আরও কতটা জানতে আগ্রহী, তবে জীবন এবং মূলত যার সাথে এটি এলো এটি উত্সাহিত। বিটিডাব্লু - স্ট্যাকওভারফ্লো উত্তর সম্পাদকটির এটির প্রয়োজন!

হালনাগাদ

আমি বিশ্বাস করি এটি আরও ভাল যে এটি কোনওভাবেই ডিওএমকে চালিত করার চেষ্টা করে না, কেবল শর্তযুক্ত বুদবুদ প্রতিরোধ করে ...

$.fn.scrollGuard2 = function() {
  return this
    .on( 'wheel', function ( e ) {
      var $this = $(this);
      if (e.originalEvent.deltaY < 0) {
        /* scrolling up */
        return ($this.scrollTop() > 0);
      } else {
        /* scrolling down */
        return ($this.scrollTop() + $this.innerHeight() < $this[0].scrollHeight);
      }
    })
  ;
};    

ক্রোমে দুর্দান্ত কাজ করে এবং অন্যান্য সমাধানগুলির চেয়ে অনেক সহজ ... আমাকে অন্যত্র এটি কীভাবে ভাড়া দেওয়া যায় তা আমাকে জানান ...

ছোট ছোট


4
ডোমমাউসস্ক্রোল ইভেন্ট যুক্ত করার ফলে এটি ফায়ারফক্সের সাথে কাজ করে → jsfiddle.net/chodorowicz/egqy7mbz/1
chodorowicz

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

আসলে দেখে মনে হচ্ছে দুজনেই অবচিত হয়ে গেছে ... wheelইভেন্ট
রবিস্রোব

এটি আমার ম্যাকবুকের ক্রোমে লক্ষণীয়ভাবে জারকিয়ার স্ক্রোলিংয়ের ফলস্বরূপ। গৃহীত সমাধানটিতে এই সমস্যা নেই।
danvk

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

8

আপনি বডি স্ক্রোলবারটি অক্ষম করতে ডিভের উপর একটি মাউসওভার ইভেন্ট এবং এটি আবার সক্রিয় করতে একটি মাউসআউট ইভেন্ট ব্যবহার করতে পারেন?

যেমন এইচটিএমএল

<div onmouseover="disableBodyScroll();" onmouseout="enableBodyScroll();">
    content
</div>

এবং তারপর জাভাস্ক্রিপ্ট এর মত:

var body = document.getElementsByTagName('body')[0];
function disableBodyScroll() {
    body.style.overflowY = 'hidden';
}
function enableBodyScroll() {
    body.style.overflowY = 'auto';
}

12
document.bodyপরিবর্তে আপনিও ব্যবহার করতে পারেন ।
Ry-

8

ওয়াই অক্ষে এটি করার একটি ক্রস-ব্রাউজারের উপায় এখানে, এটি ডেস্কটপ এবং মোবাইলে কাজ করে। ওএসএক্স এবং আইওএস-এ পরীক্ষিত।

var scrollArea = this.querySelector(".scroll-area");
scrollArea.addEventListener("wheel", function() {
    var scrollTop = this.scrollTop;
    var maxScroll = this.scrollHeight - this.offsetHeight;
    var deltaY = event.deltaY;
    if ( (scrollTop >= maxScroll && deltaY > 0) || (scrollTop === 0 && deltaY < 0) ) {
        event.preventDefault();
    }
}, {passive:false});

scrollArea.addEventListener("touchstart", function(event) {
    this.previousClientY = event.touches[0].clientY;
}, {passive:false});

scrollArea.addEventListener("touchmove", function(event) {
    var scrollTop = this.scrollTop;
    var maxScroll = this.scrollHeight - this.offsetHeight;
    var currentClientY = event.touches[0].clientY;
    var deltaY = this.previousClientY - currentClientY;
    if ( (scrollTop >= maxScroll && deltaY > 0) || (scrollTop === 0 && deltaY < 0) ) {
        event.preventDefault();
    }
    this.previousClientY = currentClientY;
}, {passive:false});

এটি দুর্দান্ত কাজ করে! বাহ, আমি ঠিক কী অনুসন্ধান করেছি। এটি অবশ্যই আরও upvotes প্রয়োজন।
delato468

এই সমাধান প্রশংসনীয় ভাল কাজ করে কিন্তু প্রয়োজন একটু সমন্বয়: পরিবর্তন করার প্রয়োজন scrollTop === maxScroll দ্বারা scrollTop >= maxScroll। এটি 1 কেসে অদ্ভুত বলে মনে হচ্ছে, এটির দরকার ছিল
tchiot.ludo

7

আমি এই ইস্যুটির জন্য সমাধান লিখেছি

  var div;
  div = document.getElementsByClassName('selector')[0];

  div.addEventListener('mousewheel', function(e) {
    if (div.clientHeight + div.scrollTop + e.deltaY >= div.scrollHeight) {
      e.preventDefault();
      div.scrollTop = div.scrollHeight;
    } else if (div.scrollTop + e.deltaY <= 0) {
      e.preventDefault();
      div.scrollTop = 0;
    }
  }, false);

এখানে কয়েকটি সমাধানের মধ্যে একটি যা পৃষ্ঠ উপাদানগুলি ছাড়াই কাজ করে যা বিরক্তিকরভাবে ঝাঁপিয়ে পড়ে ওভারফ্লো লুকিয়ে থাকার কারণে।
স্কেপটিক

+1 এটি একটি কঠিন সমাধান। যদি আপনি এটি কোনও স্ক্রোলযোগ্য ধারকটির সাথে সংযুক্ত করেন তবে আপনি এই উদাহরণটি দ্বি হতে চান e.currentTarget
ম্যাট

খুব পরিষ্কার সমাধান। ধন্যবাদ
থিনহ বুই

ক্রোম 61.0.3163.100 এবং সাফারি 11.0 এ কাজ করেছেন, তবে ফায়ারফক্স 56.0 (ম্যাক ওএস এল ক্যাপিটান) এ নেই
BigJ

এটি সর্বোত্তম নেটিভ সমাধান। তবে এটি পূর্বনির্ধারিত হওয়ার কারণে falseনির্দিষ্ট করার দরকার নেই addEventListener। তদুপরি, তুলনাগুলি সাধারণ অসমতার ( >এবং <) হওয়া উচিত , না >=বা <=
কোলোনেল প্রশ্ন

7

এখানে উত্তর হিসাবে , বেশিরভাগ আধুনিক ব্রাউজারগুলি overscroll-behavior: none;সিএসএস সম্পত্তি সমর্থন করে যা স্ক্রোল শৃঙ্খলা রোধ করে। আর এটাই, মাত্র একটি লাইন!


4
এটি 2020 এ সঠিক উত্তর হওয়া উচিত my আমার ব্যবহারের ক্ষেত্রে সবচেয়ে ভাল সমাধান ছিল overscroll-behavior: contain;
পিয়ার

এটি কিছু প্রান্ত সংস্করণের জন্য পুরোপুরি সমর্থিত নয়। এটি কোনও ভিন্ন উপায়ে কীভাবে সমাধান করবেন?
YTG

6

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি, তবে আপনি যখন মাউসটি ডিভের উপরে চলে যাবেন তখন আপনি মূল সামগ্রীর স্ক্রোলিং প্রতিরোধ করতে চান (আসুন একটি সাইডবারটি বলি)) তার জন্য, সাইড স্ক্রোল ইভেন্টটিকে তার পিতামাতাকে বুদ্বুদ করা থেকে আটকাতে মূল সামগ্রীটির (যা ব্রাউজার উইন্ডো ছিল) স্ক্রোলিং ধারকটির বাচ্চা নাও হতে পারে।

এটি সম্ভবত নিম্নলিখিত পদ্ধতিতে কিছু মার্কআপ পরিবর্তন প্রয়োজন:

<div id="wrapper"> 
    <div id="content"> 
    </div> 
</div> 
<div id="sidebar"> 
</div> 

এটি এই স্যাম্পল ফিডলটিতে কাজ করছে দেখুন এবং সাইডবারের সামান্য ভিন্ন মাউস ছাড়ার আচরণ রয়েছে এমন এই স্যাম্পল ফিডেলের সাথে তুলনা করুন।

আরও দেখুন ব্রাউজারের প্রধান স্ক্রলবার একমাত্র একটি বিশেষ DIV আছে স্ক্রল


এক্ষেত্রে সাইডবারটি র‌্যাপার ডিভের বাইরে। সুতরাং আমি মনে করি না যে স্ক্রোলটি পিতামাতাকে বুদবুদ করবে
জীবন

"এই মামলা" দ্বারা আপনি আপনার কেস বোঝায়? যদি না: আপনি ঠিক ঠিক বলেছেন। যদি তাই হয়: ডিভ স্ক্রোলিংয়ের শেষে যদি আপনার পৃষ্ঠাটি স্ক্রল করে, তবে স্ক্রোল বার্তাটি ডিভ প্যারেন্টকে বুদবুদ করে, তাই আমি মনে করি আপনার পৃষ্ঠা এবং ডিভটি ভাইবোন নয়, তবে পিতা বা মাতা এবং সন্তান।
এনজিএলএন

হ্যাঁ, পৃষ্ঠাটি আমার ডিভের পিতামাতা, সুতরাং শেষের দিকে পৌঁছে, এটি পৃষ্ঠাটি স্ক্রোল করা শুরু করে, যা আমি চাই না।
জীবন

আপনি যদি নিজের ডিভিটিকে মূল বিষয়বস্তুর ভাইবাল করতে না পারেন তবে এই সমস্যাটি কেবলমাত্র HTML + সিএসএস দিয়ে স্থির করা যাবে না। এটি ডিফল্ট আচরণ।
এনজিএলএন

4
আমি মনে করি এটি সমস্ত প্রদত্ত উত্তরের সর্বাধিক দক্ষ সমাধান; কোনও পৃষ্ঠার গোড়ায় ভাল পরিষ্কার মার্কআপ সহ, কাঙ্ক্ষিত আচরণ পাওয়ার জন্য সিএসএস এবং জেএস হ্যাকের কম প্রয়োজন।

3

আপনি যদি নির্বাচক উপাদানটি প্রবেশ করেন তবে এটি উইন্ডোতে স্ক্রোলিং অক্ষম করে। কবজ মত কাজ করে।

elements = $(".selector");

elements.on('mouseenter', function() {
    window.currentScrollTop = $(window).scrollTop();
    window.currentScrollLeft = $(window).scrollTop();
    $(window).on("scroll.prevent", function() {
        $(window).scrollTop(window.currentScrollTop);
        $(window).scrollLeft(window.currentScrollLeft);
    });
});

elements.on('mouseleave', function() {
    $(window).off("scroll.prevent");
});

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

2

আপনি এর মতো কিছু করে পুরো পৃষ্ঠার স্ক্রোলিং নিষ্ক্রিয় করতে পারেন তবে স্ক্রোলবারটি প্রদর্শন করুন!

<div onmouseover="document.body.style.overflow='hidden'; document.body.style.position='fixed';" onmouseout="document.body.style.overflow='auto'; document.body.style.position='relative';"></div>

2
$this.find('.scrollingDiv').on('mousewheel DOMMouseScroll', function (e) {
  var delta = -e.originalEvent.wheelDelta || e.originalEvent.detail;
  var scrollTop = this.scrollTop;
  if((delta < 0 && scrollTop === 0) || (delta > 0 && this.scrollHeight - this.clientHeight - scrollTop === 0)) {
    e.preventDefault();
  }
});

1

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

jQuery.fn.scrollGuard = function() {
    this
        .addClass('scroll-guarding')
        .off('.scrollGuard').on('mouseenter.scrollGuard', function() {
            var $g = $(this).parent().closest('.scroll-guarding');
            $g = $g.length ? $g : $(window);
            $g[0].myCst = $g.scrollTop();
            $g[0].myCsl = $g.scrollLeft();
            $g.off("scroll.prevent").on("scroll.prevent", function() {
                $g.scrollTop($g[0].myCst);
                $g.scrollLeft($g[0].myCsl);
            });
        })
        .on('mouseleave.scrollGuard', function() {
            var $g = $(this).parent().closest('.scroll-guarding');
            $g = $g.length ? $g : $(window);
            $g.off("scroll.prevent");
        });
};

ব্যবহারের একটি সহজ উপায় হ'ল scroll-guardপৃষ্ঠায় থাকা সমস্ত উপাদানগুলিতে ক্লাস যুক্ত করা যা আপনি স্ক্রোলিংয়ের অনুমতি দেন। তারপরে $('.scroll-guard').scrollGuard()তাদের রক্ষা করতে ব্যবহার করুন।


0

আপনি যদি কোনও overflow: hiddenস্টাইল প্রয়োগ করেন তবে এটি চলে যেতে হবে

সম্পাদনা: আসলে আমি আপনার প্রশ্নটি ভুলভাবে পড়েছি, এটি কেবল স্ক্রোল বারটি আড়াল করবে তবে আমি মনে করি না এটি আপনি যা খুঁজছেন।


4
আমার দুটোই স্ক্রোলবার দরকার। আচরণের কথা বলছি। ডিভের স্ক্রোলের শেষে পৌঁছে যখন আমি আমার মাউস ট্র্যাকবল ব্যবহার করে স্ক্রোল করব তখন এটি অবশ্যই পুরো পৃষ্ঠাটি স্ক্রোল করবে না।
জীবন

0

আমি ক্রোম এবং ফায়ারফক্সে কাজের জন্য কোনও উত্তর পেতে পারি না, তাই আমি এই সম্মিলনটি নিয়ে এসেছি:

$someElement.on('mousewheel DOMMouseScroll', scrollProtection);

function scrollProtection(event) {
    var $this = $(this);
    event = event.originalEvent;
    var direction = (event.wheelDelta * -1) || (event.detail);
    if (direction < 0) {
        if ($this.scrollTop() <= 0) {
            return false;
        }
    } else {
        if ($this.scrollTop() + $this.innerHeight() >= $this[0].scrollHeight) {
            return false;
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.