【HTML界面设计(二)】说说模块、登录界面

记录很早之前写的前端界面(具体时间有点久远)

一、说说模板

采用 适配器(Adapter)原理 来设计这款说说模板,首先看一下完整效果

在这里插入图片描述

这是demo样图,需要通过业务需求进行修改的部分

在这里插入图片描述

这一部分,就是demo代码了

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<!-- 图片定义为 150*150 -->
		<style>
			#say{
				height: 400px;
				width: 400px;
				background-color: red;
			}
			.go{
				padding: 10px 10px 0px 10px;
			}
			.go>div{
				display: inline-block;
			}
			/* 第一行:Information */
			#userImage{
				position: relative;
				height: 80px;
				width: 80px;
				background-color: blue;
			}
			#userImage+div,#userImage+div+div{
				width: 120px; 
				height: 80px;
			}
			#userName{
				width: 120px;
				height: 40px;
				background-color: blue;
			}
			#sayTime{
				position: relative;
				width: 120px;
				height: 30px;
				background-color: blue;
				top: 10px;
			}
			#operate{
				position: relative;
				margin-left: auto;
				width: 30px;
				height: 20px;
				background-color: blue;
			}
			/* 第二行:text */
			#sayText{
				position: relative;
				height: 30px;
				width: 380px;
				background-color: blue;
			}
			/* 第三行:images */
			#sayImages{
				height: 150px;
				width: 380px;
				background-color: blue;
			}
			/* 第四行:position */
			.go .ps{
				width: 380px;
				text-align: right;
			}
			.ps>div{
				display: inline-block;
			}
			#position{
				width: 80px;
				height: 20px;
				background-color: blue;
			}
			/* 第五行:用户操作 */
			#dianzan,#pinglun,#zhuanfa{
				width: 30px;
				height: 30px;
				background-color: blue;
			}
		</style>
	</head>
	<body>
		<div id="say">
			<div class="go">
				<div id="userImage">
					
				</div>
				<div>
					<div id="userName">
						
					</div>
					<div id="sayTime">
						
					</div>
				</div>
				<div>
					<div id="operate">
						<!-- 操作模块 -->
					</div>
				</div>
			</div>
			<div class="go">
				<div id="sayText">
					
				</div>
			</div>
			<div class="go">
				<div id="sayImages">
					<!-- 建议是添加图片适配器 -->
				</div>
			</div>
			<div class="go">
				<div class="ps">
					<div id="position">
						
					</div>
				</div>
			</div>
			<div class="go">
				<div class="ps">
					<!-- 为了使效果好看,这里最好也是使用适配器(适配器嵌套适配器) -->
					<div id="dianzan">
						
					</div>
					<div id="pinglun">
						
					</div>
					<div id="zhuanfa">
						
					</div>
				</div>
			</div>
		</div>
	</body>
</html>

二、登录界面

效果图(因为我这个项目有二维码登录的需求,所以有一个扫描图标,但demo里没有)
如果需要设计出一个这样的功能,可以参考同栏目下的【全栈开发】基于Spring Boot&Vue&Android扫码授权登录

建议:其实啊,我个人不是很推崇直接前端生成验证码数据,这玩意最好还是交给后端,始终要遵守开发安全原则 后端负责生成,前端负责渲染

在这里插入图片描述

html代码(使用了jQuery库,这里感谢开源者们的辛勤付出)

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8"/>
    <title></title>
    <link rel="stylesheet" href="css/c002.css">
	<script src="js/Jquery.js"></script>
</head>

<body>
    <div class="main">
        <div class="login-title">
            用 户 登 录
        </div>
        <div class="input-data">
            <input type="text" required="" id="userName" />
            <div class="underlineN"></div>
            <label>Name</label>
        </div>
        <div class="input-data">
            <input type="text" required="" id="userPass" />
            <div class="underlineP"></div>
            <label>Password</label>
        </div>
		<div class="login-yzm">
			<canvas id="canvas" width="120" height="40"></canvas>
			<div id="yzm-text">验证码:</div>
			<input type="text" id="yzm-input" >
		</div>
        <div class="login-btn">
            <button onclick="eqNull()"><span>登录</span></button>
			<button onclick=""><span>注册</span></button>
        </div>
    </div>
</body>

	<script type="text/javascript" src="js/c002.js"></script>
</html>

css代码

* {
    margin: 0;
    padding: 0;
    outline: none;
    box-sizing: border-box;
}


/* 设置自适应屏幕大小 */

body {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    background: linear-gradient(-135deg, #50c8c2, #4158d0);
}


/* 标题设计 */

.login-title {
    text-align: center;
    font-size: 20px;
    padding-bottom: 20px;
}


/* 输入框设计 */

.main {
    width: 450px;
    background-color: #fff;
    padding: 30px;
    box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
}


/* 模块规格 */
/* 输入框、验证码 */

.main .input-data,.login-yzm {
    width: 100%;
    height: 40px;
    margin: 10px;
    position: relative;
}


/* 输入框规格设计 */

.main .input-data input {
    width: 100%;
    height: 100%;
    border: none;
    border-bottom: 2px solid silver;
    font-size: 17px;
}


/* 动画效果 */

.input-data input:focus~label,
.input-data input:valid~label {
    transform: translateY(-20px);
    font-size: 15px;
    color: #4158D0;
}


/* 输入框文本提醒动画 */

.main .input-data label {
    position: absolute;
    bottom: 10px;
    left: 0;
    color: grey;
    pointer-events: none;
    transition: all 0.3s ease;
}


/* 动画设计 */

.main .input-data .underlineN {
    position: absolute;
    bottom: 0px;
    height: 2px;
    width: 100%;
}

.input-data .underlineN::before {
	background: #4158D0;
    position: absolute;
    content: "";
    height: 100%;
    width: 100%;
    transform: scaleX(0);
    transition: transform 0.3s ease;
}

.input-data input:focus~.underlineN:before,
.input-data input:valid~.underlineN:before {
    transform: scaleX(1);
}

.main .input-data .underlineP {
    position: absolute;
    bottom: 0px;
    height: 2px;
    width: 100%;
}

.input-data .underlineP::before {
	background: #4158D0;
    position: absolute;
    content: "";
    height: 100%;
    width: 100%;
    transform: scaleX(0);
    transition: transform 0.3s ease;
}

.input-data input:focus~.underlineP:before,
.input-data input:valid~.underlineP:before {
    transform: scaleX(1);
}


/* 按钮设计 */

.login-btn {
    text-align: center;
}

.login-btn button {
    background: radial-gradient(circle, rgba(247, 150, 192, 1) 0%, rgba(118, 174, 241, 1) 100%);
    border: none;
    color: #fff;
    font-family: 'Lato', sans-serif;
    border-radius: 10px;
    cursor: pointer;
    padding: 10px 30px;
    position: relative;
    top: 20px;
}


/* 按钮触摸和移出 */

.login-btn button:hover {
    background: transparent;
    color: #76aef1;
}

.login-btn button::before,
.login-btn button::after {
    content: '';
    position: absolute;
    width: 1px;
    height: 1px;
    box-shadow: -1px -1px 20px 0px rgba(255, 255, 255, 1), -4px -4px 5px 0px rgba(255, 255, 255, 1), 10px 10px 20px 0px rgba(0, 0, 0, .4), 6px 6px 5px 0px rgba(0, 0, 0, .3);
    transition: all 0.8s ease;
    padding: 0;
}

.login-btn button::before {
    top: 0;
    right: 0;
}

.login-btn button::after {
    bottom: 0;
    left: 0;
}

.login-btn button:hover::before,
.login-btn button:hover::after {
    height: 100%;
}

.login-btn button span::before,
.login-btn button span::after {
    position: absolute;
    content: '';
    width: 0px;
    box-shadow: -1px -1px 20px 0px rgba(255, 255, 255, 1), -4px -4px 5px 0px rgba(255, 255, 255, 1), 10px 10px 20px 0px rgba(0, 0, 0, .4), 6px 6px 5px 0px rgba(0, 0, 0, .3);
    transition: all 0.8s ease;
}

.login-btn button span::before {
    top: 0;
    left: 0;
}

.login-btn button span::after {
    bottom: 0;
    right: 0;
}

.login-btn button span:hover::before,
.login-btn button span:hover::after {
    width: 100%;
}

/* 验证码 */
/* 布局 */
.login-yzm #canvas,#yzm-text{
	float: left;
}

