Чи може клас CSS успадкувати один чи більше інших класів?


735

Я почуваюсь німим за те, що так довго був веб-програмістом і не знаю відповіді на це запитання, я фактично сподіваюся, що це можливо, і я просто не знав про те, ніж те, на що я думаю, що це відповідь (а це те, що це неможливо) .

Моє запитання - чи можна зробити клас CSS, який "успадковує" інший клас CSS (або більше одного).

Наприклад, скажімо, у нас було:

.something { display:inline }
.else      { background:red }

Що я хотів би зробити так, як це:

.composite 
{
   .something;
   .else
}

де клас ".composite" буде відображати вбудований рядок і мати червоне тло


3
Подумайте більше про каскадність, а не про спадщину, тут це не стосується
blu

Відповіді:


427

Є такі інструменти, як МЕНШЕ , які дозволяють складати CSS на більш високому рівні абстракції, подібному до описаного вами.

Менше називає цих "Мікінів"

Замість

/* CSS */
#header {
  -moz-border-radius: 8px;
  -webkit-border-radius: 8px;
  border-radius: 8px;
}

#footer {
  -moz-border-radius: 8px;
  -webkit-border-radius: 8px;
  border-radius: 8px;
}

Можна сказати

/* LESS */
.rounded_corners {
  -moz-border-radius: 8px;
  -webkit-border-radius: 8px;
  border-radius: 8px;
}

#header {
  .rounded_corners;
}

#footer {
  .rounded_corners;
}

37
Уау, МЕНШЕ в значній мірі саме те, що я шукаю ... прикро, що це не підтримується споконвічно, і що це написано в Ruby (я використовую ASP.NET MVC)
Joel Martinez

1
Так, я теж в світі ASP.NET, тому я не перемістив його у виробничий робочий процес.
Ларсенал

Менше красиво і спокусливо ... але я не дуже успішно використовував його з CSSEdit в одному робочому процесі - тому я ще не повністю прийняв його.
Райан Флоренція

1
Так, МЕНШЕ досить солодко, чи не так. Ive фактично працював на .NET порт тут: nlesscss.codeplex.com .
Оуен

77
якщо ви досягнете цього через google: порт .Net зараз тут
Eonasdan

309

Ви можете додати кілька класів до одного елемента DOM, наприклад

<div class="firstClass secondClass thirdclass fourthclass"></div>

Правила, подані в пізніших класах (або які більш конкретні), переосмислюють. Тож fourthclassв цьому прикладі переважає вид.

Спадкування не є частиною стандарту CSS.


12
чи знаєте ви, який клас переважає, останній чи перший клас і чи безпечна поведінка перехресного браузера? Скажімо , у нас .firstClass {font-size:12px;} .secondClass {font-size:20px;}буде остаточний font-sizeбути 12pxабо 20pxі це крос безпечний браузер?
Марко Демайо

27
Правило з найвищою специфікою щодо селектора виграє. Застосовуються стандартні правила специфіки; у вашому прикладі, оскільки "перший" та "другий" мають однакову специфіку, правило, оголошене пізніше в CSS, виграє.
Метт Брідж

19
Мені подобається ідея використання чистого CSS (замість меншої) для вирішення цього питання.
Олексій

8
Мені також подобається ідея не вводити кілька разів кілька класів - Що є O (n ^ 2) робота :)
Секрет

3
Що робити, якщо я використовую сторонній lib і хочу змінити дизайн / HTML, який він надає, але не можу змінити вбудовані файли css у цій lib? Там мені знадобиться якесь спадщину в класах css.
Шивам

112

Так, але не зовсім із цим синтаксисом.

.composite,
.something { display:inline }

.composite,
.else      { background:red }

7
Це смоктання, але я радий, що ми принаймні цього маємо!
Пейсьєр

3
Чому це смокче? це здається дуже гарним. Я не можу зрозуміти різницю між символом кома та рішенням less.js.
Відзначається

21
Тому що, якщо .something та .else класи знаходяться в різних файлах, і ви не можете їх змінити, то ви застрягли.
Олександр Мелард

8
Це була правильна відповідь, оскільки вона відповіла на питання, використовуючи чистий синтаксис CSS Менш відповідь добре знати, хоча.
raddevus

1
Це має бути виключена відповідь.
eaglei22

66

