Отразить первую букву текста с помощью CSS

Я много искал способ делать то, что хочу, но находил только способы, которые не могу использовать.

Проблема в том, что я хочу отразить ТОЛЬКО первую букву названия сайта Wordpress.

У меня есть этот CSS:

.site-title {
    font-family: fontLogo;
    font-size: 60px;
    font-weight: bold;
    line-height: 1;
    margin: 0;
    padding: 58px 0 10px;
}

и я добавил этот кусок:

.site-title::first-letter {
    font-size: 80px;
    -moz-transform: scale(-1, 1);
    -webkit-transform: scale(-1, 1);
    -o-transform: scale(-1, 1);
    -ms-transform: scale(-1, 1);
    transform: scale(-1, 1);
}

Здесь используется класс:

<h1 class="site-title">TheTitle</h1>

Вторая проблема заключается в том, что я НЕ МОГУ редактировать эту строку, единственное, что я могу сделать, это работать с css (я также безуспешно пытался ввести >span> в редакторе заголовков WordPress.

CSS на самом деле делает ТОЛЬКО масштаб буквы, от 60px до 80px, но ничего не отражает.

Я заблокирован и мне нужен совет


person Gianmarco    schedule 06.11.2014    source источник
comment
Как узнать, зеркально ли это, если это буква Т?   -  person LcSalazar    schedule 06.11.2014
comment
Это не зеркально. Я изменил букву на E, и это не сработало.   -  person Drazzah    schedule 06.11.2014
comment
Очевидно, что LcSalazar я пытался использовать собственный шрифт, который не является симметричным, и, кстати, оригинальное название, которое я не поместил здесь для ясности, начинается с буквы M, которая также является такой же, если зеркально отразить ее в стандартном шрифте.   -  person Gianmarco    schedule 06.11.2014
comment
Если вы хотите добавить интервал к первой букве всех заголовков в wordpress, вы можете подключиться к фильтр title в файле function.php вашей темы   -  person yoavmatchulsky    schedule 06.11.2014
comment
Между прочим, сгенерированные CSS псевдоэлементы (::before и ::after) требуют, чтобы было установлено свойство content (даже если это была пустая строка, content: '';), чтобы они вообще отображались.   -  person David says reinstate Monica    schedule 07.11.2014
comment
См. также stackoverflow.com/q/3433641/632951.   -  person Pacerier    schedule 30.06.2015


Ответы (4)


Согласно документам MDN на ::first-letter, ты не можешь:

Только небольшое подмножество всех свойств CSS может использоваться внутри блока объявления набора правил CSS, содержащего селектор с использованием псевдоэлемента ::first-letter:

Все свойства шрифта: шрифт, стиль шрифта, настройки параметров шрифта, кернинг шрифта, переопределение языка шрифта, растяжение шрифта, синтез шрифта, вариант шрифта, альтернативный вариант шрифта, шрифт -вариант-заглавные буквы, шрифт-вариант-восточно-азиатский, шрифт-вариант-лигатуры, шрифт-вариант-числовой, шрифт-вариант-позиция, вес шрифта, размер шрифта, настройка размера шрифта, высота строки и шрифт -семья.

Все свойства фона: background-color, background-image, background-clip, background-origin, background-position, background-repeat, background-size, background-attachment и фоновый режим наложения.

Все свойства маржи: маржа, маржа-верхняя, маржа-правая, маржа-нижняя, маржа-левая.

Все свойства отступов: отступы, отступы-сверху, отступы-вправо, отступы-снизу, отступы-влево.

Все свойства границ: сокращенные свойства border, border-style, border-color, border-width, border-radius, border-image и полные свойства.

Свойство color.

Text-decoration, text-shadow, text-transform, letter-spacing, word-spacing (при необходимости) ), line-height, text-decoration-color, text-decoration-line, text-decoration-style, box-shadow, float, vertical-align (только если float не имеет значения) CSS-свойства.

ИЗМЕНИТЬ

В качестве альтернативы, поскольку вы не можете изменить HTML, вы можете превратить первую букву в реальный элемент с помощью некоторого javascript:

Пример JsFiddle

var title = document.querySelector('.site-title');
var fletter = title.innerHTML.charAt(0);
title.innerHTML = title.innerHTML.replace(fletter, '<span>'+fletter+'</span>');
person LcSalazar    schedule 06.11.2014
comment
Отличный JS хак. +1. - person Drazzah; 06.11.2014
comment
ваш JS очень и очень интересен. Как насчет SEO? Понравится ли им это? - person Gianmarco; 06.11.2014
comment
@Gianmarco - это хорошо обсуждалось. Кто-то говорит, что будет, кто-то говорит, что не будет. Там нет четкого заявления по этому поводу. См.: webmasters.stackexchange.com/ вопросы/31066/ - person LcSalazar; 06.11.2014
comment
Если вы хотите быть уверенным в SEO, не заменяйте первую букву, просто измените ее внешний вид на ::first-letter, чтобы сделать ее невидимой, и измените JS, чтобы она оставалась там. - person vals; 06.11.2014

Только небольшое подмножество всех свойств CSS может использоваться внутри блока объявления набора правил CSS, содержащего селектор с использованием псевдоэлемента ::first-letter. transform в настоящее время не является одним из них.

Подробнее читайте в Документации для разработчиков Mozilla.

Поскольку вы используете WordPress, вы всегда можете подключиться к 'the_title' и добавить <span> к заголовку. Что-то типа:

function prepend_title( $title, $id = null ) {
    if ( is_front_page() ) {
        return '<span class="first-letter">' . substr($title, 0, 1) . '</span>' . $title;
    } else { return $title; }
}
add_filter( 'the_title', 'prepend_title', 10, 2 );

