#javascript #css #vue.js #font-size #text-shadow
#javascript #css #vue.js #размер шрифта #текст-тень
Вопрос:
Итак, мы получили инструмент vue video-edition с возможностью добавления текста и применения к нему эффектов текстовой тени с помощью настроек по умолчанию, а также некоторых пользовательских текстовых теней, разрешенных или измененных путем настройки выбранного пресета. Также пользователь может изменить размер шрифта, масштабируя элемент vdr (vue-grag-resize), и вот тут начинаются проблемы. Перетаскивание -изменение размера компонента с текстом
Наши предустановки теней имеют абсолютные значения смещения по x-y, и при изменении размера шрифта смещения тени также должны быть изменены, но для пользователя они кажутся одинаковыми. Мы, конечно, можем разобрать текущий эффект тени на разные тени и изменить смещение x-y, но я не придумал никакого хорошего способа сделать это. Размер шрифта и смещения, похоже, не являются взаимосвязанными свойствами.. Каков наилучший способ изменить x-y-смещение в зависимости от размера шрифта?
Сложный:
text-shadow: 0 -1px 0 #fff, 0 1px 0 #2e2e2e, 0 2px 0 #2c2c2c, 0 3px 0 #2a2a2a, 0 4px 0 #282828, 0 5px 0 #262626, 0 6px 0 #242424, 0 7px 0 #222, 0 8px 0 #202020, 0 9px 0 #1e1e1e, 0 10px 0 #1c1c1c, 0 11px 0 #1a1a1a, 0 12px 0 #181818, 0 13px 0 #161616, 0 14px 0 #141414, 0 15px 0 #121212, 0 22px 30px rgba(0,0,0,0.9);
Простой:
text-shadow: -4px 3px 0 #3a50d9, -14px 7px 0 #0a0e27;
Комментарии:
1. Я не думаю, что использование «px» поможет вам здесь, вам нужно будет использовать что-то вроде «em» или «rem», поэтому размер связан с размером шрифта либо текущего элемента, либо корневого элемента.
2. звучит как идея, я буду экспериментировать с этим! Спасибо
3. Нет проблем, это должно значительно упростить эту работу 🙂
Ответ №1:
Итак, я сделал не лучшую, но, по крайней мере, рабочую реализацию для сложной тени, сейчас она работает не на каждой тени, но я довольно близок к лучшей реализации, если кто-то заинтересован или столкнется с такой проблемой, вот фрагмент: (будьте осторожны, это не сработает свставка и вы должны изменить parseShadowToArray, а также цвета должны быть в #01234500 обозначении, но не стесняйтесь изменять его, если вам нужно!)
function replacePxWithEmEquivalent(shadowStr, fontSize=16) {
console.log(fontSize);
const shadowArr = parseShadowStrToArray(shadowStr);
let resultShadowStr = shadowArr.reduce((acc, shadowObj, i) => {
return acc `${(shadowObj.x_offset/fontSize)}em ${(shadowObj.y_offset/fontSize)}em ${(shadowObj.blur_radius/fontSize)}em ${(shadowObj.color)}${i === shadowArr.length-1 ? '' : ", "} `
}, "");
resultShadowStr = resultShadowStr.slice(0, -1);
return resultShadowStr;
}
function parseShadowStrToArray(shadowStr) {
const shadows = [];
let shadowStrArray = shadowStr.replaceAll('px', '');
shadowStrArray = shadowStrArray.split(',');
shadowStrArray = shadowStrArray.map(shadowStr => shadowStr[0] === ' ' ? shadowStr.substring(1) : shadowStr);
shadowStrArray.map(shadowStr => {
const shadowParts = shadowStr.split(' ');
shadows.push({
x_offset: parseInt(shadowParts[0]),
y_offset: parseInt(shadowParts[1]),
blur_radius: parseInt(shadowParts[2]),
color: shadowParts[3],
})
}
);
return shadows;
}