तालिका के ऊपर और नीचे क्षैतिज स्क्रॉलबार


159

मैं tableअपने पृष्ठ पर बहुत बड़ा हूं। इसलिए मैंने टेबल के नीचे एक क्षैतिज स्क्रॉलबार लगाने का फैसला किया। लेकिन मैं चाहूंगा कि यह स्क्रॉलबार तालिका में शीर्ष पर भी हो।

टेम्पलेट में मेरे पास यह है:

<div style="overflow:auto; width:100%; height:130%">
<table id="data" style="width:100%">...</table>
</div>

क्या यह HTML और CSS में ही संभव है?


1
stackoverflow.com/questions/2274627/… मुझे यह समाधान उपयोगी लगा।
वार्षा दास

जवाबों:


234

किसी तत्व के शीर्ष पर एक दूसरे क्षैतिज स्क्रॉलबार का अनुकरण करने के लिए, divउस तत्व के ऊपर एक "डमी" डालें जिसमें क्षैतिज स्क्रॉलिंग हो, बस स्क्रॉलबार के लिए पर्याप्त उच्च। फिर डमी तत्व और वास्तविक तत्व के लिए "स्क्रॉल" ईवेंट के हैंडलर्स को संलग्न करें, जब स्क्रबर को स्थानांतरित किया जाता है, तो दूसरे तत्व को सिंक्र में मिलाएं। डमी तत्व वास्तविक तत्व के ऊपर एक दूसरे क्षैतिज स्क्रॉलबार की तरह दिखेगा।

एक जीवंत उदाहरण के लिए , इस फिडेल को देखें

यहाँ कोड है :

HTML:

<div class="wrapper1">
  <div class="div1"></div>
</div>
<div class="wrapper2">
  <div class="div2">
    <!-- Content Here -->
  </div>
</div>

सीएसएस:

.wrapper1, .wrapper2 {
  width: 300px;
  overflow-x: scroll;
  overflow-y:hidden;
}

.wrapper1 {height: 20px; }
.wrapper2 {height: 200px; }

.div1 {
  width:1000px;
  height: 20px;
}

.div2 {
  width:1000px;
  height: 200px;
  background-color: #88FF88;
  overflow: auto;
}

जे एस:

$(function(){
  $(".wrapper1").scroll(function(){
    $(".wrapper2").scrollLeft($(".wrapper1").scrollLeft());
  });
  $(".wrapper2").scroll(function(){
    $(".wrapper1").scrollLeft($(".wrapper2").scrollLeft());
  });
});

वास्तव में महान जवाब! आपका बहुत बहुत धन्यवाद! :) तो मैंने आपके उदाहरण का उपयोग करने की कोशिश की, लेकिन शीर्ष पर पट्टी काम नहीं करती है, और जब मैंने चौड़ाई बढ़ाने की कोशिश की, तो स्क्रॉलिंग पट्टी गायब हो गई। किसी भी विचार क्यों?
psoares

1
क्या आपको यह काम करने के लिए मिला? JQuery के बारे में अधिक जानकारी के लिए, api.jquery.com/scrollLeft देखें (बेशक, आप इसे सीधे onscroll संचालकों को संलग्न करके jQuery के बिना कर सकते हैं।) बिना JS के उपयोगकर्ताओं के लिए सुंदर गिरावट के लिए, आप JS द्वारा DOM में dummy div जोड़ सकते हैं। ।
स्टेनली

1
हां, मुझे यह काम करने के लिए मिला, मैंने केवल <script टाइप = "text / javascript" src = "path"> </ script> को <head> में जोड़ा था। तो हर बार जब मैं jquery जोड़ता हूं तो मुझे उस @fudgey को जोड़ना होगा? क्षमा करें, जावास्क्रिप्ट और jquery अभी भी मेरे लिए चीनी की तरह है
psoares

4
@StanleyH: कैसे div सेट करने के लिए स्वचालित रूप से इसके अंदर तालिका की चौड़ाई लेने के लिए? मैं मैन्युअल रूप से div2 की चौड़ाई निर्दिष्ट नहीं करना चाहता, लेकिन यह स्वचालित रूप से तालिका की चौड़ाई लेना चाहता है, जिसमें यह शामिल है।
sqlchild

