Teknik DOM: elemen induk, anak, dan tetangga. CSS: Pemilih Anak Memilih Elemen Anak Tertentu

Keterangan

Kelas semu :nth-child digunakan untuk menambahkan gaya ke elemen berdasarkan penomoran di pohon elemen.

Sintaksis

elemen:anak ke-n(ganjil | genap |<число> | <выражение>) {...}

Nilai-nilai

ganjil Semua nomor elemen ganjil. genap Semua elemen bernomor genap. number Nomor urut elemen anak relatif terhadap induknya. Penomoran dimulai dari 1, ini akan menjadi elemen pertama dalam daftar. ekspresi Diberikan sebagai an+b , di mana a dan b adalah bilangan bulat, dan n adalah penghitung yang secara otomatis mengambil nilai 0, 1, 2...

Jika a bernilai nol, maka tidak ditulis dan isiannya disingkat menjadi b. Jika b sama dengan nol, maka b juga tidak ditentukan dan ekspresi ditulis dalam bentuk an . a dan b dapat berupa bilangan negatif, maka tanda tambah berubah menjadi tanda minus, contoh: 5n-1.

Dengan menggunakan nilai a dan b negatif, beberapa hasil mungkin juga negatif atau nol. Namun unsur hanya dipengaruhi oleh nilai positif karena penomoran unsur dimulai dari 1.

Di meja 1 menunjukkan beberapa kemungkinan ekspresi dan kata kunci, dan juga menunjukkan nomor elemen mana yang akan digunakan.

HTML5 CSS3 YAITU Cr Op Sa Fx

anak ke-n

21342135 213621372138
Minyak1634 627457
Emas469 725647
Pohon773 793486
Batu2334 8853103


Dalam contoh ini, kelas semu :nth-child digunakan untuk mengubah gaya baris pertama tabel, serta untuk menyorot semua baris genap (Gambar 1).

Halo, para pembaca yang budiman! Melanjutkan topik penyeleksi CSS, saya ingin menarik perhatian Anda deskripsi pemilih anak dan konteks, serta analisis perbandingannya, karena menurut logika penerapannya sangat mirip, meskipun mempunyai beberapa perbedaan.

Dalam publikasi saya, saya membahas secara rinci berbagai jenis pemilih CSS: ; Dan . Omong-omong, di artikel terakhir, di mana saya melihat berbagai jenis penyeleksi atribut, saya menjelaskan secara rinci bagaimana perhitungan teoritis saya dapat segera diuji dengan membuat perubahan pada kode HTML dan CSS secara online menggunakan alat bawaan Google Chrome. (). Alat pengeditan tersebut memiliki modifikasi terbaru dari semua browser populer, termasuk plugin Firebug untuk Firefox ().

Anda juga dapat mempelajari materi teoretis dalam posting ini dengan mengedit halaman mana pun di situs web mana pun! Untuk melakukannya, cukup tekan F12 jika Anda menggunakan Google Chrome atau Mozilla Firefox (). Sekarang saya akan menyajikan isi dari tag p, yang akan kita pelajari sebagai contoh pemilih CSS anak dan kontekstual:

Paragraf ini mencakup em dan tag pemformatan yang kuat yang menyorot teks berani Dan huruf miring.

Dengan menggunakan alat pengeditan yang dijelaskan di atas, saya menyisipkan paragraf ini langsung ke dalam artikel ini, memasukkan teks yang sesuai di sisi kiri jendela pengeditan, sehingga teks paragraf ini muncul di bagian paling atas halaman:


Konstruksi HTML ini, . Paragraf ini akan menjadi subjek uji dalam publikasi hari ini; dengan menggunakan contohnya, saya akan menunjukkan bagaimana desain teksnya berubah, bergantung pada penyeleksi mana - anak atau kontekstual - yang digunakan dalam aturan CSS.

Elemen anak adalah elemen yang terletak tepat di dalam induknya.. Sebelum langsung ke topik, saya akan memberikan gambaran yang mencerminkan hierarki tag dalam dokumen HTML menggunakan contoh paragraf yang teksnya diberikan di atas dan yang akan kita analisis hari ini:

Desain ini juga disebut pohon elemen. Gambar ini dengan jelas menunjukkan penumpukan container, yang menunjukkan hubungan hierarki antar tag. Tag paragraf p adalah anak dari . Pada saat yang sama, tag kuat bukanlah turunan dari div, karena terletak di wadah p.