Зберігайте спільні атрибути разом та призначайте знову (або переосмислюйте) атрибути.

/*  ------------------------------------------------------------------------------ */   
/*  Headings */ 
/*  ------------------------------------------------------------------------------ */   
h1, h2, h3, h4
{
    font-family         : myfind-bold;
    color               : #4C4C4C;
    display:inline-block;
    width:900px;
    text-align:left;
    background-image: linear-gradient(0,   #F4F4F4, #FEFEFE);/* IE6 & IE7 */
}

h1  
{
    font-size           : 300%;
    padding             : 45px 40px 45px 0px;
}

h2
{
    font-size           : 200%;
    padding             : 30px 25px 30px 0px;
}

2
Це дуже близьке до ідеального рішення, я сподіваюся, що люди не відмовляться від нього лише тому, що він отримав мало голосів. Насправді, одне з найскладніших питань щодо "успадкування CSS" полягає в тому, що ви зазвичай отримуєте вже зроблене, величезне веб-програмне забезпечення (наприклад, електронну комерцію або блог відомого програмного забезпечення PHP), і вони використовують код PHP, який виграв " t додайте кілька класів до елементів HTML, які вони випускають. Це змушує вас обійтись і зіпсуватись із вихідним кодом (втрачаючи зміни, якщо оновити пізніше), щоб змусити виводити ці додаткові класи. При такому підході ви натомість редагуєте лише файл CSS!
Даріо Фумагаллі

3
Це саме те, що я шукав. Не варто нічого такого ж підходу працювати з CSS Selectors? Замість вказівки h1, h2, etcви можете вказати.selector1, .selector2, .etc
JeffryHouser

Я хотів прокоментувати, що це саме той підхід, який використовує w3 у своєму рекомендованому аркуші стилів html за замовчуванням: [w3 CSS2]: w3.org/TR/CSS2/sample.html . Я також намагаюся зрозуміти, як організувати код css, і, схоже, парадигма перевернута порівняно з типовим об'єктно-орієнтованим успадкуванням: ви використовуєте класи (або, загалом, селектори), щоб вказати, які елементи успадковують, які атрибути, але ви успадковуєте атрибути (принаймні, саме так ієрархія може найлегше існувати логічно), а потім заміняєте атрибути на більш конкретних селекторах, коли це необхідно.
Натан Чаппелл

50

Елемент може приймати кілька класів:

.classOne { font-weight: bold; }
.classTwo { font-famiy:  verdana; }

<div class="classOne classTwo">
  <p>I'm bold and verdana.</p>
</div>

І це настільки ж близько, як ви збираєтеся на жаль. Я хотів би побачити цю функцію разом із псевдонімами класів колись.


44

Ні, ти не можеш зробити щось подібне

.composite 
{
   .something;
   .else
}

Це не імена "класу" в значенні ОО. .somethingі .elseє просто селекторами нічого більше.

Але ви можете або вказати два класи на елементі

<div class="something else">...</div>

або ви можете заглянути в іншу форму спадкування

.foo {
  background-color: white;
  color: black;
}

.bar {
  background-color: inherit;
  color: inherit;
  font-weight: normal;
}
<div class="foo">
  <p class="bar">Hello, world</p>
</div>

Там, де кольори та кольори абзаців успадковуються з налаштувань у розділі, що додається до .fooстилю. Можливо, вам доведеться перевірити точну специфікацію W3C. inheritза замовчуванням для більшості властивостей все одно, але не для всіх.


1
Так, це (перша частина) було моїм очікуванням, коли я вперше почув про CSS ще в 20 столітті ... і у нас все ще немає цього, вони пекуть продуктивність на деяких динамічних речах, в той час як це може бути статичним складеним перед застосуванням css і це замінює потребу в змінних (статичні "змінні")
neu-rah

30

Я зіткнувся з цією самою проблемою і в кінцевому підсумку використовував рішення JQuery, щоб зробити вигляд, що клас може успадкувати інші класи.

<script>
    $(function(){
            $(".composite").addClass("something else");
        });
</script>

Це знайде всі елементи з класом "композит" та додасть до класів "щось" та "ще". Так щось подібне <div class="composite">...</div>закінчиться так:
<div class="composite something else">...</div>


1
Проблема з цим рішенням полягає в тому, що стосується всіх існуючих елементів керування, якщо ви створите елемент керування після цього дзвінка, він не матиме нового класу.
LuisEduardoSP

27

Спосіб SCSS для даного прикладу буде таким:

.something {
  display: inline
}
.else {
  background: red
}

.composite {
  @extend .something;
  @extend .else;
}

Детальніше, ознайомтеся з основами sass


Яка додана вартість порівняно з цим? .composite,.something { display:inline }і.composite,.else { background:red }
Павло Гатнар

2
@PavelGatnar Ви можете повторно використовувати визначення .somethingта .elseв інших визначеннях css.
Альтер Лагос

15

Найкраще ви можете це зробити

CSS

.car {
  font-weight: bold;
}
.benz {
  background-color: blue;
}
.toyota {
  background-color: white;
}

HTML

<div class="car benz">
  <p>I'm bold and blue.</p>
</div>
<div class="car toyota">
  <p>I'm bold and white.</p>
</div>


7

У файлі Css:

p.Title 
{
  font-family: Arial;
  font-size: 16px;
}

p.SubTitle p.Title
{
   font-size: 12px;
}

2
То що буде в результаті font-size?
абатищев

Розмір шрифту складе 12 px для "p.Title", оскільки він визначений після першого у файлі. він переосмислює перший розмір шрифту.
YWE

@YWE: Це означає, що декларації насправді повинні бути навпаки порівняно з написаними у цій відповіді (принаймні, якщо ми хочемо, щоб приклад був ілюстративним)? Якщо останнє визначене переважає, то font-size: 16pxніколи не може набути чинності, правда?
АБО Mapper

@ORMapper - зазвичай відбувається те, що перша декларація знаходиться у загальному файлі css, який ділиться кількома сторінками. Тоді друга декларація знаходиться у другому файлі css, який використовується лише на певних сторінках. І імпортується після загального файлу css. Тож ці сторінки використовують значення "востаннє бачення" 12px.
ToolmakerSteve

7

Я усвідомлюю, що це питання зараз дуже давнє, але ось тут нічого!

Якщо наміром є додавання одного класу, що передбачає властивості декількох класів, як власне рішення, я б рекомендував використовувати JavaScript / jQuery (jQuery дійсно не потрібен, але, безумовно, корисний)

Якщо у вас є, наприклад, .umbrellaClassщо "успадковується" від, .baseClass1і .baseClass2ви можете мати готовий JavaScript, який запускається.

$(".umbrellaClass").addClass("baseClass1");
$(".umbrellaClass").addClass("baseClass2");

Тепер усі елементи .umbrellaClassволі матимуть усі властивості обох .baseClasss. Зауважте, що, як і OOP успадкування, .umbrellaClassможе мати або не мати своїх властивостей.

Єдине застереження тут - це врахувати, чи є елементи, що динамічно створюються, які не існуватимуть, коли цей код запускається, але існують і прості шляхи навколо цього.

Sucks css, однак, не має спадкової спадщини.


1
Цей підхід вже був запропонований в @ DHoover в відповідь з 2013 року
Bryan

6

Ідеальний термін : я перейшов із цього питання до свого електронного листа, щоб знайти статтю про Less , бібліотеку Ruby, яка, серед іншого, робить це:

Оскільки super виглядає так само footer, але з іншим шрифтом, я буду використовувати техніку включення класу Лесса (вони називають це міксин), щоб сказати, щоб він також включав ці декларації:

#super {
  #footer;
  font-family: cursive;
}

