যখন কোনও মডেল খোলা হয় তখন শরীরকে স্ক্রোলিং থেকে আটকাও


346

আমি চাই আমার ওয়েবসাইটের মডেলটি ( http://twitter.github.com/bootstrap থেকে ) খোলার সময় মাউসওহিলটি ব্যবহার করার সময় আমার শরীরটি স্ক্রোলিং বন্ধ করবে stop

মোডালটি খোলা থাকলে তবে সাফল্য ছাড়াই আমি নীচে জাভাস্ক্রিপ্টের টুকরো কল করার চেষ্টা করেছি

$(window).scroll(function() { return false; });

এবং

$(window).live('scroll', function() { return false; });

আমাদের ওয়েবসাইটটি আই 6 এর জন্য বাদ দেওয়া সমর্থনটি নোট করুন, আই 7 7 + যদিও সামঞ্জস্যপূর্ণ হওয়া দরকার।

উত্তর:


467

কোনও মডেল ডায়ালগ প্রদর্শিত হলে বুটস্ট্র্যাপের modalস্বয়ংক্রিয়ভাবে modal-openশরীরে ক্লাস যুক্ত হয় এবং ডায়লগটি লুকানো থাকলে এটিকে সরিয়ে দেয়। সুতরাং আপনি আপনার সিএসএসে নিম্নলিখিতগুলি যুক্ত করতে পারেন:

body.modal-open {
    overflow: hidden;
}

আপনি তর্ক করতে পারেন যে উপরের কোডটি বুটস্ট্র্যাপ সিএসএস কোড বেসের অন্তর্গত, তবে এটি আপনার সাইটে যুক্ত করার জন্য এটি একটি সহজ ফিক্স।

8 ই ফেব্রুয়ারী আপডেট করুন, 2013
এটি এখন টুইটার বুটস্ট্র্যাপ বনাম 2.3.0 এ কাজ করা বন্ধ করে দিয়েছে - তারা আর modal-openদেহে ক্লাস যুক্ত করে না।

মোডালটি যখন দেখানো হচ্ছে তখন শরীরে ক্লাস যুক্ত করা এবং মোডালটি বন্ধ হয়ে গেলে এটিকে সরিয়ে ফেলা উচিত:

$("#myModal").on("show", function () {
  $("body").addClass("modal-open");
}).on("hidden", function () {
  $("body").removeClass("modal-open")
});

11 শে মার্চ, ২০১৩ আপডেট করুন, দেখে মনে হচ্ছে modal-openক্লাসটি বুটস্ট্র্যাপ 3.0 এ ফিরে আসবে, স্পষ্টভাবে স্ক্রোলটি প্রতিরোধের উদ্দেশ্যে:

পুনরায় সূচনা করে the

এটি দেখুন: https://github.com/twitter/bootstrap/pull/6342 - মডেল বিভাগটি দেখুন।


2
বুটস্ট্র্যাপ ২.২.২ এ এটি আর কাজ করে না। আশা করি। আধুনিক-উন্মুক্ত ভবিষ্যতে ফিরে আসবে ... github.com/twitter/bootstrap/issues/5719
পেপেট্রিড

2
@ পিপ্রিড আমি প্রত্যাশা করি না যে এটি ফিরে আসবে। এই লেখার উপর ভিত্তি করে: github.com/twitter/bootstrap/wiki/Up आगामी-3.0.0- পরিবর্তন (নীচে দেখুন) উদ্ধৃতি: "আর কোনও অভ্যন্তরীণ মডেল স্ক্রোলিং হবে না Instead পরিবর্তে, মোডালগুলি তাদের সামগ্রীতে এবং পৃষ্ঠাটি মডেলটিতে রাখার জন্য বাড়বে" "
মার্টিন এইচ

2
@ বাঘাটা কুল - modal-openবুটস্ট্র্যাপ 3 এ ফিরে আসবে, সুতরাং যখন এটি চালু হয় তখন উপরের কোডটি সরিয়ে ফেলা নিরাপদ হওয়া উচিত।
মার্টিনহান

2
এ কারণেই একজনকে নিচে স্ক্রোল করে রাখা উচিত, যদি নির্বাচিত উত্তরটি আপনাকে সন্তুষ্ট না করে, আপনি এই জাতীয় রত্ন খুঁজে পাওয়ার সম্ভাবনা রয়েছে। অন্যান্য কম পছন্দ মতামত মত একটি গভীর + সমাহিত একটি 97+ ভোট উত্তর আশা করেন নি।
মোহাম্মদ আবদুল মুজিব

2
এটির সাথে সমস্যাটি হ'ল নথিটি শীর্ষে স্ক্রোল করা থেকে রোধ করতে যখন কোনও মডেল খোলা হয় তখন আপনাকে বডি যোগ করতে হবে mod আধুনিক-ওপেন {ওভারফ্লো: দৃশ্যমান}} আপনার সমাধানটি এই মুহুর্তে কাজ করে, কোনও মোডালটি খোলার পরে নথিটি শীর্ষে স্ক্রোল করে এমন ক্ষয়ক্ষতির সাথে
প্যাট্রিক

120

গৃহীত উত্তরটি মোবাইলে (আইওএস 7 ডাব্লু / সাফারি,, কমপক্ষে) কাজ করে না এবং সিএসএস যখন করবে তখন আমি আমার সাইটে এমওআর জাভাস্ক্রিপ্ট চলমান চাই না।

এই সিএসএস মডেলের অধীনে পটভূমি পৃষ্ঠাটি স্ক্রোলিং থেকে রোধ করবে:

body.modal-open {
    overflow: hidden;
    position: fixed;
}

তবে এটির উপরে শীর্ষে স্ক্রোলিংয়ের সামান্য পার্শ্ব-প্রভাবও রয়েছে। position:absoluteএটি সমাধান করে তবে, মোবাইলে স্ক্রোল করার সক্ষমতাটি নতুন করে পরিচয় করিয়ে দেয়।

আপনি যদি নিজের ভিউপোর্টটি ( ভিউপোর্ট যুক্ত করার জন্য আমার প্লাগইন<body> ) জানেন তবে আপনি কেবলমাত্র একটি সিএসএস টগল যুক্ত করতে পারেন position

body.modal-open {
    // block scroll for mobile;
    // causes underlying page to jump to top;
    // prevents scrolling on all screens
    overflow: hidden;
    position: fixed;
}
body.viewport-lg {
    // block scroll for desktop;
    // will not jump to top;
    // will not prevent scroll on mobile
    position: absolute; 
}

মোডালগুলি দেখানো / লুকিয়ে রাখার সময় অন্তর্নিহিত পৃষ্ঠাটি বাম / ডান দিক থেকে লাফানো থেকে রোধ করতে আমি এটি যুক্ত করি।

body {
    // STOP MOVING AROUND!
    overflow-x: hidden;
    overflow-y: scroll !important;
}

এই উত্তরটি একটি এক্স পোস্ট।


7
ধন্যবাদ! মোবাইলগুলি (কমপক্ষে আইওএস এবং অ্যান্ড্রয়েড নেটিভ ব্রাউজার) আমাকে মাথাব্যথা দিচ্ছিল এবং position: fixedএটি শরীরে ছাড়া কাজ করবে না ।
রাউল রেনি

মোডালগুলি দেখানোর / আড়াল করার সময় পৃষ্ঠাটিকে বাম / ডান দিক থেকে জাম্প করা থেকে রোধ করার কোড সহ কোড সহ ধন্যবাদ। এটি অত্যন্ত কার্যকর ছিল এবং আমি আইফোন 9 সি চলমান আইফোন 5 সি-তে সাফারিতে থাকা একটি সমস্যা সমাধান করে এটি যাচাই করেছি।
এলিজা লফগ্রেন

6
শীর্ষে স্ক্রোলিং স্থির করার জন্য, আপনি শ্রেণিটি যুক্ত করার আগে অবস্থান রেকর্ড করতে পারেন, তারপরে ক্লাস অপসারণের পরে, উইন্ডোটি করুন position রেকর্ডকৃত অবস্থানে স্ক্রোল করুন। এইভাবে আমি এটি নিজের জন্য ঠিক করেছি: পেস্টবিন . com / ভিপিএস07 এজেডি
সরঞ্জাম

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

32

কেবল শরীরের ওভারফ্লো লুকিয়ে রাখুন এবং এটি শরীরকে স্ক্রোলিং করে না। আপনি যখন মোডালটি আড়াল করবেন তখন এটিকে স্বয়ংক্রিয়ভাবে ফিরিয়ে দিন।

কোডটি এখানে:

$('#adminModal').modal().on('shown', function(){
    $('body').css('overflow', 'hidden');
}).on('hidden', function(){
    $('body').css('overflow', 'auto');
})

অসাধারণ! এটি আমাকে সাহায্য করেছে। ধন্যবাদ।
পিএফকোডস

21

ওভারফ্লো দিয়ে আপনি শরীরের আকার উইন্ডো আকারে সেট করার চেষ্টা করতে পারেন: মোডাল খোলা থাকলে লুকানো থাকে



আপনি যে স্ক্রোলবারগুলি ব্রাউজার সম্পর্কিত তা নিশ্চিত হন না এবং এগুলি দিয়ে আপনি আরও কিছু করতে পারবেন না
Charlietfl

আপনি মডেলটিকে "স্থির" করতে পারেন তাই স্ক্রোল করার সময় চলবে না
Charlietfl


1
এটি উইন্ডো যা স্ক্রল করে যদি দেহ এটি উপচে পড়ে। উদাহরণস্বরূপ স্ক্রোলবারগুলি নথির অংশ নয়।
Charlietfl

18

আপনার @ Charlietfl এর উত্তর অতিক্রম করতে হবে এবং স্ক্রোলবারগুলির জন্য অ্যাকাউন্টের প্রয়োজন, অন্যথায় আপনি একটি দস্তাবেজ রিফ্লো দেখতে পাবেন।

মডেলটি খোলার:

  1. bodyপ্রস্থ রেকর্ড করুন
  2. bodyওভারফ্লো সেট করুনhidden
  3. পদক্ষেপ 1 এ যা ছিল তা স্পষ্টভাবে শরীরের প্রস্থকে সেট করুন।

    var $body = $(document.body);
    var oldWidth = $body.innerWidth();
    $body.css("overflow", "hidden");
    $body.width(oldWidth);

মডেলটি বন্ধ করা হচ্ছে:

  1. bodyওভারফ্লো সেট করুনauto
  2. bodyপ্রস্থ সেট করুনauto

    var $body = $(document.body);
    $body.css("overflow", "auto");
    $body.width("auto");

দ্বারা অনুপ্রাণিত: http://jdsharp.us/jQuery/minute/calculate-scrolbar-width.php


আমি একটি উন্নত শর্তের অভাবে একটি "ঝাঁপিয়ে পড়া" পর্দা পাচ্ছিলাম এবং আমার জন্য এখানে কীটি প্রস্থের সেটিংস অনুসরণ করছে। অসংখ্য ধন্যবাদ.
Hcabnettek

1
@ এইচসিবিনেটেক ইয়েপ: "ঝাঁপিয়ে পড়া" == "ডকুমেন্ট রিফ্লো"। খুশি এটা আপনাকে সাহায্য! :-)
jpap

