Sử dụng CSS để ảnh hưởng đến kiểu div bên trong iframe


Câu trả lời:


117

Bạn cần JavaScript. Nó giống như thực hiện nó trong trang mẹ, ngoại trừ bạn phải đặt tiền tố lệnh JavaScript của bạn với tên của iframe.

Hãy nhớ rằng, chính sách nguồn gốc tương tự được áp dụng, vì vậy bạn chỉ có thể thực hiện điều này với phần tử iframe đến từ máy chủ của riêng bạn.

Tôi sử dụng khung Prototype để làm cho nó dễ dàng hơn:

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

hoặc là

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

2
hãy xem câu hỏi này của tôi, đó là stackoverflow.com/questions/1962707/, nhưng chúng ta không thể thay đổi kiểu nếu khung hình từ một máy chủ khác?
Jitendra Vyas

16
Đúng rồi. Nội dung Iframe tuân theo chính sách cùng tên miền. Nếu đó là từ miền của bạn, bạn có thể kiểm soát nó, nếu không, bạn sẽ bị khóa. Điều này ngăn chặn tất cả các loại chiếm quyền điều khiển trang dựa trên Iframe.
Diodeus - James MacFarlane

2
Không chính xác là một giải pháp "chỉ CSS", nhưng đủ tốt cho tôi. +1
Nicu Surdu

2
Đây không phải là CSS.
stramin

103

Tóm lại là không.

Bạn không thể áp dụng CSS cho HTML được tải trong iframe, trừ khi bạn có quyền kiểm soát trang được tải trong iframe do hạn chế tài nguyên tên miền chéo.


55
Điều này đúng nhưng không thực sự giúp mọi người đưa ra một ví dụ về cách làm
Simon Dragsbæk

Đây có phải là chỉ trong năm 2018? Tôi nhớ rằng tôi đã sử dụng để cấu hình kiểu iframe đến từ bên ngoài. Tôi đã cố gắng áp dụng css cho iframe được hiển thị bằng tập lệnh nhưng nó vẫn không hoạt động
Võ Minh

46

Đúng. Hãy xem chủ đề khác này để biết chi tiết: Làm thế nào để áp dụng CSS cho iframe?

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

4
là frame1 id của iframe ??
Toni Michel Caubet

5
Có, frame1 là id của iframe.
Eugene Rosenfeld

3
Đây không phải là CSS.
stramin

4
điều này chúng ta không thể làm nếu chúng ta đang tải tên miền khác nhau trong iframe.
Sunith Saga

frame1là tên iframe, không phải ID
joseantgv

14

Bạn có thể truy xuất nội dung của một iframeđầu tiên và sau đó sử dụng các jQuerybộ chọn chống lại chúng như bình thường.

