Перемикання фонового зображення DIV за допомогою jQuery


207

Я складаю таблицю тарифів на розширення / згортання для компанії, в якій працюю. Наразі у мене є таблиця з кнопкою під нею, щоб розгорнути її, на кнопці написано "Розгорнути". Він функціональний, за винятком того, що мені потрібна кнопка, щоб змінити її на "Згорнути", коли її натиснути, а потім, звичайно, повернути до "Розгорнути", коли її знову натиснути. Напис на кнопці - фонове зображення.

Тому в основному все, що мені потрібно, - це змінити фонове зображення діва при його натисканні, за винятком на зразок перемикання.


3
Чому фонове зображення? Чому б не текст ?
uınbɐɥs

1
Я проголосував за те, що він не прийняв відповідь через кілька років, сподіваюся, що він все гаразд @ @ user1040899!
gsamaras

@ user1040899 zuk1 Востаннє бачив Aug 9 '10 at 0:42у SO, можливо, саме тому :(
М. Junaid Salaat

Відповіді:


443
$('#divID').css("background-image", "url(/myimage.jpg)");  

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

$('#divID').click(function()
{
  // do my image switching logic here.
});

@fuccboi це робить, оскільки я використовую цей код, щоб знімати анімований прапорець SVG, коли користувач вибирає варіант. :)
norcal johnny

Добре, я хочу зазначити >> url () ЧАСТИНА
СТРІГУ

62

Я особисто просто використовувати код JavaScript для переключення між двома класами.

Запропонуйте CSS окреслити все, що вам потрібно у вашому div MINUS, фоновому праві, а потім додайте два класи (наприклад: розширений та згорнутий) як правила для кожного з правильним фоновим зображенням (або фоновим положенням, якщо ви використовуєте спрайт).

CSS з різними зображеннями

.div {
    /* button size etc properties */
}

.expanded {background: url(img/x.gif) no-repeat left top;}
.collapsed {background: url(img/y.gif) no-repeat left top;}

Або CSS із спрайтом зображень

.div {
    background: url(img/sprite.gif) no-repeat left top;
    /* Other styles */
}

.expanded {background-position: left bottom;}

Тоді...

JavaScript-код із зображеннями

$(function){
    $('#button').click(function(){
        if($(this).hasClass('expanded'))
        {
            $(this).addClass('collapsed').removeClass('expanded');
        }
        else
        {
            $(this).addClass('expanded').removeClass('collapsed');
        }
    });
}

JavaScript з спрайтом

Примітка: елегантний toggleClass не працює в Internet Explorer 6, але нижче addClass/ removeClassметод буде добре працювати і в цій ситуації

Найелегантніше рішення (на жаль, не зручне для Internet Explorer 6)

$(function){
        $('#button').click(function(){
            $(this).toggleClass('expanded');
        });
    }

$(function){
        $('#button').click(function(){
            if($(this).hasClass('expanded'))
            {
                $(this).removeClass('expanded');
            }
            else
            {
                $(this).addClass('expanded');
            }
        });
    }

Наскільки я знаю, цей метод працюватиме у веб-переглядачах, і мені буде зручніше грати з CSS та класами, ніж із змінами URL-адреси в сценарії.


"Примітка: елегантний toggleClass не працює в Internet Explorer 6"
Chaoley

43

Існує два різні способи змінити CSS фонового зображення за допомогою jQuery.

  1. $('selector').css('backgroundImage','url(images/example.jpg)');
  2. $('selector').css({'background-image':'url(images/example.jpg)'});

Подивіться уважно, щоб відзначити відмінності. По-друге, ви можете використовувати звичайні CSS та обв’язувати декілька властивостей CSS разом.


6
2. неправильно недійсний. Об'єднання декількох властивостей разом робиться так: $ ('selector'). Css ({'background-color': 'yellow', 'background-image': 'url ()'})
codecowboy

Якщо я спробую 2., я отримаю помилку - Uncaught SyntaxError: Несподіваний маркер:
geeky_monster

17

Якщо ви використовуєте спрайт CSS для фонових зображень, ви можете збільшити зміщення фону +/- n пікселів залежно від того, розширюєте чи згортаєте. Не перемикання, але ближче до нього, ніж перемикання URL-адрес фонового зображення.


2
Бонус: Якщо ви використовуєте окремі зображення, завантажується насправді те, що відображається при завантаженні. Буде невелика затримка при переключенні зображень до завантаження другого стану. З спрайтом у вас є лише одне зображення, і воно вже буде.
Ласар

14

Ось як я це роблю:

CSS

#button{
   background-image: url("initial_image.png");
}

#button.toggled{
  background-image:url("toggled_image.png");
}

JS

$('#button').click(function(){
  $('#my_content').toggle();
  $(this).toggleClass('toggled');
});

ви з часом можете скористатися .toggleClass()функцією jQuery .
Пауло Буено

Дізнався про toggleClass через два дні після того, як я опублікував це: P
Loupax

10

Один із способів зробити це - помістити обидва зображення в HTML, всередині SPAN або DIV, ви можете приховати типові за умовчанням або за допомогою CSS, або за допомогою JS на завантаженні сторінки. Потім ви можете переключити клацання. Ось подібний приклад, який я використовую для розміщення піктограм ліворуч / вниз у списку:

