Перехід фонового зображення CSS3


121

Я намагаюсь зробити ефект "затухаючого вицвітання" за допомогою переходу CSS. Але я не можу змусити це працювати з фоновим зображенням ...

CSS:

.title a {
    display: block;
    width: 340px;
    height: 338px;
    color: black;
    background: transparent;
    /* TRANSITION */
    -webkit-transition: background 1s;
    -moz-transition: background 1s;
    -o-transition: background 1s;
    transition: background 1s;
}

.title a:hover {
    background: transparent;
    background: url(https://lh3.googleusercontent.com/-p1nr1fkWKUo/T0zUp5CLO3I/AAAAAAAAAWg/jDiQ0cUBuKA/s800/red-pattern.png) repeat;
    /* TRANSITION */
    -webkit-transition: background 1s;
    -moz-transition: background 1s;
    -o-transition: background 1s;
    transition: background 1s;
}​

Погляньте: http://jsfiddle.net/AK3La/

Відповіді:


104

Ви можете переходити background-image. Використовуйте CSS нижче для imgелемента:

-webkit-transition: background-image 0.2s ease-in-out;
transition: background-image 0.2s ease-in-out;

Це в основному підтримується Chrome, Opera та Safari. Firefox ще не реалізував його ( bugzil.la ). Не впевнений у IE.


105
background-imageне є анімаційною властивістю ( w3.org/TR/css3-transitions/#animatable-properties ), тому ваше рішення не відповідає стандартам.
TLindig

12
Це не є рішенням - FF та IE не підтримують його, і як зазначено вище, це не властивість, за якою специфікація каже, що її слід підтримувати.
Sentinel

Дивіться також актуальну розробку в Fx: bugzilla.mozilla.org/show_bug.cgi?id=546052
Volker E.

2
@TLindig Це має бути властивістю анімації.

3
Властивість анімації є background, і це те, що слід використовувати (для мене це працює в Chrome). Можливо, специфікація (або імпл) змінилася з моменту опублікування запитання
fps

37

Рішення (яке я знайшов сам) - хитрість ніндзя, я можу запропонувати вам два способи:

спочатку вам потрібно зробити "контейнер" для <img>, він буде містити одночасно нормальний стан і наведення :

<div class="images-container">
    <img src="http://lorempixel.com/400/200/animals/9/">
    <img src="http://lorempixel.com/400/200/animals/10/">
</div>
  • із селекторами CSS3 http://jsfiddle.net/eD2zL/1/ (якщо ви використовуєте цей, "нормальний" стан стане першим дочірнім вашим контейнером або змінить nth-child()порядок)

  • Рішення CSS2 http://jsfiddle.net/eD2zL/2/ (відмінності між кількома селекторами)

В основному, вам потрібно приховати "нормальний" стан і показати їх "наближення", коли ви наводите його

і це все, я сподіваюся, що хтось вважатиме це корисним.


Приємне рішення. Експериментуючи з першим зразком, я помітив, що якщо збільшити тривалість переходу до 4с, можна помітити дуже помітний стрибок, коли z-індекс переключиться в середині переходу. Принаймні на Chrome 35 ви можете перенести часовий перемикач z-індексу та очистити перехід, змінивши значення властивості на "всі 4s легкість, z-index 1ms" ( jsfiddle.net/eD2zL/330 ).
Ніл Стублен

2
@NealS. ти маєш рацію. Цій відповіді 2 роки, хоча я б видалив z-індекс, це здається непотрібним. Зображення просто повинні бути в порядку.
Ruffo

Дуже дякую. Ваше рішення дуже корисне для мене.
Slam

Чи можливе "ледаче завантаження", якщо я використовую це рішення?
Даніель

16

Я зрозумів рішення, яке працювало для мене ...

Якщо у вас є елемент списку (або div), що містить лише посилання, і скажімо, це стосується соціальних посилань на вашій сторінці до facebook, twitter, ect. і ви використовуєте спрайт-образ, ви можете це зробити:

<li id="facebook"><a href="facebook.com"></a></li>

Зробіть фон "li" своїм зображенням кнопки

#facebook {
   width:30px;
   height:30px;
   background:url(images/social) no-repeat 0px 0px;
}

Потім перетворіть фонове зображення посилання в режим наведення кнопки. Також додайте до цього атрибут непрозорості та встановіть його на 0.

#facebook a {
   display:inline-block;
   background:url(images/social) no-repeat 0px -30px;
   opacity:0;
}

Тепер все, що вам потрібно, це "непрозорість" під "a: навести курсор" і встановити це на 1.

#facebook a:hover {
   opacity:1;
}

Додайте атрибути переходу непрозорості для кожного браузера до "a" та "a: наведіть курсор", щоб кінцевий css виглядав приблизно так:

#facebook {
   width:30px;
   height:30px;
   background:url(images/social) no-repeat 0px 0px;
}
#facebook a {
   display:inline-block;
   background:url(images/social) no-repeat 0px -30px;
   opacity:0;
   -webkit-transition: opacity 200ms linear;
   -moz-transition: opacity 200ms linear;
   -o-transition: opacity 200ms linear;
   -ms-transition: opacity 200ms linear;
   transition: opacity 200ms linear;
}
#facebook a:hover {
   opacity:1;
   -webkit-transition: opacity 200ms linear;
   -moz-transition: opacity 200ms linear;
   -o-transition: opacity 200ms linear;
   -ms-transition: opacity 200ms linear;
   transition: opacity 200ms linear;
}

Якщо я це правильно пояснив, це повинно дати вам кнопку зникаючого фонового зображення, сподівайтеся, що це допоможе принаймні!


3
Я також зробив версію його відеоуроку. youtube.com/watch?v=6ieR5ApVpr0
Остін Парріш Томас

Вам не слід, AFAIK, вказувати переходи в курсі наведення курсора; визначення переходу для типу тега прив’язки перенесеться до поведінки наведення, все що вам потрібно змінити - непрозорість. Майте на увазі, що цей приклад добре працює, оскільки стилі застосовуються безпосередньо до ідентифікаторів / типів тегів; якщо ви робите це з класами, ви повинні переконатися, що ви не додаєте та не видаляєте клас із визначеним переходом.
KeithS


13

Ви можете використовувати псевдоелемент, щоб отримати ефект, який ви хочете, як я зробив у цій скрипці .

CSS:

.title a {
    display: block;
    width: 340px;
    height: 338px;
    color: black;
    position: relative;
}
.title a:after {
    background: url(https://lh3.googleusercontent.com/-p1nr1fkWKUo/T0zUp5CLO3I/AAAAAAAAAWg/jDiQ0cUBuKA/s800/red-pattern.png) repeat;
    content: "";
    opacity: 0;
    width: inherit;
    height: inherit;
    position: absolute;
    top: 0;
    left: 0;
    /* TRANSISITION */
    transition: opacity 1s ease-in-out;
    -webkit-transition: opacity 1s ease-in-out;
    -moz-transition: opacity 1s ease-in-out;
    -o-transition: opacity 1s ease-in-out;
}
.title a:hover:after{   
    opacity: 1;
}

HTML:

<div class="title">
    <a href="#">HYPERLINK</a>
</div>

2
Це прекрасно працює, але ви можете зіткнутися з 2 проблеми: 1) якщо ви не бачите :afterелемент, спробуйте встановити widthі , heightяк 100%замість того , щоб inherit, 2) , якщо background-imageфактично відображаються на передньому плані , використання негативного індексу для :afterелемента:z-index: -1;
Радек Пече

9

Якщо ви можете використовувати jQuery, ви можете спробувати BgSwitcher плагін щоб переключити фонове зображення з ефектами, це дуже просто у використанні.

Наприклад :

$('.bgSwitch').bgswitcher({
        images: ["style/img/bg0.jpg","style/img/bg1.jpg","style/img/bg2.jpg"],
        effect: "fade",
        interval: 10000
});

І додайте власний ефект, див. Додавання типів ефектів


Дякую, я вирішив проблему з анімацією зміни фону таблиці за допомогою цього плагіна.
userlond

4

Спробуйте це, анімований фон працюватиме в Інтернеті, але гібридний мобільний додаток не працює

@-webkit-keyframes breath {
 0%   {  background-size: 110% auto; }
 50%  {  background-size: 140% auto; }
 100% {  background-size: 110% auto; }      
}
body {
   -webkit-animation: breath 15s linear infinite;
   background-image: url(images/login.png);
    background-size: cover;
}

4

