批改状态:合格
老师批语:如果觉得很像, 那麻烦了, 其实这是二个完全不同方向的语言, 你觉得像,是因为编程语言的核心知识是相通的
演示地址:http://www.php520.vip/0526/toDolist.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>toDoList</title><link rel="stylesheet" href="layui/css/layui.css" /><script src="layui/layui.js"></script></head><body><hr class="layui-bg-orange" /><label class="layui-form-label">留言内容:</label><div class="layui-input-inline"><inputtype="text"name="title"requiredlay-verify="required"placeholder="请输入留言内容"autocomplete="off"class="layui-input"/></div><div class="layui-card"><div class="layui-card-header">留言记录</div><div class="layui-card-body"><ol></ol></div></div></body></html><script>layui.use("layer", function () {var layer = layui.layer;});var cl = console.log.bind(console);var input = document.querySelector("input");var ol = document.querySelector("ol");// keyDown: 按下// keyup: 抬起/释放// keypress: 获取单个字母,功能键无效input.addEventListener("keyup",function (ev) {// cl(ev.key);// cl(ev.keyCode);if (ev.key === "Enter") {// 检查内容是否为空if (input.value.length === 0) layer.msg("内容不能为空");// 创建元素var li = document.createElement("li");// 填充内容li.innerHTML =input.value +'<button onclick="del(this)" class="layui-btn layui-btn-xs"">删除</button>';// 添加到页面中,挂载到父节点下面// 将最新留言始终显示在第一个if (ol.childElementCount === 0) ol.appendChild(li);else ol.insertBefore(li, ol.firstElementChild);// 清空留言区input.value = null;}},false);// 删除评论的函数function del(ele) {// cl(ele.parentNode);// cl(ele.parentNode.parentNode);return layer.confirm("是否删除?")? ele.parentNode.parentNode.removeChild(ele.parentNode): false;}</script>
演示地址http://www.php520.vip/0526/banner.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>轮播图</title><link rel="stylesheet" href="css/banner.css" /></head><body><div class="banner"><ul><li><img src="banner/banner1.jpg" alt="#" /></li><li><img src="banner/banner2.jpg" alt="#" /></li><li><img src="banner/banner3.jpg" alt="#" /></li><li><img src="banner/banner4.jpg" alt="#" /></li></ul><ol></ol><div class="dirBtn"><a name="left" href="JavaScript:;"><span name="left" class="skip prev"><</span></a><a name="right" href="JavaScript:;"><span name="right" class="skip next">></span></a></div></div></body></html>
body,div,ul,li,ol,a {margin: 0;padding: 0;list-style: none;text-decoration: none;font-size: 0;}img {display: block;width: 100%;height: 100%;}.banner {width: 480px;height: 270px;position: relative;margin: 200px auto;border: solid 5px #7d777b;overflow: hidden;}.banner ul {width: 500%;height: 100%;overflow: hidden;position: absolute;left: 0;top: 0;z-index: 0;}.banner ul li {float: left;width: 480px;height: 100%;}.banner ol {width: 100%;height: 40px;position: absolute;left: 0;bottom: 0;z-index: 2;display: flex;justify-content: center;align-items: center;}.banner ol li {width: 20px;height: 20px;border: solid 2px #fff;border-radius: 50%;cursor: pointer;margin: 0 10px;}.banner ol li.active {background-color: #e0a8d7;}/* 上一页下一页样式 */.dirBtn .skip {position: absolute;top: 100px;display: inline-block;width: 40px;height: 80px;text-align: center;line-height: 80px;background-color: lightgray;color: white;opacity: 0.2;font-size: 36px;}.dirBtn .prev {left: 0;}.dirBtn .next {right: 0;}.dirBtn .skip:hover {cursor: pointer;opacity: 0.5;color: black;}
// 获取标签对象var oDiv = document.querySelector(".banner");var oUl = document.querySelector("ul");var ouLis = document.querySelectorAll("ul li");var oOl = document.querySelector("ol");var oDir = document.querySelector(".dirBtn");// 获取li的默认宽度var liWidth = parseInt(window.getComputedStyle(ouLis[0]).width);// 定义开关变量,防止点击过快// 在js函数中会有防止点击过快的程序var bool = true;// 存储轮播图执行次数的变量var oriVal = 1;// 存储自动轮播定时器变量var timer = 0;setLi();copyLi();autoplay();stopPlay();focusBtn();dirBtn();hidden();
// 首先,设置运动函数,来实现各标签的动画效果// 参数1,标签对象// 参数2,运动属性// 参数3,运动终止函数function move(ele, obj, callback) {for (let type in obj) {// 获取原始定位数据let oriVal = parseInt(window.getComputedStyle(ele)[type]);// 定义定时器let timer = setInterval(function () {// 计算步长并取整,保证计时器能停下来let speed = (obj[type] - oriVal) / 5;if (speed > 0) {speed = Math.ceil(speed);} else {speed = Math.floor(speed);}oriVal += speed;// 执行定位ele.style[type] = oriVal + "px";// 到达目标位置,终止定时器if (oriVal === obj[type]) {clearInterval(timer);callback();}}, 100);}}// 根据ul中原始标签的数量动态生成ol中的li标签// 也就是轮播图中的焦点按钮function setLi() {let str = "";ouLis.forEach(function (item, key) {if (key === 0) {str += `<li index="${key + 1}" class="active"></li>`;} else {str += `<li index="${key + 1}"></li>`;}});oOl.innerHTML = str;}// 复制原始第一张轮播图到ul的最后// 复制原始最后一张轮播图到ul的起始// 并重新定义ul的宽度,将ul定位到原始5张图的第一张图的位置function copyLi() {let liF = ouLis[0];let liL = ouLis[ouLis.length - 1];let first = liF.cloneNode(true);let last = liL.cloneNode(true);oUl.appendChild(first);oUl.insertBefore(last, liF);oUl.style.width = (ouLis.length + 2) * liWidth + "px";oUl.style.left = -liWidth + "px";}// 自动轮序播放图片函数function autoplay() {timer = setInterval(function () {oriVal++;move(oUl, { left: -oriVal * liWidth }, moveEnd);}, 3000);}// 运动函数结束时执行的函数// 就是move函数中的callbackfunction moveEnd() {// 给开关变量,赋值初始值bool = true;// 判断oriVal数值,并且给ul做定位// 如果是最后一个图片if (oriVal === ouLis.length + 1) {// 改变oriVal数值oriVal = 1;// 瞬间切换图片oUl.style.left = -oriVal * liWidth + "px";}// 如果是第一个图片else if (oriVal === 0) {// 改变oriVal数值oriVal = ouLis.length;// 瞬间切换图片oUl.style.left = -oriVal * liWidth + "px";}// 设定焦点按钮样式// 获取ol中的li,在生成焦点之后生成let ooLis = document.querySelectorAll("ol li");ooLis.forEach(function (item) {item.className = "";if (item.getAttribute("index") - 0 === oriVal) {item.className = "active";}});}// 鼠标移入移出事件// 移入终止轮播// 移出继续轮播function stopPlay() {// 给父级div添加事件// 移入清除定时器,终止函数oDiv.addEventListener("mouseover", function () {clearInterval(timer);});// 移出,再次执行函数oDiv.addEventListener("mouseout", function () {autoplay();});}// 焦点按钮切换function focusBtn() {// 给ol添加事件oOl.addEventListener("click", function (e) {// 兼容性处理e = e || event;let eTarget = e.target || e.srcElement;// 如果点击的是li标签if (eTarget.tagName === "LI") {// 防止点击过快处理if (bool !== true) {return;}bool = false;// 获取点击标签,index的属性,赋值给变量oriVal = eTarget.getAttribute("index") - 0;// 一定要用move()运动函数,这样才可以再次点击move(oUl, { left: -oriVal * liWidth }, moveEnd);}});}// 左右方向的焦点切换// 点左,上一张// 点右,下一张function dirBtn() {oDir.addEventListener("click", function (e) {// 兼容性处理e = e || event;let eTarget = e.target || e.srcElement;// 如果点击的是左切换if (eTarget.getAttribute("name") === "left") {if (bool !== true) {return;}bool = false;oriVal--;move(oUl, { left: -oriVal * liWidth }, moveEnd);console.log(eTarget.getAttribute("name"));}// 如果点击的是右切换else if (eTarget.getAttribute("name") === "right") {if (bool !== true) {return;}bool = false;oriVal++;move(oUl, { left: -oriVal * liWidth }, moveEnd);console.log(eTarget.getAttribute("name"));}});}// 页面隐藏函数// 比如切换页面时就停止轮播图,回到轮播图页面时继续执行轮播function hidden() {document.addEventListener("visibilitychange", function () {if (document.visibilityState === "hidden") {clearInterval(timer);} else if (document.visibilityState === "visible") {autoplay();}});}

万变不离其宗,js学到目前为止,发现其不过也就是和php差不多,知道语法以后,想要实现什么功能,逻辑想好了,通过DOM获取页面中的元素,利用函数实现相关的功能就好了,不懂就百度,越来越觉得php和js搭配可以做很多事情。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号