এর জন্য কি কোনও সিএসএস সমাধান আছে? এটি কি সমস্ত ব্রাউজার এবং মোবাইলে কাজ করে?
রুবেন

কেবল একটি টাইপো: এটি অবশ্যই $body.css("overflow", "auto");শেষ ধাপে হওয়া উচিত :)
শ্বেইকাই

ওহে মানুষ, কি দুর্দান্ত এক ধারণা। @jpap আপনি আমাকে ডকুমেন্ট রিফ্লো ইস্যু সমাধান করতে সহায়তা করেছেন যা আমাকে দীর্ঘদিন ধরে তুচ্ছ করে চলেছে।
গোরান রাদুলোভিচ

17

সতর্কতা: নীচের বিকল্পটি বুটস্ট্র্যাপ v3.0.x এর সাথে প্রাসঙ্গিক নয়, কারণ এই সংস্করণগুলিতে স্ক্রোলিং স্পষ্টভাবে মডেলের মধ্যেই সীমাবদ্ধ রয়েছে। আপনি যদি চাকা ইভেন্টগুলি অক্ষম করে থাকেন তবে আপনি অজান্তেই কিছু ব্যবহারকারীকে ভিডপোর্টের উচ্চতার চেয়ে বেশি উচ্চতাযুক্ত মডেলগুলিতে সামগ্রী দেখতে বাধা দিতে পারেন।


