Как добавить display: inline-block в функцию jQuery show ()?


158

У меня есть такой код:

function switch_tabs(obj) {
    $('.tab-content').hide();
    $('.tabs a').removeClass("selected");

    var id = obj.attr("rel");
    $('#' + id).show();
    obj.addClass("selected");
}

Функция шоу добавляет display:block. Но я бы хотел добавить display:inline-blockвместо блока.


1
Вам нужно будет предоставить некоторые подробности. Это работает для меня в быстром тесте: jsfiddle.net/DD3Sf .
Gijs

@gijs Извините, это работает сейчас. Я думаю, что это какая-то проблема с кешем. Спасибо за ваше время
Гири

Ответы:


209

Вместо этого showпопробуйте использовать CSS, чтобы скрыть и показать содержимое.

function switch_tabs(obj) {
    $('.tab-content').css('display', 'none'); // you could still use `.hide()` here
    $('.tabs a').removeClass("selected");
    var id = obj.attr("rel");

    $('#' + id).css('display', 'inline-block');
    obj.addClass("selected");
}

92
Это может показаться очевидным, но если вы все еще хотите использовать синхронизирующий аспект show( $("#id").show(500)), просто добавьте cssк нему функцию:$("#id").show(500).css("display", "inline-block");
BenR

2
Я бы сделал еще один шаг и позаботился о том, чтобы скрыть / показать с помощью CSS-классов, а не jQuery. $('.tab-content').addClass('hidden'); (...) $('#' + id).removeClass('hidden'); В CSS:.hidden { display: none !important }
Джо Маффеи

10
Несмотря на то, что это принятый ответ, но он не отражает того, что указано в jquery docs : это примерно эквивалентно вызову .css ("display", "block"), за исключением того, что свойство display восстанавливается в том виде, в котором оно было изначально. Если элемент имеет отображаемое значение inline, то он скрыт и показан, он снова будет отображаться inline. Таким образом, чтобы иметь значение по умолчанию, displayвам нужно добавить класс в ваш css с display:inline-block;последующим вызовом hide()и show()использованием идентификатора элемента. Это более чистый и более предсказуемый код, который легче стилизовать.
Абдулла Адиб

1
@AbdullahAdeeb проблема в том, что вам потребуется hide()js при загрузке страницы. Установка #element{display:inline-block;display:none;}не делает. Я думаю, что самое чистое решение $('#element').fadeIn().addClass('displaytype');- лучше, чем ответ выше, потому что вы можете установить разные .displaytypes в css и иметь одну функцию показа в js. Смотрите мой ответ здесь: stackoverflow.com/questions/1091322/…
Фанки

36

Установка свойства CSS после использования .show()должна работать. Возможно, вы нацелены не на тот элемент HTML-страницы.

 $('#foo').css('display', 'inline-block');

Но если вы не используете никаких эффектов, .show(), .hide()почему вы не устанавливаете эти свойства CSS вручную, например:

$('#foo').css('display','none'); 
$('#foo').css('display','inline-block');

3
Обратите внимание, что jquery show / hide / toggle восстанавливает предыдущие отображаемые значения. Так что если вы скрываете это с помощью jquery, вызов show будет работать.
Кертис Яллоп

«Установка свойства CSS после того, как вы использовали .show (), должна работать». Какой смысл использовать show (), если вы все равно собираетесь вручную обновить css?
JSON

9

Используйте css () сразу после show () или fadeIn () следующим образом:

$('div.className').fadeIn().css('display', 'inline-block');

5

я это сделал

function showPanels()  {
    $('.panels').show("slow");
    $('.panels').css('display','inline-block');
}

работает как шарм.


7
Это ответ или подтверждение ..?
NREZ

5

Решение малина была бы работать для .hide()и .show()методов , но не будет работать для .toggle()метода.

В зависимости от сценария, наличие класса CSS .inline_block { display: inline-block; }и вызова $(element).toggleClass('inline_block')решает проблему для меня.


2

Вы можете использовать анимированный insted of show / hide

Что-то вроде этого:

function switch_tabs(obj)
{
    $('.tab-content').animate({opacity:0},3000);
    $('.tabs a').removeClass("selected");
    var id = obj.attr("rel");

    $('#'+id).animate({opacity:1},3000);
    obj.addClass("selected");
}

2

попробуй это:

$('#foo').show(0).css('display','inline-block');

В show()этом нет смысла. Это так же, как$('#foo').css('display','inline-block');
Лиам

@ Лиам Не бессмысленно. Вы можете изменить 0 для упрощения или изменить это, чтобы получить доступ к другим уникальным showопциям.
JSideris

2

Я думаю, что вы хотите и анимацию, и установить свойство отображения в конце. В этом случае вам лучше использовать show()обратный вызов, как показано ниже

$("#my_obj").show(400,function() {
    $("#my_obj").css("display","inline-block")
}) ;

Таким образом, вы добьетесь обоих результатов.


Это не правильно, вы можете получить inline-blockрежим только после запуска всей анимации. Это означает, что он будет « всплывать » между blockи inline-blockпосле 400 мс.
Алексис Вилке

1
<style>
.demo-ele{display:inline-block}
</style>

<div class="demo-ele" style="display:none">...</div>

<script>
$(".demo-ele").show(1000);//hide first, show with inline-block
<script>

0

на самом деле jQuery просто очищает значение свойства display и не устанавливает его в block (см. внутреннюю реализацию jQuery.showHide ()) -

   function showHide(elements, show) {
    var display, elem, hidden,

...

         if (show) {
            // Reset the inline display of this element to learn if it is
            // being hidden by cascaded rules or not
            if (!values[index] && display === "none") {
                elem.style.display = "";
            }

...

        if (!show || elem.style.display === "none" || elem.style.display === "") {
            elem.style.display = show ? values[index] || "" : "none";
        }
    }

Обратите внимание, что вы можете переопределить $ .fn.show () / $. Fn.hide (); сохранение исходного отображения в самом элементе при сокрытии (например, в качестве атрибута или в $ .data ()); и затем применить его снова при показе.

Кроме того, использование CSS важно! вероятно, здесь не сработает - поскольку установка стиля в строке обычно сильнее любого другого правила


0

Лучший .let это родитель display :inline-blockили добавить родителя из divтого, что есть только у CSS display :inline-block.


-5

Лучший способ - добавить! Важный суффикс к селектору.

Пример:

 #selector{
     display: inline-block !important;                   
}

3
это не мешает .hide ()?
Каан Сорал

! важно только в крайних случаях, когда нет другой опции. На мой взгляд, это неправильный подход к этой проблеме, когда ее можно исправить с помощью лучшего кода jQuery.
Брэндон

6
Важно помнить о !importantтом , что это важно , чтобы не использовать его.
user1728278
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.