Cara mencipta semula kesan riak butang reka bentuk bahan

Apabila saya pertama kali bertemu dengan reka bentuk bahan, saya kagum dengan konsep reka bentuk komponen butangnya. Ia bijak menggunakan kesan riak untuk memberi maklum balas kepada pengguna dengan cara yang mudah dan elegan.
Bagaimana kesan ini dicapai? Butang reka bentuk bahan bukan hanya animasi riak mudah, tetapi kedudukan animasi juga akan berubah mengikut kedudukan butang yang diklik.
Kita boleh mencapai kesan yang sama melalui kod. Pertama, kami akan menggunakan ES6 JavaScript untuk menyediakan penyelesaian yang bersih, dan kemudian meneroka beberapa alternatif.
Struktur HTML
Matlamat kami adalah untuk mengelakkan sebarang tag HTML yang tidak perlu, jadi kami akan menggunakan kod paling sedikit:
<button>Ketahui lebih lanjut</button>
Gaya butang
Kita perlu menetapkan beberapa gaya elemen riak menggunakan JavaScript, tetapi semua gaya lain boleh dilakukan di CSS. Untuk butang kami, hanya dua sifat yang perlu dimasukkan.
butang {
Kedudukan: Relatif;
Limpahan: Tersembunyi;
}
Menggunakan position: relative membolehkan kita menggunakan position: absolute pada unsur -unsur riak, yang diperlukan untuk kita mengawal kedudukannya. Sementara itu, overflow: hidden menghalang riak dari melebihi pinggir butang. Semua sifat lain adalah pilihan. Tetapi sekarang, butang kami kelihatan sedikit bertarikh. Berikut adalah titik permulaan yang lebih moden:
/* Roboto adalah font lalai untuk bahan*/
@import url ('https://fonts.googleapis.com/css2?family=roboto&display=swap');
butang {
Kedudukan: Relatif;
Limpahan: Tersembunyi;
Peralihan: Latar Belakang 400ms;
Warna: #ffff;
latar belakang warna: #6200EE;
Padding: 1rem 2rem;
Font-keluarga: 'Roboto', Sans-Serif;
saiz font: 1.5rem;
garis besar: 0;
Sempadan: 0;
Radius sempadan: 0.25rem;
box-shadow: 0 0 0.5REM RGBA (0, 0, 0, 0.3);
kursor: penunjuk;
}
Gaya riak
Kemudian, kami akan menggunakan JavaScript untuk menggunakan riak sebagai kelas .ripple<span></span> Unsur -unsur disuntik ke dalam HTML kami. Tetapi sebelum berpindah ke JavaScript, mari kita tentukan gaya riak ini dalam CSS supaya kita boleh menggunakan bila -bila masa:
span.ripple {
Kedudukan: Mutlak; /* Kami menyebutkan di atas kedudukan mutlak*/
Radius sempadan: 50%;
Transform: Skala (0);
Animasi: Ripple 600ms linear;
latar belakang warna: RGBA (255, 255, 255, 0.7);
}
Untuk menjadikan riak kami bulat, kami menetapkan border-radius kepada 50%. Untuk memastikan bahawa setiap riak muncul dari awal, kami menetapkan skala lalai ke 0. Sekarang, kami tidak dapat melihat apa -apa lagi, kerana kami belum menetapkan nilai untuk sifat top , left , width , atau height ; Kami akan menyuntik sifat -sifat ini tidak lama lagi menggunakan JavaScript.
Bagi CSS kami, perkara terakhir yang perlu kita tambahkan ialah keadaan akhir animasi:
@keyframes ripple {
ke {
Transform: Skala (4);
Kelegapan: 0;
}
}
Sila ambil perhatian bahawa kami tidak menggunakan kata kunci from untuk menentukan keadaan permulaan dalam keyframes ? Kita boleh from dan CSS akan membina nilai yang hilang berdasarkan nilai yang digunakan untuk elemen animasi. Ini berlaku jika nilai -nilai yang relevan diisytiharkan secara eksplisit (seperti transform: scale(0) ), atau mereka adalah nilai lalai (seperti opacity: 1 ).
Pelaksanaan JavaScript
Akhirnya, kita memerlukan JavaScript untuk menetapkan kedudukan dan saiz riak. Saiznya harus berdasarkan saiz butang, dan kedudukannya harus berdasarkan kedudukan butang dan kursor.
Kami akan bermula dengan fungsi kosong yang mengambil acara klik sebagai hujah:
fungsi createrple (event) {
//
}
Kami akan mengakses butang kami dengan mencari currentTarget acara.
Const Button = Event.CurrentTarget;
Seterusnya, kami akan meneliti kami<span></span> elemen dan hitung diameter dan jejari berdasarkan lebar dan ketinggian butang.
const circle = document.createElement ("span");
const diameter = Math.max (Button.ClientWidth, Button.ClientHeight);
Radius const = diameter / 2;
Kita kini boleh menentukan sifat -sifat yang tersisa yang diperlukan oleh riak: left , top , width , dan height .
Circle.style.width = Circle.style.height = `$ {diameter} px`;
Circle.style.left = `$ {event.clientx - (Button.OffsetLeft Radius)} px`;
Circle.style.top = `$ {event.clienty - (Button.offsettop Radius)} px`;
Circle.classlist.add ("Ripple");
Dalam<span></span> Sebelum menambah elemen ke DOM, sebaiknya periksa sama ada terdapat riak yang tersisa yang mungkin datang dari klik sebelumnya dan padamkannya sebelum melaksanakan riak seterusnya.
const ripple = button.getElementsByClassName ("ripple") [0];
jika (riak) {
ripple.remove ();
}
Dalam langkah terakhir, kita akan<span></span> Tambah ke elemen butang sebagai elemen kanak -kanak supaya ia disuntik ke dalam butang.
Button.AppendChild (Circle);
Selepas fungsi kami selesai, semua yang tersisa adalah memanggilnya. Ini boleh dilakukan dalam beberapa cara. Jika kita mahu menambah riak ke setiap butang pada halaman, kita boleh menggunakan kod seperti ini:
butang const = document.getElementsByTagName ("Button");
untuk (butang butang const) {
button.addeventListener ("klik", createrple);
}
Sekarang kita mempunyai kesan riak kerja!
Ciri -ciri yang dilanjutkan
Bagaimana jika kita mahu melangkah lebih jauh, menggabungkan kesan ini dengan perubahan lain dalam kedudukan atau saiz butang? Lagipun, penyesuaian adalah salah satu kelebihan utama memilih untuk mencipta kesan diri kita sendiri. Untuk menguji kemudahan fungsi lanjutan, saya memutuskan untuk menambah kesan "magnet" yang menggerakkan butang kami ke arah kursor apabila berada di dalam kawasan tertentu.
Kita perlu bergantung pada beberapa pembolehubah yang sama yang ditakrifkan dalam fungsi riak. Untuk mengelakkan duplikasi kod yang tidak perlu, kita harus menyimpannya di suatu tempat supaya kedua -dua kaedah dapat mengaksesnya. Tetapi kita juga harus mengehadkan skop pembolehubah yang dikongsi kepada setiap butang individu. Salah satu cara untuk mencapai matlamat ini ialah menggunakan kelas seperti yang ditunjukkan dalam contoh berikut:
Oleh kerana kesan magnet memerlukan penjejakan kursor setiap kali bergerak kursor, kita tidak lagi perlu mengira kedudukan kursor untuk membuat riak. Sebaliknya, kita boleh bergantung pada cursorX dan cursorY .
Dua pembolehubah baru yang penting ialah magneticPullX dan magneticPullY . Mereka mengawal intensiti kaedah magnet kami menarik butang di belakang kursor. Oleh itu, apabila kita menentukan pusat riak, kita perlu menyesuaikan kedudukan (x dan y) dan magnetisme butang baru.
const offsetLeft = this.left this.x * this.magneticpullx; const offsettop = this.top this.y * this.magneticpully;
Untuk memohon kesan gabungan ini kepada semua butang, kita perlu memberi contoh contoh kelas baru untuk setiap butang:
butang const = document.getElementsByTagName ("Button");
untuk (butang butang const) {
butang baru (butang);
}
Teknologi lain
Sudah tentu, ini hanya satu cara untuk mencapai kesan riak. Pada Codepen, terdapat banyak contoh yang menunjukkan pelaksanaan yang berbeza. Berikut adalah beberapa contoh kegemaran saya.
Pelaksanaan CSS tulen
Jika pengguna melumpuhkan JavaScript, kesan riak kami tidak mempunyai penyelesaian sandaran. Walau bagaimanapun, menggunakan CSS sahaja, menggunakan :active untuk bertindak balas kepada klik, anda boleh mendekati kesan asal. Batasan utama ialah riak hanya boleh muncul dari satu titik -biasanya pusat butang -dan bukan sebagai tindak balas kepada kedudukan klik kami. Contoh ini oleh Ben Szabo sangat ringkas:
JavaScript sebelum ES6
Demo Leandro Parice adalah serupa dengan pelaksanaan kami, tetapi ia serasi dengan versi awal JavaScript:
jQuery
Contoh ini menggunakan jQuery untuk mencapai kesan riak. Jika anda sudah mempunyai jQuery sebagai pergantungan, ia dapat membantu anda menyimpan beberapa baris kod.
Bertindak balas
Akhirnya, ada satu lagi contoh saya. Walaupun ciri -ciri React seperti keadaan dan ref boleh digunakan untuk membantu mewujudkan kesan riak, ini tidak semestinya diperlukan. Kedudukan dan saiz riak perlu dikira untuk setiap klik, jadi tidak ada kelebihan untuk menyimpan maklumat ini di negeri ini. Di samping itu, kami boleh mengakses elemen butang dari acara klik, jadi kami tidak perlu ref sama ada.
Contoh React ini menggunakan fungsi createRipple yang sama sebagai pelaksanaan pertama dalam artikel ini. Perbezaan utama ialah - sebagai kaedah komponen Button - fungsi kami dilancarkan ke komponen tersebut. Di samping itu, pendengar acara onClick kini menjadi sebahagian daripada JSX kami:
Tanggapan ini mengekalkan pemformatan imej asal dan mengelakkan mengubah makna teras teks sambil memberi ganjaran frasa dan ayat untuk aliran yang lebih semula jadi dan kebolehbacaan yang lebih baik. Ia juga menggunakan lebih banyak teks alt deskriptif untuk imej.
Atas ialah kandungan terperinci Cara mencipta semula kesan riak butang reka bentuk bahan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Alat AI Hot
Undress AI Tool
Gambar buka pakaian secara percuma
Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik
AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.
Clothoff.io
Penyingkiran pakaian AI
Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!
Artikel Panas
Alat panas
Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma
SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan
Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa
Dreamweaver CS6
Alat pembangunan web visual
SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)
Apakah ketidakkonsistenan penyemak imbas CSS biasa?
Jul 26, 2025 am 07:04 AM
Penyemak imbas yang berbeza mempunyai perbezaan dalam parsing CSS, mengakibatkan kesan paparan yang tidak konsisten, terutamanya termasuk perbezaan gaya lalai, kaedah pengiraan model kotak, flexbox dan tahap sokongan susun atur grid, dan tingkah laku yang tidak konsisten bagi atribut CSS tertentu. 1. Pemprosesan gaya lalai tidak konsisten. Penyelesaiannya adalah menggunakan cssreset atau normalisasi.css untuk menyatukan gaya awal; 2. Kaedah pengiraan model kotak versi lama IE adalah berbeza. Adalah disyorkan untuk menggunakan kotak-kotak: kotak sempadan dengan cara yang bersatu; 3. Flexbox dan grid melakukan secara berbeza dalam kes kelebihan atau dalam versi lama. Lebih banyak ujian dan gunakan autoprefixer; 4. Beberapa tingkah laku atribut CSS tidak konsisten. CANIUSE mesti dirujuk dan diturunkan.
Apakah harta tanah aksen?
Jul 26, 2025 am 09:25 AM
Accent-color adalah atribut yang digunakan dalam CSS untuk menyesuaikan warna-warna sorot elemen bentuk seperti kotak pilihan, butang radio dan slider; 1. Ia secara langsung mengubah warna lalai keadaan yang dipilih dari kawalan borang, seperti menukar tanda semak biru kotak semak menjadi merah; 2. Unsur yang disokong termasuk kotak input Type = "Checkbox", Type = "Radio" dan Type = "Range"; 3. Menggunakan warna aksen boleh mengelakkan gaya tersuai kompleks dan struktur dom tambahan, dan mengekalkan kebolehcapaian asli; 4. Ia umumnya disokong oleh pelayar moden, dan pelayar lama perlu diturunkan; 5. Set Accent-Col
Terangkan harta `menegak-align 'dan kes penggunaannya yang tipikal
Jul 26, 2025 am 07:35 AM
Thevertikal-alignpropertyincsunsignsinlineortable-cellelsementsvertically.1.itadjustSelementsLikeimagesorforminputswithIntextlinesingvaluesebaseline, Middle, Super, andSub.2.INTablecells, itControlscontentalignmentwith, Orbottomeses, STERSTOMENTIGES
Bagaimana cara menukar warna teks dalam CSS?
Jul 27, 2025 am 04:25 AM
Untuk menukar warna teks dalam CSS, anda perlu menggunakan atribut warna; 1. Gunakan atribut warna untuk menetapkan warna latar depan teks, nama warna yang menyokong (seperti merah), kod heksadesimal (seperti #FF0000), nilai RGB (seperti RGB (255,0,0)), nilai HSL (0,100% RGBA (255,0,0,0.5)); 2. Anda boleh memohon warna ke mana -mana elemen yang mengandungi teks, seperti tajuk H1 hingga H6, perenggan P, pautan A (perhatikan tetapan warna dari keadaan yang berlainan: pautan, a: dilawati, A: hover, a: aktif), butang, div, span, dan sebagainya; 3. Kebanyakan
Bagaimana untuk membersihkan CSS yang tidak digunakan?
Jul 27, 2025 am 02:47 AM
UseAutomatedToolsLikePurgecssoruncsStoScanandRemoveUnusedCss; 2.integratePurgingIntoyourBuildProcessviawebpack, Vite, OrtailWind 'Scontentconfiguration; 3.auditcssusageWithchromedevtoolscoveragetabbeforepurgingtoavoidremovingneededstyles; 4.safelistdynamic
CSS Dark Mode Togol Contoh
Jul 30, 2025 am 05:28 AM
Pertama, gunakan JavaScript untuk mendapatkan pilihan sistem pengguna dan tetapan tema yang disimpan di dalam negara, dan memulakan tema halaman; 1. Struktur HTML mengandungi butang untuk mencetuskan Topik Switching; 2. CSS menggunakan: Root untuk menentukan pembolehubah tema yang cerah, kelas mod-mode mentakrifkan pembolehubah tema gelap, dan menggunakan pembolehubah ini melalui VAR (); 3. JavaScript mengesan lebih suka skema-skema dan membaca LocalStorage untuk menentukan tema awal; 4. Tukar kelas mod gelap pada elemen HTML apabila mengklik butang, dan menjimatkan keadaan semasa ke LocalStorage; 5. Semua perubahan warna disertakan dengan animasi peralihan 0.3 saat untuk meningkatkan pengguna
Bagaimana cara menggunakan harta penapis latar belakang CSS?
Aug 02, 2025 pm 12:11 PM
Filter latar belakang digunakan untuk menggunakan kesan visual kepada kandungan di belakang unsur-unsur. 1. Gunakan penapis latar belakang: blur (10px) dan sintaks lain untuk mencapai kesan kaca beku; 2. Menyokong pelbagai fungsi penapis seperti kabur, kecerahan, kontras, dan lain -lain dan boleh ditumpangkan; 3. Ia sering digunakan dalam reka bentuk kad kaca, dan perlu memastikan bahawa unsur -unsur bertindih dengan latar belakang; 4. Pelayar moden mempunyai sokongan yang baik, dan @supports boleh digunakan untuk menyediakan penyelesaian penurunan; 5. Elakkan nilai kabur yang berlebihan dan kerap meredakan untuk mengoptimumkan prestasi. Atribut ini hanya berkuatkuasa apabila terdapat kandungan di belakang unsur -unsur.
Apakah harta nisbah aspek CSS dan bagaimana menggunakannya?
Aug 04, 2025 pm 04:38 PM
Theaspect-ratiocsspropertydefinesthewidth-to-heightratioofanelement, memastikan konsistenproportionsinresponedesedesigns.1.InisappliedDirectyToelementsLikeImages, Video, Orcontainersusingsyxsuchaspasect-ratio: 16/9.2.


