Menggunakan CSS untuk memengaruhi gaya div di dalam iframe

Jawaban:

117

Anda membutuhkan JavaScript. Ini sama dengan melakukannya di halaman induk, kecuali Anda harus mengawali perintah JavaScript Anda dengan nama iframe.

Ingat, kebijakan asal yang sama berlaku, jadi Anda hanya bisa melakukan ini ke elemen iframe yang berasal dari server Anda sendiri.

Saya menggunakan kerangka kerja Prototipe untuk membuatnya lebih mudah:

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

atau

frame1.$('mydiv').addClassName('withborder')
Diodeus - James MacFarlane
sumber
2
lihat pertanyaan saya ini mirip dengan stackoverflow.com/questions/1962707/... tetapi tidak bisakah kita mengubah gaya jika bingkai berasal dari server lain?
Jitendra Vyas
16
Itu betul. Konten Iframe tunduk pada kebijakan domain yang sama. Jika itu dari domain Anda, Anda dapat mengontrolnya, jika tidak, Anda dikunci. Ini mencegah semua jenis pembajakan halaman berbasis iframe.
Diodeus - James MacFarlane
2
Bukan solusi "hanya CSS", tetapi cukup baik untuk saya. +1
Nicu Surdu
2
Ini bukan CSS.
stramin
103

Singkatnya tidak.

Anda tidak dapat menerapkan CSS ke HTML yang dimuat dalam iframe, kecuali Anda memiliki kontrol atas halaman yang dimuat di iframe karena pembatasan sumber daya lintas domain.

mmattax
sumber
55
Ini benar tetapi tidak benar-benar membantu orang memberi contoh tentang bagaimana caranya
Simon Dragsbæk
Apakah ini baru muncul pada 2018? Saya ingat bahwa saya dulu mengonfigurasi gaya iframe berasal dari luar. Saya mencoba menerapkan css ke iframe yang diberikan oleh skrip tetapi masih belum berfungsi.l
Võ Minh
46

Iya. Lihatlah utas lainnya untuk detail: Bagaimana cara menerapkan CSS ke iframe?

var cssLink = document.createElement("link");
cssLink.href = "style.css";  
cssLink.rel = "stylesheet";  
cssLink.type = "text/css";  
frames['frame1'].document.body.appendChild(cssLink); 
Eugene Rosenfeld
sumber
4
Apakah frame1 id dari iframe ??
Toni Michel Caubet
5
Ya, frame1 adalah id dari iframe.
Eugene Rosenfeld
3
Ini bukan CSS.
stramin
4
ini tidak dapat kita lakukan jika kita memuat domain yang berbeda di iframe.
Sunith Saga
frame1adalah nama iframe, bukan ID
joseantgv
14

Anda dapat mengambil konten yang iframepertama dan kemudian menggunakan jQuerypenyeleksi terhadap mereka seperti biasa.

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

Semoga berhasil!

Riyaz Hameed
sumber
11
tidak berfungsi: Uncaught DOMException: Gagal membaca properti 'contentDocument' dari 'HTMLIFrameElement': Memblokir bingkai dengan asal " HOST " dari mengakses bingkai asal-silang.
tubbo
@tubbo, dalam kasus Anda, Anda tidak dapat menyematkan situs tidak sah yang dicegah dari XSS. Ini hanya untuk mereka yang mencari masalah mereka sendiri, bukan peretas: p
Riyaz Hameed
10

Jawaban cepatnya adalah: Tidak, maaf.

Tidak mungkin hanya menggunakan CSS. Pada dasarnya Anda perlu memiliki kontrol atas konten iframe untuk menata gaya itu. Ada beberapa metode menggunakan javascript atau bahasa web pilihan Anda (yang telah saya baca sedikit tentangnya, tetapi saya tidak terlalu terbiasa dengan diri saya sendiri) untuk menyisipkan beberapa gaya yang diperlukan secara dinamis, tetapi Anda akan memerlukan kontrol langsung atas konten iframe, yang kedengarannya seperti itu. seperti kamu tidak punya.

