@Uncle_Bens

Как уменьшить значение типа #cef1ff?

Есть массив значений, значения вида #000000.
Каждое значение нужно на лету изменить на константу например #110011.
Нужно получить переменную которая будет равна разности из массива и константы.

Весь затык в самой арифметике, как например от готового #cef1ff отнять #110011, чтобы получилось #bdf1ee?
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
Отсекаем решетку, переводим результат из hex в целое, вычитаем, результат переводим в hex, впереди вставляем #
let result = parseInt('#cef1ff'.substr(1), 16) - parseInt('#110011'.substr(1), 16);
console.log('#' + result.toString(16).padStart(6, '0'));
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Interface
Как вариант решения с обработкой переполнения разрядов и трехсимвольных цветов
function hexToTriple(hex) {
    hex = hex.slice(1);
    if (hex.length === 3) {
        return hex.split('').map(byte => parseInt(byte.repeat(2), 16));
    } else if (hex.length === 6) {
        return hex.match(/.{2}/g).map(byte => parseInt(byte, 16));
    } else {
        throw new Error(`invalid color ${hex}`);
    }
}

function tripleToHex(triple) {
    return '#' + triple.map(byte => byte.toString(16).padStart(2, '0')).join('');
}

function hexColorSubtract(hexAColor, hexBColor) {
    const [tripleA, tripleB] = [hexAColor, hexBColor].map(hexToTriple);
    const resultTriple = tripleA.map((byte, index) => {
        return Math.max(byte - tripleB[index], 0);
    });
    return tripleToHex(resultTriple);
}

// использование:

hexColorSubtract("#cef", "#110011"); // #bbeeee
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
function hexColorSubtract(ca, cb) {
    const a = parseInt(ca.substring(1), 16);
    const b = parseInt(cb.substring(1), 16);
    return '#' + ('000000' + Math.max(0, a-b).toString(16)).slice(-6).toUpperCase();
  }
  
  hexColorSubtract("#cef1ff", "#110011"); // #BDF1EE
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы