จะรับความกว้างของหน้าจอโดยไม่มีแถบเลื่อน (ลบ) ได้อย่างไร?


104

ฉันมีองค์ประกอบและต้องการความกว้างโดยไม่มีแถบเลื่อนแนวตั้ง (!)

Firebug บอกความกว้างของร่างกายคือ 1280px

สิ่งเหล่านี้ทำงานได้ดีใน Firefox:

console.log($('.element').outerWidth() );
console.log($('.element').outerWidth(true) );

$detour = $('.child-of-element').offsetParent();
console.log( $detour.innerWidth() );

ทั้งหมดส่งคืน1263pxซึ่งเป็นค่าที่ฉันกำลังมองหา

อย่างไรก็ตามเบราว์เซอร์อื่น ๆ ทั้งหมดให้ฉัน1280px

มีวิธีการข้ามเบราว์เซอร์เพื่อรับความกว้างเต็มหน้าจอโดยไม่มีแถบเลื่อนแนวตั้ง (!) หรือไม่?


คุณต้องการแถบเลื่อนแนวตั้งหรือไม่? หรือคุณสามารถใช้ overflow: hidden แล้วคำนวณความกว้างได้หรือไม่?
Filip

คุณสามารถอ้างถึงไซต์นี้สำหรับคำถามของคุณ stackoverflow.com/questions/8794338/…

คุณสามารถลองwidth: 100%;
www139

คุณกำลังพยายามทำให้องค์ประกอบมีความกว้างทั้งหมดของหน้าจอโดยไม่รวมแถบเลื่อนหรือไม่?
www139

คำตอบ:


162

.prop("clientWidth") และ .prop("scrollWidth")

var actualInnerWidth = $("body").prop("clientWidth"); // El. width minus scrollbar width
var actualInnerWidth = $("body").prop("scrollWidth"); // El. width minus scrollbar width

ในJavaScript :

var actualInnerWidth = document.body.clientWidth;     // El. width minus scrollbar width
var actualInnerWidth = document.body.scrollWidth;     // El. width minus scrollbar width

PS:โปรดทราบว่าการใช้scrollWidthองค์ประกอบของคุณอย่างน่าเชื่อถือไม่ควรล้นในแนวนอน

jsBin สาธิต


คุณยังสามารถใช้ได้.innerWidth()แต่จะใช้ได้กับbodyองค์ประกอบเท่านั้น

var innerWidth = $('body').innerWidth(); // Width PX minus scrollbar 

2
วิธีนี้จะไม่ได้ผลหากคุณเปลี่ยนความกว้างขององค์ประกอบร่างกายด้วยเหตุผลบางประการ
Konstantin Pereiaslov

4
ดูเหมือนว่าสิ่งนี้จะใช้ไม่ได้กับ Chrome อีกต่อไปความกว้างที่รายงานนั้นใหญ่กว่าหน้าต่าง 20px จริง ๆ ฉันได้ลองวัดความกว้างหลายครั้งจนไม่มีอะไรเลย
Sammaye

2
@Sammaye นั่นคือสาเหตุที่คุณลืม (ทำไม?) เพื่อกำหนดระยะขอบ: 0; เป็น BODY หรือใช้โค้ดรีเซ็ต CSS ทั่วไป jsbin.com/homixuqi/2/edit ดังนั้นอีกครั้งรหัสทำงานสมบูรณ์ดี
Roko C.Buljan

2
@NamanGoel เป็นงานของคุณในฐานะนักออกแบบเว็บไซต์เพื่อป้องกันไม่ให้เกิด messarounds ด้วยความกว้างของร่างกาย ไม่ใช่งานยากเลย นอกจากนี้เกี่ยวกับความสูงก็ขึ้นอยู่กับว่าคุณbodyล้นหรือไม่ ถ้ามันล้นเกินกว่าที่ จำกัด ไว้
Roko C.Buljan

2
@ RokoC Buljan ฉันไม่เห็นด้วยกับคุณที่นี่ แน่นอนว่าไม่มีนักออกแบบ / นักพัฒนาเว็บไซต์ที่ดีที่ควรยุ่งกับความกว้างของร่างกายและสิ่งของ ประเด็นของฉันคือการใช้ API ที่น่าเชื่อถือที่สุดที่มีให้ นักพัฒนาจาวาสคริปต์บางรายอาจกำลังสร้างปลั๊กอิน ฯลฯ และอาจไม่สามารถควบคุมทั้งหน้าได้
Naman Goel

37

คุณสามารถใช้ vanilla javascript ได้โดยเขียน:

var width = el.clientWidth;

