উল্লম্বভাবে স্ক্রোল করার সময় অনুভূমিক স্ক্রোলকে অনুমতি দেবেন না (এবং বিপরীতে)


17

আমার সাথে একটি তালিকা আছে overflow-xএবং overflow-yসেট আছে auto। তদ্ব্যতীত, আমি গতিবেগ স্ক্রোল সেট আপ করেছি, তাই টাচ স্ক্রোলিংটি মোবাইল ব্যবহার করে দুর্দান্ত ব্যবহার করে webkit-overflow-scrolling: true

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

আমি নিম্নলিখিত চেষ্টা করেছি:

জাতীয়:

offsetX: number;
offsetY: number;
isScrollingHorizontally = false;
isScrollingVertically = false;

//Detect the scrolling events
ngOnInit() {
    this.scrollListener = this.renderer.listen(
      this.taskRows.nativeElement,
      'scroll',
      evt => {
        this.didScroll();
      }
    );

    fromEvent(this.taskRows.nativeElement, 'scroll')
      .pipe(
        debounceTime(100),
        takeUntil(this.destroy$)
      )
      .subscribe(() => {
        this.endScroll();
    });
}

didScroll() {
    if ((this.taskRows.nativeElement.scrollLeft != this.offsetX) && (!this.isScrollingHorizontally)){
        console.log("Scrolling horizontally")
        this.isScrollingHorizontally = true;
        this.isScrollingVertically = false;
        this.changeDetectorRef.markForCheck();
    }else if ((this.taskRows.nativeElement.scrollTop != this.offsetY) && (!this.isScrollingVertically)) {
        console.log("Scrolling Vertically")
        this.isScrollingHorizontally = false;
        this.isScrollingVertically = true;
        this.changeDetectorRef.markForCheck();
    }
}

endScroll() {
    console.log("Ended scroll")
    this.isScrollingVertically = false;
    this.isScrollingHorizontally = false;
    this.changeDetectorRef.markForCheck();
}

এইচটিএমএল:

<div
    class="cu-dashboard-table__scroll"
    [class.cu-dashboard-table__scroll_disable-x]="isScrollingVertically"
    [class.cu-dashboard-table__scroll_disable-y]="isScrollingHorizontally"
>

সিএসএস:

&__scroll {
  display: flex;
  width: 100%;
  height: 100%;
  overflow-y: auto;
  overflow-x: auto;
  will-change: transform;
  -webkit-overflow-scrolling: touch;

  &_disable-x {
     overflow-x: hidden;
  }

  &_disable-y {
    overflow-y: hidden;
  }
}

কিন্তু সব আমি সেট overflow-xবা overflow-yকরতে hiddenযখন তার স্ক্রল হয়েছে, স্ক্রলিং সামান্য ত্রুটি এবং উপরের ফিরে তিড়িং লাফ হবে। আমি এটিও লক্ষ্য করেছি যে webkit-overflow-scrolling: trueএটি কারণ হ'ল, যখন আমি এটি সরিয়ে ফেলি, আচরণটি বন্ধ হয়ে যায় বলে মনে হয় তবে মোবাইল ডিভাইসগুলিতে গতিবেগ স্ক্রোলিংয়ের জন্য আমার একেবারে এটি প্রয়োজন need

উল্লম্বভাবে স্ক্রোল করার সময় আমি কীভাবে অনুভূমিক স্ক্রোলটি অক্ষম করব?


স্ক্রোলিংয়ের সমস্যাটি কীভাবে ঠিক করা যায় তা আমি জানি না। হতে পারে এক ধাপ পিছনে এবং যে কোনওভাবে দুটি অক্ষের মধ্যে একটিকে স্ক্রোলিং থেকে আটকাতে চেষ্টা করবেন? অফ-টপিক: টেবিলগুলি সত্যই ছোট পর্দার জন্য নয়।
জোপ কোকেলকর্ন

আপনার কোডটিতে একটি অনুপস্থিত কোঁকড়ানো বন্ধনী রয়েছে। আপনি যদি এটি স্নিপেট হিসাবে যুক্ত করেন তবে আপনি কনসোলে একটি ত্রুটি বার্তা দেখতে পাবেন।
রাজ্জান জামফির

শুধু একটি বোকা ধারণা। স্ক্রোল করতে কেন দুটি স্লাইডার বা কাস্টম স্লাইডার ব্যবহার করবেন না?
টমাস লুডভিগ

সম্পর্কিত ধারণা: স্ট্যাকওভারফ্লো.com
জেমস ডান

উত্তর:


4

এটা চেষ্টা কর

HTML
<div
  class="cu-dashboard-table__scroll-vertical"
