GWT: возврат нескольких стилей для одного и того же поля CSS

В CssResource могу ли я вернуть несколько имен классов стилей из одного и того же метода?

[пожалуйста, простите любые ошибки в коде - я пытаюсь воссоздать дома, по памяти]. У меня есть следующий код библиотеки (который я не могу изменить):

void render(ClientBundle1 bundle) {
    setInnerHtml("<div class=\" + bundle.css().style() + \"/>");
}

Пакет прямолинейный:

interface ClientBundle1 extends ClientBundle {
    @Source("css1.css")
    CssResource1 css();
}

и ресурс css:

interface CssResource1 extends CssResource {
    style1();
}

и css1.css:

.style1 {width=10; height=20}

Теперь я хотел бы _частично_ переопределить "style1" другим стилем (переопределить только высоту, а не ширину) из моего собственного css (css2.css). Однако мой css2.css объявлен так:

.style2 {height=30}

Поэтому я хотел бы частично переопределить css1.style1 с помощью css2.style2 (другое имя класса).

Если бы это был ванильный HTML, я бы просто написал:

... импортировать css1, затем css2...

  <div class="style1 style2"/>

Однако, поскольку это GWT, мне нужно что-то вроде этого:

interface ClientBundle2 extends ClientBundle1 {
    @Source("css1.css", "css2.css")
    CssResource2 css();
}

и ресурс css:

interface CssResource2 extends CssResource1 {
    @Classname("style1", "style2")
    style();
}

но, конечно, вышеперечисленное невозможно в GWT.

Есть ли способ назначить два имени класса стиля для одного метода стиля?


person Ran Biron    schedule 09.07.2012    source источник


Ответы (1)


Несколько вариантов, ни один из которых не является именно тем, что вы просите:

Добавьте более одного класса:

Где бы вы ни применяли этот стиль, как вы сказали бы <div class="style1 style2"/>, добавьте оба стиля. Если в UiBinder, сделайте что-то вроде <g:Widget addStyleNames="{css.style1} {css.style2}" />, а если в Java, просто добавьте оба класса:

widget.addStyleNames(css.style1() + " " + css.style2());

or

widget.addStyleNames(css.style1());
widget.addStyleNames(css.style2());

Переопределите только этот стиль:

Почему бы не иметь более одного правила стиля для style1 или style2? Несколько способов, в зависимости от того, что вам нужно:

css1.css:

.style1 {width:10px; height:20px}

и css2.css:

.style1 {height:30px}

Используется в этом CssResource/ClientBundle:

interface CssResource2 extends CssResource1 {
    String style();
}
interface MyClientBundle extends ClientBundle {
    @Source({"css1.css", "css2.css}) 
    CssResource2 css();
}

Приведет к тому, что это будет (более или менее) стиль:

.style1 {width:10px; height:30px}

Поскольку более поздние правила CSS с равным весом переопределяют более ранние.

В качестве альтернативы, что-то вроде:

css1.css:

.style1, .style2 {width:10px; height:20px}

css2.css:

.style2 {height:30px}

Приведет к тому, что все с style1 будет 10x20, а все с style2 будет 10x30. Аннотацию @ClassName можно использовать, чтобы заставить CssResource2 более или менее игнорировать ранее определенный стиль.

person Colin Alworth    schedule 10.07.2012
comment
Спасибо, но, как вы сказали, это не помогает. Первое решение не годится, потому что это код библиотеки, а не мой код, который генерирует HTML. Второе решение не подходит, потому что вся идея состоит в том, чтобы иметь css2 со всеми моими настройками, соответствующими различным частям в библиотеке. Поскольку каждая часть библиотеки использует общие имена (например, триггер или кнопка), для меня проблематично переопределить одну часть, не переопределяя другую. - person Ran Biron; 10.07.2012
comment
Я не уверен, что вы видите, как тогда работает CssResource/ClientBundle — это не то, о чем вы просили, но это должно работать, так как когда вы создаете новый тип CssResource со своим собственным @Source, он получит новые запутанные имена, которые не будет конфликтовать с созданными из других CssResources (т.е. CssResource1.trigger может быть «GXHT», а CssResource2.trigger может быть «GXRT») - person Colin Alworth; 11.07.2012
comment
Да, но по-прежнему нужен CSS с именем стиля, продиктованным библиотекой. Это означает, что мне нужно несколько файлов CSS для переопределения разных частей библиотеки, потому что они решили повторно использовать имена стилей из разных файлов CSS. - person Ran Biron; 11.07.2012
comment
здорово, что addStyleNames можно использовать в виджете UiBinder! благодаря. - person Carl; 26.10.2012