คุณยังสามารถใช้สิ่งนี้เพื่อรับความกว้างของเอกสารได้ดังนี้:

var docWidth = document.documentElement.clientWidth || document.body.clientWidth;

ที่มา: MDN

คุณยังสามารถรับความกว้างของหน้าต่างแบบเต็มรวมทั้งแถบเลื่อนได้ดังนี้:

var fullWidth = window.innerWidth;

อย่างไรก็ตามเรื่องนี้ไม่ได้รับการสนับสนุนจากเบราว์เซอร์เพื่อให้เป็นทางเลือกที่คุณอาจต้องการที่จะใช้docWidthกับข้างต้นและเพิ่มในความกว้างของแถบเลื่อน

ที่มา: MDN


นี้ไม่ได้คำนึงถึงหากมีการเลื่อน
ม.ค.

6
document.documentElement.clientWidthช่วยฉันได้มากที่สุดเพราะมันเหมาะกับความสูงเช่นกัน ( innerHeightอาจเล็กกว่านี้ถ้าเนื้อหาไม่เต็มหน้า ฯลฯ ) และรับค่าโดยไม่มีแถบเลื่อน
user4642212

1
document.documentElement.clientWidth เป็นผู้ชนะที่แท้จริง document.body.clientWidth ใช้ได้เว้นแต่คุณจะมีการตั้งค่าความกว้างขั้นต่ำในองค์ประกอบร่างกายของคุณและเบราว์เซอร์มีขนาดเล็กกว่าความกว้างขั้นต่ำนั้น
Codemonkey

12

นี่คือตัวอย่างบางส่วนที่ถือว่า$elementเป็นjQueryองค์ประกอบ:

// Element width including overflow (scrollbar)
$element[0].offsetWidth; // 1280 in your case

// Element width excluding overflow (scrollbar)
$element[0].clientWidth; // 1280 - scrollbarWidth

// Scrollbar width
$element[0].offsetWidth - $element[0].clientWidth; // 0 if no scrollbar

10

ลองสิ่งนี้:

$('body, html').css('overflow', 'hidden');
var screenWidth1 = $(window).width();
$('body, html').css('overflow', 'visible');
var screenWidth2 = $(window).width();
alert(screenWidth1); // Gives the screenwith without scrollbar
alert(screenWidth2); // Gives the screenwith including scrollbar

คุณสามารถรับความกว้างของหน้าจอโดยมีและไม่มีแถบเลื่อนโดยใช้รหัสนี้ ที่นี่ฉันได้เปลี่ยนค่าล้นของbodyและรับความกว้างที่มีและไม่มีแถบเลื่อน


ฉันก็ต้องพึ่งพาสิ่งนี้เช่นกัน คำตอบข้างต้นไม่ได้ผลสำหรับฉัน
valerio0999

ประหยัดเวลาของฉัน! ขอบคุณมาก!
Xonshiz

7

สถานที่ที่ปลอดภัยที่สุดในการรับความกว้างและความสูงที่ถูกต้องโดยไม่มีแถบเลื่อนมาจากองค์ประกอบ HTML ลองสิ่งนี้:

var width = document.documentElement.clientWidth
var height = document.documentElement.clientHeight

การสนับสนุนเบราว์เซอร์ค่อนข้างดีโดยมี IE 9 ขึ้นไปรองรับสิ่งนี้ สำหรับ OLD IE ให้ใช้หนึ่งในทางเลือกอื่น ๆ ที่กล่าวถึงที่นี่


0

ฉันประสบปัญหาที่คล้ายกันและกำลังwidth:100%;แก้ไขให้ฉัน ฉันมาถึงวิธีแก้ปัญหานี้หลังจากลองตอบคำถามนี้และตระหนักว่าลักษณะของการ<iframe>จะทำให้เครื่องมือวัดจาวาสคริปต์เหล่านี้ไม่แม่นยำโดยไม่ต้องใช้ฟังก์ชันที่ซับซ้อน การทำ 100% เป็นวิธีง่ายๆในการดูแลใน iframe ฉันไม่รู้เกี่ยวกับปัญหาของคุณเนื่องจากไม่แน่ใจว่าคุณกำลังจัดการองค์ประกอบ HTML ใดอยู่


0

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


0

นี่คือสิ่งที่ฉันใช้

function windowSizes(){
    var e = window,
        a = 'inner';
    if (!('innerWidth' in window)) {
        a = 'client';
        e = document.documentElement || document.body;
    }
    return {
        width: e[a + 'Width'],
        height: e[a + 'Height']
    };  
}

$(window).on('resize', function () {
    console.log( windowSizes().width,windowSizes().height );
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.