3
@CodyGuldner: कैसे div सेट करने के लिए स्वचालित रूप से इसके अंदर तालिका की चौड़ाई लेने के लिए? मैं मैन्युअल रूप से div2 की चौड़ाई निर्दिष्ट नहीं करना चाहता, लेकिन यह स्वचालित रूप से तालिका की चौड़ाई लेना चाहता है, जिसमें यह शामिल है।
sqlchild

38

jquery.doubleScrollप्लगइन का उपयोग करके देखें :

jQuery:

$(document).ready(function(){
  $('#double-scroll').doubleScroll();
});

सीएसएस:

#double-scroll{
  width: 400px;
}

HTML:

<div id="double-scroll">
  <table id="very-wide-element">
    <tbody>
      <tr>
        <td></td>
      </tr>
    </tbody>
  </table>
</div>

5
पावेल के भयानक प्लगइन के एक संस्करण के लिए github.com/avianey/jqDoubleScroll देखें जिसे jQueryUI की आवश्यकता नहीं है।
21 अप्रैल को घातक_रोर

1
लिंक मुझे पढ़ने में टूटी हुई लिंक के साथ एक संयुक्त-बनाए हुए GitHub की ओर जाता है। वास्तविक js की कोशिश नहीं की है।
पॉल गोरबास

19

सबसे पहले, शानदार जवाब, @StanleyH। अगर कोई सोच रहा है कि गतिशील चौड़ाई के साथ डबल स्क्रॉल कंटेनर कैसे बनाया जाए:

सीएसएस

.wrapper1, .wrapper2 { width: 100%; overflow-x: scroll; overflow-y: hidden; }
.wrapper1 { height: 20px; }
.div1 { height: 20px; }
.div2 { overflow: none; }

js

$(function () {
    $('.wrapper1').on('scroll', function (e) {
        $('.wrapper2').scrollLeft($('.wrapper1').scrollLeft());
    }); 
    $('.wrapper2').on('scroll', function (e) {
        $('.wrapper1').scrollLeft($('.wrapper2').scrollLeft());
    });
});
$(window).on('load', function (e) {
    $('.div1').width($('table').width());
    $('.div2').width($('table').width());
});

एचटीएमएल

<div class="wrapper1">
    <div class="div1"></div>
</div>
<div class="wrapper2">
    <div class="div2">
        <table>
            <tbody>
                <tr>
                    <td>table cell</td>
                    <td>table cell</td>
                    <!-- ... -->
                    <td>table cell</td>
                    <td>table cell</td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

डेमो

http://jsfiddle.net/simo/67xSL/


3
$('.div1').width( $('.div1')[0].scrollWidth)जब आप विशेष रूप से तालिका जैसे कंटेनर का उपयोग नहीं कर रहे हों, तब सामग्री की वास्तविक स्क्रॉल चौड़ाई प्राप्त करने के लिए उपयोग करें । @ सिमो विस्मयकारी प्रयास दोस्त।
क्लेस्सिल्वा

स्पष्ट करने के लिए, मुझे अपने स्वयं के कोड को काम करने के लिए स्क्रॉलविडथ में कोड बदलने के लिए भी बदलना पड़ा, जहां "div2" div के भीतर सामग्री की चौड़ाई सर्वर साइड डायनामिक कंटेंट के कारण परिवर्तनशील थी।
एडमजोन

15

बिना JQuery (2017)

क्योंकि आपको JQuery की आवश्यकता नहीं हो सकती है, यहाँ @StanleyH उत्तर पर आधारित एक वैनिला JS संस्करण काम कर रहा है:

