Как переопределить стандартный PrimeFaces CSS с помощью пользовательских стилей? - PullRequest
60 голосов
/ 07 января 2012

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

Теперь я хочу изменить размер компонента. Например, <p:orderList>. У него есть класс ui-orderlist-list, который определен в primefaces.css с фиксированным размером 200x200. Неважно, что я делаю в моем theme.css, он перезаписывается этим атрибутом, и я никак не могу сделать контент частью <p:orderList> шире.

Для других компонентов мне может потребоваться переопределить только один экземпляр компонента, а не все.

Может кто-нибудь сказать, пожалуйста, как мне все это сделать?

Ответы [ 4 ]

113 голосов
/ 08 января 2012

Есть несколько вещей, которые вы должны принять во внимание, одна или несколько из них могут иметь отношение к вашему конкретному случаю

Загрузите ваш CSS после PrimeFaces one

Youнеобходимо убедиться, что ваш CSS загружен после PrimeFaces.Вы можете добиться этого, поместив <h:outputStylesheet> ссылку на ваш файл CSS внутри <h:body> вместо <h:head>:

<h:head>
    ...
</h:head>
<h:body>
    <h:outputStylesheet name="style.css" />
    ...
</h:body>

JSF автоматически переместит таблицу стилей в end сгенерировал HTML <head>, и это обеспечит загрузку таблицы стилей после стилей по умолчанию PrimeFaces.Таким образом, селекторы в вашем CSS-файле, точно такие же, как и в CSS-файле PrimeFaces, получат приоритет над PrimeFaces.

Вероятно, вы также увидите предложения по его размещению в <f:facet name="last"> из <h:head>что понимается в PrimeFaces HeadRenderer, но это неоправданно неоправданно и сломается, если у вас есть собственный HeadRenderer.

Понимание специфики CSS

Вы также должны убедиться, что вашСелектор CSS имеет значение , по крайней мере, , такое же, как селектор CSS по умолчанию PrimeFaces для конкретного элемента.Вы должны понимать CSS Specificity и Правила каскадирования и наследования .Например, если PrimeFaces объявляет стиль по умолчанию следующим образом:

.ui-foo .ui-bar {
    color: pink;
}

, и вы объявляете его как

.ui-bar {
    color: purple;
}

, а конкретный элемент с class="ui-bar" имеет родительский элемент сclass="ui-foo", тогда у PrimeFaces все равно будет приоритет, потому что это самое конкретное совпадение!

Вы можете использовать инструменты разработчика веб-браузера, чтобы найти точный селектор CSS.Щелкните правой кнопкой мыши по рассматриваемому элементу в веб-браузере (IE9 / Chrome / Firefox + Firebug) и выберите Проверить элемент , чтобы увидеть его.

Частичное переопределение

Если вам нужно переопределить стиль только для определенного экземпляра компонента, а не для всех экземпляров одного и того же компонента, то добавьте пользовательский styleClass и вместо этого подключите его.Это еще один случай, когда специфичность используется / применяется.Например:

<p:dataTable styleClass="borderless">
.ui-datatable.borderless tbody,
.ui-datatable.borderless th
.ui-datatable.borderless td {
    border-style: none;
}

Если компонент не поддерживает styleClass и вы используете jsf 2.2 или выше, вы также можете использовать атрибуты передачи и добавить pt:class и запустите его на выходе.

<p:clock pt:class="borderless" />

Никогда не используйте! Important

В случае, если вам не удается правильно загрузить файл CSS по порядку или выбрать правильный селектор CSSвы, вероятно, возьмете !important обходной путь.Это просто неправильно.Это уродливый обходной путь, а не реальное решение.Это только сбивает с толку ваши правила стиля и себя больше в долгосрочной перспективе.!important должен only использоваться для переопределения значений, жестко закодированных в атрибуте style элемента HTML из файла таблицы стилей CSS (что, в свою очередь, также является плохой практикой, но, к сожалению, в некоторых редких случаяхнеизбежно).

См. также:

4 голосов
/ 07 января 2012

вы можете создать новый файл css, например, cssOverrides.css

и поместить в него все нужные вам переопределения, таким образом, обновление версии primerface не затронет вас,

иh: head добавьте что-то подобное

<link href="../../css/cssOverrides.css" rel="stylesheet" type="text/css" />

, если это не сработает, попробуйте добавить его в h: body

, чтобы проверить, работает ли он, и попробуйте этот простой пример в файле CSS

.ui-widget {
   font-size: 90% !important;
}

это уменьшит размер всех основных компонентов / текст

3 голосов
/ 26 января 2017

Я использую PrimeFaces 6.0. Вот некоторая информация, которую я хотел бы иметь относительно этого:

Если вы используете <h:outputStylesheet/>, это будет работать, но ваш CSS не будет загружаться последним, даже если он последний в тегах <h:head></h:head> (впоследствии будут включены другие файлы CSS). Уловка, которую вы можете сделать из здесь , заключается в том, чтобы поместить ее внутрь <f:facet name="last"></f:facet>, , которая должна входить в тело , вот так:

<h:body>
  <f:facet name="last">
    <h:outputStylesheet name="css/MyCSS.css" />
  </f:facet>
...

Тогда ваш CSS будет загружен последним. Примечание: вам все равно придется придерживаться правил специфики, изложенных BalusC.

Я поместил «MyCSS.css» в WebContent / resources / css /.

Подробнее о порядке загрузки ресурса: http://www.mkyong.com/jsf2/primefaces/resource-ordering-in-primefaces

1 голос
/ 05 марта 2018

Стили, используемые в PrimeFaces / jQuery UI, могут быть довольно сложными.Элемент может получить свой стиль из нескольких правил CSS.Полезно знать, что вы можете использовать фильтрацию на вкладке стиля инспектора DOM для поиска свойства, которое хотите настроить:

...