তবুও অন্য বিকল্প: চাকা ইভেন্টগুলি

স্ক্রল ঘটনা cancelable নয়। তবে মাউসওয়েল এবং চাকা ইভেন্ট বাতিল করা সম্ভব । সবচেয়ে বড় সতর্কতাটি হ'ল সমস্ত উত্তরাধিকারী ব্রাউজারগুলি তাদের সমর্থন করে না, মজিলা সম্প্রতি গেকো ১.0.০-এর শেষেরগুলির জন্য সমর্থন যোগ করেছে। আমি সম্পূর্ণ স্প্রেড জানি না, তবে আই 6 + এবং ক্রোম তাদের সমর্থন করে।

তাদের কীভাবে উপার্জন করা যায় তা এখানে:

$('#myModal')
  .on('shown', function () {
    $('body').on('wheel.modal mousewheel.modal', function () {
      return false;
    });
  })
  .on('hidden', function () {
    $('body').off('wheel.modal mousewheel.modal');
  });

JSFiddle


আপনার জেএসফিডাল ফায়ারফক্স 24, ক্রোম 24 অথবা আই 9 তে কাজ করে না।
এক্সেএফেক্ট

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

2
এটি স্পর্শ ডিভাইসগুলিকে স্ক্রোলিং থেকে আটকাতে পারে না, এটি overflow:hiddenআপাতত ভাল।
ওয়েবিনান