.login-yzm #yzm-text,#yzm-input{
	position: relative;
	left: 50px;
	top: 10px;
}

/* 输入框样式 */
.login-yzm #yzm-input{
	height: 30px;
	width: 80px;
}

js代码

var canvas = document.getElementById("canvas"); //演员
var context = canvas.getContext("2d"); //舞台,getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。
var input = document.getElementById("yzm-input"); //获取输入框
var num //定义容器接收验证码

//主函数
$(document).ready(main)

function main() {
	//验证用户名是否符合规格
	validation_userName()
	draw();
}

//输入框区域
function validation_userName() {
	var timer = null;
	// 输入的值
	var editor_start = 0;    
	// 对比时间的值 
	var editor_end = 0;
	$("#userName").keyup(function() {
	    clearTimeout(timer) // 每次滚动前 清除一次
	    timer = setTimeout(save_html_message_fun(), 2000);
	})
}

function save_html_message_fun() {
	editor_end = $("#userName").val();
	if(editor_end.length < 8) {
		//输入不满足条件时
		$('#userName').nextAll('div').append("<style>.input-data .underlineN::before{background: red}</style>")
	} else {
		$('#userName').nextAll('div').append("<style>.input-data .underlineN::before{background: #4158D0}</style>")
	}
}

// 被动触发触发事件
// 为空判断
function eqNull() {
	var userName = $('#userName').val()
	if(userName == '') {
		alert("用户名不能为空!")
	} else if(userName.length < 8) {
		alert("请输入正确的账号")
	} else if($('#userPass').val() == '') {
		alert("密码不能为空!")
	} else if($("#yzm-input").val() != num){
		reset()
		alert("验证码错误!")
	} else {
		alert("ok" + userName)
	}
}

//验证码区域
canvas.onclick = function() {
	reset()
}

function reset() {
	context.clearRect(0, 0, 120, 40); //在给定的矩形内清除指定的像素
	draw();
}

// 随机颜色函数
function getColor() {
	var r = Math.floor(Math.random() * 256);
	var g = Math.floor(Math.random() * 256);
	var b = Math.floor(Math.random() * 256);
	return "rgb(" + r + "," + g + "," + b + ")";
}

