Зупинити перехід CSS від запуску при завантаженні сторінки


81

У мене виникла проблема із transitionвластивістю CSS, яка запускається під час завантаження сторінки.

Проблема полягає в тому, що коли я застосовую color transitionелемент до елемента, (наприклад:), transition: color .2sтоді, коли сторінка вперше завантажує мої елементи, блимає від чорного до власного призначеного кольору.

Припустимо, у мене є такий код:

CSS

p.green {
   color: green;
   transition: color .2s;
   -moz-transition: color .2s;
   -webkit-transition: color .2s;
   -o-transition: color .2s;
}

p.green:hover {
   color: yellow;
}

HTML

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
    <script src="js/main.js"></script>
    <link href="css/main.css" rel="stylesheet" />
</head>
<body>
    <p class="green">The Flashing Text</p>
</body>
</html>

При завантаженні сторінки моя p.greenволя зникає з blackдо green.

Я не хочу застосовувати перехід кольору до :hoverпсевдокласу, оскільки це не застосовуватиме перехід onMouseLeave .

Мене дуже дратує, коли текст миготить через веб-сторінку. До цього моменту я уникав використання переходів, якщо вони мені дійсно не потрібні, і навіть тому я використовую їх обережно. Було б чудово, якщо б було справді очевидне рішення цього, якого я не бачу!

Це відбувається в Google Chrome. Я не тестував в інших браузерах.

jsfiddle.net/ShyZp/2 (спасибі @Shmiddty)


2
Швидка думка:window.onload = function(){document.body.className += " loaded";} body.loaded p.green{transition:color .2s;}
Шміддті,

1
Це буде працювати, якщо у вас є лише невелика кількість класів із переходом кольору. Шукаю відповідь, яка не стосується JavaScript, бажано ...
nienn

Я не можу відновити проблему в Chrome: jsfiddle.net/ShyZp
Shmiddty

у мене проблема не трапляється в chrome, надайте нам ваш точний код у jsfiddle, будь ласка ...
Ilan Biala

1
Проблему можна побачити тут, але це дійсно лише в тому випадку, якщо дві декларації не відбуваються в одному файлі: jsfiddle.net/ShyZp/2
Shmiddty

Відповіді:


110

У Chrome є помилка, через яку переходи CSS запускаються, якщо сторінка містить <form>елемент.

Одне просте виправлення - додати тег сценарію, що містить єдиний пробіл, до нижнього колонтитула сторінки.

<script> </script>

Ви можете слідкувати за помилкою на https://crbug.com/332189 та https://crbug.com/167083 .


2
Я мав <script async src="main.js"></script>наприкінці свого документа. Видалення asyncатрибута виправило небажані переходи при завантаженні сторінки. 👍
Кайл Фокс

2
Як @KyleFox я був deferна моєму <script>тезі і видалення його вирішити мою проблему. Після цього я просто перемістив сценарій у нижню частину документа.
Джонатанбелл,

Це працювало у мене непослідовно (раніше помилка траплялася 100% часу; з цією зміною це траплялося 50% часу). Що ж працювати 100% час, що ця відповідь надихнув мене , щоб спробувати, було перепризначення речі в <head>моєму документі , щоб мій CSS був включений , перш ніж мій JavaScript , а не після нього; Я буквально вирішив цю помилку, перемістивши <script>мітку Google Analytics . Очевидно, що в Chrome є деякі умови раси або терміни, які можна згладити затримкою, спричиненою інтерпретацією трохи JS, хоча точна механіка для мене загадкова.
Марк Амері

2
FWIW, у мене все ще виникала ця проблема, навіть не маючи JS на сторінці. Єдине, що це виправило для мене, - це переміщення CSS на початок <body>тегу. Я додав, <link rel="preload" href="main.css" as="style">щоб <head>він все одно завантажувався відразу.
Тед Уайтхед,

У мене не було елемента <form> на моїй сторінці, і це вирішило помилку
Сезар Кастро

44

Коментарі @Shmiddty з цього питання змусили мене задуматися, тому я погрався з кодом і знайшов рішення.

Проблема полягає в headerдеклараціях. Інвертуючи порядок викликів зовнішніх файлів CSS та JS - тобто ставлячи CSS перед JS - кольорові переходи припиняють спрацьовування при завантаженні сторінки:

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link href="css/main.css" rel="stylesheet" />
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
    <script src="js/main.js"></script>
</head>

Я припускаю, що навантаження JS затримувало завантаження CSS після того, як DOM був готовий. На той час (як запропонував @Shmiddty) тексту вже було призначено колір браузера за замовчуванням, а потім він використовував мою transitionдекларацію CSS для переходу у свій стильовий колір.

** Я все ще не впевнений, що це найбільш підходящий спосіб це зробити, але він працює. Якщо хтось має краще рішення, будь ласка, додайте або відредагуйте.


Це рішення "вдарити чи пропустити" - воно може спрацювати сьогодні, але завтра не вдасться, коли ви внесете зміни в код.
Джон Охара,

Я також можу відтворити проблему без жодного файлу JS, тому ця відповідь не вирішить мою проблему. Прийнятий робить тхо.
Альваро