5
এগুলি সবাই কাজ করছে তবে মোবাইল ডিভাইসের জন্য নয়। -__- অ্যান্ড্রয়েড 4.1 এবং ক্রোম পরীক্ষিত
টাওয়ার জিমি

@ টাওয়ার জিমি আপনার সম্ভবত সেই স্পর্শটি বাতিল করতে হবে বা ইভেন্টগুলি টেনে আনতে হবে (যদি এটি এমনকি সম্ভব হয়)
xorinzor ২

9
/* =============================
 * Disable / Enable Page Scroll
 * when Bootstrap Modals are
 * shown / hidden
 * ============================= */

function preventDefault(e) {
  e = e || window.event;
  if (e.preventDefault)
      e.preventDefault();
  e.returnValue = false;  
}

function theMouseWheel(e) {
  preventDefault(e);
}

function disable_scroll() {
  if (window.addEventListener) {
      window.addEventListener('DOMMouseScroll', theMouseWheel, false);
  }
  window.onmousewheel = document.onmousewheel = theMouseWheel;
}

function enable_scroll() {
    if (window.removeEventListener) {
        window.removeEventListener('DOMMouseScroll', theMouseWheel, false);
    }
    window.onmousewheel = document.onmousewheel = null;  
}

$(function () {
  // disable page scrolling when modal is shown
  $(".modal").on('show', function () { disable_scroll(); });
  // enable page scrolling when modal is hidden
  $(".modal").on('hide', function () { enable_scroll(); });
});

9

কেবল সিএসএস পরিবর্তন করে Chrome এ এটিকে কাজ করতে পারেনি, কারণ আমি চাইনি যে পৃষ্ঠাটি শীর্ষে ফিরে যাবে। এটি ভাল কাজ করেছে:

$("#myModal").on("show.bs.modal", function () {
  var top = $("body").scrollTop(); $("body").css('position','fixed').css('overflow','hidden').css('top',-top).css('width','100%').css('height',top+5000);
}).on("hide.bs.modal", function () {
  var top = $("body").position().top; $("body").css('position','relative').css('overflow','auto').css('top',0).scrollTop(-top);
});

1
বুটস্ট্র্যাপ ৩.২ এ এটিই আমার জন্য একমাত্র সমাধান।
volx757

1
কৌণিক-উপাদান সিডেনাভগুলির সাথে শীর্ষ ইস্যুটিতে ঝাঁপ দাও। এটিই একমাত্র উত্তর যা সমস্ত ক্ষেত্রেই কাজ করে বলে মনে হচ্ছে (ডেস্কটপ / মোবাইল + মোডাল / সিডেনাভের মধ্যে স্ক্রোলের অনুমতি দেয় + লাফানো ছাড়াই বডি স্ক্রোলের অবস্থানটি ছেড়ে দেয়)।
cYrixmorten

এটি কেবলমাত্র আমার জন্য কার্যকর সমাধান হিসাবে সমাধান। tx
ডিডজ

আমার জন্য কাজ করেছেন, বুটস্ট্র্যাপ ভি 4
ডায়ানো

9

আর একবার চেষ্টা কর:

.modal-open {
    overflow: hidden;
    position:fixed;
    width: 100%;
    height: 100%;
}

এটা আমার জন্য কাজ করে। (IE8 সমর্থন করে)


4
এটি কাজ করে কিন্তু ব্যবহারের সময় আপনি যখন কোনও মডেল খুলেন তখন আপনাকে শীর্ষে উঠতেও সহায়তা করে position: fixed
অ্যালেক্সিওয়ে

8

জন্য বুটস্ট্র্যাপ , আপনি চেষ্টা করতে পারে এই (কাজ Firefox, Chromeএবং Microsoft Edge):

body.modal-open {
    overflow: hidden;
    position:fixed;
    width: 100%;
}

আশাকরি এটা সাহায্য করবে...


7

জাভাস্ক্রিপ্টের সাথে 'ইস-মডেল-ওপেন' বা বডি ট্যাগের শৈলী সংযোজন করা ক্লাস যুক্ত করা ঠিক আছে এবং এটি যেমন অনুমিত হবে তেমন কাজ করবে। তবে আমরা যে সমস্যার মুখোমুখি হব তা হ'ল দেহ ওভারফ্লো হয়ে যায়: লুকানো থাকে, এটি শীর্ষে চলে যায়, (স্ক্রোলটপ 0 হবে)। এটি পরবর্তীতে ব্যবহারের বিষয় হয়ে উঠবে।

