วิธีเพิ่ม 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 ขออภัยมันใช้งานได้แล้ว ฉันคิดว่ามันเป็นปัญหาแคช ขอบคุณสำหรับเวลาของคุณ
Giri

คำตอบ:


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 }
Joe Maffei

10
แม้ว่านี่จะเป็นคำตอบที่ยอมรับ แต่ก็ไม่ได้สะท้อนสิ่งที่ระบุไว้ในเอกสาร jquery : นี่คือคร่าวๆเทียบเท่ากับการเรียก. css ("display", "block") ยกเว้นว่าคุณสมบัติการแสดงผลจะถูกเรียกคืนเป็นอะไรก็ตาม หากองค์ประกอบมีค่าการแสดงผลแบบอินไลน์ก็จะถูกซ่อนและแสดงองค์ประกอบนั้นจะถูกแสดงแบบอินไลน์อีกครั้ง ดังนั้นเพื่อให้มีค่าเริ่มต้นdisplayคุณจะต้องเพิ่มคลาสใน CSS ของคุณด้วยการdisplay:inline-block;โทรแล้วhide()และshow()ใช้รหัสองค์ประกอบของ นี่คือรหัสที่สะอาดและคาดเดาได้มากขึ้นและมีสไตล์ได้ง่ายขึ้น
Abdullah Adeeb

1
@AbdullahAdeeb ปัญหาคือคุณจะต้องhide()โดย js ในการโหลดหน้า การตั้งค่า#element{display:inline-block;display:none;}ไม่ได้ทำ ฉันคิดว่าวิธีการแก้ปัญหาที่$('#element').fadeIn().addClass('displaytype');ดีที่สุดคือ- ดีกว่าคำตอบข้างต้นเพราะคุณสามารถตั้งค่าที่แตกต่างกัน.displaytypeใน css และมีฟังก์ชั่นการแสดงหนึ่งใน js ดูคำตอบของฉันที่นี่: stackoverflow.com/questions/1091322/…
Fanky

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 การเรียกการแสดงจะทำงานได้
เคอร์ติส Yallop

"การตั้งค่าคุณสมบัติ CSS หลังจากที่คุณใช้. show () ควรใช้งานได้" ประเด็นของการใช้ show () ถ้าคุณเพิ่งจะอัพเดต css ด้วยตนเองอยู่ดี
JSON


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 ของการแสดง / ซ่อน

บางสิ่งเช่นนี้

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');
Liam

@ เลียมไม่ไร้จุดหมาย คุณสามารถเปลี่ยน 0 เพื่อความสะดวกในหรือแก้ไขเพื่อเข้าถึงshowตัวเลือกที่ไม่ซ้ำกันอื่น ๆ
JSideris

2

ฉันคิดว่าคุณต้องการทั้งภาพเคลื่อนไหวและการตั้งค่าคุณสมบัติการแสดงผลในตอนท้าย ในกรณีนี้คุณควรใช้การshow()ติดต่อกลับตามที่แสดงด้านล่าง

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

วิธีนี้คุณจะได้ผลลัพธ์ทั้งสองแบบ


สิ่งนี้ไม่ถูกต้องคุณจะต้องจบลงที่inline-blockโหมดหลังจากที่ภาพเคลื่อนไหวทั้งหมดทำงานเท่านั้น นั่นหมายความว่ามันจะ "ป๊อป" ระหว่างblockและinline-blockหลัง 400ms
Alexis Wilke

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
สิ่งนี้ไม่ป้องกัน. leather () หรือไม่
Kaan Soral

สำคัญเป็นสิ่งจำเป็นเฉพาะในกรณีขอบเมื่อไม่มีตัวเลือกอื่น ไม่ใช่วิธีที่ถูกต้องในการแก้ไขปัญหานี้ในความคิดของฉันเมื่อสามารถแก้ไขได้ด้วยรหัส jQuery ที่ดีกว่า
แบรนดอน

6
ที่สำคัญสิ่งที่จะต้องจำเกี่ยวกับ!importantเป็นว่ามันเป็นสิ่งสำคัญที่จะไม่ใช้มัน
user1728278
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.