JavaScript zum Erzielen eines benutzerdefinierten Bildlaufleisteneffekts

JavaScript zum Erzielen eines benutzerdefinierten Bildlaufleisteneffekts

In tatsächlichen Projekten befinden sich die Bildlaufleisten nach oben und unten sowie nach links und rechts nicht innerhalb eines DIV. Daher ist die rechte Bildlaufleiste in manchen Fällen nicht sichtbar. Wir müssen jedoch zwei Bildlaufleisten im selben Ansichtsfenster anzeigen.

Eine Lösung besteht darin, die Bildlaufleiste anzupassen und die ursprüngliche Bildlaufleiste auszublenden.

Benutzerdefinierte Bildlaufleisten

scrollbar.js

importiere React, {Komponente} von „react“;
PropTypes aus „Prop-Types“ importieren;
importiere '../css/scrollbar.css';

const propTypes = {
  eventBus: PropTypes.object.isterforderlich,
};

Klasse ScrollBar erweitert Komponente {

  Konstruktor(Requisiten) {
    super(Requisiten);
    dieser.Zustand = {
      isDraging: false,
      // X: unterer Scrollbar-Offset nach links, Bereich [0, innere Breite - 100]. Beim Ziehen ändert sich x
      x: null,
      // clickX gibt den Abstand von der linken Seite der Bildlaufleiste zur Mausklickposition beim Ziehen der Bildlaufleiste an, Bereich [0, 100], beim Ziehen ändert sich clickX nicht
      KlickX: 0,
    };
  }

  componentDidMount() {
    this.unsubscribeScrollToColumn = this.props.eventBus.subscribe('set-scrollbar-left', this.setScrollBarLeft);
    document.addEventListener('mouseup', this.onMouseUp);
  }

  componentWillUnmount() {
    this.unsubscribeScrollToColumn();
    Dokument.removeEventListener('mouseup', this.onMouseUp);
  }

  /**
   * Diese Funktion behandelt die Verknüpfung (wenn die Schnittstelle scrollt, löst sie das Scrollen der Bildlaufleiste aus). Hier ist 100 die Breite der Bildlaufleiste*/
  setScrollBarLeft = (leftRatio) => {
    // Wenn die untere Bildlaufleiste gezogen wird, kann die Bildlaufleiste nicht nach links gesetzt werden
    wenn (dieser.Zustand.istDraging) return;
    dies.setState({
      x: (Fenster.innereBreite - 100) * linkesVerhältnis,
    });
  }

  /**
   * Wenn die Maus gedrückt ist, beginnen Sie mit dem Ziehen und setzen Sie die aktuelle Position auf die anfängliche Ziehposition*/
  handleMouseDown = (e) => {
    dies.setState({
      isDraging: wahr,
      clickX: e.nativeEvent.offsetX,
    });
  }

  /**
   * Wenn die Maus angehoben wird, beenden Sie das Ziehen und setzen Sie die aktuelle Klickposition auf 0 (ist das notwendig?)
   */
  beiMausHoch = () => {
    wenn (dieser.Zustand.istZiehen) {
      setzeTimeout(() => {
        this.setState({ isDraging: false, clickX: 0 });
      }, 100);
    }
  }

  /**
   * Beim Ziehen (Maus wird gedrückt und beginnt sich zu bewegen) wird die aktuelle Verschiebung abgerufen und der neue Versatz berechnet. * Hinweis: Sie können nach rechts und nach links scrollen. * Beim Ziehen sollte das aktuelle Verhältnis berechnet werden, und dann scrollt das Raster horizontal. * Das aktuelle Problem besteht darin, dass das Ziehen nicht ausgelöst werden kann, wenn sich die Maus beim Ziehen außerhalb der Bildlaufleiste bewegt. * */ 
  beiMausbewegung = (e) => {
    e.persistent();
    wenn (dieser.Zustand.istZiehen) {
      // Neue Distanz = ursprüngliche Distanz + (aktuelle Scrolldistanz - anfängliche Scrolldistanz)
      lass newX = dieser.Zustand.x + e.nativeEvent.offsetX - dieser.Zustand.klickX;
      newX = Math.min(newX, window.innerWidth - 100); // Der maximale Widerstand darf die rechte Grenze nicht überschreiten this.setState({ x: newX });
      const leftRatio = newX / (Fenster.innereWidth - 100);
    }
  }

  renderBottomToolbar = () => {
    zurückkehren (
      <div
        Klassenname = "Antiscroll-Bildlaufleiste, Antiscroll-Bildlaufleiste-horizontal, Antiscroll-Bildlaufleiste-angezeigt"
        Stil = {{transform: `translateX(${this.state.x}px)`}}
        ziehbar="true"
        beiMouseDown={this.handleMouseDown}
        beiMouseMove={this.onMouseMove}
        beiMouseUp={diese.beiMouseUp}
      ></div>
    );
  }

  // todo: rightToolbar-Ereignis-Handle
  renderRightToolbar = () => {
    zurückkehren (
      <div
        Klassenname = "Antiscroll-Bildlaufleiste, Antiscroll-Bildlaufleiste vertikal, Antiscroll-Bildlaufleiste angezeigt"
      ></div>
    );
  }

  rendern() {
    zurückkehren (
      <div id="scrollOverlay" className="antiscroll-wrap">
        {this.renderBottomToolbar()}
        {this.renderRightToolbar()}
      </div>
    );
  }
}

ScrollBar.propTypes = propTypes;

Standard-ScrollBar exportieren;

Bildlaufleistenstil

Entsprechende scrollbar.css

