Как написать запасные варианты CSS для когда Javascript отключен

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

Допустим, я хочу добавить какой-то текст при загрузке страницы:

.fade-in { opacity:0; }

<div class="fade-in">FOOBAR</div>

$('.fade-in').fadeIn();

Но что, если у клиента не включен JavaScript?

Я не хочу, чтобы текст оставался невидимым, поэтому, возможно, я установил CSS в конечное состояние как запасной вариант, а затем UN-установил его с помощью javascript перед анимацией. Таким образом, пользователи без javascript просто видят обычный текст (без fadeIn), а пользователи с JS видят замирание.

.fade-in { opacity:1; }

<div class="fade-in">FOOBAR</div>

$('.fade-in').css('opacity', 0);
$('.fade-in').fadeIn();

Это работает, но в большинстве случаев это приведет к неприятному "мерцанию" между тем, когда установлено свойство отображения CSS, и тем, когда JavaScript отключает его. В приведенном выше примере пользователь с нормально работающим javascript увидит, что "FOOBAR" появится на долю секунды, затем исчезнет, ​​а затем исчезнет.

Есть ли лучшая практика для этого, которая не приводит к мерцанию ИЛИ жертве пользователей без JS?

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

Обновление: я знаю, что такие инструменты, как Modernizr, могут быть использованы для добавления .no-js классы и т.д., но я бы предпочел решение, которое не опирается на эти библиотеки.

4 ответа

Если у пользователя не включен JS, создайте для него таблицу стилей:

<head>
scripts
<noscript><link href="no-js.css" /> </noscript>
</head>

Использование <noscript></noscript> теги

Интересно, будет ли что-то подобное работать?

<body>

<noscript>
<div class="no-js">
</noscript>

...

<noscript>
</div>
</noscript>

</body>

Идея состоит в том, чтобы сохранить весь CSS в одной таблице стилей путем условной упаковки элементов в .no-js класс не требуя модернизр.

Вот мой лучший выбор для вас: используйте no-js и js занятия на вашем html элемент:

<html class="no-js">
<head>
    <title>...</title>
    <!-- Change "no-js" class to "js" in the html element -->
    <!-- This must appear high in your page to avoid FOUC effect -->
    <script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
</head>
<body>
    ...
</body>
</html>

Таким образом, ваш CSS может выглядеть так:

/* The item first appears with opacity=1, then disappears when the no-js class is removed */
.no-js .fade-in { opacity: 1; }
.fade-in { opacity: 0; }

Это почти то, что делают инструменты типа Modernizr, но здесь все очень просто.

Кредиты достаются Полу Ирландскому: http://www.paulirish.com/2009/avoiding-the-fouc-v3/

Другие вопросы по тегам