Тільки коли я подумав, що ЛЕПШ не може мене більше здивувати ... Я не мав уявлення, що ти можеш імпортувати форматування з іншого подібного блоку. Чудова порада.
Даніель Ріппштейн

4

На жаль, CSS не забезпечує "успадкування" так, як це роблять мови програмування, такі як C ++, C # або Java. Ви не можете оголосити клас CSS, а потім розширити його іншим класом CSS.

Однак ви можете застосувати більше ніж один клас до тегу у своїй розмітці ... в цьому випадку існує складний набір правил, який визначає, які фактичні стилі будуть застосовані браузером.

<span class="styleA styleB"> ... </span>

CSS шукатиме всі стилі, які можна застосувати, залежно від розмітки, і поєднає стилі CSS з цих кількох правил разом.

Зазвичай стилі об'єднуються, але коли виникають конфлікти, пізніше оголошений стиль, як правило, виграє (якщо тільки важливий атрибут не вказаний для одного зі стилів, у цьому випадку виграє). Також стилі, застосовані безпосередньо до елемента HTML, мають перевагу над стилями класів CSS.


Ваша відповідь стала для мене першим результатом в Google і була корисною. З цього приводу я маю вам поради - якщо ви пропонуєте рішення, найкраще уникати початкових пропозицій негативно (на жаль, CSS не забезпечує спадщину ..) Я знаю, що хтось із належним терпінням прочитає, щоб відкрити ваше приємне рішення але іноді люди втрачають терпіння і можуть поспішати зробити висновок, що те, що вони намагаються зробити, неможливо. Для найкращого шансу допомогти іншим, ви можете почати з чогось типу "Поки CSS не має спадщини, ви можете досягти того, що вам потрібно до ..."
egmfrs