Pemilih CSS anak

Pemilih anak dalam pohon elemen selalu terletak tepat di dalam elemen induk, dalam hal ini sintaks untuk menulis pemilih CSS adalah sebagai berikut:

Gaya akan diterapkan ke Selector 2, tetapi hanya jika itu adalah anak dari Selector 1. Mari kita lihat lebih detail menggunakan tangkapan layar pohon elemen di atas. Misalnya, dengan mengikuti sintaksis, Anda dapat menetapkan aturan seperti ini:

P>em (warna: hijau;)

Aturan ini akan mempengaruhi kata terakhir paragraf untuk “dicetak miring”, karena itulah yang diapit di antara tag em pembuka dan penutup. Tag em merupakan turunan dari p karena ditempatkan langsung di dalamnya, sehingga isi teks yaitu kata “miring” akan berwarna hijau.


Namun, tag em lainnya bukan merupakan turunan langsung dari tag p, karena merupakan bagian dari tag kuat, sehingga bagian "tag format em dan kuat" pada paragraf tidak akan diwarnai.

Pemilih CSS kontekstual

Saatnya untuk mencari tahu apa itu pemilih kontekstual CSS. Saat menata halaman tertentu di situs web, tag sering kali disarangkan satu sama lain. Agar gaya elemen tersebut berfungsi dengan benar, penyeleksi digunakan yang bertindak dalam konteks tertentu, itulah namanya.

Jika agar aturan CSS dapat diterapkan, pemilih anak harus ditempatkan langsung di dalam elemen induk (tingkat bersarang pertama), maka untuk pemilih konteks ini sama sekali tidak penting dan tingkat bersarang apa pun dapat diterapkan, properti dari elemen masih akan ditransfer dari induknya. Sintaksnya adalah ini:

Seperti yang Anda lihat, pemilih konteks terdiri dari pemilih sederhana yang dipisahkan oleh spasi. Untuk penyeleksi kontekstual, diperbolehkan menggunakan dua atau lebih tag bersarang. Sekarang mari kita buat aturan CSS untuk paragraf yang diuji, yang saya kutip di atas:

P em (warna: hijau;)


Seperti yang Anda lihat, tidak hanya teks sebagian isi paragraf, yang diapit langsung dalam tag pemformatan em, yaitu kata "miring", berwarna hijau, tetapi juga bagian teks dari tag em lainnya , yang juga merupakan bagian dari tag kuat. Hal ini terjadi karena ada aturan dengan pemilih konteks, yang mana tingkat penyusunannya tidak penting, tidak seperti pemilih anak. Inilah perbedaan mendasar antara anak dan pemilih konteks.

Mari kita lihat contoh lain tentang bagaimana pemilih kontekstual dan anak berinteraksi dengan paragraf kita. Mari tulis aturan CSS berikut untuk pemilih anak dan konteks:

Div em (warna: merah;) p> em (warna: hijau;)

Setelah ini, paragraf kita mengambil desain berikut:


Seperti yang Anda lihat, sepotong teks yang diapit oleh tag em dan kuat berwarna merah karena aturan pemilih konteks berlaku untuk itu, yaitu, tag em diapit dalam wadah kuat dan div, dan tingkat bersarang, seperti yang telah disebutkan , tidak apa-apa .

Timbul pertanyaan: mengapa kata “dicetak miring” yang juga merupakan isi em, berwarna hijau? Lagi pula, aturan pemilih konteks juga relevan baginya. Namun untuk bagian teks paragraf ini, aturan child selector juga berlaku, karena tidak bertentangan dengan syarat bahwa untuk child selector, elemennya harus langsung dimasukkan ke dalam tag p.

Faktanya adalah bahwa di CSS ada hukum prioritas untuk properti CSS yang terletak di bawah. Artinya, dalam hal ini, aturan pemilih anak terletak lebih rendah di dokumen daripada gaya CSS yang ditentukan untuk pemilih konteks wadah div. Oleh karena itu, kata “miring” berubah menjadi hijau. Jika Anda menukarnya, maka aturan “p> em (warna: hijau;)” tidak berlaku lagi dan bagian “miring” pada teks akan berwarna merah.