$(document).ready(function(){
    $(".button").click(function () {
        $(this).children(".arrow").toggle();
            return false;
    });
});

<a href="#" class="button">
    <span class="arrow">
        <img src="/images/icons/left.png" alt="+" />
    </span>
    <span class="arrow" style="display: none;">
        <img src="/images/down.png" alt="-" />
    </span>
</a>

5

Це працює у всіх поточних браузерах на WinXP. По суті, просто перевірити, що таке поточне зображення фонового зображення. Якщо це image1, покажіть image2, інакше покажіть image1.

Задачі jsapi просто завантажують jQuery з CDN Google (простіше для тестування файлу misc на робочому столі).

Заміна призначена для сумісності між браузерами (опера та тобто додавання цитат до url та firefox, chrome та safari delete quotes).

<html>
    <head>
        <script src="http://www.google.com/jsapi"></script>
        <script>
          google.load("jquery", "1.2.6");
          google.setOnLoadCallback(function() {
            var original_image = 'url(http://stackoverflow.com/Content/img/wmd/link.png)';
            var second_image = 'url(http://stackoverflow.com/Content/img/wmd/code.png)';

            $('.mydiv').click(function() {
                if ($(this).css('background-image').replace(/"/g, '') == original_image) {
                    $(this).css('background-image', second_image);
                } else {
                    $(this).css('background-image', original_image);
                }

                return false;
            });
          });
        </script>

        <style>
            .mydiv {
                background-image: url('http://stackoverflow.com/Content/img/wmd/link.png');
                width: 100px;
                height: 100px;
            }
        </style>
    </head>
    <body>
        <div class="mydiv">&nbsp;</div>
    </body>
</html>

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

20
Завантажувати його з Google бажано для загальнодоступних сайтів. CDN Google, швидше за все, швидше, ніж ваш сайт, дозволяє завантажувати його паралельно з чимось іншим на ваш сайт, і чим більше сайтів, які використовують його, тим більше шансів використовувати кешовану копію з браузера користувача.
Дейв Уорд

2
Якщо Google впаде, а я ще живий; дай мені знати.
greenimpala

1
@Nick Перейдіть на jQuery.com, ви знайдете власні веб-сайти<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
meagar

2
@ Nick Справді має бути питання, чому б ви не хотіли завантажуватись, якщо не виходити з Google. :-)
Джон Паркер

5

Моя анімація:

$(this).animate({
    opacity: 0
}, 100, function() {
    // Callback
    $(this).css("background-image", "url(" + new_img + ")").promise().done(function(){
        // Callback of the callback :)
        $(this).animate({
            opacity: 1
        }, 600)
    });    
});

4

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

$(".travelinfo-btn").click(
            function() {
                $("html, body").animate({scrollTop: $(this).offset().top}, 200);
                var bgImg = $(this).css('background-image')
                var bgPath = bgImg.substr(0, bgImg.lastIndexOf('/')+1)
                if(bgImg.match(/collapse/)) {
                    $(this).stop().css('background-image', bgImg.replace(/collapse/,'expand'));
                    $(this).next(".travelinfo-item").stop().slideToggle(400);
                } else {
                    $(this).stop().css('background-image', bgImg.replace(/expand/,'collapse'));
                    $(this).next(".travelinfo-item").stop().slideToggle(400);
                }
            }
        );

3

Стара публікація, але це дозволить вам використовувати спрайт зображень і відрегулювати повторення, а також позиціонування за допомогою скорочення для властивості css (фон, повтор, лівий верх).

$.each($('.smallPreview'), function(i){
  var $this = $(this);

  $this.mouseenter(function(){
    $this.css('background', 'url(Assets/imgs/imgBckg-Small_Over.png) no-repeat 0 0');
  });

  $this.mouseleave(function(){
    $this.css('background', 'url(Assets/imgs/imgBckg-Small.png) no-repeat 0 0');
  });

});

2

Я знайшов рішення на форумі, Toggle Background Img .


Ласкаво просимо в стек переповнення, Себастьян. Це запитання було задано більше року тому і вже має кілька прийнятних відповідей.
rjh

2

CSS Sprites найкраще працюють. Я спробував перемикати класи та маніпулювати властивістю 'background-image' за допомогою jQuery, жоден не працював. Я думаю, це тому, що браузери (принаймні, останній стабільний Chrome) не можуть "перезавантажити" вже завантажене зображення.

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


2

Це досить проста відповідь змінює фон сайту з переліком елементів

function randomToN(maxVal) {
    var randVal = Math.random() * maxVal;
    return typeof 0 == 'undefined' ? Math.round(randVal) : randVal.toFixed(0);
};
var list = [ "IMG0.EXT", "IMG2.EXT","IMG3.EXT" ], // Images
    ram = list[parseFloat(randomToN(list.length))], // Random 1 to n
    img = ram == undefined || ram == null ? list[0] : ram; // Detect null
$("div#ID").css("backgroundImage", "url(" + img + ")"); // push de background

Простий? Це може бути набагато простіше. Чому випадкові?
uınbɐɥs

Тому що користувачеві легше бачити, що змінює фон, і робити зміни :). Вибачте за мою англійську

0

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

var d = new Date();
var t = d.getTime();

$('#avatar').css("background-image", "url(" + iPath + "?" + t + ")");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.