Script для преобразования css-листа из px в em

Кто-нибудь знает script (php, python, perl, bash, что угодно), которые преобразуют таблицу стилей из px в em?

Как и для ввода имени файла и базового размера шрифта (по умолчанию 16) и преобразования всех экземпляров px в em?

например:

convertpx2ems --file stylesheet.css --base-font-size 16

преобразует это:

button {
    font-size:14px;
    padding:8px 19px 9px;
}

примерно так:

button {
    font-size: .875em;
    padding: .5em 1.188em .563em;
}

... может быть, есть ли способ сделать это с sass?

Ответ 1

Вы не можете разумно обменивать px и em такие размеры. Размер пикселя - это абсолютное значение, которое останется того же размера, независимо от того, где он находится. Размер em относительно родительского элемента, поэтому 0.5em - это половина размера родительского элемента. Если это не имеет большого смысла, рассмотрим следующий фрагмент кода:

/* CSS */
span { font-size: 0.9em; }

<!-- HTML -->
<span>Testing,
    <span>Testing,
        <span>Testing</span>
    </span>
</span>

В этом примере вы обнаружите, что слово "Тестирование" становится все меньше и меньше, потому что размер шрифта каждого тега span составляет 90% от предыдущего.

Для тега body размер шрифта 1em примерно эквивалентен 16px, но это единственный раз, когда вы можете разумно перевести один размер в другой

Ответ 2

Скопируйте/Вставьте свой css в JSFiddle для преобразования. Пример кода:

var regFindPX = new RegExp('(\\d+)px','g');
var reg3decPoints = new RegExp('(\.\\d{3}).*', '');

var css = 'css code';
var result;
while ((result = regFindPX.exec(css)) !== null) {
    var px = parseInt(result[1]);
    var em = px / 16;
    em = em.toString().replace(reg3decPoints, '$1');
    css = css.replace(px + 'px', em + 'em'); 

}

Ответ 3

Вы можете сделать это легко в Perl:

perl -p -i -e 's/(\d+)px/($1\/16).em/ge' stylesheet.css

Ответ 4

Я опрокинул это awk:

#!/bin/awk -f

BEGIN {
    bfs = 16;
}

{
    while (match($0, /([0-9]+\.)?[0-9]+px/)) {
        num = substr($0, RSTART, RLENGTH - 2);
        #print("numval: ", numval);
        $0 = substr($0, 1, RSTART-1) (num != 0 ? (1 / bfs) * num: 0 ) "em" substr($0, RSTART + RLENGTH);
  }
}

1

Вы можете использовать его для замены любых записей в пикселях в файле с подходящими преобразованиями. Обратите внимание, что bfs должен быть установлен на размер базового шрифта (16 в этом случае), который вы хотите использовать. Также обратите внимание, что для правильного использования вы должны обладать навыками оболочки.

Ответ 5

Я понимаю, что это старый поток, но я подумал, что это может помочь кому-то:

Преобразование px в em: target ÷ context = result

Пример:

Чтобы найти значение 1px и скажем, что размер шрифта для контейнера равен 16px, уравнение будет следующим:

1 ÷ 16 = 0,0625 ~

(Лучше всего округлить до ближайшей тысячной).

1px = 0.063em

Из этого вы также можете найти другие измерения по цели * em_value = result

Пример:

10 *.063 =.63

10px =.63em

Я надеюсь, что это имеет смысл и помогает кому-то.

Ответ 6

Как отмечает Джеймс, проблема с любым прямолинейным конвертером заключается в том, что таблица стилей не знает, какие элементы вложены. Поскольку значения em являются относительными, вычисляемый font-size будет варьироваться в сильно вложенных элементах. Вам понадобится инструмент, который сканирует вывод HTML после его визуализации и рекурсивно корректирует соответствующие стили.

Я написал компонент JavaScript, который может оказаться полезным в этом отношении. Вы можете захватить его здесь.

Рекомендуемым рабочим процессом было бы вызвать emify(document.body) в браузере, а затем извлечь соответствующие значения em и вставить его обратно в ваш css.

Не идеально, но это один из способов сделать это с точностью.

Ответ 7

Из предыдущего обсуждения кажется, что онлайн-генератор не существует, верно? Я не мог найти тот, который будет анализировать всю таблицу стилей.

Во-первых, если em применяется и изображение или ввод, кроме шрифта внутри ввода, будут ли они относительными, и если да, то что и как? Изображения не могут быть вложенными, и мне нелегко видеть, что они относятся к каждой ширине родительского div. (Преобразование ради CSS PIE, чтобы избежать ошибок, это вдохновляет).

Помимо просто ввода и изображений, мне было интересно, есть ли способ конвертировать всю таблицу стилей. Помогите мне увидеть, будет ли моя логика работать. Я думаю, что у меня есть несколько элементов, которые уже созданы, мне просто нужно будет с ними справиться.

Работа с CSS сама по себе не может сделать трюк, поскольку невозможно знать, какие элементы будут вложены. Поэтому потребуется сканирование вывода html. Какой лучший способ сделать это? Единственный способ, которым я мог подумать, - применить все стили inline, которые generator был сделан для конвертировать шаблоны для писем и т.д. Когда стили встроены, это покажет, как все вложенное. Из этого сравните с таблицей стилей.

Сравните каждый вложенный элемент с "em" с любым родительским элементом с "em", чтобы сгенерировать px соответственно, и у меня уже есть средство регулярного выражения для анализа CSS, что упрощает его.

Одна проблема заключается в том, что класс может быть вложен в разные элементы, причем em в одном классе становится другим в этом контексте, поэтому невозможно преобразовать в px и применять одно и то же. Единственное решение, я считаю, состоит в том, чтобы воссоздать вложенную структуру или часть в листе css для применения соответственно px в любое время, когда размер шрифта отличается в контексте.

Например:

<code>
    // Original Stylesheet
    .mainClass{font-size:1em;}

    // HTML
    <div id="outerNest" style="font-size:.5em;">
        <div class="mainClass"> Font here is .5em </div>
    </div>

    <div class="mainClass> Font here is 1em</div>

        // New stylesheet 
    .mainClass{font-size:16px;}

    // newly created styles to work with px conversion
    #outerNest .mainClass{font-size:8px;}
</code>

а. Считаете ли вы, что это может сработать? B. Есть ли лучший способ? C. Стоит ли это того? Я мог бы использовать его один раз в синей луне в некоторых случайных ситуациях, но я сомневаюсь, что многие люди найдут его в любой ценности. Или есть ситуация, в которой это было бы удобно, когда люди сталкивались здесь и там?