Зачем мне когда-либо использовать класс над атрибутом в HTML и CSS? - PullRequest
0 голосов
/ 11 мая 2018

Я создаю веб-приложение, и мне нужно выбрать последовательный способ стилизации моих элементов.Я заметил, что во многих справках в Интернете используются классы, но я обычно использовал атрибуты (например, селектор запросов [my-attr]) для стилизации нескольких элементов, поскольку мне не нужно работать с classList и я могу очень легко удалять и устанавливать атрибуты,

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

Буду весьма признателен за любые мысли о случаях, когда классы могут выполнять работу лучше, чем атрибуты в чем-либо, даже если аргументы субъективны и сводятся к каким-то предпочтениям!

Спасибо!

Опять же, это для ванильного JavaScript, HTML и CSS.Я понимаю, что такие библиотеки, как jQuery, могут упростить использование классов, но я не планирую использовать какие-либо библиотеки.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

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

0 голосов
/ 11 мая 2018

Это более последовательно, это конец-все будет все, честно. Если вы предпочитаете использовать атрибуты, сделайте это. Однако это просто , что намного сложнее для тех, кто должен помочь вам позже. Классы CSS предназначены для группового выбора и применения общих стилей. CSS просто может также иметь возможность выбирать атрибуты, потому что это имеет смысл в некоторых крайних случаях.

Как правило, атрибуты должны быть зарезервированы для всего, что не связано со стилем и добавляет значение для другого использования, будь то средства чтения с экрана или контейнеры переменных для JavaScript, например data-id="34" может позволить сделать асинхронный запрос с идентификатором параметр.

Рассмотрим этот пример, у него есть несколько простых кнопок на основе классов:

.button {
  display: inline-block;
  border: 1px solid;
  padding: 4px 10px;
  text-decoration: none;
  margin-bottom: 4px;
}

.primary {
  background: currentColor;
}

.primary span {
  color: #fff;
}

.blue {
  color: #0095ee;
}

.red {
  color: #ee3300
}
<a href="#" class="button red">Red Button</a>
<a href="#" class="button red primary"><span>Red Button</span></a>
<br />
<a href="#" class="button blue">Blue Button</a>
<a href="#" class="button blue primary"><span>Blue Button</span></a>

Чтобы воспроизвести что-то подобное с атрибутами, мы будем делать что-то подобное с некоторыми отвратительными и довольно произвольными именами атрибутов. Делая это, я действительно все испортил, потому что в одном случае я использовал неверное имя атрибута и пару значений.

[type="button"] {
  display: inline-block;
  border: 1px solid;
  padding: 4px 10px;
  text-decoration: none;
  margin-bottom: 4px;
}

[status="primary"] {
  background: currentColor;
}

[status="primary"]  span {
  color: #fff;
}

[color="blue"] {
  color: #0095ee;
}

[color="red"] {
  color: #ee3300
}
<a href="#" type="button" color="red">Red Button</a>
<a href="#" type="button" color="red" status="primary"><span>Red Button</span></a>
<br />
<a href="#" type="button" color="blue">Blue Button</a>
<a href="#" type="button" color="blue" status="primary"><span>Blue Button</span></a>

Разве не имеет смысла хранить все ваши стилистические и групповые целевые атрибуты внутри атрибута class? Я имею в виду, это то, для чего оно было разработано. Я полагаю, что вы могли бы отбросить значение параметра и просто использовать имена параметров, но вы действительно отрицаете назначение атрибутов, учитывая, что class является глобальным атрибутом сам по себе.

Вот и пример JavaScript:

let classes = document.getElementsByClassName('button');
for( i = 0, n = classes.length; i < n; ++i ){
  classes[i].style.background = 'red';
}

let attrs = document.querySelectorAll('[button]');
for( i = 0, n = attrs.length; i < n; ++i ){
  attrs[i].style.background = 'blue';
}
a { 
 padding: 10px;
 margin-bottom: 4px;
 display: inline-block;
 text-decoration: none;
 color: #fff;
}
<a href="#" button>Attr 1</a>
<a href="#" button>Attr 2</a>
<a href="#" button>Attr 3</a>
<br />
<a href="#" class="button">Class 1</a>
<a href="#" class="button">Class 2</a>
<a href="#" class="button">Class 3</a>

Если не учитывать тот факт, что JS имеет обширную интеграцию с функциями на основе классов (и идентификаторов) для селекторов, вы имеете для использования querySelector и querySelectorAll для кнопок атрибутов.

Хотя это не так уж и плохо, (честно говоря, я предпочитаю querySelector над getElement(s)By… в целом), но когда вы смотрите на это, querySelectorAll('[button]') просто плохо читается, почти как будто я нацеливаюсь на <button> элемент. Семантически затрудняет чтение:

getElementsByClassName('button') - явно получает все элементы, которые имеют класс кнопки, или даже

querySelectorAll('.button') - Поскольку . универсально понимается как селектор «класса», и каждый, кто работает с HTML, CSS и JS, узнает об этом буквально в первый день любой программы / учебника по веб-разработке. Таким образом, вы вносите немного рывка в проект, удаляя такой фундаментальный кусок.

Я уверен, что вы слышали фразу «Только потому, что вы можете, не значит, что вы должны». - Я думаю, что здесь все в порядке. Я имею в виду, что мы на самом деле использовали для использования таких вещей, как <font color="red">Red</font>, и мы отошли от него, потому что имело больше смысла группировать стили в одном глобальном атрибуте. Вас ничто не останавливает, но я думаю, что это требует больше хлопот, чем стоит отбросить классы для произвольных имен параметров, не говоря уже о том, если у вас возникла проблема, и выложите свой код для помощи, первый ответ будет всегда be "Почему ты это делаешь, какой препроцессор ты используешь?"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...