var wrapper1 = document.getElementById('wrapper1');
var wrapper2 = document.getElementById('wrapper2');
wrapper1.onscroll = function() {
  wrapper2.scrollLeft = wrapper1.scrollLeft;
};
wrapper2.onscroll = function() {
  wrapper1.scrollLeft = wrapper2.scrollLeft;
};
#wrapper1, #wrapper2{width: 300px; border: none 0px RED;
overflow-x: scroll; overflow-y:hidden;}
#wrapper1{height: 20px; }
#wrapper2{height: 100px; }
#div1 {width:1000px; height: 20px; }
#div2 {width:1000px; height: 100px; background-color: #88FF88;
overflow: auto;}
<div id="wrapper1">
    <div id="div1">
    </div>
</div>
<div id="wrapper2">
    <div id="div2">
    aaaa bbbb cccc dddd aaaa bbbb cccc 
    dddd aaaa bbbb cccc dddd aaaa bbbb 
    cccc dddd aaaa bbbb cccc dddd aaaa 
    bbbb cccc dddd aaaa bbbb cccc dddd
    </div>
</div>


यह वास्तव में उत्तरदायी / गतिशील नहीं है, यदि आप अपनी चौड़ाई नहीं जानते हैं
elad silver

हाँ! इसका मूल जवाब @StanleyH
rap-2-h

11

आप एक jQuery प्लगइन का उपयोग कर सकते हैं जो आपके लिए काम करेगा:

प्लगइन आपके लिए सभी लॉजिक को हैंडल करेगा।


2
हालांकि इस प्लगइन के रूप में एक ही बात करता है suwala / jquery.doubleScroll प्लगइन यह window.resize पर चौड़ाई recalculating की तरह अधिक विकल्प हैं
इवान Hušnjak

1
इसके अलावा jquery UI पर निर्भर नहीं करता है।
tribe84

1
मैं इस प्लगइन की सिफारिश करूंगा, यह सुवाला / jquery.doubleScroll के एक उन्नत संस्करण जैसा दिखता है और मेरे लिए काम करता है
रसेल इंग्लैंड

पहले महान प्लगइन के लिए धन्यवाद! हालाँकि, मेरे पास स्क्रॉल दिशा: rtl के साथ एक समस्या है। ऐसा लगता है कि यह इसे सही ढंग से समर्थन नहीं करता है। यदि आप में से किसी ने गुरुओं को पता है कि इसे कैसे ठीक किया जाए, तो यह है कि फिडेल: jsfiddle.net/qsn7tupc/3 ध्यान दें कि यह क्रोम में काम करता है लेकिन किसी अन्य ब्राउज़र में नहीं।
व्लादो

10

स्टैनली का जवाब उत्कृष्ट था, लेकिन इसमें एक दुर्भाग्यपूर्ण बग था: स्क्रॉलबार के छायांकित क्षेत्र को क्लिक करने से अब आपके द्वारा चुने गए चयन पर कूदता नहीं है। इसके बजाय, आपको जो मिलता है वह स्क्रॉलबार की स्थिति में बहुत छोटा और कुछ कष्टप्रद वृद्धि है।

परीक्षण किया गया: फ़ायरफ़ॉक्स के 4 संस्करण (100% प्रभावित), क्रोम के 4 संस्करण (50% प्रभावित)।

यहाँ मेरा jsfiddle है । आप इसे एक चालू / बंद (सच्चा / गलत) संस्करण के साथ प्राप्त कर सकते हैं, जो एक बार में चालू करने के लिए केवल एक ऑनस्कॉल () घटना की अनुमति देता है:

var scrolling = false;
$(".wrapper1").scroll(function(){
    if(scrolling) {
      scrolling = false;
      return true;
    }
    scrolling = true;
    $(".wrapper2")
        .scrollLeft($(".wrapper1").scrollLeft());
});
$(".wrapper2").scroll(function(){
    if(scrolling) {
      scrolling = false;
      return true;
    }
      scrolling = true;
    $(".wrapper1")
        .scrollLeft($(".wrapper2").scrollLeft());
});

समस्या व्यवहार उत्तर स्वीकृत के साथ:

वास्तव में वांछित व्यवहार:

