Scrollblock des Gutenberg-Editors sichtbar

Lesezeit: 4 Minuten

Benutzer-Avatar
Niklas

Wie kann ich einen neu eingefügten Block in die Ansicht im WordPress-Gutenberg-Editor scrollen?

Ich erstelle den Block mit

const nextBlock = createBlock( 'core/paragraph' );
wp.data.dispatch( 'core/editor' ).insertBlock( nextBlock );
//scroll the block into the view

Ich habe auch gesehen, dass Gutenberg das nutzt dom-scroll-into-view Paket wie zB hier.

Ihre Dokumentation sagt:

var scrollIntoView = require('dom-scroll-into-view');
scrollIntoView(source,container,config);

aber wie kann ich es in meinem Fall zum Laufen bringen, wie bekomme ich die Quell- und Container-DOM-Elemente?

  • Frage mich, ob Sie verwenden könnten const blockNode = getBlockDOMNode( blockId ) und const scrollContainer = getScrollContainer( blockNode ) wie in MultiSelectScrollIntoView. Vielleicht mögen scrollIntoView( blockNode, scrollContainer, { onlyScrollIfNeeded: true, } ); . Haben wir die Block-ID von nextBlock.id oder mit dem 'block-' Präfix ?

    – Birgire

    22. Juni 2019 um 15:35 Uhr


  • Können Sie dafür ein JSFiddle erstellen, damit wir Ihr Problem reproduzieren können?

    – Lajos Arpad

    23. Juni 2019 um 13:07 Uhr

  • Nun, ich denke nicht. Es ist die Standard-Wordpress-Installation mit vielen WordPress-spezifischen JS- und CSS-Dateien. Um dies zu reproduzieren, müsste man eine WordPress-Umgebung mit WordPress > 5.0 einrichten … aber vielleicht finde ich irgendwo im Internet einen WordPress-Spielplatz?

    – niklas

    23. Juni 2019 um 13:29 Uhr


Benutzer-Avatar
Sally C.J

Wie bekomme ich in meinem Fall die Quell- und Container-DOM-Elemente?

Es ist eigentlich ganz einfach … einfach benutzen document.querySelector() um den Blockknoten zu bekommen und dann wp.dom.getScrollContainer() um den Container dieses Knotens zu erhalten:

const nextBlock = wp.blocks.createBlock( 'core/paragraph' );
wp.data.dispatch( 'core/editor' ).insertBlock( nextBlock );

const source = document.querySelector( '[data-block="' + nextBlock.clientId + '"]' );
const container = wp.dom.getScrollContainer( source );

Verweise: Einer Zwei

Und hier ist mein Code:

/**
 * External dependencies
 */
import scrollIntoView from 'dom-scroll-into-view';

/**
 * WordPress dependencies
 */
import { createBlock } from '@wordpress/blocks';     // wp.blocks.createBlock
import { dispatch } from '@wordpress/data';          // wp.data.dispatch
import { getScrollContainer } from '@wordpress/dom'; // wp.dom.getScrollContainer

function getBlockDOMNode( clientId ) {
    return document.querySelector( '[data-block="' + clientId + '"]' );
}

const nextBlock = createBlock( 'core/paragraph' );
dispatch( 'core/editor' ).insertBlock( nextBlock );

const source = getBlockDOMNode( nextBlock.clientId );
const container = source ? getScrollContainer( source ) : null;
if ( source && container ) {
    scrollIntoView( source, container );
}

AKTUALISIEREN

Zum Testen der imported scrollIntoView()Versuche dies:

function scrollBlockIntoView( block ) {
    const source = getBlockDOMNode( block.clientId );
    const container = source ? getScrollContainer( source ) : null;
    if ( source && container ) {
        console.log( source, container );
        scrollIntoView( source, container );
    }
}

window.scrollBlockIntoView = function( block ) {
    scrollBlockIntoView( block || {} );
};

Führen Sie dann in der Browserkonsole Folgendes aus:

scrollBlockIntoView( wp.data.select('core/editor').getBlocks()[1] )

Achte aber darauf, dass du mindestens zwei Blöcke im Editor hast – zB einen Absatz mit längerem Inhalt und einen Bildblock.

Erprobt und getestet auf Chrome (Windows 10).

  • Funktioniert es bei dir? Quelle und Container sind gültig und scheinen die richtigen Elemente zu sein, aber es wird nicht gescrollt.

    – niklas

    27. Juni 2019 um 12:58 Uhr

  • Ihre Lösung funktioniert nur in Safari, aber ich denke, die Antwort ist vollständig und korrekt und kommt dem am nächsten, was ich brauchte. Denke es ist a dom-scroll-into-view Ausgabe? Oder könnten wir es falsch verwenden?

    – niklas

    27. Juni 2019 um 13:02 Uhr

  • Also ich bin auf WordPress 5.2.2. Und tatsächlich, die insertBlock() call scrollt den eingefügten Block tatsächlich automatisch in die Ansicht, ohne dass ein Aufruf erforderlich ist scrollIntoView(). Und ja, die scrollIntoView() in meinem Code funktioniert richtig.

    – Sally CJ

    27. Juni 2019 um 14:16 Uhr

dom-scroll-into-view ist ein eigenständiges NPM-Paket unter https://github.com/yiminghe/dom-scroll-into-view

Sie haben eine Demo unter verfügbar http://yiminghe.me/dom-scroll-into-view/examples/demo.html

Und ihr Hauptquellcode ist https://github.com/yiminghe/dom-scroll-into-view/blob/master/src/dom-scroll-into-view.js


Kurze Antwort:

  • source ist das HTML-Element, das angezeigt werden soll.

  • container ist sein Containerelement, oder Sie können es einfach als sein bezeichnen window wenn Sie keinen bestimmten Container haben, der Ihr Element umhüllt.

  • Endlich config ist ein optionales Objekt, mit dem Sie einige Feinabstimmungen konfigurieren können, z. B. einen kleinen Rand oben links, wenn Sie nicht möchten, dass dies genau den oberen Rand des Browsers trifft. Sie können mit dem Passieren beginnen {} dazu erstmal.

  • Ich weiß, aber ich kann mir diese konkrete Verwendung im Fall von Gutenberg nicht vorstellen.

    – niklas

    23. Juni 2019 um 0:53 Uhr

  • @nicklas scrollIntoView benötigt DOM-Elemente, da es sich um eine reine DOM-Aktion handelt. Und React rät davon ab, explizit auf DOM-Elemente zuzugreifen. Die einzige Problemumgehung ist die Verwendung von ref Das ist genau das, was der letzte Typ hinzugefügt hat scrollIntoView zu gutenberg getan hat. Hier ist die PR, der Sie folgen können: github.com/WordPress/gutenberg/commit/… . Fügen Sie einfach eine Referenz zu Ihren erstellten Blöcken hinzu, holen Sie sich dann DOM mit dieser Referenz und übergeben Sie sie an scrollIntoView.

    – Hilfe bei der

    24. Juni 2019 um 1:37 Uhr

  • und wie füge ich Refs zum “Blockeditor-Container” hinzu?

    – niklas

    24. Juni 2019 um 9:26 Uhr

  • @niklas vielleicht kannst du es einfach so lassen window und sehen, wie es funktioniert. Ansonsten kannst du folgen this.inserterResults in der PR, die ich geteilt habe.

    – Hilfe bei der

    24. Juni 2019 um 21:57 Uhr

1386060cookie-checkScrollblock des Gutenberg-Editors sichtbar

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy