Font Face Mixin для меньшего

Используя Less, я определяю семейства шрифтов следующим образом:

@georgia: georgia, times, 'times new roman', 'nimbus roman no9 l', serif; 

Тогда у меня меньше примесей:

.font(@family: arial, @size: 1.0em, @lineheight: 1.0, @weight: normal, @style: normal, @variant: normal) {
  font: @style @variant @weight @size~"/"@lineheight @family;
} // font

Наконец, я использую это так:

p {
  .font(@georgia, 1.0em, 1.5)
}

Но я также хотел бы определить семейства шрифтов с помощью пользовательских шрифтов:

@something: 'custom-font', arial, ...;

Но сначала мне нужно зарегистрировать custom-font:

@font-face {
  font-family: 'custom-font';
src:url('fonts/custom-font.eot');
src:url('fonts/custom-font.eot?#iefix') format('embedded-opentype'),
    url('fonts/custom-font.woff') format('woff'),
    url('fonts/custom-font.ttf') format('truetype'),
    url('fonts/custom-font.svg#icon') format('svg');
font-weight: normal;
font-style: normal;
}

Можно ли создать миксин LESS для @font-face, чтобы я мог передавать имя шрифта и путь, а также регистрировать шрифты, не повторяя весь этот код?

Я не уверен, как интегрировать это с моим миксином шрифтов ...

Или, если есть еще лучший способ сделать это ...

Спасибо, Мигель


person Miguel Moura    schedule 02.08.2013    source источник


Ответы (7)


Вы можете определить свой собственный миксин для включения пользовательских шрифтов, но поскольку LESS не реализует никаких управляющих директив, а только охраняет миксины (которые бесполезны в аспекте текущего вопроса), вы не можете сократить код миксина для определения font-face.

.include-custom-font(@family: arial, @weight: normal, @style: normal){
    @font-face{
        font-family: @family;
        src:url('fonts/@{family}.eot');
        src:url('fonts/@{family}.eot?#iefix') format('embedded-opentype'),
            url('fonts/@{family}.woff') format('woff'),
            url('fonts/@{family}.ttf') format('truetype'),
            url('fonts/@{family}.svg#icon') format('svg');
        font-weight: @weight;
        font-style: @style;
    }
}
person Lajos Mészáros    schedule 02.08.2013

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

Сначала я создал параметрический миксин со всем, что будет повторяться внутри @ font-face:

.loadFont(@Weight; @Name; @Local; @Eot:'@{Local}.eot'; @Woff:'@{Local}.woff'){
    font-family: 'Open Sans';
    font-style: normal;
    font-weight: @Weight;
    src: url(@Eot);
    src: local(@Name), local(@Local), url(@Eot) format('embedded-opentype'), url(@Woff) format('woff');
}

Затем загрузил все мои веб-шрифты (в данном случае open sans)

@font-face {.loadFont(100;'Roboto Thin';'Roboto-Thin')}
@font-face {.loadFont(300;'Roboto Light';'Roboto-Light')}
@font-face {.loadFont(400;'Roboto Regular';'Roboto-Regular')}
@font-face {.loadFont(500;'Roboto Medium';'Roboto-Medium')}
@font-face {.loadFont(700;'Roboto Bold';'Roboto-Bold')}
@font-face {.loadFont(900;'Roboto Black';'Roboto-Black')}

Затем создал второй параметрический миксин с правилом CSS для применения к элементам.

.font(@weight:400; @size:14px; @font-family:'Open Sans', sans-serif){
    font:@arguments;
}

И, наконец, я использую его на своих элементах вроде этого

div.someClass{
    .font(); //to accept all default parameters 
}
div.otherClass{
    .font(100; 40px); //to specify weight and size
}

В качестве примечания. У меня есть все мои файлы *.eot и *.woff рядом с файлом LESS и названы как параметр @Local (Open-Sans.woff || Open-Sans.eot)

person Zero Dragon    schedule 11.02.2014
comment
Я просто перечитал (и медленно) принятый ответ и теперь чувствую себя глупо xD - person Zero Dragon; 11.02.2014

Мне нравится структурировать шрифты по папкам, например:

/fonts/OpenSans-Bold/OpenSans-Bold.eot
/fonts/OpenSans-Bold/OpenSans-Bold.svg
/fonts/OpenSans-Bold/OpenSans-Bold.ttf
/fonts/OpenSans-Bold/OpenSans-Bold.woff

И я использую МЕНЬШЕ СМЕСИ для font-face:

.font-face(@fontName: sans-serif; @fontWeight: normal; @fontStyle: normal) {
    @font-face {
        font-family: @fontName;
        src: url('@{pTheme}/fonts/@{fontName}/@{fontName}.eot');
        src: url('@{pTheme}/fonts/@{fontName}/@{fontName}.eot?#iefix') format('embedded-opentype'),
             url('@{pTheme}/fonts/@{fontName}/@{fontName}.woff') format('woff'),
             url('@{pTheme}/fonts/@{fontName}/@{fontName}.ttf') format('truetype'),
             url('@{pTheme}/fonts/@{fontName}/@{fontName}.svg#@{fontName}') format('svg');
        font-weight: @fontWeight;
        font-style: @fontStyle;
    }
}

Где:

@pTheme: "../../themes/[THEME NAME]";

Пример вызова миксина:

.font-face('OpenSans-Bold');