तो, बस ऐसा क्यों होता है? यदि आप कोड के माध्यम से चलते हैं, तो आप देखेंगे कि wrapper1 कॉल आवरण 2 के स्क्रॉललेफ्ट, और आवरण 2 के कॉल आवरण 1 को स्क्रॉललेट कहते हैं, और इसे अनंत रूप से दोहराते हैं, इसलिए, हमारे पास एक अनंत लूप समस्या है। या, इसके बजाय: उपयोगकर्ता की निरंतर स्क्रॉलिंग आवरण के कॉलगर्ल के कॉल के साथ संघर्ष करती है, एक घटना संघर्ष होता है, और अंतिम परिणाम स्क्रॉलबार में कूद नहीं होता है।

आशा है कि यह किसी और की मदद करता है!


महान व्याख्या! वास्तव में यह एक अनंत पाश कर रहा था
अहमद अबाउद

हाँ। आपके समर्थन के लिए धन्यवाद! यह मेरे लिए मददगार है।
गियांग डी। एमएआई

3

स्क्रॉल करने वालों को जोड़ने का काम किया, लेकिन जिस तरह से इसे लिखा गया है, यह एक लूप बनाता है जो अधिकांश ब्राउज़रों में स्क्रॉलिंग को धीमा कर देता है यदि आप लाइटर स्क्रॉलबार के हिस्से पर क्लिक करते हैं और इसे पकड़ते हैं (स्क्रोलर को खींचते समय नहीं)।

मैंने इसे एक ध्वज के साथ तय किया:

$(function() {
    x = 1;
    $(".wrapper1").scroll(function() {
        if (x == 1) {
            x = 0;
            $(".wrapper2")
                .scrollLeft($(".wrapper1").scrollLeft());
        } else {
            x = 1;
        }
    });


    $(".wrapper2").scroll(function() {
        if (x == 1) {
            x = 0;
            $(".wrapper1")
                .scrollLeft($(".wrapper2").scrollLeft());
        } else {
            x = 1;
        }
    });
});

यह एक समस्या है जो मुझे यहाँ सुझाए गए उत्तर के साथ हल कर रही है। हालाँकि, यह केवल समस्या को थोड़ा कम करता है, फिर भी कदम / धीमी स्क्रॉलिंग हो सकती है यदि आप जिस दूरी को स्क्रॉल करना चाहते हैं वह इसके लिए काफी बड़ा है।
दान मंदिर

सशर्त / झंडे के साथ यह समाधान अच्छी तरह से काम करता है और परीक्षण उस व्यवहार से मेल खाता है जो आप जावास्क्रिप्ट के बिना उम्मीद करेंगे कि ब्राउज़र में लागू किया जा रहा है।
userabuser

3

एक जावास्क्रिप्ट केवल समाधान जो @HoldOffHunger और @bobince उत्तरों पर आधारित है

<div id="doublescroll">

function DoubleScroll(element) {
            var scrollbar= document.createElement('div');
            scrollbar.appendChild(document.createElement('div'));
            scrollbar.style.overflow= 'auto';
            scrollbar.style.overflowY= 'hidden';
            scrollbar.firstChild.style.width= element.scrollWidth+'px';
            scrollbar.firstChild.style.paddingTop= '1px';
            scrollbar.firstChild.appendChild(document.createTextNode('\xA0'));
            var running = false;
            scrollbar.onscroll= function() {
                if(running) {
                    running = false;
                    return;
                }
                running = true;
                element.scrollLeft= scrollbar.scrollLeft;
            };
            element.onscroll= function() {
                if(running) {
                    running = false;
                    return;
                }
                running = true;
                scrollbar.scrollLeft= element.scrollLeft;
            };
            element.parentNode.insertBefore(scrollbar, element);
        }

    DoubleScroll(document.getElementById('doublescroll'));

3

@StanleyH समाधान के आधार पर मैंने एक AngularJS निर्देश , jsFiddle पर डेमो बनाया

प्रयोग करने में आसान:

<div data-double-scroll-bar-horizontal> {{content}} or static content </div>

AngularJS डेवलपर्स के लिए


31
"कोई jQuery की आवश्यकता नहीं है।" हाँ, बस एक पूरी रूपरेखा। कोई बड़ी बात नहीं।
पीटीजेजे

2

