Вообще всё это, что ты написал в зависимости от ситуации применяется по-разному.
Можно применять и класс к элементу h1. Но мне кажется лучше изначально элементу h1 и остальным заголовочным элементам задать базовые стили, чтобы где бы ты его не вставил он смотрелся одинаково. Правильный тон верстки. Т.е. просто прописать в классах:
h1 { ... }.
Можно и для него использовать класс, но я бы использовал его для косметических изменений. Например:
h1.color-red.
Или если надо его видоизменить, или какие-либо свойства задать конкретному заголовку то прописать, непосредственно, связанную с ним каскадность (его родителей):
.container h1 { ... }, .nav h1 { ... }.
Так же можно использовать добавление класса, как я писал выше.
Поиск по аттрибутам использовать можно.
По-поводу каскадности в классе элемента - в зависимости от ситуации. Лучше использовать проще. Не более 2-3 классов. И лучше стараться вообще стараться элементы делать независимыми. Вот сделаешь ты, например, каскадный стиль элементу:
.nav .list .list-item .list-item-link
А потом изменишь название .nav, на .nav-wrapper, или .list-wrapper. И стили твои все пропадут. Поэтому делай выводы из этого.