Ця відповідь схожа на те, що ваша проблема кешувалась.
TylerH

11

Додайте до свого CSS:

.css-transitions-only-after-page-load * {
  -webkit-transition: none !important;
  -moz-transition: none !important;
  -ms-transition: none !important;
  -o-transition: none !important;
}

І додайте код у свій глобальний файл JavaScript:

$(document).ready(function () {
    $(".css-transitions-only-after-page-load").each(function (index, element) {
        setTimeout(function () { $(element).removeClass("css-transitions-only-after-page-load") }, 10);
    });
});

Тепер ви можете позначити будь-який елемент на своїй сторінці за допомогою класу css-transitions-only-after-page-load :

<div class="container css-transitions-only-after-page-load">
...
</div>

4

Прийнята відповідь не зробила для мене фокусу. У Google Chrome є помилка, яку можна уникнути, просто додавши на сторінку скрипт . Навіть порожній сценарій вирішує проблему.


Здивований, що ця помилка триває роками. Просто щоб додати відповідь, <script>теги повинні йти після елементів DOM, з якими ви стикаєтесь із проблемою. Я рекомендую просто розмістити його в кінці вашої сторінки.
Кенні Ворден,

Хм spencer.sm дав, що є, по суті, більш доопрацьованим дублікатом цієї відповіді, зараз проголосованим набагато вищим за ваш. Твій був першим, але оскільки його піднявся над ним, твій вже не додає жодної цінності, оскільки я бачу. Можливо, пора його видалити?
Марк Амері

4

Найкращий спосіб вирішити цю проблему - використовувати єдиний пробіл, порожнє <script>виправлення, знайдене у відповідях на цій сторінці. Однак я знайшов 2 інші способи вирішення цієї проблеми.

  1. Помістіть CSS порушуючих елементів у <style>тег у заголовку HTML-файлу. Помилка виникає лише тоді, коли CSS викликається із зовнішньої таблиці стилів.
  2. Помістіть порушувальні елементи в flexboxконтейнер. Це також виправляє помилку.

це рішення, якщо у вас немає файлу js і ви не хочете використовувати js
CodeWeis

4

nienn розміщує рішення . Проблема полягає в голові документа та в тому, де / як ви завантажуєте таблиці стилів. Це схоже на "неможливо змінити заголовки, вони вже надіслані" в PHP, за винятком того, що HTML / CSS / webkit не видає вам помилки.

Я зіткнувся з цією точною проблемою, прочитав допис Нінн і переглянув свою голову. Ось мій вміст раніше.

<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <html lang="en">
    <meta name="description" content="A website for me to do whatever I want with." >
    <title>My title</title>
    <link rel="stylesheet" type="text/css" href="/mD/media/foot.css">
    <link rel="stylesheet" href="mD/media/head.css" type="text/css">
</head>

Зверніть увагу, що я не завантажую жодну JS, також зверніть увагу на те, як я завантажував сторінку таблиць стилів після зазначення заголовка. Перемістивши посилання на таблицю стилів на "назад", це спрацювало як шарм. Кінцевий результат виглядав так:

<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <html lang="en">
    <meta name="description" content="A website for me to do whatever I want with." >
    <link rel="stylesheet" type="text/css" href="/mD/media/foot.css">
    <link rel="stylesheet" href="mD/media/head.css" type="text/css">
    <title>My title</title>
</head>

Цю проблему може спричинити не тільки javascript, але й назва сайту. Я думаю, хорошим правилом є css> js> заголовок сайту.


Просто додам, у мене була та сама проблема, і виявилося, що це відео затримує завантаження сторінки. Видалення відео на iOS вирішило проблему.
Скотт w

0

Ви можете просто додати порожній тег сценарію у свій HTML-файл.

Подобається це:

<script type="text/javascript"></script>

але він повинен містити принаймні один символ. Або пробіл, або новий рядок (\ n), або коментар (//), або що завгодно

<script type="text/javascript"> </script>

<script type="text/javascript">
</script>

<script type="text/javascript">//</script>

Або просто приєднайте файл js до вашого файлу html

<script type="text/javascript" src="js/script.js"></script>

Ви можете розміщувати тег сценарію де завгодно. У мітці голови чи тіла .

Ця проблема трапляється лише під час розробки, оскільки в кінцевій ситуації веб-сайт він точно матиме js-файл


-2

Ви пробували використовувати різні властивості переходу? Як от:

-moz-transition: color .2s; /* Firefox 4 */
-webkit-transition: color .2s; /* Safari and Chrome */
-o-transition: color .2s; /* Opera */

Мені в Chrome вдалось чудово.

EDIT: Ви вже відповіли на питання про браузери. Спробуйте використати -webkit-transform


Я використовую це, вибачте, просто подумав, що поставив би спрощений код на питання.
nienn

Добре, до речі, я думав, що IE не підтримує переходи CSS3?
Banath

Ну ось і ви! :) Ви, звичайно, праві! Я застряг у Chrome для цього, пішов до IE лише заради цього питання і навіть не замислювався про цю * незначну деталь ...
nienn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.