जहाँ तक मुझे पता है यह HTML और CSS के साथ संभव नहीं है।


अच्छी तरह से यह वास्तव में मैंने क्या सोचा है .. लेकिन मैं यह जानना चाहूंगा कि क्या किसी ने भी ऐसा किया है और ऐसा करने का सबसे अच्छा तरीका है ..
10'सुविधाएँ

HTML और CSS के लिए, कोई सबसे अच्छा तरीका नहीं है। यह बस संभव नहीं है। आपको इस तरह की कार्यक्षमता प्राप्त करने के लिए, जावास्क्रिप्ट जैसी अन्य तकनीकों का उपयोग करने की आवश्यकता है।
जस्टस रोमिज़न

1
क्या आप कुछ सुझाव देना शुरू कर सकते हैं?
psoares

2
यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें।
एसएसए

2
@SSA यह प्रश्न का उत्तर देता है। सवाल था "क्या यह HTML और CSS में ही संभव है?" और इसका उत्तर "नहीं" है।
punkrockbuddyholly

2

वेनिला जावास्क्रिप्ट / कोणीय में आप इसे इस तरह से कर सकते हैं:

scroll() {
    let scroller = document.querySelector('.above-scroller');
    let table = document.querySelector('.table');
    table.scrollTo(scroller.scrollLeft,0);
  }

HTML:

<div class="above-scroller" (scroll)="scroll()">
  <div class="scroller"></div>
</div>
<div class="table" >
  <table></table>
</div>

सीएसएस:

.above-scroller  {
   overflow-x: scroll;
   overflow-y:hidden;
   height: 20px;
   width: 1200px
 }

.scroller {
  width:4500px;
  height: 20px;
}

.table {
  width:100%;
  height: 100%;
  overflow: auto;
}

1

स्टेनली के जवाब पर विस्तार करना, और न्यूनतम आवश्यक खोजने की कोशिश करना, यहाँ मैंने जो लागू किया है:

जावास्क्रिप्ट (एक बार कहीं से भी बुलाया जाता है $(document).ready()):

function doubleScroll(){
        $(".topScrollVisible").scroll(function(){
            $(".tableWrapper")
                .scrollLeft($(".topScrollVisible").scrollLeft());
        });
        $(".tableWrapper").scroll(function(){
            $(".topScrollVisible")
                .scrollLeft($(".tableWrapper").scrollLeft());
        });
}

HTML (ध्यान दें कि चौड़ाई स्क्रॉल बार की लंबाई बदल जाएगी):

<div class="topScrollVisible" style="overflow-x:scroll">
    <div class="topScrollTableLength" style="width:1520px; height:20px">
    </div>
</div>
<div class="tableWrapper" style="overflow:auto; height:100%;">
    <table id="myTable" style="width:1470px" class="myTableClass">
...
    </table>

बस।


1

सभी कोणीय / देशीजैस प्रशंसकों के लिए, @ सिमो के उत्तर को लागू करना

HTML (कोई परिवर्तन नहीं)

<div class="top-scroll-wrapper">
    <div class="top-scroll"></div>
</div>

सीएसएस (कोई परिवर्तन नहीं, चौड़ाई: 90% मेरी इच्छा है)

.top-scroll-wrapper { width: 90%;height: 20px;margin: auto;padding: 0 16px;overflow-x: auto;overflow-y: hidden;}
.top-scroll { height: 20px; }

जेएस (जैसे onload) या ngAfterViewChecked(सभी के लिए asहैं TypeScript)

let $topscroll = document.querySelector(".top-scroll") as HTMLElement
let $topscrollWrapper = document.querySelector(".top-scroll-wrapper") as HTMLElement
let $table = document.querySelectorAll('mat-card')[3] as HTMLElement

$topscroll.style.width = totalWidth + 'px'
$topscrollWrapper.onscroll = e => $table.scroll((e.target as HTMLElement).scrollLeft, 0)
$table.onscroll = e => $topscrollWrapper.scroll((e.target as HTMLElement).scrollLeft, 0)

0

