Вы, безусловно, можете использовать этот метод, который предложил Taplar, или вы можете отказаться от него и использовать css только с: target псевдоселектором См. Приемы css здесь
По сути, вы будете скрывать свои разделы, как вы уже делаете, а затем добавляете класс с display: block вот так
#contact:target {
display: block;
}
Правда, показ содержимого по умолчанию немного сложнее. Вы можете проверить наличие значения в хэше и показать содержимое по умолчанию, если его нет. Я посмотрю на это и вернусь к вам
Редактировать: Проверить на этот вопрос принял ответ с помощью псевдо-селекторов
Вот ссылка на этот вопрос
Возможно, вы могли бы сделать что-то похожее на это:
/* based on/6990315/css-selektor-kogda-tsel-pusta */
.section-wrapper>.dynamic-content:target~#default-content,
.section-wrapper>.dynamic-content {
display: none;
}
.dynamic-content>#default-content,
.dynamic-content>.dynamic-content:target {
display: block;
}
<div class="section-wrapper">
<div id="default-content" class="dynamic-content">
This is the default content
</div>
<!-- Dynamic Section 1 -->
<div id="contact" class="dynamic-content">
Contact content
</div>
<!-- Dynamic Section 2 -->
<div id="expertise" class="dynamic-content">
Expertise content
</div>
<!-- Dynamic Section 3 -->
<div id="about" class="dynamic-content">
About content
</div>
<!-- Dynamic Section 3 -->
</div>
Время истекло, поэтому не было возможности протестировать, но что-то вроде этого должно работать