Kami sering menganggap gambar latar belakang sebagai tekstur atau sesuatu yang memberikan kontras untuk konten yang dapat dibaca — dengan kata lain, sebenarnya bukan konten. Jika itu konten, Anda mungkin akan meraih <img>
bagaimanapun, aksesibilitas dan yang lainnya.
Tapi ada kalanya posisi or skala gambar latar belakang mungkin berada di antara kutub konten dan dekorasi. Konteks adalah raja, bukan? Jika kita mengubah posisi gambar latar belakang, itu mungkin menyampaikan lebih banyak konteks atau pengalaman.
Bagaimana? Mari kita lihat beberapa contoh yang pernah saya lihat beredar.
Saat kita mulai, saya akan mengingatkan bahwa ada garis tipis dalam demo ini antara gambar yang digunakan untuk dekorasi dan gambar yang digunakan sebagai konten. Perbedaannya memiliki implikasi aksesibilitas di mana latar belakang tidak diumumkan ke pembaca layar. Jika gambar Anda benar-benar gambar, maka mungkin pertimbangkan sebuah <img>
tag dengan tepat alt
teks. Dan sementara kita berbicara tentang aksesibilitas, itu adalah ide yang bagus pertimbangkan preferensi gerakan pengguna juga.
Tunjukkan lebih banyak lagi!
Chris Coyier memiliki demo kecil yang rapi ini dari beberapa tahun yang lalu.
Demo ini sangat praktis dalam banyak hal karena merupakan pendekatan yang rapi untuk menampilkan iklan dalam konten. Anda memiliki promosi penjualan dan gambar yang menarik untuk melengkapinya.
Batasan besar untuk sebagian besar iklan, saya berani bertaruh, adalah real estat yang terbatas. Saya tidak tahu apakah Anda pernah harus meletakkan iklan ke halaman, tetapi saya telah dan biasanya meminta pengiklan untuk gambar yang memenuhi dimensi piksel yang tepat, sehingga aset sesuai dengan ruangnya.
Tapi demo Chris meredakan masalah luar angkasa. Arahkan gambar dan lihat gerakan dan skalanya. Pengguna benar-benar mendapatkannya lebih konteks untuk produk daripada saat gambar berada di posisi aslinya. Itu sama-sama menguntungkan, bukan? Pengiklan dapat membuat gambar yang menarik tanpa mengorbankan konteks. Sementara itu, pengguna mendapat sedikit nilai ekstra dari bagian gambar yang baru terungkap.
Jika Anda mengintip markup demo, Anda akan melihat bahwa itu seperti yang Anda harapkan. Ini versi singkatnya:
<div class="ad-container"> <a href="#" target="_blank" rel="noopener"> <!-- Background image container --> <div class="ad-image"></div> </a> <div class="ad-content"> <!-- Content --> </div>
</div>
Kita mungkin bisa sedikit berdalih tentang semantik, tapi bukan itu intinya. Kami memiliki wadah dengan tautan <div>
untuk gambar latar belakang dan lainnya <div>
untuk menampung isinya.
Sejauh gaya berjalan, bagian penting ada di sini:
.container { background-image: url("/path/to/some/image.png"); background-repeat: no-repeat; background-position: 0 0; height: 400px; width: 350px;
}
Tidak buruk, kan? Kami memberi wadah beberapa dimensi dan mengatur gambar latar di atasnya yang tidak berulang dan diposisikan di tepi kiri bawahnya.
Trik sebenarnya adalah dengan JavaScript. Kami akan menggunakannya untuk mendapatkan posisi mouse dan offset wadah, lalu mengonversi nilai tersebut ke skala yang sesuai untuk menyetel background-position
. Pertama, mari kita dengarkan gerakan mouse di .container
elemen:
let container = document.querySelector(".container");
container.addEventListener("mousemove", function(e) { // Our function }
);
Dari sini, kita bisa menggunakan wadahnya offsetX
dan offsetY
properti. Namun kita tidak akan menggunakan nilai ini secara langsung, karena nilai koordinat X lebih kecil dari yang kita perlukan, dan koordinat Y lebih besar. Kita harus bermain-main sedikit untuk menemukan konstanta yang bisa kita gunakan sebagai pengali.
Ini sedikit menyentuh dan merasakan, tetapi saya telah menemukannya 1.32
dan 0.455
bekerja dengan sempurna untuk masing-masing koordinat X dan Y. Kami mengalikan offset dengan nilai tersebut, tambahkan a px
unit pada hasil, kemudian menerapkannya ke background-position
nilai-nilai.
let container = document.querySelector(".container");
container.addEventListener("mousemove", function(e) { container.style.backgroundPositionX = -e.offsetX * 1.32 + "px"; container.style.backgroundPositionY = -e.offsetY * 0.455 + "px"; }
);
Terakhir, kita juga dapat mengatur ulang posisi background kembali ke aslinya jika pengguna meninggalkan wadah gambar.
container.addEventListener("mouseleave", function() { container.style.backgroundPosition = "0px 0px"; }
);
Karena kita menggunakan CSS-Tricks, saya akan menawarkan bahwa kita dapat melakukan versi yang jauh lebih murah dengan sedikit transisi hover di vanilla CSS:
Lukis gambar yang lebih besar
Tidak diragukan lagi Anda pernah ke beberapa toko pakaian online atau apa pun dan menemukan fitur zoom-on-hover.
Pola ini telah ada untuk waktu yang terasa seperti selamanya (Dylan Winn-Brown membagikan pendekatannya kembali 2016), tapi itu hanya bukti (saya harap) kegunaannya. Pengguna mendapatkan lebih banyak konteks saat mereka memperbesar dan mendapatkan ide yang lebih baik tentang jahitan sweter atau apa pun yang Anda miliki.
Ada dua bagian untuk ini: the wadah dan kaca pembesar. Penampung adalah satu-satunya hal yang kita perlukan dalam markup, karena kita akan menyuntikkan elemen kaca pembesar selama interaksi pengguna. Jadi, lihatlah HTML kami!
<div class="container"></div>
Dalam CSS, kita akan membuat width
dan height
variabel untuk menyimpan dimensi kaca pembesar itu sendiri. Kemudian kami akan memberikan itu .container
beberapa bentuk dan a background-image
:
:root {
--magnifer-width: 85;
--magnifer-height: 85;
} .container { width: 500px; height: 400px; background-size: cover; background-image: url("/path/to/image.png"); background-repeat: no-repeat; position: relative;
}
Ada beberapa hal yang sudah kita ketahui tentang kaca pembesar bahkan sebelum kita melihatnya, dan kita dapat menentukan gaya tersebut di muka, khususnya variabel yang telah ditentukan sebelumnya untuk .maginifier
's width
dan height
:
.magnifier { position: absolute; width: calc(var(--magnifer-width) * 1px);
height: calc(var(--magnifer-height) * 1px);
border: 3px solid #000;
cursor: none;
background-image: url("/path/to/image.png");
background-repeat: no-repeat;
}
Ini adalah kotak kecil yang benar-benar diposisikan yang menggunakan sama file gambar latar belakang sebagai .container
. Perhatikan bahwa fungsi calc hanya digunakan di sini untuk mengonversi nilai unit-less dalam variabel menjadi piksel. Jangan ragu untuk mengaturnya sesuai keinginan Anda sejauh menghilangkan pengulangan dalam kode Anda.
Sekarang, mari beralih ke JavaScript yang menyatukan semua ini. Pertama kita perlu mengakses variabel CSS yang didefinisikan sebelumnya. Kami akan menggunakan ini di banyak tempat nanti. Kemudian kita perlu mendapatkan posisi mouse di dalam wadah karena itulah nilai yang akan kita gunakan untuk posisi latar belakang kaca pembesar.
// Get the css variables
let root = window.getComputedStyle(document.documentElement);
let magnifier_width = root.getPropertyValue("--magnifer-width");
let magnifier_height = root.getPropertyValue("--magnifer-height"); let container = document.querySelector(".container");
let rect = container.getBoundingClientRect();
let x = (e.pageX - rect.left);
let y = (e.pageY - rect.top); // Take page scrolling into account
x = x - window.pageXOffset;
y = y - window.pageYOffset;
Yang kita butuhkan pada dasarnya adalah a mousemove
pendengar acara di .container
. Kemudian, kita akan menggunakan event.pageX
or event.pageY
properti untuk mendapatkan koordinat X atau Y dari mouse. Tapi untuk mendapatkan tepat posisi relatif mouse pada suatu elemen, kita perlu mengurangi posisi elemen induk dari posisi mouse yang kita dapatkan dari JavaScript di atas. Cara "sederhana" untuk melakukan ini adalah dengan menggunakan getBoundingClientRect()
, yang mengembalikan ukuran elemen dan posisinya relatif terhadap viewport.
Perhatikan bagaimana saya memperhitungkan pengguliran. Jika ada luapan, kurangi jendela pageX
dan pageY
offset akan memastikan efek berjalan seperti yang diharapkan.
Pertama-tama kita akan membuat div kaca pembesar. Selanjutnya kita akan membuat sebuah mousemove
fungsi dan menambahkannya ke wadah gambar. Dalam fungsi ini, kami akan memberikan atribut class pada kaca pembesar. Kami juga akan menghitung posisi mouse dan memberi kaca pembesar nilai kiri dan atas yang kami hitung sebelumnya.
Mari kita lanjutkan dan membangun magnifier
ketika kita mendengar a mousemove
acara di .container
:
// create the magnifier
let magnifier = document.createElement("div");
container.append(magnifier);
Sekarang kita perlu memastikan itu memiliki nama kelas yang dapat kita cakup ke CSS:
// run the function on `mousemove`
container.addEventListener("mousemove", (e) => { magnifier.setAttribute("class", "magnifier");
}
Contoh video yang saya tunjukkan sebelumnya memposisikan kaca pembesar di luar wadah. Kita akan membuat ini tetap sederhana dan melapisinya di atas wadah sebagai gantinya saat mouse bergerak. Kami akan menggunakan if
pernyataan untuk mengatur posisi kaca pembesar hanya jika nilai X dan Y adalah lebih besar or sama menjadi nol, dan kurang dari lebar atau tinggi wadah. Itu harus tetap dalam batas-batas. Pastikan untuk mengurangi lebar dan tinggi kaca pembesar dari nilai X dan Y.
// Run the function on mouse move.
container.addEventListener("mousemove", (e) => { magnifier.setAttribute("class", "magnifier"); // Get mouse position let rect = container.getBoundingClientRect(); let x = (e.pageX - rect.left); let y = (e.pageY - rect.top); // Take page scrolling into account x = x - window.pageXOffset; y = y - window.pageYOffset; // Prevent magnifier from exiting the container // Then set top and left values of magnifier if (x >= 0 && x <= container.clientWidth - magnifier_width) { magnifier.style.left = x + "px"; } if (y >= 0 && y <= container.clientHeight - magnifier_height) { magnifier.style.top = y + "px"; }
});
Terakhir, namun tidak kalah pentingnya… kita perlu sedikit bermain dengan gambar latar kaca pembesar. Intinya adalah bahwa pengguna mendapatkan tampilan gambar latar yang LEBIH BESAR berdasarkan tempat hover berlangsung. Jadi, mari kita tentukan kaca pembesar yang bisa kita gunakan untuk memperbesar skala. Kemudian kita akan mendefinisikan variabel untuk lebar dan tinggi gambar latar belakang sehingga kita memiliki sesuatu untuk mendasarkan skala itu, dan mengatur semua nilai tersebut pada .magnifier
gaya:
// Magnifier image configurations
let magnify = 2;
let imgWidth = 500;
let imgHeight = 400; magnifier.style.backgroundSize = imgWidth * magnify + "px " + imgHeight * magnify + "px";
Mari kita ambil koordinat X dan Y dari gambar kaca pembesar dan menerapkannya ke .magnifier
elemen background-position
. Seperti sebelumnya dengan posisi kaca pembesar, kita perlu mengurangi lebar dan tinggi kaca pembesar dari nilai X dan Y menggunakan variabel CSS.
// the x and y positions of the magnifier image
let magnify_x = x * magnify + 15;
let magnify_y = y * magnify + 15; // set backgroundPosition for magnifier if it is within image
if ( x <= container.clientWidth - magnifier_width && y <= container.clientHeight - magnifier_height
) { magnifier.style.backgroundPosition = -magnify_x + "px " + -magnify_y + "px";
}
Tada!
Jadikan itu sinematik
Pernahkah Anda melihat Efek Ken Burns? Ini adalah hal klasik dan abadi di mana gambar lebih besar dari wadahnya, lalu agak meluncur dan menskala lambat seperti siput. Hampir setiap film dokumenter di dunia tampaknya menggunakannya untuk gambar diam. Jika Anda memiliki Apple TV, Anda pasti pernah melihatnya di screen saver.
Ada cukup of contoh di CodePen jika Anda ingin mendapatkan ide yang lebih baik.
Anda akan melihat bahwa ada sejumlah cara untuk melakukan pendekatan ini. Beberapa menggunakan JavaScript. Lainnya adalah 100% CSS. Saya yakin pendekatan JavaScript bagus untuk beberapa kasus penggunaan, tetapi jika tujuannya hanya untuk menskalakan gambar secara halus, CSS sangat cocok.
Kami dapat sedikit membumbui menggunakan beberapa latar belakang daripada satu. Atau, lebih baik lagi, jika kita memperluas aturan untuk menggunakan elemen alih-alih gambar latar belakang, kita dapat menerapkan animasi yang sama ke semua latar belakang dan menggunakan tanda hubung animation-delay
untuk mengejutkan efeknya.
Banyak cara untuk melakukan ini, tentu saja! Itu pasti bisa dioptimalkan dengan variabel Sass dan/atau CSS. Heck, mungkin Anda bisa melakukannya dengan satu <div>
Jika demikian, bagikan di komentar!
Bonus: Jadikan imersif
Saya tidak tahu apakah ada yang lebih keren dari Sarah Drasner Pena "Selamat Halloween".… dan itu dari 2016! Ini adalah contoh yang bagus untuk melapisi latar belakang dan memindahkannya dengan kecepatan yang bervariasi untuk menciptakan pengalaman yang hampir sinematik. Astaga, keren sekali!
GSAP adalah pendorong utama di sana, tetapi saya membayangkan kita dapat membuat versi rebus yang hanya menerjemahkan setiap lapisan latar belakang dari kiri ke kanan dengan kecepatan berbeda. Tidak sekeren, tentu saja, tapi yang pasti pengalaman dasar. Harus memastikan awal dan akhir dari setiap gambar latar konsisten sehingga berulang dengan mulus saat animasi diulang.
Itu saja untuk saat ini! Cukup rapi sehingga kita dapat menggunakan latar belakang lebih dari sekadar tekstur dan kontras. Saya sangat yakin ada banyak interaksi cerdas lainnya yang dapat kita terapkan pada latar belakang. Temani Afif melakukan hal itu dengan sekumpulan efek hover yang rapi untuk tautan. Apa yang ada dalam pikiran Anda? Bagikan dengan saya di komentar!
- Konten Bertenaga SEO & Distribusi PR. Dapatkan Amplifikasi Hari Ini.
- Platoblockchain. Intelijen Metaverse Web3. Pengetahuan Diperkuat. Akses Di Sini.
- Sumber: https://css-tricks.com/moving-backgrounds/
- 1
- 11
- 7
- 9
- 98
- a
- Tentang Kami
- atas
- Mutlak
- benar
- mengakses
- aksesibilitas
- Akun
- sebenarnya
- Ad
- iklan
- di depan
- Semua
- sudah
- dan
- animasi
- mengumumkan
- Lain
- Apple
- Mendaftar
- pendekatan
- pendekatan
- sesuai
- sekitar
- aset
- kembali
- latar belakang
- background-image
- latar belakang
- Buruk
- mendasarkan
- berdasarkan
- Dasar
- Pada dasarnya
- karena
- sebelum
- Lebih baik
- antara
- Besar
- lebih besar
- Bit
- batas
- membangun
- ikat
- menghitung
- dihitung
- kasus
- Pasti
- perubahan
- murah
- kelas
- klasik
- Pakaian
- kode
- kompromi
- Mempertimbangkan
- konsisten
- konstan
- Wadah
- Konten
- konteks
- kontras
- mengubah
- dingin
- mengkoordinasikan
- bisa
- Kelas
- menutupi
- membuat
- CSS
- Dash
- didefinisikan
- Demo
- MELAKUKAN
- perbedaan
- berbeda
- ukuran
- langsung
- menampilkan
- dokumen
- dokumenter
- Tidak
- Dont
- meragukan
- pengemudi
- Menjatuhkan
- selama
- setiap
- Terdahulu
- Tepi
- efek
- efek
- elemen
- menghilangkan
- memastikan
- perkebunan
- Bahkan
- Acara
- pERNAH
- Setiap
- persis
- contoh
- contoh
- Keluar
- Lihat lebih lanjut
- mengharapkan
- diharapkan
- pengalaman
- tambahan
- Menarik
- Fitur
- beberapa
- File
- Film
- Menemukan
- akhir
- Pertama
- cocok
- mengambang
- selama-lamanya
- ditemukan
- Gratis
- dari
- fungsi
- mendapatkan
- Memberikan
- kaca
- Go
- tujuan
- Pergi
- baik
- besar
- tinggi
- di sini
- memegang
- berharap
- melayang-layang
- Seterpercayaapakah Olymp Trade? Kesimpulan
- Namun
- HTML
- HTTPS
- SAYA AKAN
- ide
- gambar
- gambar
- implikasi
- penting
- in
- Di lain
- sebagai gantinya
- interaksi
- interaksi
- isu
- IT
- Diri
- JavaScript
- Menjaga
- King
- Tahu
- lebih besar
- lapisan
- lapisan
- pembatasan
- Terbatas
- baris
- sedikit
- melihat
- Utama
- membuat
- Sementara itu
- Memenuhi
- mungkin
- keberatan
- lebih
- paling
- gerakan
- pindah
- gerak-gerik
- bergerak
- bergerak
- beberapa
- banyak latar belakang
- nama
- Perlu
- berikutnya
- jumlah
- menawarkan
- mengimbangi
- ONE
- secara online
- dioptimalkan
- asli
- Lainnya
- Lainnya
- di luar
- pola
- potongan-potongan
- Nada
- pixel
- Tempat
- Tempat
- plato
- Kecerdasan Data Plato
- Data Plato
- Bermain
- Titik
- posisi
- diposisikan
- posisi
- positif
- Praktis
- cukup
- mencegah
- sebelumnya
- mungkin
- Produk
- tepat
- properties
- milik
- menyediakan
- Menarik
- mencapai
- pembaca
- nyata
- real estate
- ulangi
- mengakibatkan
- Pengembalian
- Terungkap
- akar
- aturan
- Run
- penjualan
- sama
- Kelancangan
- Skala
- sisik
- cakupan
- Layar
- pembaca layar
- bergulir
- mulus
- tampaknya
- semantik
- set
- beberapa
- Bentuknya
- Share
- berbagi
- harus
- Sederhana
- hanya
- tunggal
- Ukuran
- Slides
- lambat
- lebih kecil
- So
- padat
- beberapa
- sesuatu
- di suatu tempat
- Space
- Secara khusus
- kecepatan
- bumbu
- kotak
- awal
- mulai
- Laporan
- menyimpan
- gaya
- cocok
- besar
- MENANDAI
- Mengambil
- pengambilan
- pembicaraan
- Perjanjian
- Grafik
- Dunia
- hal
- hal
- abadi
- kali
- untuk
- bersama
- Nada
- puncak
- transisi
- benar
- MENGHIDUPKAN
- tv
- khas
- satuan
- menggunakan
- Pengguna
- nilai
- Nilai - Nilai
- versi
- Video
- View
- Menonton
- cara
- Apa
- yang
- sementara
- seluruh
- Wikipedia
- akan
- dalam
- tanpa
- kata
- Kerja
- dunia
- akan
- X
- tahun
- Kamu
- Anda
- zephyrnet.dll
- nol
- zoom