Специфика CSS лучше встроена в !important

Вот мой сайт: http://stage.samkeddy.com/

Он отзывчив, используя пару медиа-запросов и кнопку мобильного меню на основе javascript.

Вот javascript для кнопки меню:

function toggleMenu () {
    if (menuIsVisible == false) {
        collapsibleMenu.style.height = 'auto';
        content.style.paddingTop = '290px';
        menuIsVisible = true;
    }
    else {
        collapsibleMenu.style.height = '0';
        content.style.paddingTop = '80px';
        menuIsVisible = false;
    }
}

так что вы можете видеть, что мне нужно настроить отступ в верхней части содержимого div, чтобы сместить меню

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

Вы можете проверить сами, открыв размер (как он должен выглядеть), изменив размер на мобильную ширину (навигация исчезнет, ​​и вы увидите кнопку меню), нажав кнопку меню (оставьте меню открытым), затем измените размер вернуться к ширине рабочего стола. Вы увидите, что прокладка все еще там. Если вы осмотрите его, вы увидите, что исходный отступ зачеркнут в пользу встроенного стиля.

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

РЕДАКТИРОВАТЬ: решено

Во-первых, я должен был добавлять классы, а не добавлять CSS с моим javascript.

Затем я предположил, что размещение !important вне медиа-запроса приведет к тому, что он будет отображаться только на рабочем столе, но он взял на себя все медиа-запросы. Таким образом, размещение только этого в запросе заставило его работать. Обратите внимание, что если бы я использовал 2 отдельных меню (мобильное/настольное), мне бы это не понадобилось, но, поскольку это было исправлено, а #content требовалось дополнение, это нужно было сделать. Но с помощью этой техники вы также можете использовать только одно меню, но таким образом делая высоту для меню. Я продемонстрировал эту технику в codepen: http://codepen.io/anon/pen/JFvay


person stackers    schedule 19.09.2014    source источник
comment
почему вы не используете запросы @media для определения размера вашего меню... использование javascript/jQuery для этих стилей только раскрывает лаз, в который вы собираетесь упасть.   -  person Cayce K    schedule 19.09.2014
comment
Также вы можете просто перестать использовать эти встроенные стили. Создайте пару классов и присвойте элементам тот или иной класс. (Но да, конечно, используйте медиа-запросы, когда это возможно.)   -  person Pointy    schedule 19.09.2014
comment
Итак, ваш стиль !important отображается в ваших инструментах разработки? Если нет, возможно, у вас есть синтаксическая ошибка где-то перед этим стилем.   -  person DeFeNdog    schedule 19.09.2014
comment
Медиа-запросы изменяют размер меню, javascript просто скрывает/отображает его. Я попробую использовать классы, а затем обновлю.   -  person stackers    schedule 19.09.2014
comment
Можно иметь два разных меню без дублирования htm. Используйте медиа-запросы, чтобы отформатировать страницу по-другому. Возможно, вам придется использовать различные свойства отображения, такие как фиксированный, смешанный с полями, но это можно сделать.   -  person Daryn    schedule 29.03.2017


Ответы (2)


Добавление этого кода в вашу таблицу стилей должно решить проблему, я только что попробовал это на вашем веб-сайте с помощью инструментов разработчика, и он работает:

@media only screen and (min-width: 643.2px) {
    #content {
        padding-top: 80px !important;
    }
}

Хотя я настоятельно рекомендую вам создать отдельное навигационное меню для мобильных устройств и прибегнуть к использованию @media-queries для его отображения.

person Fahad Hasan    schedule 19.09.2014
comment
Попробую сделать 2 навигации. Я вижу, как это может быть проще в кодировании, хотя это позор, иметь для него два одинаковых набора html. - person stackers; 19.09.2014
comment
не уверен, можете ли вы использовать php или нет, но, возможно, вы можете написать свою собственную функцию, если вы используете php для создания меню за вас. Таким образом, вы не делаете 2 отдельных набора. Или, в зависимости от вашего меню, вы можете настроить его так, чтобы он довольно легко ломался. - person Cayce K; 19.09.2014
comment
Это было ключом к моему успеху. Я предполагал, что добавление !important вне медиа-запроса заставит его отображаться только на рабочем столе, но он взял на себя все медиа-запросы. Таким образом, размещение только этого в запросе заставило его работать. Обратите внимание, что если бы я использовал 2 отдельных меню (мобильное/настольное), мне бы это не понадобилось, но, поскольку это было исправлено, а #content требовалось дополнение, это нужно было сделать. Но с помощью этой техники вы также можете использовать только одно меню, но таким образом делая высоту для меню. Я продемонстрировал эту технику в codepen: codepen.io/anon/pen/JFvay. - person stackers; 20.09.2014

Ваша проблема в том, что вы смешиваете CSS и встроенные стили. Как правило, избегайте размещения определенных свойств CSS непосредственно в элементах, будь то в HTML, с помощью element.style.<property> = или с помощью функции jQuery .css(). Вместо этого вы должны определить нужные свойства как правила CSS, используя классы:

#collapsible-menu                       { height: auto;  }
#content                                { padding-top: 290px; }
#someelt.menu-visible #collapsible-menu { height: 0; }
#someelt.menu-visible #content          { padding-top: 80px; }

где someelt — некоторый элемент-предок более высокого уровня. Тогда ваш JS становится просто

function toggleMenu() {
    document.getElementById('someelt').classList.toggle('menu-visible');
}

Если вы ориентируетесь на браузеры, которые не поддерживают classList (см. CanIUse), jQuery предоставляет собственную версию класса переключение.

CSS не является императивным языком, но если вы хотите, вы можете думать о #someelt.menu-visible части последних двух правил выше как о своего рода утверждении if: «Если меню видны, то< /em> уменьшить collapsible-menu до нулевой высоты» и т. д. В этой метафоре CSS как разновидности языка программирования (которым он и является) наличие класса menu-visible для #someelt можно рассматривать как своего рода логическую «переменную», Я полагаю. Скорее всего, вам больше не понадобится соответствующая переменная в вашем JS.

В любом случае, преимущество этого заключается в том, что люди, просматривающие ваш код, могут видеть всю логику, связанную с CSS, просто взглянув на файл CSS, вместо того, чтобы смотреть и на CSS, и на JS, и вы можете изменить вещи, связанные с CSS, всего в одном месте.

person Community    schedule 19.09.2014
comment
Это не точное описание, особенно если вы считаете, что встроенные атрибуты стиля находятся за пределами области CSS. !important влияет на все объявления стилей, участвующие в каскаде, включая атрибуты стиля. Если объявление встроенного стиля не имеет !important, то любое объявление !important должно переопределять его. (И, конечно же, если во встроенном объявлении стиля есть !important, он все равно выиграет.) - person BoltClock; 19.09.2014
comment
Описание взято из MDN. В этой конкретной статье много неточной информации. Я понимаю, почему написано, что эта статья нуждается в техническом обзоре. - он нужен, крайне. - person BoltClock; 19.09.2014
comment
Описание MDN теперь удалено. - person ; 19.09.2014
comment
Большое спасибо, этот комментарий помог мне достичь того, что я искал. Я определил #content.openMenu и #mobile-nav.openMenu в css, а затем просто добавил класс к обоим элементам через javascript. Мне также пришлось частично указать здесь другой ответ, который заключался в том, чтобы определить минимальную ширину и переместить верхнюю часть отступа для контента туда с важным флагом, чтобы он перезаписывался, когда он был на рабочем столе. - person stackers; 20.09.2014