यदि आप वेबकिट ब्राउज़र या मोबाइल ब्राउज़र पर iscroll.js का उपयोग कर रहे हैं, तो आप कोशिश कर सकते हैं:

$('#pageWrapper>div:last-child').css('top', "0px");

0

इसे हासिल करने का निर्देश इसके लिए आपको jQuery और AngularJs की आवश्यकता होगी।

import angular from 'angular';

var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, $compile) {
  $scope.name = 'Dual wielded horizontal scroller';
});

app.directive('doubleHscroll', function($compile) {
  return {
restrict: 'C',
link: function(scope, elem, attr){

  var elemWidth = parseInt(elem[0].clientWidth);

  elem.wrap(`<div id='wrapscroll' style='width:${elemWidth}px;overflow:scroll'></div>`); 
  //note the top scroll contains an empty space as a 'trick' 
  $('#wrapscroll').before(`<div id='topscroll' style='height:20px; overflow:scroll;width:${elemWidth}px'><div style='min-width:${elemWidth}px'> </div></div>`);

  $(function(){
    $('#topscroll').scroll(function(){
      $("#wrapscroll").scrollLeft($("#topscroll").scrollLeft());
    });
    $('#wrapscroll').scroll(function() {
      $("#topscroll").scrollLeft($("#wrapscroll").scrollLeft());
    });

  });  

}

  };


});

0

यहाँ VueJS के लिए एक उदाहरण है

सूचि पन्ना

<template>
  <div>
    <div ref="topScroll" class="top-scroll" @scroll.passive="handleScroll">
      <div
        :style="{
          width: `${contentWidth}px`,
          height: '12px'
        }"
      />
    </div>
    <div ref="content" class="content" @scroll.passive="handleScroll">
      <div
        :style="{
          width: `${contentWidth}px`
        }"
      >
        Lorem ipsum dolor sit amet, ipsum dictum vulputate molestie id magna,
        nunc laoreet maecenas, molestie ipsum donec lectus ut et sit, aut ut ut
        viverra vivamus mollis in, integer diam purus penatibus. Augue consequat
        quis phasellus non, congue tristique ac arcu cras ligula congue, elit
        hendrerit lectus faucibus arcu ligula a, id hendrerit dolor nec nec
        placerat. Vel ornare tincidunt tincidunt, erat amet mollis quisque, odio
        cursus gravida libero aliquam duis, dolor sed nulla dignissim praesent
        erat, voluptatem pede aliquam. Ut et tellus mi fermentum varius, feugiat
        nullam nunc ultrices, ullamcorper pede, nunc vestibulum, scelerisque
        nunc lectus integer. Nec id scelerisque vestibulum, elit sit, cursus
        neque varius. Fusce in, nunc donec, volutpat mauris wisi sem, non
        sapien. Pellentesque nisl, lectus eros hendrerit dui. In metus aptent
        consectetuer, sociosqu massa mus fermentum mauris dis, donec erat nunc
        orci.
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      contentWidth: 1000
    }
  },
  methods: {
    handleScroll(event) {
      if (event.target._prevClass === 'content') {
        this.$refs.topScroll.scrollLeft = this.$refs.content.scrollLeft
      } else {
        this.$refs.content.scrollLeft = this.$refs.topScroll.scrollLeft
      }
    }
  }
}
</script>

<style lang="scss" scoped>
.top-scroll,
.content {
  overflow: auto;
  max-width: 100%;
}
.top-scroll {
  margin-top: 50px;
}
</style>

इस पर ध्यान देंheight: 12px .. मैंने इसे 12px बनाया है इसलिए इसे मैक उपयोगकर्ताओं पर भी देखा जाएगा। लेकिन w / windows, 0.1px काफी अच्छा है


-1

स्क्रॉल दिशा के साथ एक समस्या है: आरटीएल। ऐसा लगता है कि प्लगइन इसे सही ढंग से समर्थन नहीं करता है। यहाँ है फिडेल: फिडल

ध्यान दें कि यह क्रोम में सही ढंग से काम करता है, लेकिन अन्य सभी लोकप्रिय ब्राउज़रों में शीर्ष स्क्रॉल बार दिशा शेष है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.