FronzZ, У HTML немного правил, и там можно покуралесить на славу, например можно обернуть это в тот же span, div, h4 и это никак не нарушит правила. В вашем случае да, использования p/strong - чистое решение и ругать вас никто не будет, потому что в спецификации HTML, четко написано, что тот же p - представляет контейнером для "текста", а если быть правильнее для фразового содержимого, куда входит и обычный текст, и даже элементы форм ( то есть это не просто параграф в нашем понимании) . Если хотите больше узнать о тегах - ссылка у вас есть, либо простой запрос в гугле "HTML spec либо MDN <название тега>",
GaserV, есть два варианта - поднимаетесь так по предкам пока не достигнете нужного - elem.parentElement.parentElement.parentElement.parentElement. Да скучно.
Можно проще есть такой метод, который возвращает ближайшего предка по селектору closest
lleballex, потому что onselectionchange можно установить только на уровне document, на элемент можно попробовать поиграться с событием selectstart. И, наcчет события select - оно работает только для полей форм (input, textarea).
Сдесь не сработает :empty, так как есть пробельные символы между тегами элемена, а значит элемент уже не пустой.
Либо удали эти пробельные символы, что бы было так <div><?=$arResult["DETAIL_TEXT"]?></div>.
Либо проверяй $('.description-container').text().trim() === "" и только тогда прячь.
GaserV, думаю на чистом CSS Grid такого не добиться, ну если только не фиксировать размеры грид строк явно и потом размещать элементы с помощью grid-column/grid-row, для динамичного содержимого можно реализировать с помощью CSS Grid + JS (на самом деле простого кусочка JS) и в сети куча примеров.
smogstart, Скажу больше, по хорошему, так и должно быть. Я так понимаю, что в файле site-header.css у вас все, что относиться к блоку site-header, а именно - сам блок, его элементы и модификаторы, а site-header__nav как раз является его элементом. Поэтому все нормально.