El marcador de arrastre no calcula el ancho correcto.
Para ser honesto, dejaría 'getElRect' tal cual, usar 'getComputedStyle' en este contexto sería demasiado caro y la función en sí es genérica (así que no tiene sentido tener cosas como 'boundingRect.width = boundingRect.width - margin.left - margin.right'). Estoy bastante seguro de que el problema está en el Sorter y l...
Lee la respuesta completa abajo ↓Pregunta
Hola @artf, espero que estéis teniendo un buen día.
Hay un pequeño problema con el marcador de arrastre cuando un bloque se arrastra hacia un posible contenedor con márgenes laterales. También podría ocurrir con los márgenes superior/inferior o el acolchado, pero no estoy 100% seguro.
<img width="1107" alt="image" src="https://user-images.githubusercontent.com/1976679/76625994-9e803e00-6538-11ea-900e-fbbe3769cabe.png">La razón de esto es que la función getBoundingClientRect, que calcula las dimensiones de un contenedor, se comporta de forma irregular en algunos casos, devolviendo el ancho del elemento sin tener en cuenta algunas propiedades que afectan a ese cálculo.
Alguien tuvo un problema similar antes. https://stackoverflow.com/questions/28966678/getboundingclientrect-returning-wrong-results
En este caso tendremos que ajustar un poco la función getElRect que está en el archivo mixins. Creo que algo así ayudará, aunque todavía tengo que trabajar un poco más para arreglarlo.
const getElRect = el => {
const def = {
Arriba: 0,
izquierda: 0,
Ancho: 0,
Altura: 0
};
si (!el) devuelve la defensa;
let rectText;
Sea recto;
if (isTextNode(el)) {
const range = document.createRange();
rango.selectNode(el);
rectText = rango.getBoundingClientRect();
rango.detach();
}
if (rectText) {
rect = rectText;
} else if (el.getBoundingClientRect) {
sea estilo = window.getComputedStyle(el);
sea boundingRect = el.getBoundingClientRect();
Sea margen = {
izquierda: parseInt(style['margin-left']),
derecha: parseInt(style['margin-right']),
arriba: parseInt(style['margin-top']),
bottom: parseInt(style['margin-bottom'])
};
Sea relleno = {
izquierda: parseInt(style['relleno-izquierda']),
derecha: parseInt(style['padding-right']),
arriba: parseInt(estilo['acolchado']),
abajo: parseInt(estilo['relleno-bottom'])
};
boundingRect.width = boundingRect.width - margin.left - margin.right;
boundingRect.left = 0 + bounding.left;
rect.width = boundingRect;
} else {
Rect = def;
}
return rect;
};
Ahora mismo no tengo tiempo para hacer una pull request, escribo como un problema para llevar un registro de ello, pronto investigaré esto.
Si quieres replicar este problema, puedes crear un componente contenedor con estas propiedades
.container {
ancho: 100%;
relleno-derecha: 15px;
relleno-izquierda: 15px;
margen a la derecha: Auto;
margen izquierdo: auto;
}
Y otro que podría ir como componente hijo del contenedor
.row {
pantalla: bloqueo;
marje: 0;
}
Estoy usando la última versión (v0.16.2), quizá se me esté escapando algo y esto se pueda solucionar fácilmente.
Un saludo cordial, Juan
Respuestas (3)
Para ser honesto, dejaría 'getElRect' tal cual, usar 'getComputedStyle' en este contexto sería demasiado caro y la función en sí es genérica (así que no tiene sentido tener cosas como 'boundingRect.width = boundingRect.width - margin.left - margin.right').
Estoy bastante seguro de que el problema está en el Sorter y la función que calcula las dimensiones de los elementos es 'getDim' (bastante antigua, así que no esperaría lógica adecuada ahí), así que deberías intentar empezar la investigación ahí
He conseguido 'getElRect' leyendo la función 'getDim', pero volveré a investigar allí para buscar otra solución.
¡Gracias!
Hola,
Para futuras preguntas o problemas técnicos, que no sean errores, la pestaña Discussions de GitHub es el lugar ideal.
No olvides cerrar este problema si se resuelve o escribir un nuevo mensaje detallado en la categoría Discussiones -> Q&A (y cerrar este número).
Gracias por tu comprensión.
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #2850
[PREGUNTA] Añadir un desplegable para bloquear usando Rasgos
Hola @artf, Espero que estés bien, Me preguntaba si podríais ayudarme con algún problema sencillo que estoy teniendo (recientemente he empe...
Issue #1683
¿Cómo cambiar el id/clase cuando aparece un nuevo elemento en el editor o renderizo un elemento con IP dinámica?
Hola @artf, Espero que estés bien. Tengo dos preguntas sobre la suma de bloques dinámicos, 1) ¿Es posible renderizar el bloque con id dinám...
Issue #1509
Cómo desactivar el botón de deshacer
Hola @artf, Espero que te vaya bien con uvas. ¿Podrías decirnos cómo desactivar el botón de deshacer cuando no hay datos en el administrado...
Issue #1853
Posición de arrastre y solta
Hola, Intento que el ratón esté en la posición cuando arrastro y suelto un bloque. ¿Es posible tener la posición X y la posición Y con este...
Plugins de pago que cumplen con este problema
Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.
Cargando recomendaciones de plugins de pago...
Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.
Explora plugins gratuitos →Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.
Explora plugins premium →Tutoriales relacionados
Guías detalladas sobre el mismo tema.
Tutorial
Ship to Production Faster: What’s New in GrapesJS Shadcn
Supercharge your page builder! GrapesJS Shadcn adds live drag previews, rich text / commands, dynamic data, and canvas presets to ship to prod faster.
Tutorial
How to Build a Production GrapesJS Editor: The Complete Walkthrough of Brief, Preset, Plugins, and Services
A complete walkthrough of building a production GrapesJS editor: how to choose a preset, pick plugins, and scope setup services without burning a sprint.
Tutorial
GrapesJS Inline RTE Plugins Update: CKEditor 5 v0.1.4 and Froala Inline Text Editor
CKEditor 5 Inline for GrapesJS v0.1.4 fixes Studio SDK toolbar clipping, iframe injection and link balloon bugs. Compare with Froala Inline — both $69.
Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.