>
  <div
    class="cu-dashboard-table__scroll-horizontal"
  >
    <!-- Scroll content here -->
  </div>
</div>


CSS
&__scroll {
  &-horizontal {
    overflow-x: auto;
    width: 100%;
    -webkit-overflow-scrolling: touch;
  }

  &-vertical {
    overflow-y: auto;
    height: 100%;
    -webkit-overflow-scrolling: touch;
  }
}

স্ক্রোলিংয়ের জন্য একটি ডিভ ব্যবহার না করে আপনি দুটি ব্যবহার করবেন না কেন? এক্স এর জন্য একটি এবং ওয়াইয়ের জন্য একটি রাখুন


1
ভালো বুদ্ধি! অসুস্থ এটি একটি শট দিতে।
জোশ

1
লোল, আমাকে বলতে হবে এটি একটি উদ্ভাবনী ধারণা।
frodo2975

15

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

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

// Touchstart handler
if (scrollState === ScrollState.Default) {
    // Record position and id of touch
    touchStart = touch.location
    touchStartId = touch.id.
    scrollState = ScrollState.Touching

    // If you have to manually scroll the div, first store its starting scroll position:
    containerTop = $('.myContainer').scrollTop();
    containerLeft = $('.myContainer').scrollLeft();
}

// Touchmove handler - If the user has dragged beyond a distance threshold,
// do the css classes swap.
if (touch.id === touchStartId && distance(touchStart, touch.location > threshold) {
    scrollState = ScrollState.Scrolling;
    swapCssClasses();

    // If you have to manually scroll the div to prevent jump:
    $('.myContainer').scrollTop(containerTop + (touch.location.y - touchStart.y));
    // Do the same for horizontal scroll.
}

// Then, listen for debounced scroll events, like you're already doing,
// to reset your state back to default.

দ্বিতীয় ধারণা: আপনার স্ক্রোল হ্যান্ডলারে, CSS ক্লাস পরিবর্তন করার পরিবর্তে, আপনি যে অক্ষটি লক করতে চান তার জন্য সরাসরি ডিভের স্ক্রোল অবস্থানটি সেট করুন। IE, আপনি যদি অনুভূমিকভাবে স্ক্রল করে থাকেন তবে সর্বদা স্ক্রোলটপটিকে তার শুরু মান হিসাবে সেট করুন। এটি স্ক্রোলিং বাতিলও করতে পারে, নিশ্চিত নয়। এটি কাজ করে কিনা তা দেখার জন্য আপনাকে চেষ্টা করতে হবে।


আমি এটি চেষ্টা করেছিলাম তবে এটি দুর্দান্ত ঝাপটায় ছিল এবং অভিনয়টি দুর্দান্ত ছিল।
জোশ

3

এটি সমাধান করার চেষ্টা করার বিভিন্ন উপায় রয়েছে। কিছু ভাল ধারণা এখানে দেওয়া হয়।

তবে, অন্যরা যেমন ইঙ্গিত দিয়েছে, বহুমাত্রিক স্ক্রোলিং উপর নির্ভর (বা এড়াতে চেষ্টা করা) একটি খারাপ ইউএক্স গন্ধ - ইউএক্স একটি সমস্যা হওয়ার ইঙ্গিত দেয়। আমি মনে করি না এটি একটি বৈধ দেব সমস্যা। এক ধাপ পিছিয়ে নেওয়া এবং আপনি কী সম্পাদনা করতে চাইছেন তা পুনর্বিবেচনা করা ভাল। সমস্যাগুলির মধ্যে একটি হতে পারে ইউআইটিকে আরও ব্যবহারযোগ্য করে তোলার প্রয়াসে আপনি ব্যবহারকারীদের বিভ্রান্ত করবেন। এখানে বর্ণিত ব্যবহারযোগ্যতা সম্ভবত বিভ্রান্তির কারণ হতে পারে।

আমি কেন অনুভূমিকভাবে স্ক্রোল করতে পারি না?

কেন আমি যখন উল্লম্বভাবে স্ক্রোলিং বন্ধ করি, কেবল তখনই আমি অনুভূমিকভাবে স্ক্রোল করতে পারি?

এগুলি এমন কিছু প্রশ্ন যা জিজ্ঞাসা করা যেতে পারে (শ্রবণাতীত)।

আপনি যখন ব্যবহারকারীটি সারিটি নির্বাচন করেছেন কেবল তখন উল্লম্ব তথ্য তালিকার অতিরিক্ত তথ্যের জন্য ব্রাউজযোগ্য হওয়ার অনুমতি দেওয়ার চেষ্টা করছেন, সম্ভবত কেবলমাত্র উল্লম্বভাবে স্ক্রোলযোগ্য, এবং কেবল উল্লম্বভাবে টগল করে কেবল ফ্ল্যাট তালিকা থাকা আরও ভাল would "সারি" নির্বাচন / সক্রিয় করা হলে তথ্য বিশদটি সঙ্কুচিত করে ফ্লেট উল্লম্ব তালিকায় ফিরে আসবে।

যদি আপনি এই জাতীয় প্রান্তের প্রযুক্তিগত চ্যালেঞ্জ সমাধানের জন্য হুপসের মধ্য দিয়ে ঝাঁপিয়ে পড়ে থাকেন তবে এটি একটি ভাল ইঙ্গিত যে ব্যবহারকারীর অভিজ্ঞতা শুরু করার জন্য ভালভাবে ডিজাইন করা হয়নি।


3

তিনটি পাত্রে ব্যবহার করা দরকার।
প্রথম ধারকটিতে আমি উল্লম্ব স্ক্রোলিং সক্ষম করি এবং অনুভূমিকটিকে অস্বীকার করি।
দ্বিতীয়টিতে, তদ্বিপরীতভাবে, আমি অনুভূমিক স্ক্রোলিং সক্ষম করি এবং উল্লম্বটি বর্জন করি। ব্যবহার নিশ্চিত করুন overflow-x: hidden;এবং overflow-y: hidden;, অন্যথায় শিশু পাত্রে বর্তমান ধারক ছাড়িয়ে যেতে পারে।
এছাড়াও ব্যবহার করা প্রয়োজন min-width: 100%; min-height: 100%;
তৃতীয় ধারকটির জন্য আমাদের ব্যবহার করা দরকার display: inline-block;এবং তারপরে অভ্যন্তরীণ সামগ্রীটি এই ধারকটিকে প্রসারিত করবে এবং সংশ্লিষ্ট স্ক্রোল বার দুটি প্যারেন্ট ব্লকগুলিতে প্রদর্শিত হবে।

এইচটিএমএল

<div class="scroll-y">
  <div class="scroll-x">
    <div class="content-container">

      <!-- scrollable content here -->

    </div>
  </div>
</div>

সিএসএস

.scroll-y {
  position: absolute;
  overflow-x: hidden;
  overflow-y: auto;
  width: 100%;
  height: 100%;
  min-width: 100%;
  min-height: 100%;
}

.scroll-x {
  overflow-y: hidden;
  overflow-x: auto;
  width: auto;
  min-width: 100%;
  min-height: 100%;
}

.content-container {
  min-width: 100%;
  min-height: 100%;
  display: inline-block;
}

আপনি এখানে আইফোনের সাফারিতে এটি পরীক্ষা করতে পারেন ।

শুভকামনা !! 😉


: উত্থিত হাত:: উত্থিত হাত:
কাপ_

0

এটিকে মজাদার দেখাচ্ছে;)

