การใช้ CSS เพื่อส่งผลกระทบต่อสไตล์ div ภายใน iframe


266

เป็นไปได้หรือไม่ที่จะเปลี่ยนสไตล์ของ div ที่อยู่ภายใน iframe บนหน้าโดยใช้ CSS เท่านั้น?

css  iframe 

ซ้ำกันเป็นไปได้ของวิธีการใช้ CSS กับ iframe?
Alexander O'Mara

ข้อมูลเพิ่มเติมเกี่ยวกับCORS : wikipedia.org/wiki/Content_Security_Policyและdeveloper.mozilla.org/docs/Web/HTTP/CORS
ashleedawg

คำตอบ:


117

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

โปรดจำไว้ว่านโยบายต้นกำเนิดเดียวกันนั้นมีผลบังคับใช้ดังนั้นคุณสามารถทำเช่นนี้กับองค์ประกอบ iframe ซึ่งมาจากเซิร์ฟเวอร์ของคุณเองเท่านั้น

ฉันใช้กรอบงานต้นแบบเพื่อทำให้ง่ายขึ้น:

frame1.$('mydiv').style.border = '1px solid #000000'

หรือ

frame1.$('mydiv').addClassName('withborder')

2
เห็นคำถามของฉันมันคล้ายกับstackoverflow.com/questions/1962707/แต่เราไม่สามารถเปลี่ยนสไตล์ได้หรือไม่ถ้า frame มาจากเซิร์ฟเวอร์อื่น?
Jitendra Vyas

16
ถูกต้อง. เนื้อหา Iframe อยู่ภายใต้นโยบายโดเมนเดียวกัน หากมาจากโดเมนของคุณคุณสามารถควบคุมได้หากไม่ใช่คุณจะถูกล็อค นี่เป็นการป้องกันการไฮแจ็กหน้าตาม Iframe ทุกประเภท
Diodeus - James MacFarlane

2
ไม่ใช่วิธีการแก้ปัญหา "CSS เท่านั้น" แต่ก็ดีพอสำหรับฉัน +1
Nicu Surdu

2
นี่ไม่ใช่ CSS
stramin

103

ในระยะสั้น ๆ

คุณไม่สามารถใช้ CSS กับ HTML ที่โหลดใน iframe ได้เว้นแต่คุณจะสามารถควบคุมหน้าที่โหลดใน iframe ได้เนื่องจากข้อ จำกัด ด้านทรัพยากรข้ามโดเมน


55
นี้เป็นจริง แต่ไม่ได้ช่วยให้ผู้คนเป็นตัวอย่างให้กับวิธีการ
Simon Dragsbæk

นี่เพิ่งจะเกิดขึ้นในปี 2018? ฉันจำได้ว่าเคยใช้รูปแบบของ iframe มาจากข้างนอก ฉันพยายามที่จะใช้ css กับ iframe ที่แสดงโดยสคริปต์ แต่มันก็ไม่สามารถใช้งานได้
Võ Minh

46

ใช่. ดูรายละเอียดเพิ่มเติมในหัวข้อนี้: วิธีการใช้ CSS กับ iframe?

var cssLink = document.createElement("link");
cssLink.href = "style.css";  
cssLink.rel = "stylesheet";  
cssLink.type = "text/css";  
frames['frame1'].document.body.appendChild(cssLink); 

4
frame1 คือ id ของ iframe หรือไม่?
Toni Michel Caubet

5
ใช่ frame1 คือ id ของ iframe
Eugene Rosenfeld

3
นี่ไม่ใช่ CSS
stramin

4
สิ่งนี้เราไม่สามารถทำได้หากเรากำลังโหลดโดเมนที่แตกต่างใน iframe
Sunith Saga

frame1เป็นชื่อ iframe ไม่ใช่ ID
joseantgv

14

คุณสามารถดึงเนื้อหาของรายการiframeแรกจากนั้นใช้jQueryตัวเลือกกับเนื้อหาตามปกติ

$("#iframe-id").contents().find("img").attr("style","width:100%;height:100%")

$("#iframe-id").contents().find("img").addClass("fancy-zoom")

$("#iframe-id").contents().find("img").onclick(function(){ zoomit($(this)); });

โชคดี!


11
ไม่ทำงาน: Uncaught DOMException: ล้มเหลวในการอ่านคุณสมบัติ 'contentDocument' จาก 'HTMLIFrameElement': บล็อกเฟรมที่มีต้นกำเนิด " HOST " ไม่ให้เข้าถึงเฟรม cross-origin
tubbo

@tubbo ในกรณีของคุณคุณไม่สามารถฝังไซต์ที่ไม่ได้รับอนุญาตป้องกันจาก XSS นี่เป็นเพียงสำหรับผู้ที่มองหาปัญหาของตัวเองไม่ใช่แฮกเกอร์: p
Riyaz Hameed

10

คำตอบอย่างรวดเร็วคือ: ไม่ขอโทษ

ไม่สามารถใช้เพียง CSS โดยทั่วไปคุณต้องมีการควบคุมเนื้อหา iframe เพื่อจัดรูปแบบ มีวิธีการใช้จาวาสคริปต์หรือภาษาเว็บที่คุณเลือก (ซึ่งฉันได้อ่านนิดหน่อย แต่ฉันไม่คุ้นเคยกับตัวเอง) เพื่อแทรกสไตล์ที่ต้องการแบบไดนามิก แต่คุณจะต้องควบคุมเนื้อหา iframe โดยตรงซึ่งฟังดู เหมือนที่คุณไม่มี