Зважаючи на те, що фонові зображення не можуть бути анімовані, я створив невеликий SCSS міксин, що дозволяє переходити між двома різними фоновими зображеннями за допомогою псевдоселекторів до та після . Вони знаходяться на різних шарах z-індексу. Той, що знаходиться попереду, починається з непрозорості 0 і стає видимим із наведенням курсору.

Ви можете використовувати цей самий підхід і для створення анімації з лінійними градієнтами.

scss

@mixin bkg-img-transition( $bkg1, $bkg2, $transTime:0.5s ){  
  position: relative;  
  z-index: 100; 
  &:before, &:after {
    background-size: cover;  
    content: '';    
    display: block;
    height: 100%;
    position: absolute;
    top: 0; left: 0;    
    width: 100%;    
    transition: opacity $transTime;
  }
  &:before {    
    z-index: -101;
    background-image: url("#{$bkg1}");    
  }
  &:after {    
    z-index: -100;
    opacity: 0;
    background-image: url("#{$bkg2}");    
  }
  &:hover {
     &:after{
       opacity: 1; 
     }
  }  
}

Тепер ви можете просто використовувати його

@include bkg-img-transition("https://picsum.photos/300/300/?random","https://picsum.photos/g/300/300");

Перевірити це можна тут: https://jsfiddle.net/pablosgpacheco/01rmg0qL/


Дуже приємне рішення! Дайте мені краще зрозуміти, як добре використовувати елементи елементів ': до' і ': після' як бонус :-)
joronimo

3

Якщо анімація opacityне є варіантом, ви також можете анімувати background-size.

Наприклад, я використовував цей CSS для встановлення набору backgound-imageіз затримкою.

.before {
  background-size: 0;
}

.after {
  transition: background 0.1s step-end;
  background-image: $path-to-image;
  background-size: 20px 20px;
}

Якщо ви хочете ефект поступового зникнення з .afterв .beforeдля фонового зображення, ви повинні встановити фонове зображення в .before. Інакше він просто зникне без анімації.
Радек Печ

2

Салам, ця відповідь працює лише в Chrome, тому що IE і FF підтримують перехід кольорів.

Не потрібно робити свої HTML-елементи opacity:0 , тому що вони містять текст, і не потрібно подвоювати елементи!

Питання із посиланням на приклад у jsfiddle потребувало невеликої зміни, тобто поставити порожнє зображення у .title aтакий background:url(link to an empty image);самий, як ви його помістили, .title a:hoverале зробіть його порожнім зображенням, і код спрацює.

.title a {
display: block;
width: 340px;
height: 338px;
color: black;
background: url(https://upload.wikimedia.org/wikipedia/commons/5/59/Empty.png) repeat;
/* TRANSISITION */
transition: background 1s;
-webkit-transition: background 1s;
-moz-transition: background 1s;
-o-transition: background 1s;
  }
  .title a:hover{   background: transparent;
   background: url(https://lh3.googleusercontent.com/-p1nr1fkWKUo/T0zUp5CLO3I/AAAAAAAAAWg/jDiQ0cUBuKA/s800/red-pattern.png) repeat;
/* TRANSISITION */
transition: background 1s;
-webkit-transition: background 1s;
-moz-transition: background 1s;
-o-transition: background 1s;
}

Перевірте це https://jsfiddle.net/Tobasi/vv8q9hum/


Все ще не працює над вогняною лисою чи IE :(, але добре виглядає в хромі
Мухаммед Сулейман

1

З натхненним постом Кріса тут:

https://css-tricks.com/different-transitions-for-hover-on-hover-off/

Мені вдалося придумати таке:

#banner
{
    display:block;
    width:100%;
    background-repeat:no-repeat;
    background-position:center bottom;
    background-image:url(../images/image1.jpg);
    /* HOVER OFF */
    @include transition(background-image 0.5s ease-in-out); 

    &:hover
    {
        background-image:url(../images/image2.jpg);
        /* HOVER ON */
        @include transition(background-image 0.5s ease-in-out); 
    }
}

0

Цього можна досягти за допомогою більшої крос-браузерної підтримки, ніж прийнятої відповіді, використовуючи псевдоелементи, як це пояснює ця відповідь: https://stackoverflow.com/a/19818268/2602816


0

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

Ви можете використовувати цю бібліотеку, яка дозволяє отримати ** динамічний розмір фонового зображення, здатного до слайд-шоу **, використовуючи jquery-backstretch.

https://github.com/jquery-backstretch/jquery-backstretch

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.