এটি যুক্তিসঙ্গত কিনা তা নিয়ে আমি তর্ক করব না।

আমি এটি আরএক্সজেএস দিয়ে চেষ্টা করেছি:

  ngAfterViewInit() {
    const table = document.getElementById("table");

    const touchstart$ = fromEvent(table, "touchstart");
    const touchmove$ = fromEvent(table, "touchmove");
    const touchend$ = fromEvent(table, "touchend");

    touchstart$
      .pipe(
        switchMapTo(
          touchmove$.pipe(
            // tap(console.log),
            map((e: TouchEvent) => ({
              x: e.touches[0].clientX,
              y: e.touches[0].clientY
            })),
            bufferCount(4),
            map(calculateDirection),
            tap(direction => this.setScrollingStyles(direction)),
            takeUntil(touchend$)
          )
        )
      )
      .subscribe();
  }

আমরা প্রতি 4 র্থ বাফার touchemoveঘটনা এবং তারপর চার ইভেন্টগুলি (স্থানাঙ্ক সঙ্গে কিছু অত্যন্ত অত্যাধুনিক হিসাব করা map(calculateDirection)) যা আউটপুট RIGHT, LEFT, UPবা DOWNএবং আমি অক্ষম উল্লম্ব বা horicontal স্ক্রলিং চেষ্টা উপর ভিত্তি করে। আমার অ্যান্ড্রয়েড ফোনে ক্রোমে এটি ধরণের কাজ করে;)

আমি একটি সামান্য খেলার মাঠ তৈরি করেছি , যা উন্নত, পুনরায় লিখিত, যা কিছু হতে পারে ...

চিয়ার্স ক্রিস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.