Justin Lucente
sumber
8

Gunakan Jquery dan tunggu sampai sumbernya dimuat, Ini adalah bagaimana saya telah mencapai (Digunakan interval sudut, Anda dapat menggunakan metode 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);
Priyank Gupta
sumber
1
mengapa Anda tidak menggunakan acara yang memuat iframe?
ProllyGeek
3

mungkin bukan cara Anda berpikir. iframe juga harus ada <link>di file css. DAN Anda tidak dapat melakukannya bahkan dengan javascript jika berada di domain yang berbeda.

Al W
sumber
Bisakah Anda memberi contoh bagaimana ini bisa dilakukan? Apakah maksud Anda sesuatu seperti itu <iframe src="/source" link=css-stylesheet:"/css.css">?
Semut
3

Ternyata itu bisa dilakukan melalui jQuery:

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

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

adamj
sumber
3
Anda tidak dapat menggunakan ini lagi karena kebijakan asal yang sama di browser Chrome. Pesan kesalahan:Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna
@adamj, bisakah kita mengubah overwrite style sheet dari elemen iframe? jika ya, silakan tambahkan skrip.
Super Model
2

Semacam cara hack-ish dalam melakukan sesuatu adalah seperti kata Eugene. Saya akhirnya mengikuti kode-nya dan menautkan ke CSS kustom saya untuk halaman tersebut. Masalahnya bagi saya adalah bahwa, Dengan timeline twitter Anda harus melakukan beberapa sidestepping dari twitter untuk mengganti kode mereka menjadi smidgen. Sekarang kami memiliki timeline bergulir dengan css kami untuk itu, font IE Larger, tinggi garis yang tepat dan membuat scrollbar tersembunyi untuk ketinggian lebih besar dari batas mereka.

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

Cukup tambahkan ini dan semua berfungsi dengan baik:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
Wahab Ahmed
sumber
tidak yakin apakah ini jawaban yang benar untuk pertanyaan yang diberikan, tetapi itu adalah solusi yang bagus untuk mengubah ukuran formulir google sesuai dengan lebar perangkat, terima kasih banyak!
shiftyscales
0

Ya, itu mungkin meskipun rumit. Anda perlu mencetak / menggema HTML halaman ke dalam tubuh halaman Anda kemudian menerapkan fungsi perubahan aturan CSS. Menggunakan contoh-contoh yang sama yang diberikan di atas, Anda pada dasarnya akan menggunakan metode parsing untuk menemukan div di halaman, dan kemudian menerapkan CSS untuk itu dan kemudian mencetak ulang / menggemakannya ke pengguna akhir. Saya tidak membutuhkan ini jadi saya tidak ingin kode fungsi itu ke setiap item di CSS dari halaman web lain hanya untuk aphtply.

Referensi:

eric wiedemann
sumber
Pertanyaannya secara khusus menanyakan "hanya menggunakan CSS". Dengan mengingat hal itu, jawaban Anda salah.
Serj Sagan
Ini bukan CSS.
stramin
0

Menggabungkan berbagai solusi, inilah yang berhasil bagi saya.

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

Tidak mungkin dari sisi klien. Kesalahan javascript akan dimunculkan "Kesalahan: Izin ditolak untuk mengakses properti" dokumen "" karena Iframe bukan bagian dari domain Anda. Satu-satunya solusi adalah mengambil halaman dari kode sisi server dan mengubah CSS yang dibutuhkan.

Chdid
sumber
2
Jawaban ini benar dalam isinya tetapi terkait dengan JavaScript sedangkan pertanyaannya terkait dengan CSS. Jawabannya mungkin Anda perlu menggunakan JavaScript tetapi Anda tidak mengatakannya. Jawabannya juga mengasumsikan bahwa konten dalam iFrame berasal dari domain yang berbeda, yang tidak selalu demikian. Terakhir, pesan yang tepat akan bervariasi dari browser ke browser.
pwdst