8

ใช้ Jquery และรอจนกว่าแหล่งจะโหลดนี่คือวิธีที่ฉันได้รับ (ใช้ช่วงเชิงมุมคุณสามารถใช้วิธี setInterval javascript)

var addCssToIframe = function() {
    if ($('#myIframe').contents().find("head") != undefined) {
        $('#myIframe')
                .contents()
                .find("head")
                .append(
                        '<link rel="stylesheet" href="app/css/iframe.css" type="text/css" />');
        $interval.cancel(addCssInterval);
    }
};
var addCssInterval = $interval(addCssToIframe, 500, 0, false);

1
ทำไมคุณไม่ใช้เหตุการณ์ที่โหลด iframe
ProllyGeek

3

อาจไม่ใช่วิธีที่คุณคิด iframe จะต้อง<link>อยู่ในไฟล์ css ด้วย และคุณไม่สามารถทำได้แม้กับ javascript หากอยู่ในโดเมนอื่น


คุณสามารถยกตัวอย่างวิธีการนี้ได้หรือไม่? คุณหมายถึงอะไรที่ชอบ<iframe src="/source" link=css-stylesheet:"/css.css">?
Ant

3

เห็นได้ชัดว่าสามารถทำได้ผ่าน jQuery:

$('iframe').load( function() {
    $('iframe').contents().find("head")
      .append($("<style type='text/css'>  .my-class{display:none;}  </style>"));
});

https://stackoverflow.com/a/13959836/1625795


3
คุณไม่สามารถใช้สิ่งนี้ได้อีกต่อไปเนื่องจากนโยบายกำเนิดเดียวกันในเบราว์เซอร์ Chrome ข้อความแสดงข้อผิดพลาด:Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna

@adamj เราสามารถเปลี่ยนสไตล์ชีทขององค์ประกอบ iframe ได้หรือไม่ ถ้าใช่กรุณาเพิ่มสคริปต์
Super Model

2

วิธีการทำแฮ็ก - ไอชการทำสิ่งต่าง ๆ นั้นเหมือนกับที่ยูจีนกล่าว ฉันสิ้นสุดการติดตามรหัสของเขาและเชื่อมโยงไปยัง Css ที่กำหนดเองสำหรับหน้า ปัญหาสำหรับฉันคือว่าด้วยไทม์ไลน์ของทวิตเตอร์คุณต้องหลีกเลี่ยงการใช้ทวิตเตอร์เพื่อลบล้างโค้ด smidgen ของพวกเขา ตอนนี้เรามีลำดับเวลาการกลิ้งด้วย css ของเรา, แบบอักษรที่มีขนาดใหญ่ขึ้น IE, ความสูงของบรรทัดที่เหมาะสมและทำให้แถบเลื่อนถูกซ่อนไว้สำหรับความสูงมากกว่าขีด จำกัด ของพวกเขา

var c = document.createElement('link');
setTimeout(frames[0].document.body.appendChild(c),500); // Mileage varies by connection. Bump 500 a bit higher if necessary

1

เพียงเพิ่มสิ่งนี้และทำงานได้ดี:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

ไม่แน่ใจว่านี่เป็นคำตอบที่ถูกต้องสำหรับคำถามที่ให้มาหรือไม่ แต่เป็นวิธีที่ดีในการปรับขนาด google form ให้เป็นความกว้างของอุปกรณ์ขอบคุณมาก!
shiftyscales

0

ใช่เป็นไปได้แม้จะยุ่งยาก คุณจะต้องพิมพ์ / echo HTML ของหน้าลงในเนื้อความของหน้าของคุณจากนั้นใช้ฟังก์ชันการเปลี่ยนแปลงกฎ CSS การใช้ตัวอย่างเดียวกันที่ระบุข้างต้นคุณจะต้องใช้วิธีการวิเคราะห์คำในการค้นหา divs ในหน้าจากนั้นใช้ CSS กับมันจากนั้นพิมพ์ซ้ำ / สะท้อนออกไปยังผู้ใช้ปลายทาง ฉันไม่ต้องการสิ่งนี้ดังนั้นฉันไม่ต้องการโค้ดที่ทำงานในทุกรายการใน CSS ของเว็บเพจอื่นเพียงแค่ไปอย่างง่ายดาย

อ้างอิง:


คำถามถามโดยเฉพาะ "ใช้ CSS เท่านั้น" คำตอบของคุณก็ผิด
Serj Sagan

นี่ไม่ใช่ CSS
stramin

0

การรวมโซลูชันต่าง ๆ เข้าไว้ด้วยกัน

$(document).ready(function () {
    $('iframe').on('load', function() {
        $("iframe").contents().find("#back-link").css("display", "none");
    }); 
});

-1

เป็นไปไม่ได้จากฝั่งไคลเอ็นต์ ข้อผิดพลาดของจาวาสคริปต์จะได้รับการยก "ข้อผิดพลาด: การอนุญาตให้ปฏิเสธการเข้าถึงคุณสมบัติ" เอกสาร "" เนื่องจาก Iframe ไม่ได้เป็นส่วนหนึ่งของโดเมนของคุณ ทางออกเดียวคือดึงหน้าจากรหัสฝั่งเซิร์ฟเวอร์และเปลี่ยน CSS ที่จำเป็น


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