Saya tidak tahu sama ada anda mengalami keperluan sedemikian atau melihat kesan yang serupa Apabila anda memasuki senarai dan melihat imej karusel secara terperinci, bekas ketinggian karusel akan menyesuaikan diri apabila jari anda menatal imej karusel. jadi seperti berikut Kandungan akan diperah ke atas, ketinggian akan dikira semasa proses gelongsor, dan ia akan menatal ke gambar seterusnya apabila dikeluarkan Ia juga akan mengira ketinggian gambar yang sepadan, dan kemudian mencipta kesan animasi perlahan. Sama seperti gambar di bawah.
Anda boleh melihat kandungan imej dan teks di atas, dan ketinggian berubah apabila karusel meluncur. Tanpa berlengah lagi, mari terus ke kod.
Kaedah pelaksanaan
Anda boleh mengawal gambar dengan mendengar acara mounse
tetikus atau gelongsor jari touch
Di sini, artikel ini hanya akan membincangkan idea tentang melaksanakan fungsi karusel , tumpuan adalah bagaimana untuk mencapai tahap kebolehsuaian yang tinggi.
Mari mulakan teks secara langsung dan lihat struktur kod html dahulu.
struktur html
<div> <div> <div> <div> <img alt="Contoh terperinci tentang cara melaraskan ketinggian carta karusel" > </div> <div> <img alt="Contoh terperinci tentang cara melaraskan ketinggian carta karusel" > </div> <div> <img alt="Contoh terperinci tentang cara melaraskan ketinggian carta karusel" > </div> </div> </div> <div>这是一段内容</div> </div>
gaya css
.container { width: 100%; overflow: hidden; }.wrapper { width: 100%; }.swiper { font-size: 0; white-space: nowrap; }.item { display: inline-block; width: 100%; vertical-align: top; // 一定要使用顶部对齐,不然会出现错位的情况 }.item img { width: 100%; height: auto; display: block; }.content { position: relative; z-index: 9; font-size: 14px; text-align: center; padding-top: 20px; background-color: #fff; height: 200px; }
Terdapat beberapa perkara yang perlu diberi perhatian;
white-space
, tetapan elemen subset display: inline-block
akan disusun dalam ketinggian yang berbeza Penyelesaiannya adalah untuk menambah vertical-align: top
saya tidak akan menerangkan secara terperinci tentang sebab tertentu. . font-size: 0
Jika ia tidak ditambah, akan ada jurang antara dua subset Selepas menambahnya, jurang akan dialih keluar. Adalah lebih baik untuk menetapkan imej 100%
pada lebar display: block
Jika tidak, akan ada jurang di bahagian bawah. Selepas menulis html
bahagian dan gaya bekas di atas, mari kita lihat bagaimana js
diproses.
Pelaksanaan Js
Sebelum kita mula, mari kita fikirkan cara melaksanakan masalah karusel dan sangat adaptif ini, dibahagikan kepada beberapa langkah
transform
gayanya, dan juga melakukan pemprosesan sempadan lain di tengah, dan sudah tentu mengubah ketinggian. transition
Hanya animasi peralihan. Mengikut idea yang kami bayangkan, mulakan teks; untuk imej dimuatkan. Untuk mendapatkan ketinggian setiap elemen, saya tidak menulis kod khusus di sini untuk menyelamatkan diri daripada kemalasan
di atas sepadan dengan ketinggian setiap imej selepas pemaparan terbaik untuk membiarkan bahagian belakang menghantar semula lebar jalur yang tinggi Ini menghapuskan keperluan untuk menggunakanconst data = { ele: null, width: 0, len: 0, proportion: .3, type: false, heights: [500, 250, 375], currentIndex: 0, startOffset: 0, clientX: 0, distanceX: 0, duration: 30, touching: false } const wrapper = data.ele = document.querySelector('.wrapper') const items = document.querySelectorAll('.item') data.width = wrapper.offsetWidth data.len = items.length - 1 wrapper.addEventListener('touchstart', onStart) wrapper.addEventListener('mousedown', onStart)
heights
onload
Dalam kod di atas, saya telah menjadikannya serasi dengan terminal PC dan mudah alih Seperti yang dirancang, simpan koordinat
function onStart(event) { if (event.type === 'mousedown' && event.which !== 1) return if (event.type === 'touchstart' && event.touches.length > 1) return data.type = event.type === 'touchstart' const events = data.type ? event.touches[0] || event : event data.touching = true data.clientX = events.clientX data.startOffset = data.currentIndex * -data.width data.ele.style.transition = `none` window.addEventListener(data.type ? 'touchmove' : 'mousemove', onMove, { passive: false }) window.addEventListener(data.type ? 'touchend' : 'mouseup', onEnd, false) }
telah ditambah semasa memantau pergerakan demi keserasian di bahagian mudah alih. clientX
startOffset
Apabila tetikus bergerak,
passive: false
diproses dengan sempadan Jika jarak melebihi 30, ia tidak akan dibenarkan untuk terus meluncurkan nilai
function onMove(event) { event.preventDefault() if (!data.touching) return const events = data.type ? event.touches[0] || event : event data.distanceX = events.clientX - data.clientX let translatex = data.startOffset + data.distanceX if (translatex > 0) { translatex = translatex > 30 ? 30 : translatex } else { const d = -(data.len * data.width + 30) translatex = translatex < d ? d : translatex } data.ele.style.transform = `translate3d(${translatex}px, 0, 0)` data.ele.style.webkitTransform = `translate3d(${translatex}px, 0, 0)` }
startOffset
mengira
function onEnd() { if (!data.touching) return data.touching = false // 通过计算 proportion 滑动的阈值拿到释放后的索引 if (Math.abs(data.distanceX) > data.width * data.proportion) { data.currentIndex -= data.distanceX / Math.abs(data.distanceX) } if (data.currentIndex < 0) { data.currentIndex = 0 } else if (data.currentIndex > data.len) { data.currentIndex = data.len } const translatex = data.currentIndex * -data.width data.ele.style.transition = 'all .3s ease' data.ele.style.transform = `translate3d(${translatex}px, 0, 0)` data.ele.style.webkitTransform = `translate3d(${translatex}px, 0, 0)` window.removeEventListener(data.type ? 'touchmove' : 'mousemove', onMove, { passive: false }) window.removeEventListener(data.type ? 'touchend' : 'mouseup', onEnd, false) }
proportion
transition
Adaptif ketinggian
untuk mendapatkan ketinggian masa nyata. 这里是移动时的高度变化,另外还需要在释放时也要处理, 因为上面已经拿到了下一张的索引 const index = data.currentIndex
const currentHeight = data.heights[index]
// 判断手指滑动的方向拿到下一张图片的高度
let nextHeight = data.distanceX > 0 ? data.heights[index - 1] : data.heights[index + 1]
let diffHeight = Math.abs((nextHeight - currentHeight) * (data.distanceX / data.width))
let realHeight = currentHeight + (nextHeight - currentHeight > 0 ? diffHeight : -diffHeight)
data.ele.style.height = `${realHeight}px`
onEnd
函数里加上以下代码。// ... 因为上面已经拿到了下一张的索引 currentIndex
const currentHeight = data.heights[data.currentIndex]
data.ele.style.height = `${currentHeight}px`
currentIndex
所以再滚动到下一张是就直接通过数据获取就可以了。
Atas ialah kandungan terperinci Contoh terperinci tentang cara melaraskan ketinggian carta karusel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!