Aplikasi web yang rumit dan berat sudah menjadi hal yang umum akhir-akhir ini. Pustaka lintas-browser dan mudah digunakan seperti jQuery dengan fungsionalitasnya yang kaya dapat sangat membantu dalam memanipulasi DOM dengan cepat. Oleh karena itu, tidak mengherankan jika banyak pengembang lebih sering menggunakan perpustakaan seperti itu daripada bekerja dengan API DOM asli, yang menimbulkan banyak masalah. Meskipun perbedaan browser masih menjadi masalah, DOM sekarang berada dalam kondisi yang lebih baik dibandingkan 5-6 tahun yang lalu ketika jQuery mulai populer.

Pada artikel ini, saya akan mendemonstrasikan kemampuan manipulasi HTML DOM, dengan fokus pada hubungan orang tua, anak, dan tetangga. Sebagai kesimpulan, saya akan memberikan informasi tentang dukungan browser untuk fitur-fitur ini, namun perlu diingat bahwa perpustakaan seperti jQuery masih merupakan pilihan yang baik karena adanya bug dan inkonsistensi dalam implementasi fungsi asli.

Menghitung node anak

Saya akan menggunakan markup HTML berikut untuk demonstrasi ini, dan kami akan mengubahnya beberapa kali sepanjang artikel:

  • Contoh satu
  • Contoh dua
  • Contoh ketiga
  • Contoh empat
  • Contoh lima
  • Contoh Enam


Var Daftarku = document.getElementById("Daftarku"); console.log(daftarsaya.anak-anak.panjang); // 6 console.log(daftarsaya.childElementCount); // 6

Seperti yang Anda lihat, hasilnya sama, meski teknik yang digunakan berbeda. Dalam kasus pertama saya menggunakan properti anak-anak. Ini adalah properti read-only dan mengembalikan kumpulan elemen HTML yang terdapat dalam elemen yang diminta; Untuk menghitung jumlahnya, saya menggunakan properti panjang koleksi ini.

Pada contoh kedua, saya menggunakan metode childElementCount, yang menurut saya merupakan cara yang lebih rapi dan berpotensi lebih mudah dikelola (diskusikan lebih lanjut nanti, menurut saya Anda tidak akan kesulitan memahami fungsinya).

Saya dapat mencoba menggunakan childNodes.length (daripada kids.length), tetapi lihat hasilnya:

Var Daftarku = document.getElementById("Daftarku"); console.log(daftarsaya.childNodes.length); // 13

Ia mengembalikan 13 karena childNodes adalah kumpulan semua node, termasuk spasi - ingatlah ini jika Anda peduli dengan perbedaan antara node anak dan node elemen anak.

Memeriksa keberadaan node anak

Untuk memeriksa apakah suatu elemen memiliki node anak, saya dapat menggunakan metode hasChildNodes(). Metode ini mengembalikan nilai Boolean yang menunjukkan ada atau tidaknya nilai tersebut:

Var Daftarku = document.getElementById("Daftarku"); console.log(daftarsaya.hasChildNodes()); // BENAR

Saya tahu bahwa daftar saya memiliki node anak, tetapi saya dapat mengubah HTML sehingga tidak ada; Markupnya sekarang terlihat seperti ini:



Dan inilah hasil menjalankan hasChildNodes() lagi:

Console.log(daftarsaya.hasChildNodes()); // BENAR

Metode ini masih mengembalikan true . Meskipun daftar tidak berisi elemen apa pun, daftar tersebut berisi spasi, yang merupakan tipe node yang valid. Metode ini memperhitungkan semua node, bukan hanya node elemen. Agar hasChildNodes() menghasilkan false, kita perlu mengubah markupnya lagi:



Dan sekarang hasil yang diharapkan ditampilkan di konsol:

Console.log(daftarsaya.hasChildNodes()); // PALSU

Tentu saja, jika saya tahu saya mungkin menemukan spasi, pertama-tama saya akan memeriksa keberadaan node anak, kemudian menggunakan properti nodeType untuk menentukan apakah ada node elemen di antara node tersebut.

Menambah dan Menghapus Elemen Anak

Ada beberapa teknik yang dapat Anda gunakan untuk menambah dan menghapus elemen dari DOM. Yang paling terkenal didasarkan pada kombinasi metode createElement() dan appendChild().

Var myEl = dokumen.createElement("div"); dokumen.body.appendChild(myEl);

Dalam hal ini saya membuat

