การเปลี่ยนแอตทริบิวต์สไตล์องค์ประกอบแบบไดนามิกโดยใช้ JavaScript


117

ฉันมีสไตล์ชีตบางอย่างสำหรับ div ตอนนี้ฉันต้องการแก้ไขแอตทริบิวต์หนึ่งของ div แบบไดนามิกโดยใช้ js

ฉันจะทำได้อย่างไร?

document.getElementById("xyz").style.padding-top = "10px";

ถูกต้องหรือไม่

คำตอบ:


123

เกือบถูกต้องแล้ว

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

อย่างไรก็ตามสิ่งที่คุณต้องจำไว้padding-topและสำหรับชื่อแอตทริบิวต์ที่มียัติภังค์คือในจาวาสคริปต์คุณจะลบขีดกลางและสร้างตัวอักษรตัวถัดไปเป็นตัวพิมพ์ใหญ่ดังนั้นในกรณีของคุณก็จะเป็นpaddingTopเช่นนั้น

มีข้อยกเว้นอื่น ๆ JavaScript มีคำสงวนไว้บางส่วนดังนั้นคุณจึงไม่สามารถตั้งค่าfloatเช่นนั้นได้ แต่ในเบราว์เซอร์บางอย่างที่คุณจำเป็นต้องใช้งานและอื่น ๆcssFloat styleFloatสำหรับความคลาดเคลื่อนเช่นนี้ขอแนะนำให้คุณใช้เฟรมเวิร์กเช่น jQuery ซึ่งจัดการกับความเข้ากันไม่ได้ของเบราว์เซอร์สำหรับคุณ ...


213

นอกจากคำตอบอื่น ๆ แล้วหากคุณต้องการใช้เครื่องหมายขีดกลางสำหรับคุณสมบัติสไตล์คุณยังสามารถใช้:

document.getElementById("xyz").style["padding-top"] = "10px";

3
ฉันไม่เหมือนกันสิ่งนี้มีประโยชน์มากสำหรับฟังก์ชันไดนามิกเราสามารถส่งสไตล์เป็นค่าสตริงจากนั้นตั้งค่าสไตล์และค่า ทางออกที่ดี
raphie

1
นอกจากนี้ยังเพิ่มสิ่ง @raphie document.getElementById("xyz").style["paddingTop"] = '10px'บอกว่าคุณยังสามารถใช้
แปรงสีฟัน

1
@anunkjn: คุณพูดถูก ฉันจะบอกว่ามันใช้ไม่ได้อีกแล้วใน FF ซึ่งก็ ... แปลกดี
KooiInc

17

ฉันแก้ไขปัญหาที่คล้ายกันกับ:

document.getElementById("xyz").style.padding = "10px 0 0 0";

หวังว่าจะช่วยได้


2
นักโทษของการทำวิธีนี้คือการที่คุณจะได้รับการขยายสำหรับด้านอื่น ๆ 0ที่กำหนดเพื่อ และบางครั้งคุณก็ไม่ต้องการสิ่งนั้น
Gustavo Straube


15

สมมติว่าคุณมี HTML ดังนี้:

<div id='thediv'></div>

หากคุณต้องการแก้ไขแอตทริบิวต์สไตล์ของ div นี้คุณจะต้องใช้

document.getElementById('thediv').style.[ATTRIBUTE] = '[VALUE]'

แทนที่[ATTRIBUTE]ด้วยแอตทริบิวต์สไตล์ที่คุณต้องการ อย่าลืมลบ '-' และทำให้ตัวอักษรต่อไปนี้เป็นตัวพิมพ์ใหญ่

ตัวอย่าง

document.getElementById('thediv').style.display = 'none'; //changes the display
document.getElementById('thediv').style.paddingLeft = 'none'; //removes padding

1
ตามที่ระบุไว้ในคำตอบที่ยอมรับมีข้อยกเว้นบางประการ ชอบfloat.
Gustavo Straube


7

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

//function to handle multiple styles
function setStyle(elId, propertyObject) {
    var el = document.getElementById(elId);
    for (var property in propertyObject) {
        el.style[property] = propertyObject[property];
    }
}

setStyle('xyz', {'padding-top': '10px'});

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

var xyzStyles = {'padding-top':'10px'}
setStyle('xyz', xyzStyles);

หวังว่าจะช่วยได้


7

แปลกใจที่ฉันไม่เห็นวิธีแก้ปัญหาตัวเลือกแบบสอบถามด้านล่าง

document.querySelector('#xyz').style.paddingTop = "10px"

โซลูชันCSSStyleDeclarationตัวอย่างของคำตอบที่ยอมรับ

document.getElementById('xyz').style.paddingTop = "10px";

5
document.getElementById("xyz").setAttribute('style','padding-top:10px');

ก็จะทำงาน


5
ข้อเสียของการทำแบบนี้คือคุณจะลบสไตล์อินไลน์อื่น ๆ ออกไป นั่นเป็นเพราะคุณกำลังแทนที่ค่าแอตทริบิวต์ทั้งหมด ฉันเดาว่าการได้รับสไตล์ปัจจุบันการตรวจสอบค่าที่มีอยู่สำหรับคุณสมบัติที่คุณต้องการตั้งค่าจากนั้นเพิ่ม / แทนที่ด้วยค่าที่ต้องการเป็นทางออกที่ดีกว่า
Gustavo Straube

ตกลง แต่ OP ต้องการวิธีแก้ปัญหาที่ใกล้เคียงกับสิ่งที่เขากำลังทำอยู่ซึ่งไม่ได้คำนึงถึงกรณีการใช้งานของคุณ นี่เป็นวิธีที่ง่ายที่สุดวิธีหนึ่งในการบรรลุเป้าหมายนั้น แต่ก็ไม่ใช่วิธีที่ดีที่สุดอย่างแน่นอน
Pinkesh Badjatiya

@GustavoStraube ฉันจะไม่เรียกว่าข้อเสีย ในหลาย ๆ กรณีนี่คือสิ่งที่นักพัฒนาต้องการทำนั่นคือเขียนทับสไตล์ขององค์ประกอบ ฉันจะเรียกมันว่าผลของการทำแบบนี้
stwr667

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