4

Також є SASS, який можна знайти на веб-сайті http://sass-lang.com/ . Там є тег @extend, а також система змішаного типу. (Рубі)

Це свого роду конкурент менше.


4

Це неможливо в CSS.

Єдине, що підтримується у CSS, - це конкретніше, ніж інше правило:

span { display:inline }
span.myclass { background: red }

Проміжок з класом "myclass" матиме обидві властивості.

Ще один спосіб - вказати два класи:

<div class="something else">...</div>

Стиль "else" замінить (або додасть) стиль "щось"


Для всіх стилів у 1 файлі є схоже на спадщину рішення у CSS, дивіться мою публікацію.
Павло Гатнар

3

Ви можете застосувати до одного класу CSS щось подібне до цього класу = "щось інше"


3

Як говорили інші, ви можете додати до елемента кілька класів.

Але це насправді не сенс. Я отримую ваше запитання про спадщину. Справжній сенс полягає в тому, що успадкування в CSS здійснюється не через класи, а через ієрархії елементів. Отже, для моделювання успадкованих ознак потрібно застосувати їх до різних рівнів елементів у DOM.


Краще створити визначення схожих CSS у спадок, а не використовувати весь ланцюжок класів композиції, дивіться мою публікацію.
Павло Гатнар

2

Я шукав це, як божевільний, і я просто зрозумів це, пробуючи різні речі: P ... Ну ти можеш це зробити так:

composite.something, composite.else
{
    blblalba
}

Це раптом у мене вийшло :)


2

За конкретних обставин ви можете зробити "м'яке" успадкування:

.composite
{
display:inherit;
background:inherit;
}

.something { display:inline }
.else      { background:red }

Це працює лише в тому випадку, якщо ви додаєте .composite клас до дочірнього елемента. Це "м'яке" успадкування, оскільки будь-які значення, не вказані в .composite, не успадковуються очевидно. Майте на увазі, що все-таки менше символів буде просто писати "вбудований" і "червоний", а не "успадковувати".

Ось список властивостей і те, чи вони це роблять автоматично: https://www.w3.org/TR/CSS21/propidx.html


2

Хоча пряме успадкування неможливо.

Можна використовувати клас (або ідентифікатор) для батьківського тегу, а потім використовувати комбінатори CSS, щоб змінити поведінку дочірних тегів із своєї спадкоємності.

p.test{background-color:rgba(55,55,55,0.1);}
p.test > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
<p class="test"><span>One <span>possible <span>solution <span>is <span>using <span>multiple <span>nested <span>tags</span></span></span></span></span></span></span></span></p>

Я б не пропонував використовувати стільки прольотів, як приклад, однак це лише доказ концепції. Є ще багато помилок, які можуть виникнути при спробі застосувати CSS таким чином. (Наприклад, зміна типів декорування тексту).


2

Less і Sass - це попередні процесори CSS, які цінними способами розширюють мову CSS. Одне з багатьох вдосконалень, які вони пропонують, - це лише той варіант, який ви шукаєте. Є кілька дуже хороших відповідей з Менше, і я додам рішення Сасса.

Sass має розширений варіант, що дозволяє повністю розширити один клас до іншого. Більше про розширення ви можете прочитати в цій статті


1

Насправді те, що ви просите, існує - однак це робиться як додаткові модулі. Ознайомтесь із цим запитанням на веб-сайті Better CSS у .NET для прикладів.

Ознайомтеся з відповіддю Ларсеналу щодо використання ЛЕШЕ, щоб отримати уявлення про те, що роблять ці додатки.