এই সমস্যার সমাধান হিসাবে, বডি ট্যাগের ওভারফ্লো পরিবর্তনের পরিবর্তে: html ট্যাগে লুকানো পরিবর্তন

$('#myModal').on('shown.bs.modal', function () {
  $('html').css('overflow','hidden');
}).on('hidden.bs.modal', function() {
  $('html').css('overflow','auto');
});

1
এটি একেবারে সঠিক উত্তর কারণ সাধারণ sensকমত্যের উত্তরটি পৃষ্ঠায় শীর্ষে স্ক্রোল করে যা একটি ভয়ঙ্কর ব্যবহারকারীর অভিজ্ঞতা। আপনার এটিতে একটি ব্লগ লেখা উচিত। আমি এটিকে বৈশ্বিক সমাধানে রূপান্তরিত করেছি।
স্মিথ

এটি আইফোনে কাজ করবে না।
বদরিনারায়ণ শ্রীধরণ

6

আমি এই কোড সম্পর্কে নিশ্চিত নই, তবে এটি শট করার জন্য মূল্যবান।

JQuery এ:

$(document).ready(function() {
    $(/* Put in your "onModalDisplay" here */)./* whatever */(function() {
        $("#Modal").css("overflow", "hidden");
    });
});

আমি আগেই বলেছি, আমি 100% নিশ্চিত নই তবে যাইহোক চেষ্টা করুন।



@ xorinzor আপনি Charlietfl এর উত্তরের মন্তব্য বিভাগে বলেছেন যে এটি কাজ করে। তবে আপনি বলেছিলেন: মডেলটি খোলার সময় এটি শরীরকে স্ক্রোলিং থেকে বাধা দেয় না।
আনিস গুপ্ত

সত্য তবে বর্তমানে এটির একমাত্র সমাধান যা আংশিকভাবে কাজ করে এবং আমি ঠিক আছি। আমি তার প্রতিক্রিয়াটিকে উত্তর হিসাবে চিহ্নিত করার কারণটি হ'ল কারণ তিনি উত্তর নিয়ে আগে ছিলেন।
xorinzor

@xorinzor সত্যিই, আমি ভেবেছিলাম আমি তার আগে উত্তর দিয়েছি, কিছু অদ্ভুত ভুল হতে পারে। যদিও এটি ঠিক আছে
আনিস গুপ্ত

5

নভেম্বর 2017 পর্যন্ত ক্রোম একটি নতুন CSS সম্পত্তি প্রবর্তন করেছে

overscroll-behavior: contain;

লেখার ক্ষেত্রে ক্রস ব্রাউজার সমর্থন সীমাবদ্ধ থাকলেও যা এই সমস্যাটি সমাধান করে।

সম্পূর্ণ বিবরণ এবং ব্রাউজার সমর্থনের জন্য নীচের লিঙ্কগুলি দেখুন


4

সর্বোত্তম সমাধান হ'ল body{overflow:hidden}এই উত্তরগুলির বেশিরভাগ দ্বারা ব্যবহৃত সিএসএস- সমাধান। কিছু উত্তর একটি স্থির করে দেয় যা অদৃশ্য স্ক্রোলবারের কারণে "জাম্প" প্রতিরোধ করে; তবে, কেউ খুব মার্জিত ছিল না। সুতরাং, আমি এই দুটি ফাংশন লিখেছি, এবং তারা বেশ ভাল কাজ করে বলে মনে হচ্ছে।

var $body = $(window.document.body);

function bodyFreezeScroll() {
    var bodyWidth = $body.innerWidth();
    $body.css('overflow', 'hidden');
    $body.css('marginRight', ($body.css('marginRight') ? '+=' : '') + ($body.innerWidth() - bodyWidth))
}

function bodyUnfreezeScroll() {
    var bodyWidth = $body.innerWidth();
    $body.css('marginRight', '-=' + (bodyWidth - $body.innerWidth()))
    $body.css('overflow', 'auto');
}

পরীক্ষা করে দেখুন এই jsFiddle ব্যবহারে এটি দেখতে।


এটি এত পুরানো নয় তবে এর কোনওটিই আমার পক্ষে মোটেও কাজ করছে না এমনকী আমার কাছে এখনও যে উইন্ডোটি উইন্ডোটি স্ক্রোল করতে পারে তা নয়, আমি কী নিখোঁজ করছি?
অবতরণ করেছে

