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

Foreman Ubuntu16 Schnellinstallation

Kurzanleitung Das Foreman-Installationsprogramm i...

Spezifische Verwendung von MySQL-Fensterfunktionen

Inhaltsverzeichnis 1. Was ist eine Fensterfunktio...

Umfassendes Verständnis des html.css-Überlaufs

Umfassendes Verständnis des html.css-Überlaufs XM...

Detaillierte Beschreibung allgemeiner Ereignisse und Methoden von HTML-Text

Veranstaltungsbeschreibung onactivate: Wird ausgel...

Mehr als 100 Zeilen Code zur Implementierung von React Drag Hooks

Vorwort Der Quellcode umfasst insgesamt nur mehr ...

So öffnen Sie externe Netzwerkzugriffsrechte für MySQL

Wie unten dargestellt: Führen Sie hauptsächlich A...

Einige Erfahrungen in der Selbstkultivierung von Künstlern

Da der Einfluss des Unternehmens wächst und seine...

Implementierung des Tomcat-Bereitstellungsprojekts und Integration mit IDEA

Inhaltsverzeichnis 3 Möglichkeiten zum Bereitstel...

Detaillierte Schritte zur Installation von RabbitMQ im Docker

Inhaltsverzeichnis 1. Finde den Spiegel 2. Laden ...

Implementierung der MySQL8.0.11-Datenverzeichnismigration

Das Standardspeicherverzeichnis von MySQL ist /va...

So entwickeln Sie eine Progressive Web App (PWA)

Inhaltsverzeichnis Überblick Erfordern URL der An...

Einführung in Docker-Container

1. Übersicht 1.1 Grundlegende Konzepte: Docker is...