$("#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)); });

Chúc may mắn!


11
không hoạt động: Uncaught DOMException: Không thể đọc thuộc tính 'contentDocument' từ 'HTMLIFrameEuity': Bị chặn một khung có nguồn gốc " HOST " khi truy cập khung có nguồn gốc chéo.
tubbo

@tubbo, trong trường hợp của bạn, bạn không thể nhúng các trang web trái phép bị ngăn chặn từ XSS. Điều này chỉ dành cho những người tìm kiếm vấn đề của riêng họ, không phải là tin tặc: p
Riyaz Hameed

10

Câu trả lời nhanh là: Không, xin lỗi.

Không thể chỉ sử dụng CSS. Về cơ bản, bạn cần có quyền kiểm soát nội dung iframe để tạo kiểu cho nó. Có các phương pháp sử dụng javascript hoặc ngôn ngữ web bạn chọn (mà tôi đã đọc một chút, nhưng không quen thuộc với bản thân) để chèn một số kiểu cần thiết một cách linh hoạt, nhưng bạn sẽ cần kiểm soát trực tiếp nội dung iframe mà nó nghe có vẻ như bạn không có


8

Sử dụng Jquery và đợi cho đến khi nguồn được tải, Đây là cách tôi đã đạt được (Đã sử dụng khoảng thời gian góc, bạn có thể sử dụng phương pháp javascript setInterval):

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
Tại sao bạn không sử dụng iframe tải sự kiện?
ProllyGeek

3

có lẽ không phải là cách bạn đang nghĩ iframe cũng sẽ phải <link>trong tệp css. VÀ bạn không thể làm điều đó ngay cả với javascript nếu nó trên một tên miền khác.


Bạn có thể đưa ra một ví dụ về làm thế nào điều này có thể được thực hiện? Bạn có ý nghĩa gì đó như thế <iframe src="/source" link=css-stylesheet:"/css.css">nào?
Kiến

3

Rõ ràng nó có thể được thực hiện thông qua 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
Bạn không thể sử dụng điều này nữa vì chính sách xuất xứ tương tự trong trình duyệt Chrome. Thông báo lỗi:Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna

@adamj, Chúng tôi có thể thay đổi bảng ghi đè của phần tử iframe không? nếu có, vui lòng thêm tập lệnh.
Siêu mẫu

2

Một cách thức hoạt động của hack-ish giống như cách mà Eugene nói. Tôi đã kết thúc theo mã của anh ấy và liên kết với Css tùy chỉnh của tôi cho trang. Vấn đề đối với tôi là, với dòng thời gian twitter, bạn phải thực hiện một số bước tiến của twitter để ghi đè mã của họ thành smidgen. Bây giờ chúng ta có một dòng thời gian cuộn với css của chúng tôi, phông chữ IE Lớn hơn, chiều cao dòng thích hợp và làm cho thanh cuộn bị ẩn cho chiều cao lớn hơn giới hạn của chúng.

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

Chỉ cần thêm điều này và tất cả hoạt động tốt:

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

không chắc đây có phải là câu trả lời chính xác cho câu hỏi đã cho hay không, nhưng đó là một giải pháp tuyệt vời để thay đổi kích thước biểu mẫu google theo chiều rộng của thiết bị, cảm ơn rất nhiều!
shiftyscales

0

Vâng, nó có thể mặc dù cồng kềnh. Bạn sẽ cần in / lặp lại HTML của trang vào phần thân của trang sau đó áp dụng chức năng thay đổi quy tắc CSS. Sử dụng các ví dụ tương tự được đưa ra ở trên, về cơ bản, bạn sẽ sử dụng phương pháp phân tích cú pháp tìm div trong trang, sau đó áp dụng CSS cho nó và sau đó in lại / lặp lại cho người dùng cuối. Tôi không cần điều này vì vậy tôi không muốn mã hóa chức năng đó vào mọi mục trong CSS của một trang web khác chỉ để aphtply.

Người giới thiệu:


Câu hỏi đặc biệt hỏi "chỉ sử dụng CSS". Với ý nghĩ đó, câu trả lời của bạn là sai.
Serj Sagan

Đây không phải là CSS.
stramin

0

Kết hợp các giải pháp khác nhau, đây là những gì làm việc cho tôi.

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

-1

Không thể từ phía khách hàng. Một lỗi javascript sẽ được đưa ra "Lỗi: Quyền bị từ chối truy cập vào tài liệu" tài liệu "" vì Iframe không phải là một phần của tên miền của bạn. Giải pháp duy nhất là tìm nạp trang từ mã phía máy chủ và thay đổi CSS cần thiết.


2
Câu trả lời này đúng trong nội dung của nó nhưng liên quan đến JavaScript trong khi câu hỏi liên quan đến CSS. Câu trả lời có thể là bạn cần sử dụng JavaScript nhưng bạn không nói như vậy. Câu trả lời cũng cho rằng nội dung trong iFrame là từ một tên miền khác, không phải lúc nào cũng như vậy. Cuối cùng, thông báo chính xác sẽ thay đổi tùy theo trình duyệt.
pwdst
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.