মডেলটি কয়েকবার খুলুন এবং বন্ধ করুন, এবং মূল সবুজ ডিআইভি সঙ্কুচিত হবে এবং সঙ্কুচিত হবে!
ওয়েবিনান

@ ওয়েবিনান আমি এটি উইন 7-এ ক্রোমে দেখছি না। আপনার ব্রাউজার এবং ভিউপোর্টের আকার কী?
স্টিফেন এম হ্যারিস

1
@ সিমহমিক প্রায় 20 বার খোলা এবং বন্ধ করার পরে সবুজ ডিভের প্রস্থ open modalবোতামগুলির প্রস্থের সমান হয়ে যায় । 8 এ ক্রোম
ওয়েবিনান

@ Jpap এর উত্তর (অনুরূপ stackoverflow.com/a/16451821/5516499 ) কিন্তু যোগ বাগ সঙ্গে। :-(
কিভি শাপিরো

4

অনেকে শরীরের উপরে "ওভারফ্লো: লুকানো" পরামর্শ দেয় যা কাজ করবে না (আমার ক্ষেত্রে অন্তত নয়), যেহেতু এটি ওয়েবসাইটটিকে শীর্ষে স্ক্রোল করে তুলবে।

এই সমাধানটি আমার জন্য (মোবাইল ফোন এবং কম্পিউটার উভয় ক্ষেত্রে) jQuery ব্যবহার করে:

    $('.yourModalDiv').bind('mouseenter touchstart', function(e) {
        var current = $(window).scrollTop();
        $(window).scroll(function(event) {
            $(window).scrollTop(current);
        });
    });
    $('.yourModalDiv').bind('mouseleave touchend', function(e) {
        $(window).off('scroll');
    });

এটি মডেলের স্ক্রোলিংটি কাজ করতে সক্ষম করবে এবং একই সাথে ওয়েবসাইটটিকে স্ক্রোলিং থেকে আটকাবে।


: এই সমাধান সংশোধন করা হয়েছে মত এই আইওএস বাগ খুব সৌন্দর্য hackernoon.com/...
Gotenks

3

আপনি নিম্নলিখিত যুক্তি ব্যবহার করতে পারেন, আমি এটি পরীক্ষা করেছি এবং এটি কাজ করে (এমনকি আইআই তেও)

   <html>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">

var currentScroll=0;
function lockscroll(){
    $(window).scrollTop(currentScroll);
}


$(function(){

        $('#locker').click(function(){
            currentScroll=$(window).scrollTop();
            $(window).bind('scroll',lockscroll);

        })  


        $('#unlocker').click(function(){
            currentScroll=$(window).scrollTop();
            $(window).unbind('scroll');

        })
})

</script>

<div>

<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<button id="locker">lock</button>
<button id="unlocker">unlock</button>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>

</div>

2

আমি এটি 100% নিশ্চিত নই যে এটি বুটস্ট্র্যাপের সাথে কাজ করবে তবে চেষ্টা করার মতো - এটি গিডুবটিতে পাওয়া যেতে পারে এমন রেমোডাল.জেএস এর সাথে কাজ করেছে: http://vodkabears.github.io/remodal/ এবং এটি পদ্ধতিগুলির জন্য বোধগম্য হবে বেশ অনুরূপ হতে।

পৃষ্ঠার শীর্ষে জাম্পিং বন্ধ করতে এবং সামগ্রীর ডানদিকের শিফট প্রতিরোধ করতে bodyযখন মডেলটি নিক্ষেপ করা হবে এবং এই সিএসএস বিধিগুলি সেট করুন:

body.with-modal {
    position: static;
    height: auto;
    overflow-y: hidden;
}

ডানদিকে সামগ্রীর ঝাঁপ দেওয়া বন্ধ করতে এটি position:staticএবং height:autoএকত্রিত। overflow-y:hidden;মোডাল পিছনে স্ক্রোলযোগ্য হওয়া থেকে পৃষ্ঠা স্টপ।


এই সমাধানটি আমার জন্য সাফারি 11.1.1, ক্রোম 67.0.3396.99 এবং ফায়ারফক্স 60.0.2 এ পুরোপুরি কার্যকর করে। ধন্যবাদ!
ডোম

2

এই ঝাঁকুনির উপর ভিত্তি করে: http://jsfiddle.net/dh834zgw/1/

নিম্নলিখিত স্নিপেট (jquery ব্যবহার করে) উইন্ডো স্ক্রোলটি অক্ষম করবে:

 var curScrollTop = $(window).scrollTop();
 $('html').toggleClass('noscroll').css('top', '-' + curScrollTop + 'px');

এবং আপনার সিএসএসে:

html.noscroll{
    position: fixed;
    width: 100%;
    top:0;
    left: 0;
    height: 100%;
    overflow-y: scroll !important;
    z-index: 10;
 }

এখন আপনি যখন মডেলটি সরিয়ে ফেলবেন, এইচটিএমএল ট্যাগে ন্যাসক্রোল ক্লাসটি সরাতে ভুলবেন না:

$('html').toggleClass('noscroll');

overflowসেট করা উচিত নয় hidden? যদিও এটি আমার জন্য ব্যবহার করেছে (ব্যবহার করে hidden)।
mhulse

2

আমার একটি সাইডবার ছিল যা চেকবক্স হ্যাক দ্বারা উত্পাদিত হয়েছিল। তবে মূল ধারণাটি হ'ল ডকুমেন্ট স্ক্রোলটপ সংরক্ষণ করা এবং উইন্ডো স্ক্রোল করার সময় এটি পরিবর্তন না করা।

দেহটি 'ওভারফ্লো: লুকানো' হয়ে গেলে পৃষ্ঠা লাফানো আমার ঠিক পছন্দ হয়নি

window.addEventListener('load', function() {
    let prevScrollTop = 0;
    let isSidebarVisible = false;

    document.getElementById('f-overlay-chkbx').addEventListener('change', (event) => {
        
        prevScrollTop = window.pageYOffset || document.documentElement.scrollTop;
        isSidebarVisible = event.target.checked;

        window.addEventListener('scroll', (event) => {
            if (isSidebarVisible) {
                window.scrollTo(0, prevScrollTop);
            }
        });
    })

});


2

দুঃখের বিষয়, উপরের উত্তরগুলির কোনওোটাই আমার সমস্যাগুলি স্থির করেনি।

আমার পরিস্থিতিতে, ওয়েব পৃষ্ঠায় মূলত একটি স্ক্রোল বার রয়েছে। আমি যখনই মডেলটিতে ক্লিক করব তখন স্ক্রোল বারটি অদৃশ্য হবে না এবং শিরোনামটি কিছুটা ডানদিকে চলে যাবে।

তারপরে আমি যুক্ত করার চেষ্টা করেছি .modal-open{overflow:auto;}(যা বেশিরভাগ লোকেরা সুপারিশ করেছেন)। এটি প্রকৃতপক্ষে সমস্যাগুলি স্থির করেছে: আমি মোডালটি খোলার পরে স্ক্রোল বারটি উপস্থিত হয়। যাইহোক, অন্য একটি পার্শ্ব প্রতিক্রিয়া বেরিয়ে আসে যা হ'ল "শিরোনামের নীচের পটভূমিটি কিছুটা বাম দিকে চলে যাবে, একসাথে মডেলের পিছনে আরও একটি দীর্ঘ বার"

মডেলের পিছনে লম্বা বার

ভাগ্যক্রমে, আমি যুক্ত করার পরে {padding-right: 0 !important;}, সবকিছু পুরোপুরি ঠিক করা হয়েছে। শিরোনাম এবং বডি ব্যাকগ্রাউন্ড উভয়ই সরেনি এবং মডেল এখনও স্ক্রোলবারকে রাখে।

স্থির চিত্র

যারা এখনও এই সমস্যা নিয়ে আটকে আছেন এটি তাদের সহায়তা করতে পারে আশা করি। শুভকামনা!


1

বেশিরভাগ টুকরো এখানে, তবে আমি কোনও উত্তর দেখতে পাচ্ছি না যা এটি সমস্ত একসাথে রেখে দেয়।

সমস্যা তিনগুণ।

(1) অন্তর্নিহিত পৃষ্ঠার স্ক্রোলটি প্রতিরোধ করুন

$('body').css('overflow', 'hidden')

(২) এবং স্ক্রোল বারটি সরান

var handler = function (e) { e.preventDefault() }
$('.modal').bind('mousewheel touchmove', handler)

(3) মোডাল বরখাস্ত করা হলে পরিষ্কার করুন

$('.modal').unbind('mousewheel touchmove', handler)
$('body').css('overflow', '')

যদি মডেলটি পূর্ণ স্ক্রিন না হয় তবে একটি সম্পূর্ণ পর্দার ওভারলেতে। মডেল বাইন্ডিংগুলি প্রয়োগ করুন।


4
এটি মডেলের মধ্যেও স্ক্রোলিং প্রতিরোধ করে।
ড্যানিয়েল

একই সমস্যা. আপনি কি সমাধান খুঁজে পেয়েছেন? @ ড্যানিয়েল
অ্যালেক্সিওভয়ে

@ ওয়ে বাছাই করুন। এটি দেখুন: blog.christoffer.me/…
ড্যানিয়েল

1

বুটস্ট্র্যাপ 3 এর জন্য আমার সমাধান:

.modal {
  overflow-y: hidden;
}
body.modal-open {
  margin-right: 0;
}

কারণ আমার জন্য শুধুমাত্র overflow: hiddenউপর body.modal-openবর্গ মূল কারণে বাম নাড়াচাড়া থেকে পৃষ্ঠা আটকাতে পারেনি margin-right: 15px


1

আমি সবেমাত্র এটি করেছি ...

$('body').css('overflow', 'hidden');

কিন্তু যখন স্ক্রোলার অসন্তুষ্ট হয়ে গেল তখন সবকিছু ঠিক 20 পিক্সে সরানো হয়েছিল, তাই আমি যুক্ত করেছি

$('body').css('margin-right', '20px');

সরাসরি এটি পরে

আমার জন্য কাজ কর.


এটি কেবল তখনই কাজ করে যদি মডেলটি পর্দার আকারের চেয়ে ছোট হয়।
সের্গেই

1

মডেল যদি 100% উচ্চতা / প্রস্থ হয় তবে "মাউসেন্টার / ছুটি" সহজেই স্ক্রোলিং সক্ষম / অক্ষম করতে কাজ করবে। এটি সত্যই আমার পক্ষে কাজ করেছে:

var currentScroll=0;
function lockscroll(){
    $(window).scrollTop(currentScroll);
} 
$("#myModal").mouseenter(function(){
    currentScroll=$(window).scrollTop();
    $(window).bind('scroll',lockscroll); 
}).mouseleave(function(){
    currentScroll=$(window).scrollTop();
    $(window).unbind('scroll',lockscroll); 
});

1

আমার জন্য কাজ

$('#myModal').on({'mousewheel': function(e) 
    {
    if (e.target.id == 'el') return;
    e.preventDefault();
    e.stopPropagation();
   }
});

1

বুলমা যেমন করে না কেন? মোডাল যখন সক্রিয় থাকে তখন তাদের শ্রেণিতে এইচটিএমএল যুক্ত করুন .আইএস-ক্লিপড যা ওভারফ্লো: লুকানো! গুরুত্বপূর্ণ; এবং এটাই.

সম্পাদনা: ওকে, বুলমার এই বাগ রয়েছে, সুতরাং আপনাকে অবশ্যই অন্যান্য জিনিস যুক্ত করতে হবে

html.is-modal-active {
  overflow: hidden !important;
  position: fixed;
  width: 100%; 
}

1

যেহেতু আমার জন্য এই সমস্যাটি মূলত আইওএস-তে উপস্থাপিত হয়, আমি কেবল এটি আইওএস-এ ঠিক করার জন্য কোড সরবরাহ করি:

  if(!!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)) {
    var $modalRep    = $('#modal-id'),
        startScrollY = null, 
        moveDiv;  

    $modalRep.on('touchmove', function(ev) {
      ev.preventDefault();
      moveDiv = startScrollY - ev.touches[0].clientY;
      startScrollY = ev.touches[0].clientY;
      var el = $(ev.target).parents('#div-that-scrolls');
      // #div-that-scrolls is a child of #modal-id
      el.scrollTop(el.scrollTop() + moveDiv);
    });

    $modalRep.on('touchstart', function(ev) {
      startScrollY = ev.touches[0].clientY;
    });
  }

