Ja preferuje opcję numer 2.
Ale staraj się przy tym nie myśleć o stronie jako o całości, lecz o pojedynczych komponentach. Na przykład menu, jakiś box z artykułem, jakiś box ze zdjęciem itp. itd. Myśl o komponencie w taki sposób, abyś mógł go wykorzystać np. w innym projekcie.
Oznacza to np. rezygnację z popularnych kiedyś resetów CSS czy zbyt mocnym uzależnianiu elementów od siebie.
Jednocześnie staraj się tak pisać CSS aby możliwie uniezależnić się od struktury html. To znaczy zamiast:
// html
<ul>
<li>
<a>xxx<.a<
</li>
</ul>
// css
ul {}
ul > li {}
ul > li > a {}
styluj po klasach:
// html
<ul class="list">
<li class="list__item">
<a class="list__item__link">xxx<.a<
</li>
</ul>
// css
.list {
&__item {
&__link {}
}
}
W drugim przypadku dałem w css składnię SCSS ale to tak dla ciekawostki :)
Kod może nie najlepszy pod kątem BEM ale chodzi mi o zasadę. W drugim przypadku gdy np. zmienimy ul na ol to dalej css są ok i nic się nie rozwala.
Stylowanie po tagach osobiście toleruję tylko w przypadku pełnej enkapsulacji komponentu, np. gdy piszę w Angular ale i to nie zawsze.