menggunakan metode createElement() dan kemudian menambahkannya ke body . Ini sangat sederhana dan Anda mungkin pernah menggunakan teknik ini sebelumnya.

Namun alih-alih memasukkan elemen yang dibuat khusus, saya juga bisa menggunakan appendChild() dan cukup memindahkan elemen yang ada. Katakanlah kita memiliki markup berikut:

  • Contoh satu
  • Contoh dua
  • Contoh ketiga
  • Contoh empat
  • Contoh lima
  • Contoh Enam

Contoh teks

Saya dapat mengubah lokasi daftar dengan kode berikut:

Var myList = document.getElementById("myList"), container = document.getElementById("c"); container.appendChild(Daftar Saya);

DOM terakhir akan terlihat seperti ini:

Contoh teks

  • Contoh satu
  • Contoh dua
  • Contoh ketiga
  • Contoh empat
  • Contoh lima
  • Contoh Enam

Perhatikan bahwa seluruh daftar telah dihapus dari tempatnya (di atas paragraf) dan kemudian disisipkan setelahnya sebelum penutup body . Meskipun metode appendChild() biasanya digunakan untuk menambahkan elemen yang dibuat dengan createElement() , metode ini juga dapat digunakan untuk memindahkan elemen yang sudah ada.

Saya juga dapat menghapus elemen anak sepenuhnya dari DOM menggunakan deleteChild() . Berikut cara menghapus daftar kami dari contoh sebelumnya:

Var myList = document.getElementById("myList"), container = document.getElementById("c"); container.removeChild(Daftar Saya);

Elemen tersebut kini telah dihapus. Metode deleteChild() mengembalikan elemen yang dihapus sehingga saya dapat menyimpannya jika saya memerlukannya nanti.

Var myOldChild = dokumen.body.removeChild(daftarsaya); dokumen.body.appendChild(myOldChild);

Ada juga metode ChildNode.remove() yang relatif baru ditambahkan ke spesifikasi:

Var Daftarku = document.getElementById("Daftarku"); Daftarsaya.hapus();

Metode ini tidak mengembalikan objek jarak jauh dan tidak berfungsi di IE (Edge saja). Dan kedua metode menghapus node teks dengan cara yang sama seperti node elemen.

Mengganti elemen anak

Saya dapat mengganti elemen anak yang ada dengan yang baru, baik elemen baru itu ada atau saya membuatnya dari awal. Berikut markupnya:

Contoh Teks

Var myPar = document.getElementById("par"), myDiv = document.createElement("div"); myDiv.className = "contoh"; myDiv.appendChild(document.createTextNode("Teks elemen baru")); dokumen.body.replaceChild(myDiv, myPar);

Teks elemen baru

Seperti yang Anda lihat, metode replaceChild() mengambil dua argumen: elemen baru dan elemen lama yang digantikannya.

Saya juga bisa menggunakan metode ini untuk memindahkan elemen yang ada. Lihatlah HTML berikut:

Contoh teks 1

Contoh teks 2

Contoh teks 3

Saya bisa mengganti paragraf ketiga dengan paragraf pertama menggunakan kode berikut:

Var myPar1 = dokumen.getElementById("par1"), myPar3 = dokumen.getElementById("par3"); dokumen.body.replaceChild(myPar1, myPar3);

Sekarang DOM yang dihasilkan terlihat seperti ini:

Contoh teks 2

Contoh teks 1

Memilih anak-anak tertentu

Ada beberapa cara berbeda untuk memilih elemen tertentu. Seperti yang ditunjukkan sebelumnya, saya bisa memulai dengan menggunakan koleksi anak-anak atau properti childNodes. Tapi mari kita lihat opsi lain:

Properti firstElementChild dan lastElementChild melakukan persis seperti yang disarankan oleh namanya: memilih elemen turunan pertama dan terakhir. Mari kembali ke markup kita:

  • Contoh satu
  • Contoh dua
  • Contoh ketiga
  • Contoh empat
  • Contoh lima
  • Contoh Enam


Saya dapat memilih elemen pertama dan terakhir menggunakan properti berikut:

Var Daftarku = document.getElementById("Daftarku"); console.log(daftarsaya.firstElementChild.innerHTML); // "Contoh satu" console.log(myList.lastElementChild.innerHTML); // "Contoh enam"

Saya juga dapat menggunakan properti previousElementSibling dan nextElementSibling jika saya ingin memilih elemen anak selain yang pertama atau terakhir. Hal ini dilakukan dengan menggabungkan properti firstElementChild dan lastElementChild:

