Files
ClassContent/历届学生/font-end-nine/项目练习/学生项目/张婷/练习/案例自写/0619/案例九.html
2024-09-27 02:06:13 +08:00

245 lines
7.7 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>Document</title>
<style>
body,
ul,
li {
margin: 0;
padding: 0;
}
.main {}
.main ul {
overflow: hidden;
}
.main ul li {
display: flex;
height: 45px;
align-items: center;
position: relative;
padding: 0 15px;
border-bottom: 1px solid #f4f0f0;
transition-duration: 0.3s;
}
.main .item {
width: 100%;
}
.main .action {
display: flex;
align-items: center;
height: 100%;
position: absolute;
right: -180px;
}
.main .action .item {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
padding: 0 14px;
color: #fff;
}
.action .top {
background: #c8c7cd;
}
.action .read {
background: #ff9c00;
}
.action .delete {
background: #ff3a31;
}
</style>
</head>
<body>
<div class="main">
<ul>
<li>
<div class="item">新闻1</div>
<div class="action">
<div class="item top">置顶</div>
<div class="item read">未读</div>
<div class="item delete">删除</div>
</div>
</li>
<li>
<div class="item">新闻2</div>
<div class="action">
<div class="item top">置顶</div>
<div class="item read">未读</div>
<div class="item delete">删除</div>
</div>
</li>
<li>
<div class="item">新闻3</div>
<div class="action">
<div class="item top">置顶</div>
<div class="item read">未读</div>
<div class="item delete">删除</div>
</div>
</li>
</ul>
</div>
</body>
<!-- 1 获取事件; 2 绑定事件; 3 事件处理函数。
思路:侧滑按钮,默认固定在屏幕右侧固定-180px,首先,要监听屏幕,获取x值,通过手指触摸屏幕的滑动距离来判断左滑、右滑,
该事件:标题的内容: 首先,通过循环words得到里面的对象和下标,设置相关属性后,把它放到html上;
内容的内容: 同上 激活态还是通过下标实现同步-->
<script>
// 事件的传递有两种方式:冒泡与捕获。
// 在冒泡中,内部元素的事件会先被触发,然后再触发外部元素; 【从里到外】
// 在捕获中,外部元素的事件会被先触发,然后才会触发内部元素的事件。【从外到里】
// 一、addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作。
// 它们都接受3个参数:如 addEventListener("事件名" , "事件处理函数" , "布尔值"); (注:事件名不含"on",如“click”)
// 现在的版本可以省略第三个参数,默认值为false.
// 总结:
// 1:相同事件绑定和解除,需要使用共用函数;绑定和解除事件时 事件没有"on" 即onclick写成click
// 2:共用函数不能带参数;
// 二.addEventListener()与removeEventListener()的第三个参数详解
// 布尔值参数是true,表示在捕获阶段调用事件处理程序;就是最不具体的节点先接收事件,最具体的节点最后接收事件
// 如果是false,在冒泡阶段调用事件处理程序;则是先寻找指定的位置,由最具体的元素接收,然后逐级向上传播至最不具体的
// 元素的节点(文档)
// 总结:
// 1:true的触发顺序总是在false前面
// 2:如果多个均为true,则外层触发先于内层
// 3:如果多个均为false,则内层触发先于外层
// 触点坐标选取
// touchstart和touchmove使用: e.targetTouches[0].pageX 或 (jquery)e.originalEvent.targetTouches[0].pageX
// touchend使用: e.changedTouches[0].pageX 或 (jquery)e.originalEvent.changedTouches[0].pageX
//返回值
function $(className) {
return document.querySelector(className)
}
// 返回数组
function _(className) {
return document.querySelectorAll(className)
}
var mainli = _('.main ul li')
var startX = 0
mainli.forEach(function (value, index) {
value.addEventListener('touchstart', function (event) {
// console.log('event.targetTouches[0]', event.targetTouches[0].screenX);
startX = event.targetTouches[0].screenX;
mainli.forEach(function (V, i) {
if (i != index) {
V.style.transform = `translateX(0px)`;
}
})
})
value.addEventListener('touchmove', function (event) {
var moveX = event.targetTouches[0].screenX;
// 在没有任何操作的情况下,起始状态都是关上的即false,也就是open取反
// 先判断右滑还是左滑,再判断是打开状态还是关闭状态,(定义value.open,true是打开,false是关上)。
// 然后打开的情况下,x值的计算以及再关上的状态下x轴的计算。
// 左滑
if(moveX < startX){
// 状态默认关闭
if (!value.open){
var x = moveX - startX
// 左滑打开成功
if(x < -180){
value.style.transform =`translateX(-180px)`
}else{
// 左滑打开失败
value.style.transform =`translateX(${x}px)`
}
value.open = true
}
// 右滑(movex > startx)
}else{
// 状态默认打开
if (value.open){
var newX = (moveX - startX) + (-180)
// 右滑关闭失败
if (newX <= 0){
value.style.transform =`translateX(${newX})px`
}else{
// 右滑关闭成功
value.style.transform =`translateX(0px)`
}
}
}
})
value.addEventListener('touchend', function (event) {
console.log('event.targetTouches', event);
var endX = event.changedTouches[0].screenX;
// 阈值
var distenceX = endX - startX
// 左滑
if (startX > endX) {
// 打开成功
if (distenceX < -60) {
value.style.transform = `translateX(-180px)`;
// 打开失败
} else {
value.style.transform = `translateX(0px)`;
value.open = false
}
// 右滑
} else {
// 打开成功
if (distenceX > 60) {
value.style.transform = `translateX(0px)`;
// 打开失败
} else {
value.style.transform = `translateX(-180px)`;
value.open = false
}
}
})
})
</script>
</html>