Toggle navigation
在线编辑器
在线代码
文本比较
jQuery下载
前端库
在线手册
登录/注册
下载代码
html
css
js
分享到微信朋友圈
X
html
Custom scroll
I made a slider
5 Jun 2020
I don't know how to make a slider
4 Jun 2020
I want to make a slider
3 Jun 2020
bees
bees
---------
---------
ь
ъ
No more items
For real
这是一个滑块, 尝试滚动!
css
html, body { padding: 20px; margin: 0; background-color: #dfe9ef; display: -webkit-box; display: flex; -webkit-box-pack: center; justify-content: center; -webkit-box-align: center; align-items: center; min-height: 100%; font-family: 'Manrope', sans-serif; color: #31393d; } * { box-sizing: border-box; outline: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } main { width: 300px; height: 550px; background-color: white; border-radius: 16px; overflow: hidden; padding: 30px 20px 20px; box-shadow: 0 6px 20px 0 rgba(202, 208, 216, 0.15); display: -webkit-box; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; flex-direction: column; } main h1 { font-size: 1.4em; margin-top: 0; margin-bottom: 10px; font-weight: 800; } ::-webkit-scrollbar { display: none; width: 0; background: transparent; height: 0; -webkit-appearance: none; } .scroll { padding: 20px 20px 40px; white-space: nowrap; position: -webkit-sticky; position: sticky; left: 0; top: 0; width: 100%; height: 100%; } .scroll-wrapper { height: -webkit-fit-content; height: -moz-fit-content; height: fit-content; margin-left: -20px; margin-right: -20px; position: relative; overflow-x: auto; overflow-y: hidden; scrollbar-width: none; } .scroll-filler { width: 100%; height: 100%; position: absolute; } .scroll-inner { width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; display: -webkit-box; display: flex; -webkit-box-align: stretch; align-items: stretch; } .scroll-item { width: 160px; border-radius: 16px; background-image: linear-gradient(130deg, #9457e2, #5029bb); -webkit-transform: perspective(400px); transform: perspective(400px); box-shadow: 0 8px 20px 0 rgba(108, 79, 197, 0.44); padding: 20px 30px; vertical-align: top; color: white; text-decoration: none; white-space: normal; display: -webkit-box; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; flex-direction: column; } .scroll-item.red { background-image: linear-gradient(130deg, #ff8063, #e34040); box-shadow: 0 8px 20px 0 rgba(213, 65, 51, 0.45); } .scroll-item.bees { background-image: linear-gradient(130deg, #ffe561, #ffd24c); box-shadow: 0 8px 20px 0 rgba(227, 169, 55, 0.45); color: #333; } .scroll-item.blue { background-image: linear-gradient(130deg, #1cffb7, #0075ff); box-shadow: 0 8px 20px 0 rgba(107, 187, 255, 0.45); } .scroll-item.ghost { background-image: none; box-shadow: none; border: 1px dashed #eaeaea; color: #bdbdbd; cursor: default; } .scroll-item:not(:last-child) { margin-right: 0; } .scroll-item h2 { font-size: 1.15em; font-weight: 600; line-height: 1.5; margin: 0 0 30px; } .scroll-item .scroll-item-date { font-size: 0.8em; letter-spacing: 0.02em; opacity: 0.8; display: block; margin-top: auto; } .scroll-position { height: 1px; background-color: #f1f1f1; -webkit-box-flex: 1; flex: 1; margin: 0 5px; } .scroll-position-wrapper { width: 100%; margin-top: -10px; display: -webkit-box; display: flex; -webkit-box-align: center; align-items: center; } .scroll-position-inner { height: 1px; background-color: #d0d0d0; } .scroll-btn { display: block; -webkit-appearance: none; -moz-appearance: none; appearance: none; border: none; background: none; width: 26px; height: 26px; background-color: white; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23aaa' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E"); background-position: center; background-size: 20px; z-index: 9; cursor: pointer; opacity: 0.6; color: rgba(179, 179, 179, 0.7); -webkit-transition-duration: 0.3s; transition-duration: 0.3s; } .scroll-btn:hover { opacity: 1; } .scroll-btn.prev { -webkit-transform: scaleX(-1); transform: scaleX(-1); } .scroll-btn[disabled] { opacity: 0; pointer-events: none; } .info { padding: 10px; text-align: center; border-radius: 4px; box-shadow: 0 0 0 1px #ececec; margin-top: 30px; position: relative; } .info p { color: #898e90; font-size: 0.9em; margin: 5px 10px; } .info p a { color: #6c5dff; text-decoration: none; opacity: 0.8; } .info p a:hover { opacity: 1; }
JavaScript
const wrapper = document.querySelector('.scroll-wrapper'); const el = document.querySelector('.scroll'); const filler = document.querySelector('.scroll-filler'); const position = document.querySelector('.scroll-position-inner'); const inner = document.querySelector('.scroll-inner'); const btns = {prev: document.querySelector('.scroll-btn.prev'), next: document.querySelector('.scroll-btn.next')}; const lerp = (a, b, n) => { return (1 - n) * a + n * b } const padding = 20; let scrollNow = 0; filler.style.width = inner.offsetWidth + padding*2 + 'px'; position.style.width = wrapper.offsetWidth / (inner.offsetWidth + padding*2) * 100 + '%'; const offset = 150; const angle = 25; const z = 15; function render() { let now = lerp(scrollNow, wrapper.scrollLeft, .15); gsap.set(el, {x: -now}); gsap.set(position, {x: now / wrapper.offsetWidth * 100 + '%'}); document.querySelectorAll('.scroll-item').forEach(item => { let elPos = item.offsetLeft + item.offsetWidth / 2 - scrollNow; if (elPos > wrapper.offsetWidth - offset) { let q = (wrapper.offsetWidth - elPos) / offset; gsap.set(item, {rotateY: -(angle - q * angle), z: z - z * q}) } else if (elPos < offset) { let q = elPos / offset; gsap.set(item, {rotateY: angle - q * angle, z: z - z * q}) } else { gsap.set(item, {rotateY: 0, z: 0}); } }); scrollNow = now; if (wrapper.scrollLeft === 0) btns.prev.disabled = true else if (inner.offsetWidth - wrapper.scrollLeft === wrapper.offsetWidth - padding*2) btns.next.disabled = true else {btns.prev.disabled = false; btns.next.disabled = false;} requestAnimationFrame(render); } render(); function nextBtn() { wrapper.scrollLeft += document.querySelector('.scroll-item').offsetWidth*2 - 20; } function prevBtn() { wrapper.scrollLeft -= document.querySelector('.scroll-item').offsetWidth*2 - 20; }
粒子
时间
文字
hover
canvas
3d
游戏
音乐
火焰
水波
轮播图
鼠标跟随
动画
css
加载动画
导航
菜单
按钮
滑块
tab
弹出层
统计图
svg
×
Close
在线代码下载提示
开通在线代码永久免费下载,需支付20jQ币
开通后,在线代码模块中所有代码可终身免费下!
您已开通在线代码永久免费下载,关闭提示框后,点下载代码可直接下载!
您已经开通过在线代码永久免费下载
对不起,您的jQ币不足!可通过发布资源 或
直接充值获取jQ币
取消
开通下载
<!doctype html> <html> <head> <meta charset="utf-8"> <title>自定义滑块-jq22.com</title> <script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script> <style>
</style> </head> <body>
<script>
</script>
</body> </html>
2012-2021 jQuery插件库版权所有
jquery插件
|
jq22工具库
|
网页技术
|
广告合作
|
在线反馈
|
版权声明
沪ICP备13043785号-1
浙公网安备 33041102000314号