Var Daftarku = document.getElementById("Daftarku"); console.log(myList.firstElementChild.nextElementSibling.innerHTML); // "Contoh dua" console.log(myList.lastElementChild.previousElementSibling.innerHTML); // "Contoh lima"

Ada juga properti serupa firstChild , lastChild , previousSibling , dan nextSibling , tetapi properti tersebut memperhitungkan semua jenis node, bukan hanya elemen. Secara umum, properti yang hanya mempertimbangkan node elemen lebih berguna dibandingkan properti yang memilih semua node.

Memasukkan konten ke dalam DOM

Saya telah mencari cara untuk memasukkan elemen ke dalam DOM. Mari beralih ke topik serupa dan melihat fitur baru untuk menyisipkan konten.

Pertama, ada metode insertBefore() sederhana, seperti replaceChild(), metode ini memerlukan dua argumen dan bekerja dengan elemen baru dan elemen yang sudah ada. Berikut markupnya:

  • Contoh satu
  • Contoh dua
  • Contoh ketiga
  • Contoh empat
  • Contoh lima
  • Contoh Enam

Contoh Paragraf

Perhatikan paragraf yang akan saya hapus terlebih dahulu lalu sisipkan sebelum daftar, semuanya sekaligus:

Var myList = document.getElementById("myList"), container = document.getElementBy("c"), myPar = document.getElementById("par"); container.insertBefore(myPar, myList);

Dalam HTML yang dihasilkan, paragraf akan muncul sebelum daftar dan ini adalah cara lain untuk menggabungkan elemen.

Contoh Paragraf

  • Contoh satu
  • Contoh dua
  • Contoh ketiga
  • Contoh empat
  • Contoh lima
  • Contoh Enam

Seperti replaceChild() , insertBefore() membutuhkan dua argumen: elemen yang akan ditambahkan dan elemen sebelum kita ingin menyisipkannya.

Metode ini sederhana. Sekarang mari kita coba metode penyisipan yang lebih canggih: metode insertAdjacentHTML().

  • Tugas yang dilakukan adalah memilih elemen anak.
  • Notasinya berupa rantai: pemilih induk sederhana, kombinator “>”, pemilih anak sederhana.
  • Contoh penggunaan:

Mari kita atur indentasi kiri untuk daftar yang disarangkan langsung ke dalam elemen dengan kelas konten (aturan ini tidak akan memengaruhi daftar tingkat bersarang kedua):

Isi > ul ( margin-kiri: 20px; )

Pelajari lebih lanjut tentang pemilih elemen turunan

Perbedaan utama antara pemilih elemen anak dan yang dibahas sebelumnya adalah kenyataan bahwa meskipun pemilih anak memilih semua keturunan, terlepas dari tingkat sarangnya, pemilih anak hanya memilih keturunan dari tingkat pertama - yaitu, elemen yang disarangkan secara langsung. . Misalnya, mari kita tulis ini:

