Obtén todas las reglas CSS relacionadas de seleccionadores CSS a nivel multi
Este es el comando que uso en Grapedrop para obtener todo el CSS de un componente '''js importar cada uno de 'lodash/each'; export default (config = {}) => ({ run(editor, snd, opts = {}) { const component = opts.target || editor.getWrapper(); const cssc = editor. CssCompositor; reglas const = cssc.getAll(); Sea result...
Lee la respuesta completa abajo ↓Pregunta
Hola @artf
Espero que estés bien. He estado dándole vueltas a este asunto los últimos días, he estado buscando si me ha pasado lo mismo con los demás, pero desafortunadamente no encuentro ninguna solución que pueda solucionar mi problema, así que decidí abrir un ticket. Espero que tenga sentido.
Así que tengo una función de 'Guardar bloque/componente' que necesito para obtener el HTML y CSS del componente seleccionado. Puedo obtener fácilmente el HTML del componente seleccionado con sus elementos hijos. haciendo 'const blockHTML = block.toHTML();' eso funciona bien. Sin embargo, mi problema radica en las reglas CSS de los elementos del elemento padre que van a los elementos hijos.
- Así que mi primer intento es iterar a cada componente hijo del componente seleccionado para poder usar la función 'getStyle()' y extraer el CSS de los componentes hijos, pero desafortunadamente, está devolviendo un objeto vacío. Por favor, consulta la captura de pantalla a continuación para ver el bloque de código que hace esto.
! Captura de pantalla del 17-02-15-34 de 2020
Aquí están los registros del navegador para el punto 1.
! Captura de pantalla del 17-02-2020 16-01-43
Parece que funciona con el componente padre, que es el '#banner', puede coger las reglas CSS, pero cuando profundizo en los componentes hijos, devuelve un objeto vacío. Por favor, consulta a continuación una captura de pantalla del marcado HTML del componente con sus reglas CSS.
#banner ! Captura de pantalla del 17-02-2020 03-16-08-03
#banner cabezaje ! Captura de pantalla del 17-02-2020 16-08-43
- Luego mi segundo intento fue elegir 'editor. CodeManager.getCode(childBlock, 'css', {cssc: editor. CssComposer});' Eso resultó en los siguientes registros.
! Captura de pantalla del 17-02-2020 16-12-37
Da todas las reglas CSS en el editor de código CSS, no pude extraer las reglas de clase relacionadas para el componente específico.
- Probé la API 'CssComposer' con el siguiente bloque de código, por favor consulta más abajo, pero al final obtuve todos los resultados como 'null'
! Captura de pantalla del 17-02-17-2020
No sé cómo puedo resolver este problema a estas alturas, así que busco ayuda para que me guíes hacia una solución adecuada. Espero con ganas saber de ti. Gracias.
Saludos, Tyrone
Respuestas (2)
Este es el comando que uso en Grapedrop para obtener todo el CSS de un componente '''js importar cada uno de 'lodash/each';
export default (config = {}) => ({ run(editor, snd, opts = {}) { const component = opts.target || editor.getWrapper(); const cssc = editor. CssCompositor; reglas const = cssc.getAll(); Sea resultado = '';
const { atRules, notAtRules } = this.splitRules(this.matchedRules(component, rules)); notAtRules.forEach(rule => result += rule.toCSS()); this.sortMediaObject(atRules).forEach(item => { sea rulesStr = ''; const atRule = item.key; const mRules = valor.elemento;
mRules.forEach(rule => { const ruleStr = rule.getDeclaration();
if (rule.get('singleAtRule')) { resultado += '${atRule}{${ruleStr}}'; } else { rulesStr += ruleStr; } });
si (rulesStr) resulta += '${atRule}{${rulesStr}}'; });
resultado de retorno; },
/**
- Consigue reglas emparejadas de un componente
- @param {Component} componente
- @param reglas {Array<CSSRule>}
- @returns {Array<CSSRule>} */ matchedRules(component, rules) { const el = component.getEl(); Sea resultado = [];
rules.forEach(rule => { try { si (rule.selectorsToString().split(',').some( selector => el.matches(this.cleanSelector(selector)) )) { resultado.push(regla); } } atrapar (err) {} });
component.components().forEach(component => { result = result.concat(this.matchedRules(component, rules)) });
Eliminar duplicados resultado = resultado.filter((regla, i) => resultado.indexOf(regla) == i);
resultado de retorno; },
/**
- Devolver el selector pasado sin estados
- @param selector {String}
- @returns {Cuerda} */ cleanSelector(selector) { return selector.split(' ').map(item => item.split(':')[0]).join(' '); },
/**
- Divide una serie de reglas en atRules y no
- @param reglas {Array<CSSRule>}
- @returns {Objeto} */ splitRules(rules) { const atRules = {}; const notAtRules = [];
rules.forEach(rule => { const atRule = rule.getAtRule();
if (atRule) { const mRules = atRules[atRule];
if (mRules) { mRules.push(regla); } else { atRules[atRule] = [regla]; } } else { notAtRules.push(regla); } });
return { atRules, notAtRules, }; },
/**
- Obtener la longitud numérica de la cadena de consulta de medios
- @param {String} cadena de consulta mediaQuery Media
- @return {número} / getQueryLength(mediaQuery) { longitud const = /(-?\d.? \d+)\w{0,}/.exec(mediaQuery); si (!length) devuelve Number.MAX_VALUE;
return parseFloat(length[1]); },
/**
- Devolver un array ordenado desde el objeto de consulta de medios
- @param elementos {Objeto}
- @return {Array} */ sortMediaObject(items = {}) { const itemsArr = []; each(items, (valor, clave) => itemsArr.push({ clave, valor })); return itemsArr.sort( (a, b) => this.getQueryLength(b.key) - this.getQueryLength(a.key) ); } })
Hola @artf
¡Muchas gracias por tu respuesta! Lo probaré y os avisaré si tengo algún problema. De verdad lo agradezco.
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #2897
[Pregunta] ayuda para contribuir al repositorio mjml
Hola @artf Seguro que estás muy ocupado estos días, pero he estado intentando ponerme en contacto para ayudar a avanzar con el proyecto 'gr...
Issue #1613
[Bug] Las propiedades de estilo de los estilos compuestos no están bien aclaradas
Hola Artf, He trabajado un poco con tu gran editor y he encontrado este (y quizá otro más, que requieren más pruebas). Lo encontré en mi ve...
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...
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 →Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.