Я сделал переменную @pTheme, поэтому могу использовать ее также и для фоновых изображений, например:

background: url("@{pTheme}/images/logo.png") no-repeat;
person PAdrian    schedule 06.03.2014

LESS действительно поддерживает миксины с параметрами. См. Здесь: http://lesscss.org/#-parametric-mixins

person Ulrich Schmidt-Goertz    schedule 02.08.2013

Вы можете попробовать этот миксин для font-face (шрифт Proxima Nova, как описано):

.fontFace(@fontWidth) {
    @fontName: "Proxima Nova @{fontWidth}";
    @fileName: "../fonts/ProximaNova-@{fontWidth}";
    @font-face {        
        font-family: '@{fontName}';
        font-weight: 400;
        font-style: normal;
        src: url('@{fileName}.eot');
        src: url('@{fileName}.eot?#iefix') format('embedded-opentype'),
             url('@{fileName}.woff') format('woff'),
             url('@{fileName}.ttf') format('truetype'),
             url('@{fileName}.svg#@{fontName}') format('svg');
    }
}

.fontFace('Regular');
.fontFace('RegularIt');
.fontFace('Bold');

@fontName: Proxima Nova;
@font:          "@{fontName} Regular";
@font_italic:   "@{fontName} RegularIt";
@font_bold:     "@{fontName} Bold";

h2 {
    font: 400 50px @font_bold;  
}

И, что то же самое, сотрудники SASS / SCSS:

@mixin font ($weight) {
    @font-face {
        $fontName: 'Proxima Nova ' + $weight;
        $fileName: '../fonts/ProximaNova-' + $weight;

        font-family: $fontName;
        font-weight: 300;
        font-style: normal;
        src: url($fileName + '.eot ');
        src: url($fileName + '.eot?#iefix') format('embedded-opentype'),
           url($fileName + '.woff2') format('woff'),
           url($fileName + '.ttf') format('truetype'),
           url($fileName + '.svg##' + $fontName) format('svg');
    }
}
@include font(regular);
@include font(bold);
@include font(light);

$fontName: 'Proxima Nova ';
$font: $fontName + regular, "Helvetica Neue", sans-serif;
$font_bold: $fontName + bold;
$font_light: $fontName + light;

h2 {
    font: 300 15px $font_bold;
}
person GrimCap    schedule 01.10.2016

Я знаю, что этот вопрос немного устарел, но я дал ответ Месароша Лайоша. Необходимо было учесть несколько вещей, которых в настоящее время нет:

  1. Ваше семейство шрифтов и имя файла шрифта не обязательно должны совпадать; фактически, для «жирного» и «курсивного» вы можете использовать «Связывание стилей». См .: http://www.smashingmagazine.com/2013/02/14/setting-weights-and-styles-at-font-face-declaration/. Это предотвращает появление «ложного полужирного» и «искусственного курсива», которые возникают, когда браузер не понимает взаимосвязь между вашими шрифтами (например, он не знает, что MyFont-Bold является правильным шрифтом, если у вас есть сильный тег внутри текст, использующий MyFont).
  2. Имя семейства шрифтов и идентификатор SVG могут не совпадать; например, файл montserrat-regular.svg может иметь SVG-идентификатор montserratregular. Да, вы можете исправить это, переименовав свои файлы, и, возможно, вам стоит, но если вы получаете файлы удаленно (CDN), у вас может не быть такой роскоши.
  3. В личных предпочтениях я поменял порядок варианта и веса. В сокращении шрифтов CSS на первом месте стоит вариант, поэтому, чтобы все оставалось похожим, я поставил его здесь первым.
  4. Опять же, в личных предпочтениях, я удалил значения по умолчанию, потому что я не хотел вызывать этот метод без явного указания. Когда вам нужно указать все, вы с меньшей вероятностью забудете, что вам действительно нужно было изменить идентификатор SVG для этого шрифта.
  5. Поскольку Chrome-windows в настоящее время не сглаживает WOFF, я изменил порядок перемещения SVG сразу после EOT (старому IE сначала нужен EOT, иначе он сломается). Кредит

.fontface(@family, @filename-base, @style, @weight, @svgID){
    font-family: @family;
    src:url('@{filename-base}.eot');
    src:url('@{filename-base}.svg#@{svgID}') format('svg'),
        url('@{filename-base}.eot?#iefix') format('embedded-opentype'),
        url('@{filename-base}.woff') format('woff'),
        url('@{filename-base}.ttf') format('truetype');
    font-weight: @weight;
    font-style: @style;
}

person Carl Bussema    schedule 24.04.2014

Вот моя версия для SASS, протестированная и работающая.

@mixin fontface($family: sans-serif, $weight: normal, $style: normal, $path: '../fonts', $filename: 'font'){ @font-face{ font-family: $family; src:url('#{$path}/#{$filename}.eot'); src:url('#{$path}/#{$filename}.eot?#iefix') format('embedded-opentype'), url('#{$path}/#{$filename}.woff') format('woff'), url('#{$path}/#{$filename}.ttf') format('truetype'), url('#{$path}/#{$filename}.svg#icon') format('svg'); font-weight: $weight; font-style: $style; } }

person Karl    schedule 22.05.2014
comment
Вопрос про МЕНЬШЕ. Вам следует подумать о том, чтобы найти аналогичный вопрос о SASS, опубликовать там этот ответ и удалить этот ответ. - person Chris Moschini; 25.07.2014