Div > rentang ( warna: #555; /* abu-abu */ )

...dan kode ini:

Teks ini akan berwarna hitam. Dan yang ini berwarna abu-abu, karena span ini adalah elemen turunan dari div.

Ada teks hitam lagi. Dan teks ini juga berwarna hitam, karena rentang ini bukan merupakan turunan dari div. Induk langsungnya adalah tag p.

Pemilih anak CSS adalah penyeleksi yang digunakan untuk menerapkan gaya pada elemen hanya jika elemen tersebut merupakan anak dari elemen (induk) lainnya. Seperti penyeleksi turunan, penyeleksi anak bersifat majemuk dan terdiri dari penyeleksi sederhana (kelas, pengidentifikasi, dll.).

Dan lagi, jika Anda lupa apa itu elemen anak, mari kita ingat dengan melihat contoh yang sudah tidak asing lagi bagi Anda.

<тег1> <тег2>... <тег3><тег4>...

Suatu elemen dikatakan sebagai turunan dari elemen lain jika elemen tersebut berada pada tingkat pertama bersarang di dalamnya. Dalam contoh kita<тег2>Dan<тег3>adalah anak perempuan<тег1>, A<тег4>- ini anak perempuanku<тег3> .

Pemilih anak terdiri dari dua atau lebih penyeleksi sederhana yang dipisahkan oleh tanda ">", yang pertama menentukan induknya, lalu anaknya, lalu anak dari anak itu, dan seterusnya. Artinya, seperti pada penyeleksi turunan, jalur melalui pohon dokumen ditentukan. Gaya hanya akan diterapkan pada elemen yang pemilihnya berada di urutan terakhir dalam daftar. Sintaks umum:

pemilih1 > pemilih2 (

Spasi pada kedua sisi tanda “>” dapat ditempatkan atau tidak, sesuai keinginan.

Contoh penggunaan pemilih anak CSS

Pemilih anak

Paragraf 1.

Paragraf 2.



Hasil di browser

Paragraf 1.

Paragraf 2.

Ada dua hal yang perlu Anda perhatikan dalam contoh ini. Ada tiga elemen di sini, namun hanya dua yang memiliki batas, padding, dan margin. Mengapa? Dan poin kedua. Hanya paragraf pertama yang teksnya berwarna biru.

Internet Explorer 6.0 tidak memahami pemilih anak, jadi jika Anda membuat situs dengan mempertimbangkan browser lama ini - ingatlah hal itu.

Pemilih anak dalam tabel HTML

Banyak pemula (dan terkadang bukan pemula) dalam membuat situs web menghadapi masalah tertentu saat menggunakan pemilih anak dalam tabel HTML. Agar Anda memahami apa yang sedang kita bicarakan, mari kita lihat tabel biasa.

Sel 1.1Sel 1.2
Sel 2.1Sel 2.2

Dan sekarang pertanyaannya. Apa yang akan Anda lakukan jika Anda perlu menggunakan pemilih anak untuk berpindah dari tag ke sel? Jika Anda memutuskan untuk menulis seperti ini, maka salah:

tabel > tr > td ( nilai properti; nilai properti; ... )

Bisakah Anda menebak mengapa hal itu salah? TIDAK? Faktanya adalah Anda lupa tentang elemen lain - yang, meskipun tidak ditentukan secara eksplisit, masih ada secara tidak terlihat di setiap tabel HTML. Hanya saja, tag pembuka dan penutupnya tidak diperlukan, sehingga sering kali terlupakan. Ngomong-ngomong, ya, masuk tutorial HTML Kami tidak membahasnya, karena pada kenyataannya indikasi eksplisitnya jarang diperlukan. Baiklah, saya pikir Anda sudah menebak entri apa yang benar, tapi saya akan tetap menunjukkannya kepada Anda.

tabel > tbody > tr > td ( nilai properti; nilai properti; ... )

Omong-omong, tidak hanya tabel yang memiliki elemen dengan tag pembuka opsional, ada juga elemen seperti itu. Hanya saja dalam praktiknya, “masalah kelupaan” paling sering muncul pada tabel, itulah sebabnya saya menarik perhatian Anda pada hal ini.

Pekerjaan rumah.

  1. Atur halaman ke ukuran font Arial 0,9em dan beberapa latar belakang.
  2. Tulis beberapa judul dan paragraf pada halaman, ubah ukuran dan warna teks judul sesuai keinginan Anda.
  3. Pastikan tautan langsung di paragraf halaman berwarna biru tanpa garis bawah. Namun pada saat yang sama, jika tautan juga dibingkai dengan tag apa pun, misalnya untuk huruf miring, maka tautan tersebut harus ditampilkan dengan garis bawah dan warna merah. Sekali lagi, saya menarik perhatian Anda pada fakta bahwa Anda tidak perlu menentukan gaya tautan dengan setiap tag pembingkaian secara terpisah, jadikan itu universal. Bagaimana? Pikirkan tentang itu.
  4. Buat menu kecil di sisi kanan halaman dan perbaiki, untuk ini Anda memerlukan properti dan beberapa properti lagi yang menyertainya, Anda akan mengetahuinya. Pada saat yang sama, biarkan menu tidak hanya tetap berada di dalam jendela browser, tetapi juga tidak menyusup ke konten halaman saat menggulir.

Saya pikir poin terakhir dari pelajaran ini akan menjadi yang paling sulit bagi Anda, tetapi jangan mencoba untuk langsung membenamkan diri dalam menguasai positioning. Kerjakan saja pekerjaan rumahmu. Omong-omong, item ini tidak akan berfungsi di Internet Explorer 6.0, karena orang tua tidak memahami pemosisian tetap.



Memuat...
Atas