Это заставит the_title() вернуть заголовок вместе с дублирующейся первой буквой, завернутой в <span>.

person rnevius    schedule 06.11.2014
comment
мммм очень интересно. Я сам думал о чем-то подобном, поэтому я думаю, что мы пришли к одной и той же идее (ты раньше меня, LOL). Мне нужно выяснить, ГДЕ и КОГДА используется заголовок, потому что мне нужно это отражение ТОЛЬКО в заголовке h1 на домашней странице (только по графической причине). - person Gianmarco; 06.11.2014
comment
человек, это может быть решением, а также, если я хочу перевернуть другие буквы в этом случае, я смогу это сделать. - person Gianmarco; 06.11.2014
comment
Да, все изолировано. JS не нужен. - person rnevius; 06.11.2014
comment
все еще беспокоюсь о SEO, хотя. По ссылке LcSalazar используйте изображение логотипа или текста с перевернутым p. Назначьте ему свойство alt и, как указано выше, также добавьте сюда скрытый текст. может лучше листать текст? Это потому, что название компании НЕ с перевернутыми буквами, а буквы логотипа. - person Gianmarco; 06.11.2014
comment
@Gianmarco Если вы измените мой код выше и заключите окончательный $title в теги <h1>, это будет означать, что весь диапазон первых букв находится ЗА ПРЕДЕЛАМИ заголовка <h1>. Это означает, что не должно быть абсолютно никакого влияния на SEO. - person rnevius; 06.11.2014
comment
Я тестирую ваш код, но я думаю, что мы делаем ошибку. Я посмотрел код и обнаружил, что мне действительно нужно изменить следующее: bloginfo('name'); но также я понял, что ВОЗМОЖНО, я смогу редактировать HTML шаблона. - person Gianmarco; 06.11.2014
comment
Я могу редактировать HTML, НО, когда внутри тегов h1 диапазон неэффективен при зеркалировании. не могу понять, что вы сказали об этом, это будет означать, что весь диапазон первых букв находится ЗА ПРЕДЕЛАМИ заголовка ‹h1›. - person Gianmarco; 06.11.2014
comment
Давайте продолжим это обсуждение в чате. - person Gianmarco; 06.11.2014

Это не самый гладкий способ, и он кажется немного хакерским, но я думаю, что это то, что вы ищете.

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

.site-title:after {
    content: "T";
    position: absolute;
    transform: rotateX(180deg);
}

Codepen здесь: http://codepen.io/supah_frank/pen/dCpmo

Если вы можете сделать контейнер за пределами позиции H1: относительная, это, вероятно, поможет с позиционированием, поскольку новая буква будет ее родственной сестрой.

person AndrewTet    schedule 06.11.2014
comment
Это определенно вариант, если заголовок не меняется динамически. - person rnevius; 06.11.2014
comment
Да, как я уже сказал, это немного хакерски, и я не большой поклонник необходимости жестко кодировать букву, и я бы предпочел абсолютное расположение буквы к фактическому H1, а не к его родителю, но я не могу думать другого способа сделать это без доступа к HTML. - person AndrewTet; 06.11.2014
comment
это листать по вертикали, я ищу вертикальную зеркальную. Я полагаю, что я могу сделать это с помощью rotateY, возможно. Дело в том, что: буква идет в конце (:after) и если я использую ::before она перекрывает собственно заголовок. Использование родственника не работает. Кстати, если мне нужно жестко закодировать письмо, это может быть не так полезно, как хотелось бы (я могу использовать jpeg), и, возможно, это может быть проблемой для SEO, потому что движки никогда не прочитают весь заголовок сайта. . Но спасибо, это ответ +1, очень интересно - person Gianmarco; 06.11.2014
comment
Я отредактировал свой вопрос, чтобы показать, как вы можете изолировать первую букву любого заголовка с помощью крючка WordPress. Не уверен, что это что-то изменит. - person rnevius; 06.11.2014

Я хочу поставить в качестве ответа решение, которое я использую (не окончательно), к сожалению, использование span внутри H1 не очень просто, поэтому я пришел к этому:

.firstletter {
    position:absolute;
    -moz-transform: scale(-1, 1);
    -webkit-transform: scale(-1, 1);
    -o-transform: scale(-1, 1);
    -ms-transform: scale(-1, 1);
    transform: scale(-1, 1);
}
.otherletters {
    position:relative;
    left:58px;
}

это интересная часть CSS, ОБРАТИТЕ ВНИМАНИЕ на «абсолютную» позицию для первой буквы (которая должна быть зеркальной), это необходимо, иначе (НО Я НЕ ЗНАЮ ПОЧЕМУ, если кто знает...) это не будет зеркально После этого мне нужно поставить диапазон с относительным позиционированием. К сожалению, это относительно конца последнего «встроенного» или «относительного» элемента, а не конца нашего «абсолютного» диапазона. По этой причине я перемещаю следующие буквы вправо примерно на 58 пикселей (визуально это выглядит вполне нормально).

<h1 class="site-title">
    <?php 
    $name = get_bloginfo('name','raw');
    echo '<span class="firstletter">' . substr($name, 0, 1) . '</span><span class="otherletters">' . substr($name,1).'</span>'; ?>
</h1>

это PHP заголовка, вы можете увидеть два разных тега span.

Для той же проблемы, с которой я столкнулся, все решения, предложенные моими друзьями LcSalazar, rnevius, просто не будут работать. Код, который я разместил, работает, но мне не нравится, что я должен поставить жестко запрограммированное «58px», которое достигается после нескольких тестов, потому что, если я изменю самую маленькую вещь в css, этот пробел может быть «преобразован» во что-то неправильное.

К настоящему времени я хотел бы иметь возможность рассчитать ширину пролета, чтобы точно расположить второй.

person Gianmarco    schedule 07.11.2014