#scrollOverlay {
  Anzeige: Inline-Block;
  Überlauf: versteckt;
  Position: fest;
  links: 0;
  rechts: 0;
  oben: 156px;
  unten: 0;
  Z-Index: 4;
  Zeigerereignisse: keine;
  Deckkraft: .7;
}

#scrollOverlay .antiscroll-scrollbar {
  Zeigerereignisse: auto;
  Z-Index: 2;
  Hintergrundfarbe: hsla (0,0 %, 0 %, 0,28);
  Box-Shadow: Einschub 0 0 0 1px hsl(0,0%,100%);
  Rahmenradius: 5px;
}

#scrollOverlay .antiscroll-scrollbar-horizontal {
  Höhe: 12px;
  Breite: 100px;
  Position: absolut;
  unten: 32px;
}

#scrollOverlay .antiscroll-scrollbar-vertical {
  Breite: 12px;
  Höhe: 100px;
  Position: absolut;
  rechts: 0;
}

/* Blende die Bildlaufleiste des ursprünglichen Bildlaufobjekts aus */
.react-demo::-webkit-scrollbar {
  Breite: 0;
}

Spezifische Verwendung der Bildlaufleiste

Für spezielle Anwendungen fügen wir diese Bildlaufleiste zum Grid hinzu

Importiere ScrollBar aus „../components/scrollbar“.

// Rasternatives Scrollen, Auslösen der Callback-Funktion onScroll = () => {
  // zu erledigen: Wenn die Clientbreite kleiner als die Innenbreite ist, untere Scrollleiste nicht anzeigen
  let scrollLeftRatio = this._scrollLeft / (Clientbreite - Fensterbreite);
  // Wenn das native DOM nach links oder rechts scrollt, holen Sie sich das aktuelle Scroll-Verhältnis (Offset/Gesamtbreite) und stellen Sie die Bildlaufleiste auf Scrollen ein. this.setScrollLeftRatio(scrollLeftRatio);
}

setScrollLeftRatio = (scrollLeftRatio) => {
  this.props.eventBus.dispatch('set-scrollbar-left', scrollLeftRatio);
}

// Übergeben Sie im ursprünglichen Bildlaufelement eventBus, um die Verarbeitung von Ereigniswerten zu erleichtern // <ScrollBar eventBus={this.props.eventBus}/>

Es gibt auch viele Open-Source-Komponenten von Drittanbietern für benutzerdefinierte Bildlaufleisten. Wir bevorzugen die Verwendung von Bibliotheken von Drittanbietern, um sie zu implementieren (bei der Berechnung von Bildlaufleisten sind viele Überlegungen anzustellen).

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung der Bildlaufleistenereignisse mithilfe von Javascript
  • Natives JS zum Erzielen eines benutzerdefinierten Bildlaufleisteneffekts
  • Einfacher Implementierungscode für den benutzerdefinierten JS-Bildlaufleisteneffekt
  • JavaScript-Anwendung zum Ziehen mit begrenztem Bereich und benutzerdefinierter Bildlaufleiste (3)
  • Beispielcode für sanfte Bewegung der JS-Bildlaufleiste
  • Erfahren Sie, wie Sie das mobile Scrollbar-Plugin jQuery iScroll.js verwenden
  • js/jquery erhält den Implementierungscode für die Höhe und Breite des sichtbaren Bereichs des Browserfensters sowie die Höhe der Bildlaufleiste
  • JS-Code zur Bestimmung der Unterseite der Bildlaufleiste
  • JS implementiert die Methode zur Beurteilung, dass die Bildlaufleiste bis zum Ende der Seite gescrollt ist, und führt das Ereignis aus
  • Beispiel für ein JS-Operations-Scrollbar-Ereignis

<<:  Eine kurze Einführung in Linux-Umgebungsvariablendateien

>>:  Detaillierte Erklärung des Prinzips und der Verwendung des Cursors (DECLARE) in der gespeicherten MySQL-Prozedur

Artikel empfehlen

Detailliertes Beispiel für die JSON-Analyse mit MySQL (5.6 und darunter)

MySQL (5.6 und darunter) analysiert JSON #json-An...

15 JavaScript-Funktionen, die es wert sind, gesammelt zu werden

Inhaltsverzeichnis 1. Zahlen umkehren 2. Holen Si...

Vant+postcss-pxtorem implementiert Browser-Anpassungsfunktion

Rem-Layout-Anpassung Die Stile in Vant verwenden ...

Eine kurze Analyse des MySQL-Index

Ein Datenbankindex ist eine Datenstruktur, deren ...

So verwenden Sie React-Slots

Inhaltsverzeichnis brauchen Kernidee Zwei Möglich...

Detaillierte Erklärung der neuen Hintergrundeigenschaften in CSS3

Bisher kannten wir mehrere Hintergrundattribute i...

Erweiterte Verwendungsbeispiele für den Befehl mv in Linux

Vorwort Der Befehl mv ist die Abkürzung für move ...

JavaScript zum Erzielen eines benutzerdefinierten Bildlaufleisteneffekts

In tatsächlichen Projekten befinden sich die Bild...

Berechnete Eigenschaften und Listenerdetails

Inhaltsverzeichnis 1. Berechnete Eigenschaften 1....

So verwenden Sie http und WebSocket in CocosCreator

Inhaltsverzeichnis 1. HttpGET 2. HTTP POST WebSoc...

js realisiert die Funktion zum Klicken zum Wechseln der Karte

In diesem Artikelbeispiel wird der spezifische Co...

Problem mit der V-HTML-Rendering-Komponente

Da ich bereits HTML analysiert habe, möchte ich h...

CSS-Navigationsleistenmenü mit kleinem Dreieck-Implementierungscode

Viele Webseiten haben kleine Dreiecke in ihren Na...