Блок прокрутки редактора Гутенберга в поле зрения

Как я могу прокрутить недавно вставленный блок в представление в редакторе wordpress Gutenberg?

Я создаю блок с

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

Я также видел, что Гутенберг использует пакет dom-scroll-into-view, например, .

В их документации говорится:

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

но как я могу заставить его работать в моем случае, как получить элементы DOM источника и контейнера?


person niklas    schedule 09.06.2019    source источник
comment
Интересно, могли бы вы использовать const blockNode = getBlockDOMNode( blockId ) и const scrollContainer = getScrollContainer( blockNode ), как в MultiSelectScrollIntoView. Может, нравится scrollIntoView( blockNode, scrollContainer, { onlyScrollIfNeeded: true, } );. У нас есть идентификатор блока с nextBlock.id или с префиксом 'block-'?   -  person birgire    schedule 22.06.2019
comment
Можете ли вы создать для этого JSFiddle, чтобы мы могли воспроизвести вашу проблему?   -  person Lajos Arpad    schedule 23.06.2019
comment
Думаю, нет. Это стандартная установка WordPress со многими файлами js и css, специфичными для WordPress. Для воспроизведения нужно настроить среду wordpress с помощью wordpress ›5.0 ... но, может быть, я найду где-нибудь в Интернете площадку для wordpress?   -  person niklas    schedule 23.06.2019


Ответы (2)


в моем случае, как получить элементы DOM источника и контейнера?

На самом деле это довольно просто ... просто используйте document.querySelector(), чтобы получить узел блока, а затем wp.dom.getScrollContainer(), чтобы получить контейнер этого узла:

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 );

Ссылки: Один Два

А вот мой код:

/**
 * 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 );
}

ОБНОВИТЬ

Для тестирования imported scrollIntoView() попробуйте следующее:

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 || {} );
};

А затем из консоли браузера запустите это:

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

Но убедитесь, что у вас есть как минимум два блока в редакторе, например. абзац с длинным содержанием и блок изображения.

Испытано и протестировано, работает в Chrome (Windows 10).

person Sally CJ    schedule 27.06.2019
comment
Это работает для вас? Источник и контейнер действительны и кажутся правильными элементами, но не прокручиваются. - person niklas; 27.06.2019
comment
Ваше решение работает только в сафари, но я думаю, что ответ будет полным, правильным и наиболее близким к тому, что мне нужно. Угадайте, что это dom-scroll-into-view проблема? Или мы можем использовать это неправильно? - person niklas; 27.06.2019
comment
Итак, я использую WordPress 5.2.2. И фактически, вызов insertBlock() фактически автоматически прокручивает вставленный блок в поле зрения, без необходимости вызывать scrollIntoView(). И да, scrollIntoView() в моем коде работает правильно. - person Sally CJ; 27.06.2019

dom-scroll-into-view сам по себе является пакетом NPM по адресу https://github.com/yiminghe/dom-scroll-into-view

У них есть демонстрационная версия, доступная по адресу http://yiminghe.me/dom-scroll-into-view/examples/demo.html

И их основной исходный код: https://github.com/yiminghe/dom-scroll-into-view/blob/master/src/dom-scroll-into-view.js


Короткий ответ:

  • source - это HTML-элемент, который вы хотите отобразить.

  • container - это его контейнерный элемент, или вы можете просто указать window, если у вас нет определенного контейнера, обертывающего ваш элемент.

  • Наконец, config - это необязательный объект, который позволяет вам настроить некоторую тонкую настройку, например небольшой запас поля в верхнем левом углу, если вы не хотите, чтобы это касалось точной верхней границы браузера. Вы можете начать с передачи ему {}.

person Aidin    schedule 22.06.2019
comment
Я знаю, но не могу понять, что конкретно используется в случае с Гутенбергом. - person niklas; 23.06.2019
comment
@niklas scrollIntoView нужны элементы DOM, поскольку это чистое действие DOM. И React не рекомендует явно обращаться к элементам DOM. Единственный обходной путь - использовать ref, что и сделал последний парень, добавивший scrollIntoView в Gutenberg. Вот PR, которому вы можете следовать: - person Aidin; 24.06.2019
comment
а как добавить ссылки в контейнер редактора блоков? - person niklas; 24.06.2019
comment
@niklas, вы могли бы просто оставить это window и посмотреть, как это работает. В противном случае вы можете следить за this.inserterResults в PR, которым я поделился. - person Aidin; 25.06.2019