196 lines
5.5 KiB
HTML
196 lines
5.5 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>仿QQ列表滑动</title>
|
|
<style>
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
list-style: none;
|
|
}
|
|
|
|
.list {}
|
|
|
|
.list li {
|
|
width: 100%;
|
|
height: 45px;
|
|
display: flex;
|
|
align-items: center;
|
|
box-sizing: border-box;
|
|
border-bottom: 1px solid #f3f3f3;
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.list li .text {
|
|
position: absolute;
|
|
transition: all 0.3s;
|
|
}
|
|
|
|
.slide {
|
|
position: absolute;
|
|
height: 100%;
|
|
display: flex;
|
|
transition: all 0.3s;
|
|
}
|
|
|
|
.slide .slide_item {
|
|
padding: 0 15px;
|
|
color: #fff;
|
|
display: flex;
|
|
align-items: center;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.slide .slide_item:nth-child(1) {
|
|
background-color: #09f;
|
|
}
|
|
|
|
.slide .slide_item:nth-child(2) {
|
|
background-color: #fe8d3f;
|
|
}
|
|
|
|
.slide .slide_item:nth-child(3) {
|
|
background-color: #ff5967;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
|
|
<ul class="list">
|
|
<li>
|
|
<div class="text" style="left: 15px;">测试文字1</div>
|
|
<div class="slide" style="right: -220px">
|
|
<div class="slide_item ">取消置顶</div>
|
|
<div class="slide_item">标记未读</div>
|
|
<div class="slide_item delete">删除</div>
|
|
</div>
|
|
</li>
|
|
<li>
|
|
<div class="text" style="left: 15px;">测试文字2</div>
|
|
<div class="slide" style="right: -220px">
|
|
<div class="slide_item ">取消置顶</div>
|
|
<div class="slide_item">标记未读</div>
|
|
<div class="slide_item delete">删除</div>
|
|
</div>
|
|
</li>
|
|
<li>
|
|
<div class="text" style="left: 15px;">测试文字3</div>
|
|
<div class="slide" style="right: -220px">
|
|
<div class="slide_item ">取消置顶</div>
|
|
<div class="slide_item">标记未读</div>
|
|
<div class="slide_item delete">删除</div>
|
|
</div>
|
|
</li>
|
|
<li>
|
|
<div class="text" style="left: 15px;">测试文字4</div>
|
|
<div class="slide" style="right: -220px">
|
|
<div class="slide_item ">取消置顶</div>
|
|
<div class="slide_item">标记未读</div>
|
|
<div class="slide_item delete">删除</div>
|
|
</div>
|
|
</li>
|
|
<li>
|
|
<div class="text" style="left: 15px;">测试文字5</div>
|
|
<div class="slide" style="right: -220px">
|
|
<div class="slide_item ">取消置顶</div>
|
|
<div class="slide_item">标记未读</div>
|
|
<div class="slide_item delete">删除</div>
|
|
</div>
|
|
</li>
|
|
<li>
|
|
<div class="text" style="left: 15px;">测试文字6</div>
|
|
<div class="slide" style="right: -220px">
|
|
<div class="slide_item ">取消置顶</div>
|
|
<div class="slide_item">标记未读</div>
|
|
<div class="slide_item delete">删除</div>
|
|
</div>
|
|
</li>
|
|
<li>
|
|
<div class="text" style="left: 15px;">测试文字7</div>
|
|
<div class="slide" style="right: -220px">
|
|
<div class="slide_item ">取消置顶</div>
|
|
<div class="slide_item">标记未读</div>
|
|
<div class="slide_item delete">删除</div>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
|
|
</body>
|
|
|
|
<script>
|
|
var touchstartX = 0, currentSilde = null;
|
|
_(".list li").forEach((v, i) => {
|
|
v.addEventListener('touchstart', (e) => {
|
|
if (!e.target.className.includes("delete")) {
|
|
_(".list li").forEach(v => {
|
|
resetSilde(v.children[1]);
|
|
resetText(v.children[0]);
|
|
})
|
|
currentSilde = v;
|
|
touchstartX = e.touches[0].clientX
|
|
}
|
|
|
|
}, false);
|
|
|
|
|
|
v.addEventListener('touchmove', (e) => {
|
|
var moveX = e.touches[0].clientX
|
|
|
|
// 文字移动
|
|
v.children[0].style.left = `${parseInt(v.children[0].style.left) - (touchstartX - moveX)}px`
|
|
|
|
// 菜单移动
|
|
var right = parseInt(v.children[1].style.right) + (touchstartX - moveX);
|
|
if (right <= 0) {
|
|
v.children[1].style.right = `${right}px`
|
|
}
|
|
|
|
}, false);
|
|
|
|
|
|
v.addEventListener('touchend', (e) => {
|
|
|
|
var endX = parseInt(v.children[1].style.right)
|
|
if (endX > -110) {
|
|
v.children[1].style.right = `0px`
|
|
} else {
|
|
resetSilde(v.children[1]);
|
|
resetText(v.children[0]);
|
|
}
|
|
}, false);
|
|
|
|
|
|
})
|
|
|
|
function resetSilde(v) {
|
|
v.style.right = `-220px`
|
|
}
|
|
|
|
function resetText(v) {
|
|
v.style.left = `15px`
|
|
}
|
|
|
|
_(".delete").forEach(v => {
|
|
v.onclick = (e) => {
|
|
e.stopPropagation();
|
|
e.preventDefault()
|
|
$(".list").removeChild(currentSilde);
|
|
}
|
|
})
|
|
function $(className) {
|
|
return document.querySelector(className)
|
|
}
|
|
|
|
function _(className) {
|
|
return document.querySelectorAll(className)
|
|
}
|
|
</script>
|
|
|
|
</html> |