1

CSS насправді не робить те, що ви просите. Якщо ви хочете написати на увазі правила з цією складною ідеєю, ви можете перевірити компас . Це рамка таблиць стилів, яка схожа на вже згадану Менш.

Це дозволяє вам робити комбінації та всі добрі справи.


Додаючи більше деталей до вище, Compass aka Sass робить через Extend, PlaceHolders Mixins vs Extend , більш детальну інформацію про PlaceHolders
Abhijeet

1

Для тих, хто не задоволений згаданими (відмінними) посадами, ви можете використовувати свої навички програмування, щоб зробити змінну (PHP або залежно від того), в якій вона зберігатиме кілька імен класів.

Це найкращий злом, який я міг придумати.

<style>
.red { color: red; }
.bold { font-weight: bold; }
</style>

<? define('DANGERTEXT','red bold'); ?>

Потім застосуйте глобальну змінну до потрібного елемента, а не самих назв класів

<span class="<?=DANGERTEXT?>"> Le Champion est Ici </span>


1

Не думайте про класи css як об’єктно-орієнтовані класи, не думайте про них як про інструмент серед інших селекторів, щоб вказати, до яких класів атрибутів стилюється html-елемент. Подумайте про все між дужками як клас атрибутів , а селектори ліворуч повідомляють про елементи, які вони вибрали для успадкування атрибутів з класу атрибутів . Приклад:

.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}

Коли елементу надається атрибут class="foo", корисно думати про нього не як про спадкові атрибути класу .foo, а про клас атрибутів A та клас B атрибутів . Тобто, графік спадкування є глибиною на один рівень, з елементами, що походять з класів атрибутів , та селекторами, що вказують, куди йдуть ребра, та визначають пріоритет, коли є конкуруючі атрибути (подібно до порядку вирішення методу).

введіть тут опис зображення

Практичне значення для програмування полягає в цьому. Скажімо , у вас є таблиця стилів , наведені вище, і хочете додати новий клас .baz, де вона повинна мати такий же , font-sizeяк .foo. Наївним рішенням було б таке:

.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}
.baz { font-size : 2em; /* attribute class C, hidden dependency! */}

введіть тут опис зображення

Кожен раз, коли мені доведеться щось набрати двічі, я настільки злий! Мало того, що я мушу це двічі писати, тепер я не можу програмно вказувати на те, що .fooі .bazповинно бути те саме font-size, і я створив приховану залежність! Моя вище парадигма запропонувала б я абстрагувати font-sizeатрибут з класу атрибутів A :

.foo, .bar, .baz { font-size : 2em; /* attribute base class for A */}
.foo, .bar { font-weight : bold; /* attribute class A */}
.foo { color : green; /* attribute class B */}

введіть тут опис зображення

Основна скарга тут є те , що тепер я повинен передруковувати кожен селектор з атрибута класу A ще раз , щоб вказати , що елементи , вони повинні вибрати також повинні наслідувати атрибути з атрибутів базового класу A . Тим не менш, альтернативи повинні пам’ятати, щоб редагувати кожен клас атрибутів, де є приховані залежності кожного разу, коли щось змінюється, або використовувати сторонній інструмент. Перший варіант сміє бога, другий змушує мене вбити себе.


0

Якщо ви хочете більш потужний текстовий препроцесор, ніж LESS, перегляньте PPWizard:

http://dennisbareis.com/ppwizard.htm

Попередження веб-сайту справді огидне, і крива навчання невелика, але він ідеально підходить для створення CSS та HTML коду за допомогою макросів. Я ніколи не розумів, чому більшість веб-кодерів не використовують це.


11
Сайт є дійсно огидним.
нанофарад

Вид іронії на веб-сайті для html-процесора!
Бен Терлі

2
Так, веб-сайт огидний, але це більше, ніж просто це. Це важко читати і теж болить голова!
ArtOfWarfare

1
Хороша річ, що вона сумісна з Windows 3.1 до XP, lol
Alter Lagos

Химерний нестандартний інструмент, немає подібного.
berkus

-6

Ви можете досягти того, що хочете, якщо попередньо обробити файли .css через php. ...

$something='color:red;'
$else='display:inline;';
echo '.something {'. $something .'}';
echo '.else {'. $something .'}';
echo '.somethingelse {'. $something  .$else '}';

...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.