페이지로드시 CSS 전환 실행 중지


81

transition페이지로드시 실행 되는 CSS 속성에 문제가 있습니다.

문제는 color transition요소에 a 를 적용 할 때 (예 :) 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에서 사라질 것이다 blackgreen.

onMouseLeave:hover 전환을 적용하지 않으므로 의사 클래스에 색상 전환을 적용하고 싶지 않습니다 .

웹 페이지에서 텍스트가 깜박이는 것이 정말 짜증나 지 않습니다. 지금까지 저는 전환이 정말로 필요하지 않는 한 전환 사용을 피해 왔으며 심지어 신중하게 사용합니다. 내가 보지 못하는 이것에 대한 확실한 해결책이 있다면 좋을 것입니다!

이것은 Google 크롬에서 발생합니다. 다른 브라우저에서는 테스트하지 않았습니다.

jsfiddle.net/ShyZp/2 ( @Shmiddty에게 감사드립니다)


2
빠른 생각 :window.onload = function(){document.body.className += " loaded";} body.loaded p.green{transition:color .2s;}
Shmiddty

1
색상 전환이있는 소수의 클래스 만있는 경우 작동합니다. 나는 바람직하게는 비 JavaScript 대답을 찾고 있어요 ...
nienn

: 나는 크롬에서 문제를 재현 할 수 jsfiddle.net/ShyZp을
Shmiddty

문제는 제발 ... jsfiddle에 정확한 코드와 함께 우리를, 크롬에 나를 위해 일 제공하지 않습니다
일란 스코 비아

1
문제는 여기에서 볼 수 있지만 두 선언이 동일한 파일에서 발생하지 않는 경우에만 유효합니다. jsfiddle.net/ShyZp/2
Shmiddty

답변:


110

페이지에 요소가 포함 된 경우 CSS 전환이 실행되는 Chrome 버그 가 있습니다 <form>.

한 가지 간단한 수정 사항은 페이지 바닥 글에 단일 공백이 포함 된 스크립트 태그를 추가하는 것입니다.

<script> </script>

https://crbug.com/332189https://crbug.com/167083 에서 버그를 추적 할 수 있습니다 .


2
나는 <script async src="main.js"></script>내 문서의 끝에 있었다 . async속성을 제거하면 페이지로드시 원하지 않는 전환이 수정되었습니다. 👍
카일 폭스

2
@KyleFox처럼 defer<script>태그에 태그가 있었고 제거하면 문제가 해결되었습니다. 그 후 스크립트를 문서 맨 아래로 옮겼습니다.
jonathanbell

이것은 저에게 일관되지 않게 작동했습니다 (이전에는 버그가 100 % 발생했지만이 변경으로 50 % 발생했습니다). 어떤 일이 대답은 나에 물건을 재정렬 한 시도 영감 시간의 100 %를 <head>내 문서의 나의 CSS가 포함 된 것을 전에 내 자바 스크립트 대신 이후의; Google Analytics <script>태그를 이동하여 말 그대로 버그를 해결했습니다 . 정확한 메커니즘이 나에게는 신비하지만 약간의 JS 해석으로 인한 지연으로 인해 완화 될 수있는 경합 상태 또는 타이밍 문제가 Chrome에 분명히 있습니다.
Mark Amery

2
FWIW, 페이지에 JS가 없어도 여전히이 문제가 발생했습니다. 나를 위해 그것을 고친 유일한 것은 CSS를 <body>태그 의 시작 부분으로 옮기는 것입니다 . 나는 추가 <link rel="preload" href="main.css" as="style">받는 <head>여전히 바로 다운로드 할 수 있도록.
Ted Whitehead

내 페이지에서 <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로드로 인해 DOM이 준비된 후 CSS로드가 지연되고있었습니다. 그 무렵 (@Shmiddty가 제안한대로) 텍스트는 이미 기본 브라우저 색상으로 할당되었으며 CSS transition선언을 사용하여 스타일이 지정된 색상으로 페이드됩니다.

** 여전히 이것이 가장 적절한 방법인지는 모르겠지만 작동합니다. 누구든지 더 나은 솔루션을 가지고 있다면 자유롭게 추가하거나 편집하십시오.


이것은 히트 또는 미스 솔루션입니다. 오늘은 작동하지만 내일 코드를 변경하면 실패 할 수 있습니다.
John Ohara

단일 JS 파일 없이도 문제를 재현 할 수 있으므로이 답변으로 문제가 해결되지 않습니다. 받아 들여진 사람은 tho를한다.
Alvaro

이 대답은 문제가 캐싱 인 것 같습니다.
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 크롬 의 버그 가 있습니다 . 빈 스크립트도 문제를 해결합니다.


이 버그가 수년 동안 계속되고 있다는 사실에 놀랐습니다. 대답에 추가하기 위해 <script>태그는 문제가 발생한 DOM 요소 뒤에 있어야합니다. 페이지 끝 부분에 두는 것이 좋습니다.
Kenny Worden 2016

흠. spencer.sm은 본질적 으로이 답변의 더 구체화 된 복제물을 제공했으며 이제는 귀하보다 훨씬 높은 투표를 받았습니다. 당신의 것이 첫 번째 였지만 그가 그 이상으로 상승했기 때문에 내가 볼 수있는 한 당신은 더 이상 기존의 가치를 더하지 않습니다. 삭제해야 할 때가 되었나요?
Mark Amery

4

이 문제를 해결하는 가장 좋은 방법은 <script>이 페이지의 답변에 있는 단일 공백, 빈 수정 사항 을 사용하는 것 입니다. 그러나 나는이 문제를 해결하는 두 가지 다른 방법을 찾았습니다.

  1. <style>HTML 파일 헤더의 태그 안에 문제가되는 요소의 CSS를 배치 합니다. 이 버그는 CSS가 외부 스타일 시트에서 호출 될 때만 발생합니다.
  2. 문제가되는 요소를 flexbox컨테이너에 넣습니다. 이것은 버그도 수정합니다.

더 JS 파일이없고 JS 사용하지 않으려면이 솔루션입니다
CodeWeis

4

nienn 은 솔루션을 게시합니다 . 문제는 문서 헤드와 스타일 시트를로드하는 위치 / 방법에 있습니다. HTML / CSS / webkit에서 오류가 발생하지 않는다는 점을 제외하면 PHP의 "헤더를 수정할 수 없습니다. 이미 전송되었습니다"와 비슷합니다.

나는이 정확한 문제를 겪고 있었고 nienn의 게시물을 읽고 내 머리를 검토했습니다. 이전에 내 내용은 다음과 같습니다.

<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>

이 문제를 일으킬 수있는 것은 자바 스크립트뿐 아니라 사이트 제목도 마찬가지입니다. 좋은 경험 법칙은 css> js> site title입니다.


추가하기 위해 동일한 문제가 있었고 페이지로드를 지연시키는 비디오라는 것이 밝혀졌습니다. iOS에서 비디오를 제거하면 문제가 해결되었습니다.
Scott 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에서 잘 작동했습니다.

편집 : 브라우저에 대한 질문에 이미 답변했습니다. -webkit-transform을 사용해보십시오


나는 그것을 사용하고 있습니다. 죄송합니다. 질문에 간단한 코드를 넣을 것이라고 생각했습니다.
nienn

그런데 IE가 CSS3 전환을 지원하지 않는다고 생각 했나요?
Banath

잘하셨습니다! :) 물론 맞습니다! 이 문제를 해결하기 위해 Chrome에 갇혀 있었고,이 질문을 위해 IE에 갔고 그 * 사소한 세부 사항에 대해 생각조차하지 않았습니다 ...
nienn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.