function draw() {
	context.strokeRect(0, 0, 120, 40); //绘制矩形(无填充)
	var aCode = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
	// 绘制字母
	var arr = [] //定义一个数组用来接收产生的随机数
	for (var i = 0; i < 4; i++) {
		var x = 20 + i * 20; //每个字母之间间隔20
		var y = 20 + 10 * Math.random(); //y轴方向位置为20-30随机
		var index = Math.floor(Math.random() * aCode.length); //随机索引值
		var txt = aCode[index];
		context.font = "bold 20px 微软雅黑"; //设置或返回文本内容的当前字体属性
		context.fillStyle = getColor(); //设置或返回用于填充绘画的颜色、渐变或模式,随机
		context.translate(x, y); //重新映射画布上的 (0,0) 位置,字母不可以旋转移动,所以移动容器
		var deg = 90 * Math.random() * Math.PI / 180; //0-90度随机旋转
		context.rotate(deg); // 	旋转当前绘图
		context.fillText(txt, 0, 0); //在画布上绘制“被填充的”文本
		context.rotate(-deg); //将画布旋转回初始状态
		context.translate(-x, -y); //将画布移动回初始状态
		arr[i] = txt //接收产生的随机数
	}
	num = arr[0] + arr[1] + arr[2] + arr[3] //将产生的验证码放入num
	// 绘制干扰线条
	for (var i = 0; i < 8; i++) {
		context.beginPath(); //起始一条路径,或重置当前路径
		context.moveTo(Math.random() * 120, Math.random() * 40); //把路径移动到画布中的随机点,不创建线条
		context.lineTo(Math.random() * 120, Math.random() * 40); //添加一个新点,然后在画布中创建从该点到最后指定点的线条
		context.strokeStyle = getColor(); //随机线条颜色
		context.stroke(); // 	绘制已定义的路径
	}
	// 绘制干扰点,和上述步骤一样,此处用长度为1的线代替点
	for (var i = 0; i < 20; i++) {
		context.beginPath();
		var x = Math.random() * 120;
		var y = Math.random() * 40;
		context.moveTo(x, y);
		context.lineTo(x + 1, y + 1);
		context.strokeStyle = getColor();
		context.stroke();
	}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/31772.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis系列--布隆过滤器(Bloom Filter)

一、前言 在实际开发中&#xff0c;会遇到很多要判断一个元素是否在某个集合中的业务场景&#xff0c;类似于垃圾邮件的识别&#xff0c;恶意ip地址的访问&#xff0c;缓存穿透等情况。类似于缓存穿透这种情况&#xff0c;有许多的解决方法&#xff0c;如&#xff1a;redis存储…

宏景eHR SQL注入漏洞复现(CNVD-2023-08743)

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR 存在SQL注入漏洞&#xff0c;未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令&#xff0c;从而窃取数…

如何在大规模服务中迁移缓存

当您启动初始服务时&#xff0c;通常会过度设计以考虑大量流量。但是&#xff0c;当您的服务达到爆炸式增长阶段&#xff0c;或者如果您的服务请求和处理大量流量时&#xff0c;您将需要重新考虑您的架构以适应它。糟糕的系统设计导致难以扩展或无法满足处理大量流量的需求&…

docker基础

文章目录 通过Vagrant安装虚拟机修改虚拟机网络配置 docker CE安装(在linux上)docker desktop安装(在MacOS上)Docker架构关于-阿里云镜像加速服务配置centos卸载docker 官网: http://www.docker.com 仓库: https://hub.docker.com Docker安装在虚拟机上&#xff0c;可以通过V…

Go语言的TCP和HTTP网络服务基础

目录 【TCP Socket 编程模型】 Socket读操作 【HTTP网络服务】 HTTP客户端 HTTP服务端 TCP/IP 网络模型实现了两种传输层协议&#xff1a;TCP 和 UDP&#xff0c;其中TCP 是面向连接的流协议&#xff0c;为通信的两端提供稳定可靠的数据传输服务&#xff1b;UDP 提供了一种…

[MySQL]不就是SQL语句

前言 本期主要的学习目标是SQl语句中的DDL和DML实现对数据库的操作和增删改功能&#xff0c;学习完本章节之后需要对SQL语句手到擒来。 1.SQL语句基本介绍 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的编程语言。它允许用户在数据库中存…

双因素身份验证在远程访问中的重要性

在快速发展的数字环境中&#xff0c;远程访问计算机和其他设备已成为企业运营的必要条件。无论是在家庭办公室运营的小型初创公司&#xff0c;还是团队分散在全球各地的跨国公司&#xff0c;远程访问解决方案都能保证工作效率和连接性&#xff0c;能够跨越距离和时间的阻碍。 …

7Z045 引脚功能详解

本文针对7Z045芯片&#xff0c;详细讲解硬件设计需要注意的技术点&#xff0c;可以作为设计和检查时候的参考文件。问了方便实用&#xff0c;按照Bank顺序排列&#xff0c;包含配置Bank、HR Bank、HP Bank、GTX Bank、供电引脚等。 参考文档包括&#xff1a; ds191-XC7Z030-X…

怎么计算 flex-shrink 的缩放尺寸

计算公式: 子元素的宽度 - (子元素的宽度的总和 - 父盒子的宽度) * (某个元素的flex-shrink / flex-shrink总和) 面试问题是这样的下面 left 和 right 的宽度分别是多少 * {padding: 0;margin: 0;}.container {width: 500px;height: 300px;display: flex;}.left {width: 500px…

红日靶场(一)外网到内网速通

红日靶场&#xff08;一&#xff09; 下载地址&#xff1a;http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ win7:双网卡机器 win2003:域内机器 win2008域控 web阶段 访问目标机器 先进行一波信息收集&#xff0c;扫一下端口和目录 扫到phpmyadmin&#xff0c;还有一堆…

【资料分享】Xilinx Zynq-7010/7020工业核心板规格书(双核ARM Cortex-A9 + FPGA,主频766MHz)

1 核心板简介 创龙科技SOM-TLZ7x是一款基于Xilinx Zynq-7000系列XC7Z010/XC7Z020高性能低功耗处理器设计的异构多核SoC工业核心板&#xff0c;处理器集成PS端双核ARM Cortex-A9 PL端Artix-7架构28nm可编程逻辑资源&#xff0c;通过工业级B2B连接器引出千兆网口、USB、CAN、UA…

Triton教程 --- 动态批处理

Triton教程 — 动态批处理 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理 Triton 提供了动态批处理功能&#xff0c;将多个请求组合在一起执行同一模型以提供更大的吞吐量。 默认情况下&#xff0c;只有当每个输入在…

【开源与项目实战:开源实战】81 | 开源实战三(上):借Google Guava学习发现和开发通用功能模块

上几节课&#xff0c;我们拿 Unix 这个超级大型开源软件的开发作为引子&#xff0c;从代码设计编写和研发管理两个角度&#xff0c;讲了如何应对大型复杂项目的开发。接下来&#xff0c;我们再讲一下 Google 开源的 Java 开发库 Google Guava。 Google Guava 是一个非常成功、…

io.netty学习(十一)Reactor 模型

目录 前言 传统服务的设计模型 NIO 分发模型 Reactor 模型 1、Reactor 处理请求的流程 2、Reactor 三种角色 单Reactor 单线程模型 1、消息处理流程 2、缺点 单Reactor 多线程模型 1、消息处理流程 2、缺点 主从Reactor 多线程模型 主从Reactor 多线程模型示例 1…

CTF-Show密码学:ZIP文件密码破解【暴力破解】

萌新 隐写23 题目内容&#xff1a; 文件的主人喜欢用生日做密码&#xff0c;而且还是个90后。 一、已知条件 在这个题目中&#xff0c;我们有以下已知条件&#xff1a; 文件的主人喜欢用生日做密码 - 这个条件告诉我们&#xff0c;密码可能是一个八位的纯数字密码&#xff0c…

云原生之深入解析如何正确计算Kubernetes容器CPU使用率

一、简介说明 使用 Prometheus 配置 kubernetes 环境中 Container 的 CPU 使用率时&#xff0c;会经常遇到 CPU 使用超出 100%&#xff0c;现在来分析一下&#xff1a; container_spec_cpu_period&#xff1a;当对容器进行 CPU 限制时&#xff0c;CFS 调度的时间窗口&#xff…

[架构之路-214]- UML-类图图解、详解、结构化、本质化讲解

目录 一、什么是类 1.1 概述 1.2 UML中类的表示 1.3 接口 1.4 抽象类 1.5 模板类 二、什么类图 2.1 概述 2.2 类关系 三、UML类图 3.1 结构关系 3.1.1 完全一体&#xff1a;继承关系 &#xff08;类与类耦合度最高&#xff0c;类与类之间最强的关系&#xff09; …

计算机基础知识

参考链接&#xff1a;https://blog.csdn.net/ChineseSoftware/article/details/123176978 https://www.cnblogs.com/8023-CHD/p/11067141.html https://blog.csdn.net/qq_42033567/article/details/108088514 http与https的区别 HTTP 的URL以http:// 开头&#xff0c;而HTTPS…

【Matlab】语音信号分析与处理实验报告

一、目的 使用Matlab分析与设计实验&#xff0c;理解与掌握以下知识点&#xff1a; 1、信号的采样、频谱混叠 2、信号的频谱分析 3、信号的幅度调制与解调方法 4、理想滤波器的时域和频域特性 5、数字滤波器的设计与实现 二、内容 1、录制一段个人的语音信号 2、采用合适的频…

Unity光照贴图的切换,实现黑夜和白天效果

有这么一个需求&#xff0c;不能使用实时光来进行动态控制光照开关&#xff0c;但是又要实现白天和黑夜的效果&#xff0c;我的场景中有大概十几个点光源和平行光 实现步骤&#xff1a; 一、模型原模原样复制到另一个场景中&#xff08;因为贴图只能存在于当前的场景文件夹&am…