1

উপরের উত্তরগুলির মধ্যে আমার পক্ষে পুরোপুরি কার্যকর হয়নি worked সুতরাং আমি আরও একটি উপায় খুঁজে পেয়েছি যা ভালভাবে কাজ করে।

কেবলমাত্র একটি scroll.(namespace)শ্রোতা এবং এর সেটটি যুক্ত scrollTopকরুনdocument এটা মান সর্বশেষ করতে ...

এবং আপনার নিকট স্ক্রিপ্টে শ্রোতাদের সরান।

// in case of bootstrap modal example:
$('#myModal').on('shown.bs.modal', function () {

  var documentScrollTop = $(document).scrollTop();
  $(document).on('scroll.noScroll', function() {
     $(document).scrollTop(documentScrollTop);
     return false;
  });

}).on('hidden.bs.modal', function() {

  $(document).off('scroll.noScroll');

});

হালনাগাদ

দেখে মনে হচ্ছে এটি ক্রোমে ভাল কাজ করে না। এটি ঠিক করার কোন পরামর্শ?



0

যারা বুটস্ট্র্যাপ 3 মডালের জন্য কীভাবে স্ক্রোল ইভেন্টটি পাবেন তা ভাবছেন:

$(".modal").scroll(function() {
    console.log("scrolling!);
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.