19
数据数量
4818 人评价
PHP语言大全
PHPYYDQ
PHP常用代码大全:从基础到高级
在网站制作中,PHP是一种非常常用的编程语言。下面是一些常用的PHP代码和功能:
接口地址http协议:国内大陆优化(支持ipv4)http://ip.xsitv.com/api/openIPInfo/* API接口可能会因为各种网络原因和攻击都可能产生阻断,请开发时做好冗余和异常处理* 当HTTP请求返回的状态码非200时,请做异常处理,比如 202 状态码造成的原因可能是无效Token、余额不足、格式错误<?php
$ip = '183.44.113.246';
$datatype = 'JSON';
$token = '340a8425b71a88e5a234bada74a82rct';
$url = 'http://ip.xsitv.com/api/openIPInfo/?ip='.$ip.'&datatype='.$datatype.'&token='.$token;
$header = array('token:'.$token.'');
echo getData($url,$header);
function getData($url,$header){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3);
$handles = curl_exec($ch);
curl_close($ch);
echo $handles;
}
?>查询结果JSON样式{
"code": 200,
"success": true,
"message": "查询成功",
"data": {
"ip": "183.44.113.246",
"isp": "电信",
"geo": "中国–广东–茂名"
}
}
一些变量说明:add_time为插入的时间to_days是sql函数,返回的是个天数data_sub(date,INTERVAL expr type)给指定的日期减去多少天data()函数返回日期或日期/时间表达式的日期部分。curdate()函数返回当前的日期 y-m-ddata_format 用于以不同的格式显示日期/时间数据period_diff(p1,p2)返回周期P1和P2之间的月数。 P1和P2格式为YYMM或YYYYMM。注意周期参数 P1 和 P2 都不是日期值1、查询今天的所有记录:(1)add_time字段,该字段为int(5)类型的select * from `article` where to_days(date_format(from_UNIXTIME(`add_time`),'%Y-%m-%d')) = to_days(now());(2)add_time字段是DATETIME类型或者TIMESTAMP类型的select * from `article` where to_days(`add_time`) = to_days(now());2、查询昨天的所有记录select * from `article` where to_days(now()) = 1 + to_days(`add_time`);3、近7天的信息记录:select * from `article` where date_sub(curdate(), INTERVAL 7 DAY) <= date(`add_time`);4、近30天的信息记录:select * from `article` where date_sub(curdate(), INTERVAL 30 DAY) <= date(`add_time`);5、查询本月的记录select * from `article` where date_format(`add_time`, ‘%Y%m') = date_format(curdate() , ‘%Y%m');6、上一个月的记录select * from `article` where period_diff(date_format(now() , ‘%Y%m') , date_format(`add_time`, ‘%Y%m')) =1;
php 获取 今天、昨天、这周、上周、这月、上月、近30天<?php
//今天
$today = date("Y-m-d");
//昨天
$yesterday = date("Y-m-d", strtotime(date("Y-m-d"))-86400);
//上周
$lastweek_start = date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1-7,date("Y")));
$lastweek_end = date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7-7,date("Y")));
//本周
$thisweek_start = date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1,date("Y")));
$thisweek_end = date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7,date("Y")));
//上月
$lastmonth_start = date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m")-1,1,date("Y")));
$lastmonth_end = date("Y-m-d H:i:s",mktime(23,59,59,date("m") ,0,date("Y")));
//本月
$thismonth_start = date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),1,date("Y")));
$thismonth_end = date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("t"),date("Y")));
//本季度未最后一月天数
$getMonthDays = date("t",mktime(0, 0 , 0,date('n')+(date('n')-1)%3,1,date("Y")));
//本季度/
$thisquarter_start = date('Y-m-d H:i:s', mktime(0, 0, 0,date('n')-(date('n')-1)%3,1,date('Y')));
$thisquarter_end = date('Y-m-d H:i:s', mktime(23,59,59,date('n')+(date('n')-1)%3,$getMonthDays,date('Y')));
?>
PHP 使用token验证可有效的防止非法来源数据提交访问,增加数据操作的安全性第一步:生成token/** 第一步:生成token */
public function CreateToken($userid) {
//用户名、此时的时间戳,并将过期时间拼接在一起
$time = time();
$end_time = time() + 86400;//过期时间
$info = $userid . '.' . $time . '.' . $end_time; //设置token过期时间为一天
//根据以上信息信息生成签名(密钥为 SIGNATURE 自定义全局常量)
$signature = hash_hmac('md5', $info, SIGNATURE);
//最后将这两部分拼接起来,得到最终的Token字符串
return $token = $info . '.' . $signature;
}
/** 第二步:验证token */
public function check_token($token)
{
/**** api传来的token ****/
if(!isset($token) || empty($token))
{
$msg['code']='400';
$msg['msg']='非法请求';
return json_encode($msg,JSON_UNESCAPED_UNICODE);
}
//对比token
$explode = explode('.',$token);//以.分割token为数组
if(!empty($explode[0]) && !empty($explode[1]) && !empty($explode[2]) && !empty($explode[3]) )
{
$info = $explode[0].'.'.$explode[1].'.'.$explode[2];//信息部分
$true_signature = hash_hmac('md5',$info,'siasqr');//正确的签名
if(time() > $explode[2])
{
$msg['code']='401';
$msg['msg']='Token已过期,请重新登录';
return json_encode($msg,JSON_UNESCAPED_UNICODE);
}
if ($true_signature == $explode[3])
{
$msg['code']='200';
$msg['msg']='Token合法';
return json_encode($msg,JSON_UNESCAPED_UNICODE);
}
else
{
$msg['code']='400';
$msg['msg']='Token不合法';
return json_encode($msg,JSON_UNESCAPED_UNICODE);
}
}
else
{
$msg['code']='400';
$msg['msg']='Token不合法';
return json_encode($msg,JSON_UNESCAPED_UNICODE);
}
}1、密钥设置public $secretKey = 'hgakdfkljalfdjlk';//私钥
public $termValidity = 60;//有效时常(秒)2、调用方式$info = ['user_id' => 1];
//生成密钥
$this->CreateToken( $info);
//校验密钥
$this->CheckToken($token);3、基础方法
引言CSS边框属性是网页设计中控制元素视觉边界的核心工具,通过设置边框的样式、宽度和颜色,可以显著提升页面的视觉层次和交互反馈。本文将系统梳理CSS边框的核心属性及其应用场景,帮助开发者全面掌握边框的使用技巧。核心边框属性详解边框样式(border-style)边框样式属性定义了边框的显示形式,支持以下值:none:无边框(默认值)solid:实线边框dashed:虚线边框dotted:点线边框double:双线边框groove:3D凹槽边框ridge:3D脊线边框inset:3D嵌入边框outset:3D突出边框<style>
.demo {
border-style: dashed solid double dotted;
/* 上右下左依次设置 */
}
</style>
<div class="demo">示例元素</div>边框宽度(border-width)边框宽度属性支持以下单位:长度值:px、em、rem等关键字:thin、medium(默认)、thick.box {
border-width: 2px 4px; /* 上下2px,左右4px */
}边框颜色(border-color)边框颜色属性支持以下格式:颜色名称:red、blue等RGB值:rgb(255, 0, 0)十六进制:#ff0000透明色:transparent.element {
border-color: red green blue yellow; /* 上右下左依次设置 */
}边框简写属性border简写属性可一次性设置所有边框的宽度、样式和颜色:.button {
border-top: 1px solid red;
border-right: 2px dashed blue;
border-bottom: 3px double green;
border-left: 4px dotted yellow;
}高级应用场景圆角边框(border-radius).circle {
width: 100px;
height: 100px;
border-radius: 50%; /* 创建圆形 */
}
.pill {
border-radius: 9999px; /* 创建胶囊形 */
}边框图像(border-image).image-border {
border: 15px solid transparent;
border-image: url('border.png') 30 round;
/* 使用图像作为边框,30px切片,round方式重复 */
}几何图形创建通过设置元素宽高为0,仅保留边框可创建三角形:.triangle {
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 20px solid red;
}最佳实践一致性:保持同类元素的边框样式一致性能优化:避免过度使用复杂的border-image可访问性:确保边框变化提供足够的视觉反馈回退方案:为border-image提供border-style回退总结CSS边框属性是塑造元素视觉边界的基础工具,通过border-width、border-style和border-color的组合,可以实现从基础边框到复杂3D效果的多样化设计。掌握简写属性与单独边框设置的差异,结合border-radius和border-image的高级应用,能够显著提升页面的视觉表现力。在实际开发中,应注重边框样式的一致性、性能优化和可访问性,以创建既美观又实用的用户界面。
1,查询面页内容 b.php 面页<?php
function getiparea($ip) {
$url = 'http://ip.xsitv.com/api/openIPInfo/?ip='.$ip.'&token=340a8425b71a88e5a234bada74a82bff'; // 这是查询接口地址
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$jsonData = curl_exec($ch);
curl_close($ch);
if ($jsonData === FALSE) {
die('Error fetching data');
}
$data = json_decode($jsonData, true); // 将 JSON 字符串转换为数组
if (json_last_error() !== JSON_ERROR_NONE) {
die('Error decoding JSON');
}
// 访问多级数据结构示例
$isp = $data['data']['isp']; // 获取用户ID
$geoo = $data['data']['geo']; // 获取用户名
$geo = str_replace("–", "", $geoo);
$ip = $data['data']['ip']; // 获取用户街道地址
return $geoo.'–'.$isp;
}查询结果JSON样式
{"code":200,"success":true,"message":"操作成功","data":{"ip":"111.207.198.198","isp":"联通","geo":"中国–北京–北京"},"time":"2025-11-19 22:31:03"}2,传入要查询的IP c.php 面页<?php echo $rs["ip"]."<br>".getiparea($rs["ip"]);?>最终输入这样的效果本人是小白 有什么见解多多支教!18125039721
http://blog.sina.com.cn/s/blog_438308750100im0b.html我原来的公司是一家网络游戏公司,其中网站交易与游戏数据库结合通过ws实现的,但是交易记录存放在网站上,级别是千万级别的数据库是mysql数据库. 可能有人会问mysql是否支持千万级数据库,还有既然已经到了这个数据量公司肯定不差,为什么要用mysql而不用oracle这里我做一下解答 1. mysql绝对支持千万级数据库是可以肯定的, 2. 为什么选择择mysql呢? 1> 第一也是最主要的一条是mysql他能做到。 2>在第一点前提下以下的就不是太重要了,mysql相对操作简单,测试容易,配置优化也相对容易很多 3>我们这里的数据仅仅是为了记录交易保证交易是被记录的,对于查询的还是相对少只有管理后台操作中需要对数据库进行查询 4>数据结构简单,而且每条记录都非常小,因为查询速度不管和记录条数有关和数据文件大小也有直接关系. 5>我们采用的是大小表的解决办法,每天大概需要插入数据库好几百万条,这里可能还是有人怀疑,其实没问题,如果批量插入我测试的在普通的pc机子上带该一个线程并发我插入的是6千万条记录大概需要“JDBC插入6000W条数据用时:9999297ms”,小表保存最近插入的内容,把几天前的保存到大表中,这里我说的就是大表大概6-7千万条数据; 带着这些疑问和求知欲望咱们来做一个测试,因为在那个时候我也不是dba不知道人家是怎么搞的能够做成这么大的数据量,我们平时叶总探讨一些相关的内容 1.mysql的数据查询,大小字段要分开,这个还是有必要的,除非一点就是你查询的都是索引内容而不是表内容,比如只查询id等等 2.查询速度和索引有很大关系也就是索引的大小直接影响你的查询效果,但是查询条件一定要建立索引,这点上注意的是索引字段不能太多,太多索引文件就会很大那样搜索只能变慢, 3.查询指定的记录最好通过Id进行in查询来获得真实的数据.其实不是最好而是必须,也就是你应该先查询出复合的ID列表,通过in查询来获得数据 我们来做一个测试ipdatas表: CREATE TABLE `ipdatas` ( `id` INT(11) NOT NULLAUTO_INCREMENT, `uid` INT(8) NOT NULL DEFAULT'0', `ipaddress` VARCHAR(50) NOTNULL, `source` VARCHAR(255) DEFAULTNULL, `track` VARCHAR(255) DEFAULTNULL, `entrance` VARCHAR(255)DEFAULT NULL, `createdtime` DATETIME NOTNULL DEFAULT '0000-00-00 00:00:00', `createddate` DATE NOT NULLDEFAULT '0000-00-00', PRIMARY KEY (`id`), KEY `uid` (`uid`) ) ENGINE=MYISAM AUTO_INCREMENT=67086110 DEFAULTCHARSET=utf8; 这是我们做的广告联盟的推广ip数据记录表,由于我也不是mysql的DBA所以这里咱们仅仅是测试 因为原来里面有大概7015291条数据 这里我们通过jdbc的batch插入6000万条数据到此表当中“JDBC插入6000W条数据用时:9999297ms”; 大概用了两个多小时,这里面我用的是batch大小大概在1w多每次提交,还有一点是每次提交的数据都很小,而且这里用的myisam数据表,因为我需要知道mysql数据库的大小以及索引数据的大小结果是 ipdatas.MYD 3.99 GB (4,288,979,008 字节) ipdatas.MYI 1.28 GB (1,377,600,512 字节) 这里面我要说的是如果真的是大数据如果时间需要索引还是最好改成数字字段,索引的大小和查询速度都比时间字段可观。 步入正题: 1.全表搜索 返回结构是67015297条数据 SELECT COUNT(id) FROMipdatas; SELECT COUNT(uid) FROMipdatas; SELECT COUNT(*) FROMipdatas; 首先这两个全表数据查询速度很快,mysql中包含数据字典应该保留了数据库中的最大条数 查询索引条件 SELECT COUNT(*) FROM ipdatasWHERE uid=1; 返回结果时间:2分31秒594 SELECT COUNT(id) FROM ipdatasWHERE uid=1; 返回结果时间:1分29秒609 SELECT COUNT(uid) FROM ipdatasWHERE uid=1; 返回结果时间:2分41秒813 第二次查询都比较快因为mysql中是有缓存区的所以增大缓存区的大小可以解决很多查询的优化,真可谓缓存无处不在啊在程序开发中也是层层都是缓存 查询数据 第一条开始查询 SELECT * FROM ipdatas ORDER BYid DESC LIMIT 1,10 ; 31毫秒 SELECT * FROM ipdatas LIMIT1,10 ; 15ms 第10000条开始查询 SELECT * FROM ipdatas ORDER BYid ASC LIMIT 10000,10 ; 266毫秒 SELECT * FROM ipdatas LIMIT10000,10 ; 16毫秒 第500万条开始查询 SELECT * FROM ipdatas LIMIT5000000,10 ;11.312秒 SELECT * FROM ipdatas ORDER BYid ASC LIMIT 5000000,10 ; 221.985秒 这两条返回结果完全一样,也就是mysql默认机制就是id正序然而时间却大相径庭 第5000万条开始查询 SELECT * FROM ipdatas LIMIT60000000,10 ;66.563秒 (对比下面的测试) SELECT * FROM ipdatas ORDER BYid ASC LIMIT 50000000,10; 1060.000秒 SELECT * FROM ipdatas ORDER BYid DESC LIMIT 17015307,10; 434.937秒 第三条和第二条结果一样只是排序的方式不同但是用时却相差不少,看来这点还是不如很多的商业数据库,像oracle和sqlserver等都是中间不成两边还是没问题,看来mysql是开始行越向后越慢,这里看来可以不排序的就不要排序了性能差距巨大,相差了20多倍 查询数据返回ID列表 第一条开始查 select id from ipdatas orderby id asc limit 1,10; 31ms SELECT id FROM ipdatas LIMIT1,10 ; 0ms 第10000条开始 SELECT id FROM ipdatas ORDERBY id ASC LIMIT 10000,10; 68ms select id from ipdatas limit10000,10;0ms 第500万条开始查询 SELECT id FROM ipdatas LIMIT5000000,10; 1.750s SELECT id FROM ipdatas ORDERBY id ASC LIMIT 5000000,10;14.328s 第6000万条记录开始查询 SELECT id FROM ipdatas LIMIT60000000,10; 116.406s SELECT id FROM ipdatas ORDERBY id ASC LIMIT 60000000,10; 136.391s select id from ipdataslimit 10000002,10; 29.032s select id from ipdatas limit20000002,10; 24.594s select id from ipdatas limit30000002,10; 24.812s select id from ipdatas limit40000002,10; 28.750s 84.719s select id from ipdatas limit50000002,10; 30.797s 108.042s select id from ipdatas limit60000002,10; 133.012s 122.328s select * from ipdatas limit10000002,10; 27.328s select * from ipdatas limit20000002,10; 15.188s select * from ipdatas limit30000002,10; 45.218s select * from ipdatas limit40000002,10; 49.250s 50.531s select * from ipdatas limit50000002,10; 73.297s 56.781s select * from ipdatas limit60000002,10; 67.891s 75.141s select id from ipdatasorder by id asc limit 10000002,10; 29.438s select id from ipdatas orderby id asc limit 20000002,10; 24.719s select id from ipdatas orderby id asc limit 30000002,10; 25.969s select id from ipdatas orderby id asc limit 40000002,10; 29.860d select id from ipdatas orderby id asc limit 50000002,10; 32.844s select id from ipdatas orderby id asc limit 60000002,10; 34.047s 至于SELECT * ipdatas order byid asc 就不测试了 大概都在十几分钟左右 可见通过SELECT id不带排序的情况下差距不太大,加了排序差距巨大 下面看看这条语句 SELECT * FROM ipdatas WHERE idIN(10000,100000,500000,1000000,5000000,10000000,2000000,30000000,40000000,50000000,60000000,67015297); 耗时0.094ms 可见in在id上面的查询可以忽略不计毕竟是6000多万条记录,所以为什么很多lucene或solr搜索都返回id进行数据库重新获得数据就是因为这个,当然lucene/solr+mysql是一个不错的解决办法这个非常适合前端搜索技术,比如前端的分页搜索通过这个可以得到非常好的性能.还可以支持很好的分组搜索结果集,然后通过id获得数据记录的真实数据来显示效果真的不错,别说是千万级别就是上亿也没有问题,真是吐血推荐啊.上面的内容还没有进行有条件的查询仅仅是一些关于orderby和limit的测试,请关注我的下一篇文件对于条件查询的1亿数据检索测试最近做了个项目,实现对存在千万条记录的库表进行插入、查询操作。原以为对数据库的插入、查询是件很容易的事,可不知当数据达到百万甚至千万条级别的时候,这一切似乎变得相当困难。几经折腾,总算完成了任务。 1、 避免使用Hibernate框架 Hibernate用起来虽然方便,但对于海量数据的操作显得力不从心。 关于插入: 试过用Hibernate一次性进行5万条左右数据的插入,若ID使用sequence方式生成,Hibernate将分5万次从数据库取得5万个sequence,构造成相应对象后,再分五万次将数据保存到数据库。花了我十分钟时间。主要的时间不是花在插入上,而是花在5万次从数据库取sequence上,弄得我相当郁闷。虽然后来把ID生成方式改成increase解决了问题,但还是对那十分钟的等待心有余悸。 关于查询: Hibernate对数据库查询的主要思想还是面向对象的,这将使许多我们不需要查询的数据占用了大量的系统资源(包括数据库资源和本地资源)。由于对Hibernate的偏爱,本着不抛弃、不放弃的作风,做了包括配SQL,改进SQL等等的相当多的尝试,可都以失败告终,不得不忍痛割爱了。 2、 写查询语句时,要把查询的字段一一列出 查询时不要使用类似select * from x_table的语句,要尽量使用select id,name from x_table,以避免查询出不需要的数据浪费资源。对于海量数据而言,一个字段所占用的资源和查询时间是相当可观的。 3、 减少不必要的查询条件 当我们在做查询时,常常是前台提交一个查询表单到后台,后台解析这个表单,而后进行查询操作。在我们解析表单时,为了方便起见,常常喜欢将一些不需要查询的条件用永真的条件来代替(如:select count(id) from x_table where name like ‘%’),其实这样的SQL对资源的浪费是相当可怕的。我试过对于同样的近一千万条记录的查询来说,使用select count(id) from x_table 进行表查询需要11秒,而使用select count(id) from x_table where name like ‘%’却花了33秒。 4、 避免在查询时使用表连接 在做海量数据查询时,应尽量避免表连接(特别是左、右连接),万不得已要进行表连接时,被连接的另一张表数据量一定不能太大,若连接的另一张表也是数万条的话,那估计可以考虑重新设计库表了,因为那需要等待的时间决不是正常用户所能忍受的。 5、 嵌套查询时,尽可能地在第一次select就把查询范围缩到最小 在有多个select嵌套查询的时候,应尽量在最内层就把所要查询的范围缩到最小,能分页的先分页。很多时候,就是这样简单地把分页放到内层查询里,对查询效率来说能形成质的变化。 就是这些了,希望对遇到类似问题的朋友们能有所帮助!
dataType类型:String预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后 服务器端返回的数据会根据这个值解析后,传递给 回调函数。可用值: •"xml": 返回 XML 文档,可用 jQuery 处理。•"html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。•"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)•"json": 返回 JSON 数据 。•"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行 回调函数。•"text": 返回纯文本字符串
字体属性:(font)大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD样式 {font-style: oblique;}(偏斜体) italic;(斜体) normal;(正常)行高 {line-height: normal;}(正常) 单位:PX、PD、EM粗细 {font-weight: bold;}(粗体) lighter;(细体) normal;(正常)变体 {font-variant: small-caps;}(小型大写字母) normal;(正常)大小写 {text-transform: capitalize;}(首字母大写) uppercase;(大写) lowercase;(小写) none;(无)修饰 {text-decoration: underline;}(下划线) overline;(上划线) line-through;(删除线) blink;(闪烁)常用字体: (font-family)"Courier New", Courier, monospace, "Times New Roman", Times, serif, Arial, Helvetica, sans-serif, Verdana背景属性: (background)色彩 {background-color: #FFFFFF;}图片 {background-image: url();}重复 {background-repeat: no-repeat;}滚动 {background-attachment: fixed;}(固定) scroll;(滚动)位置 {background-position: left;}(水平) top(垂直);简写方法 {background:#000 url(..) repeat fixed left top;} /*简写·这个在阅读代码中经常出现,要认真的研究*/区块属性: (Block) /*这个属性第一次认识,要多多研究*/字间距 {letter-spacing: normal;} 数值 /*这个属性似乎有用,多实践下*/对齐 {text-align: justify;}(两端对齐) left;(左对齐) right;(右对齐) center;(居中)缩进 {text-indent: 数值px;}垂直对齐 {vertical-align: baseline;}(基线) sub;(下标) super;(下标) top; text-top; middle; bottom; text-bottom;词间距word-spacing: normal; 数值空格white-space: pre;(保留) nowrap;(不换行)显示 {display:block;}(块) inline;(内嵌) list-item;(列表项) run-in;(追加部分) compact;(紧凑) marker;(标记) table; inline-table; table-raw-group; table-header-group; table-footer-group; table-raw; table-column-group; table-column; table-cell; table-caption;(表格标题) /*display 属性的了解很模糊*/方框属性: (Box)width:; height:; float:; clear:both; margin:; padding:; 顺序:上右下左边框属性: (Border)border-style: dotted;(点线) dashed;(虚线) solid; double;(双线) groove;(槽线) ridge;(脊状) inset;(凹陷) outset;border-width:; 边框宽度border-color:#;简写方法border:width style color; /*简写*/列表属性: (List-style)类型list-style-type: disc;(圆点) circle;(圆圈) square;(方块) decimal;(数字) lower-roman;(小罗码数字) upper-roman; lower-alpha; upper-alpha;位置list-style-position: outside;(外) inside;图像list-style-image: url(..);定位属性: (Position)Position: absolute; relative; static;visibility: inherit; visible; hidden;overflow: visible; hidden; scroll; auto;clip: rect(12px,auto,12px,auto) (裁切)css属性代码大全一 CSS文字属性:color : #999999; /*文字颜色*/font-family : 宋体,sans-serif; /*文字字体*/font-size : 9pt; /*文字大小*/font-style:itelic; /*文字斜体*/font-variant:small-caps; /*小字体*/letter-spacing : 1pt; /*字间距离*/line-height : 200%; /*设置行高*/font-weight:bold; /*文字粗体*/vertical-align:sub; /*下标字*/vertical-align:super; /*上标字*/text-decoration:line-through; /*加删除线*/text-decoration: overline; /*加顶线*/text-decoration:underline; /*加下划线*/text-decoration:none; /*删除链接下划线*/text-transform : capitalize; /*首字大写*/text-transform : uppercase; /*英文大写*/text-transform : lowercase; /*英文小写*/text-align:right; /*文字右对齐*/text-align:left; /*文字左对齐*/text-align:center; /*文字居中对齐*/text-align:justify; /*文字分散对齐*/vertical-align属性vertical-align:top; /*垂直向上对齐*/vertical-align:bottom; /*垂直向下对齐*/vertical-align:middle; /*垂直居中对齐*/vertical-align:text-top; /*文字垂直向上对齐*/vertical-align:text-bottom; /*文字垂直向下对齐*/二、CSS边框空白padding-top:10px; /*上边框留空白*/padding-right:10px; /*右边框留空白*/padding-bottom:10px; /*下边框留空白*/padding-left:10px; /*左边框留空白三、CSS符号属性:list-style-type:none; /*不编号*/list-style-type:decimal; /*阿拉伯数字*/list-style-type:lower-roman; /*小写罗马数字*/list-style-type:upper-roman; /*大写罗马数字*/list-style-type:lower-alpha; /*小写英文字母*/list-style-type:upper-alpha; /*大写英文字母*/list-style-type:disc; /*实心圆形符号*/list-style-type:circle; /*空心圆形符号*/list-style-type:square; /*实心方形符号*/list-style-image:url(/dot.gif); /*图片式符号*/list-style-position: outside; /*凸排*/list-style-position:inside; /*缩进*/四、CSS背景样式:background-color:#F5E2EC; /*背景颜色*/background:transparent; /*透视背景*/background-image : url(/image/bg.gif); /*背景图片*/background-attachment : fixed; /*浮水印固定背景*/background-repeat : repeat; /*重复排列-网页默认*/background-repeat : no-repeat; /*不重复排列*/background-repeat : repeat-x; /*在x轴重复排列*/background-repeat : repeat-y; /*在y轴重复排列*/指定背景位置background-position : 90% 90%; /*背景图片x与y轴的位置*/background-position : top; /*向上对齐*/background-position : buttom; /*向下对齐*/background-position : left; /*向左对齐*/background-position : right; /*向右对齐*/background-position : center; /*居中对齐*/五、CSS连接属性:a /*所有超链接*/a:link /*超链接文字格式*/a:visited /*浏览过的链接文字格式*/a:active /*按下链接的格式*/a:hover /*鼠标转到链接*/鼠标光标样式:链接手指 CURSOR: hand十字体 cursor:crosshair箭头朝下 cursor:s-resize十字箭头 cursor:move箭头朝右 cursor:move加一问号 cursor:help箭头朝左 cursor:w-resize箭头朝上 cursor:n-resize箭头朝右上 cursor:ne-resize箭头朝左上 cursor:nw-resize文字I型 cursor:text箭头斜右下 cursor:se-resize箭头斜左下 cursor:sw-resize漏斗 cursor:wait光标图案(IE6) p {cursor:url("光标文件名.cur"),text;}六、CSS框线一览表:border-top : 1px solid #6699cc; /*上框线*/border-bottom : 1px solid #6699cc; /*下框线*/border-left : 1px solid #6699cc; /*左框线*/border-right : 1px solid #6699cc; /*右框线*/以上是建议书写方式,但也可以使用常规的方式 如下:border-top-color : #369 /*设置上框线top颜色*/border-top-width :1px /*设置上框线top宽度*/border-top-style : solid/*设置上框线top样式*/其他框线样式solid /*实线框*/dotted /*虚线框*/double /*双线框*/groove /*立体内凸框*/ridge /*立体浮雕框*/inset /*凹框*/outset /*凸框*/七、CSS表单运用:文字方块按钮复选框选择钮多行文字方块下拉式菜单 选项1选项2八、CSS边界样式:margin-top:10px; /*上边界*/margin-right:10px; /*右边界值*/margin-bottom:10px; /*下边界值*/margin-left:10px; /*左边界值*/CSS 属性: 字体样式(Font Style)序号 中文说明 标记语法1 字体样式 {font:font-style font-variant font-weight font-size font-family}2 字体类型 {font-family:"字体1","字体2","字体3",...}3 字体大小 {font-size:数值|inherit| medium| large| larger| x-large| xx-large| small| smaller| x-small| xx-small}4 字体风格 {font-style:inherit|italic|normal|oblique}5 字体粗细 {font-weight:100-900|bold|bolder|lighter|normal;}6 字体颜色 {color:数值;}7 阴影颜色 {text-shadow:16位色值}8 字体行高 {line-height:数值|inherit|normal;}9 字 间 距 {letter-spacing:数值|inherit|normal}10 单词间距 {word-spacing:数值|inherit|normal}11 字体变形 {font-variant:inherit|normal|small-cps }12 英文转换 {text-transform:inherit|none|capitalize|uppercase|lowercase}13 字体变形 {font-size-adjust:inherit|none}14 字体 {font-stretch:condensed|expanded|extra-condensed|extra-expanded|inherit|narrower|normal| semi-condensed|semi-expanded|ultra-condensed|ultra-expanded|wider}文本样式(Text Style)序号 中文说明 标记语法1 行 间 距 {line-height:数值|inherit|normal;}2 文本修饰 {text-decoration:inherit|none|underline|overline|line-through|blink}3 段首空格 {text-indent:数值|inherit}4 水平对齐 {text-align:left|right|center|justify}5 垂直对齐 {vertical-align:inherit|top|bottom|text-top|text-bottom|baseline|middle|sub|super}6 书写方式 {writing-mode:lr-tb|tb-rl}背景样式序号 中文说明 标记语法1 背景颜色 {background-color:数值}2 背景图片 {background-image: url(URL)|none}3 背景重复 {background-repeat:inherit|no-repeat|repeat|repeat-x|repeat-y}4 背景固定 {background-attachment:fixed|scroll}5 背景定位 {background-position:数值|top|bottom|left|right|center}6 背影样式 {background:背景颜色|背景图象|背景重复|背景附件|背景位置}框架样式(Box Style)序号 中文说明 标记语法1 边界留白 {margin:margin-top margin-right margin-bottom margin-left}2 补 白 {padding:padding-top padding-right padding-bottom padding-left}3 边框宽度 {border-width:border-top-width border-right-width border-bottom-width border-left-width} 宽度值: thin|medium|thick|数值4 边框颜色 {border-color:数值 数值 数值 数值} 数值:分别代表top、right、bottom、left颜色值5 边框风格 {border-style:none|hidden|inherit|dashed|solid|double|inset|outset|ridge|groove}6 边 框 {border:border-width border-style color}上 边 框 {border-top:border-top-width border-style color}右 边 框 {border-right:border-right-width border-style color}下 边 框 {border-bottom:border-bottom-width border-style color}左 边 框 {border-left:border-left-width border-style color}7 宽 度 {width:长度|百分比| auto}8 高 度 {height:数值|auto}9 漂 浮 {float:left|right|none}10 清 除 {clear:none|left|right|both}分类列表序号 中文说明 标记语法1 控制显示 {display:none|block|inline|list-item}2 控制空白 {white-space:normal|pre|nowarp}3 符号列表 {list-style-type:disc|circle|square|decimal|lower-roman|upper-roman|lower-alpha|upper-alpha|none}4 图形列表 {list-style-image:URL}5 位置列表 {list-style-position:inside|outside}6 目录列表 {list-style:目录样式类型|目录样式位置|url}7 鼠标形状 {cursor:hand|crosshair|text|wait|move|help|e-resize|nw-resize|w-resize|s-resize|se-resize|sw-resize}
一、时间会告诉我们,简单的喜欢,最长远;平凡中的陪伴,最心安;懂你的人,最温暖。二、希望以后的日子里,有人给你波澜不惊的爱情,有人陪你看细水长流的风景。三、眼里没你的人,你何必放心里;情里没你的份,你何苦一往情深。但同时记住,永远不要因为新鲜感,扔掉一直陪伴你的人。四、看着不喜欢的人,学着将内心的不满沉淀,看着喜欢的人,学着将内心的情绪隐藏。五、“承诺”没有统一零售价,有时一文不值,有时千金难买。六、无论身边是否有个可以拥抱的人,真正能够温暖自己的,还是只有自己的体温。让自己变得更强大,对自己好一点,永远不会错。七、生活就是这样,总在你以为一切顺遂时,给你来个措手不及。八、我特别怕,在我主动联系某人想说什么的时候,久久得不到回应,或在多久后得到几个字的敷衍,瞬间没了说下去的心情。九、有时候你把什么放下了,不是因为突然就舍得了,而是因为期限到了,任性够了,成熟多了,也就知道这一页该翻过去了。十、愿你穿自己喜欢的衣服,和不累的人相处,和所有喜欢的一切在一起,过想象里的一百种生活。十一、最宝贵的东西不是你拥有的物质,而是陪伴在你身边的人。不能强迫别人来爱自己,只能努力让自己成为值得爱的人。十二、你应该去喜欢那些,能让你觉得自己很美好,由衷感受到温暖的人。而不是那些让你低到尘埃里,觉得自己很没用的人。十三、不怕你憨厚吃亏,也不怕你精明过人,就怕你半精办傻的,占不到便宜也交不到朋友。十四、一个人可以没有爱情,可以没有情人,但不能没有对爱情的癖好。十五、从不喜欢强迫别人做什么,你要是喜欢我就喜欢,不喜欢我也随你便。同样,你要是愿意一直陪在我身边很好,要走我也不会挽留。十六、早成者未必有成,晚达者未必不达。不可以年少而自恃,不可以年老而自弃。十七、谁也不能陪谁一辈子,谁也不是谁的谁,都只是匆匆一过客。十八、有人说,人间就是一个剧场,我们都是剧场里形形色色的演员,自己的人生总是充满着多种角色,其中最重要的一个角色就是:自己。十九、不想回的消息就不回,讨厌的人就离远一点,不开心就表现出来,不要总活在看别人脸色的生活中。二十、谎言与誓言的差别在于:一个是听的人当了真,一个是说的人用了心。二十一、我们永远不要期待别人的拯救,只有自己才能升华自己,自己准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。二十二、淡然地过着自己的生活,如果没有轰轰烈烈,那就安安心心。不是不追求,只是不去强求。二十三、时间的绝情之处在于,它让你熬到真相,却不给你任何补偿。二十四、所谓花心,就是有了感情和面包,还想吃蛋糕的情绪;所谓外遇,就是潜出围城,跌入陷阱;所谓浪漫,就是帮老婆买包心菜时,还会顺手带回一支玫瑰花;所谓厨房,就是结婚时红地毯通向的正前方……
一、代码生成效果二、完整代码及其详解1、index.html<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户登录</title>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body>
<div>
<div>
<div>
<h1>用户登录</h1>
<p>欢迎回来,请登录您的账号</p>
</div>
<form id="login-form">
<div>
<div>
<i class="fas fa-user"></i>
<input type="text" id="username" name="username" placeholder="用户名" required>
</div>
<div id="username-error"></div>
</div>
<div>
<div>
<i class="fas fa-lock"></i>
<input type="password" id="password" name="password" placeholder="密码" required>
<button type="button" id="toggle-password">
<i class="fas fa-eye"></i>
</button>
</div>
<div id="password-error"></div>
</div>
<div>
<label>
<input type="checkbox" name="remember"> 记住我
</label>
<a href="#">忘记密码?</a>
</div>
<button type="submit">登录</button>
</form>
<div>
<p>还没有账号? <a href="#" id="register-link">立即注册</a></p>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>1.1 文档基础结构采用HTML5标准文档结构,以<!DOCTYPE html>声明开头,根元素<html lang="zh-CN">明确指定页面语言为简体中文,确保浏览器正确解析内容和提供语言相关服务(如翻译提示)。1.2 元数据配置• 字符编码:通过<meta charset="UTF-8">设置,支持全球绝大多数语言字符显示,避免中文等非英文字符乱码。• 视口设置:<meta name="viewport" content="width=device-width, initial-scale=1.0">确保页面在移动设备上正确缩放,width=device-width使页面宽度等于设备屏幕宽度,initial-scale=1.0设置初始缩放比例为1:1,是响应式设计的基础。• 页面标题:<title>用户登录</title>定义浏览器标签页标题,提升用户体验和SEO友好性。1.3 资源引入• 外部样式:通过<link rel="stylesheet" href="style.css">引入自定义CSS文件,控制页面视觉呈现;<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">引入Font Awesome图标库,用于美化输入框前缀图标(如用户图标fa-user、锁图标fa-lock)。• 脚本文件:在<body>结束前通过<script src="script.js"></script>引入JavaScript文件,确保DOM元素加载完成后再执行脚本,避免找不到元素的错误。1.4 DOM元素结构页面核心为登录表单,采用模块化结构设计:• 容器层:.login-container(最大宽度420px)和.login-box(卡片式容器)实现居中布局和视觉隔离。• 头部区域:.login-header包含标题<h1>用户登录</h1>和副标题<p>欢迎回来,请登录您的账号</p>,明确页面用途。• 表单主体:<form id="login-form" class="login-form">包含:◦ 用户名输入组:含<i class="fas fa-user"></i>图标、<input type="text" id="username">输入框和<div id="username-error">错误提示区。◦ 密码输入组:含<i class="fas fa-lock"></i>图标、<input type="password" id="password">输入框、密码可见性切换按钮<button class="toggle-password">(图标fa-eye)和<div id="password-error">错误提示区。◦ 辅助选项:.form-options包含“记住我”复选框和“忘记密码”链接。◦ 操作按钮:<button type="submit" class="login-btn">登录</button>触发表单提交。• 注册引导:.register-option提供“立即注册”链接,引导新用户转化。2、style.css————————————————:root {
--primary-color: #6c5ce7;
--primary-dark: #5d4cc8;
--primary-light: #e8f0fe;
--secondary-color: #00cec9;
--accent-color: #fd79a8;
--text-color: #2d3436;
--text-light: #636e72;
--error-color: #d63031;
--success-color: #00b894;
--warning-color: #fdcb6e;
--info-color: #0984e3;
--border-color: #b2bec3;
--bg-gradient: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
--card-gradient: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
--shadow: 0 8px 24px rgba(108, 99, 231, 0.15);
--transition: all 0.3s ease;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: var(--bg-gradient);
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
padding: 20px;
background-attachment: fixed;
}
.login-container {
width: 100%;
max-width: 420px;
}
.login-box {
background: var(--card-gradient);
border-radius: 12px;
box-shadow: var(--shadow);
padding: 40px;
transition: var(--transition);
border: 1px solid rgba(255, 255, 255, 0.5);
}
.login-box:hover {
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
}
.login-header {
text-align: center;
margin-bottom: 30px;
}
.login-header h1 {
background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
font-size: 28px;
margin-bottom: 8px;
font-weight: 700;
}
.login-header p {
color: var(--text-light);
font-size: 14px;
}
.login-form .form-group {
margin-bottom: 20px;
}
.input-icon {
position: relative;
}
.login-form input {
width: 100%;
padding: 14px 14px 14px 45px;
border: 1px solid var(--border-color);
border-radius: 8px;
font-size: 15px;
transition: var(--transition);
}
.login-form input:focus {
outline: none;
border-color: var(--primary-color);
box-shadow: 0 0 0 3px rgba(108, 99, 231, 0.2);
border-width: 2px;
}
.input-icon i {
position: absolute;
left: 15px;
top: 50%;
transform: translateY(-50%);
color: var(--text-light);
font-size: 18px;
}
.toggle-password {
position: absolute;
right: 15px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
color: var(--text-light);
cursor: pointer;
font-size: 18px;
transition: var(--transition);
}
.toggle-password:hover {
color: var(--primary-color);
}
.error-message {
color: var(--error-color);
font-size: 13px;
margin-top: 5px;
height: 16px;
display: none;
display: flex;
align-items: center;
}
.error-message::before {
content: 'f071';
font-family: 'Font Awesome 6 Free';
font-weight: 900;
margin-right: 5px;
font-size: 12px;
}
.form-options {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
.remember-me {
display: flex;
align-items: center;
color: var(--text-light);
font-size: 14px;
}
.remember-me input {
width: auto;
margin-right: 8px;
}
.forgot-password {
color: var(--primary-color);
font-size: 14px;
text-decoration: none;
transition: var(--transition);
}
.forgot-password:hover {
color: var(--primary-dark);
text-decoration: underline;
}
.login-btn {
width: 100%;
padding: 14px;
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
transition: var(--transition);
position: relative;
overflow: hidden;
}
.login-btn::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0) 70%);
transform: rotate(30deg);
animation: shine 3s infinite;
}
@keyframes shine {
0% { transform: translateX(-100%) rotate(30deg); }
100% { transform: translateX(100%) rotate(30deg); }
}
.login-btn:hover {
background-color: var(--primary-dark);
}
.login-btn:active {
transform: scale(0.98);
}
.register-option {
text-align: center;
margin-top: 20px;
color: var(--text-light);
font-size: 14px;
}
.register-option a {
color: var(--primary-color);
text-decoration: none;
font-weight: 500;
transition: var(--transition);
}
.register-option a:hover {
color: var(--primary-dark);
text-decoration: underline;
}
/* 响应式设计 */
@media (max-width: 480px) {
.login-box {
padding: 30px 20px;
}
}
/* 动画效果 */
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.login-box {
animation: fadeIn 0.5s ease forwards;
}
.form-group {
animation: fadeIn 0.5s ease forwards;
opacity: 0;
}
.form-group:nth-child(1) { animation-delay: 0.1s; }
.form-group:nth-child(2) { animation-delay: 0.2s; }
.form-options { animation-delay: 0.3s; animation: fadeIn 0.5s ease forwards; opacity: 0; }
.login-btn { animation-delay: 0.4s; animation: fadeIn 0.5s ease forwards; opacity: 0; }
.register-option { animation-delay: 0.5s; animation: fadeIn 0.5s ease forwards; opacity: 0; }2.1 CSS变量系统通过:root伪类定义全局样式变量,实现样式统一管理和便捷维护:变量名值用途描述--primary-color#6c5ce7主色调(紫色),用于强调元素--primary-dark#5d4cc8主色调深色变体,用于hover状态--primary-light#e8f0fe主色调浅色变体,用于背景--secondary-color#00cec9辅助色(青色),用于渐变效果--accent-color#fd79a8强调色(粉色),预留扩展使用--text-color#2d3436主要文本色(深灰)--text-light#636e72次要文本色(浅灰)--error-color#d63031错误提示色(红色)--success-color#00b894成功状态色(绿色)--warning-color#fdcb6e警告色(黄色),预留扩展使用--info-color#0984e3信息提示色(蓝色),预留扩展使用--border-color#b2bec3边框色(浅灰)--bg-gradient线性渐变(135deg, #f5f7fa 0%, #c3cfe2 100%)页面背景渐变--card-gradient线性渐变(135deg, #ffffff 0%, #f8f9fa 100%)卡片背景渐变--shadow0 8px 24px rgba(108, 99, 231, 0.15)卡片阴影效果--transitionall 0.3s ease统一过渡动画设置2.2 全局样式重置与基础设置• 盒模型重置:* { margin: 0; padding: 0; box-sizing: border-box; }将所有元素的盒模型设置为border-box,使width和height包含边框和内边距,避免布局计算偏差。• 字体设置:font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;指定跨平台无衬线字体栈,确保在Windows、macOS等系统上均有良好显示效果。• 页面背景:body { background: var(--bg-gradient); min-height: 100vh; display: flex; justify-content: center; align-items: center; }通过Flexbox将登录框垂直水平居中,min-height: 100vh确保背景占满整个视口高度。2.3 核心组件样式设计2.3.1 登录容器• .login-container:限制最大宽度为420px,确保在大屏幕上表单不过宽,提升可读性。• .login-box:采用var(--card-gradient)白色渐变背景,border-radius: 12px圆角,var(--shadow)阴影增强立体感;padding: 40px内边距提供充足空间,border: 1px solid rgba(255,255,255,0.5)半透明白色边框增加层次感。2.3.2 表单元素样式• 输入框:.login-form input设置width: 100%占满容器,padding: 14px 14px 14px 45px预留图标空间,border: 1px solid var(--border-color)灰色边框,border-radius: 8px圆角;焦点状态(:focus)时,border-color: var(--primary-color)变为紫色边框,box-shadow: 0 0 0 3px rgba(108, 99, 231, 0.2)紫色外发光,清晰反馈交互状态。• 图标定位:.input-icon i通过position: absolute绝对定位,left: 15px; top: 50%; transform: translateY(-50%)实现垂直居中,显示在输入框左侧。• 密码切换按钮:.toggle-password同样绝对定位在输入框右侧(right: 15px),初始图标fa-eye,点击后切换为fa-eye-slash,颜色从var(--text-light)变为var(--primary-color)(hover状态)。2.3.3 按钮与交互元素• 登录按钮:.login-btn采用linear-gradient(135deg, var(--primary-color), var(--secondary-color))紫色到青色渐变背景,color: white白色文字,font-weight: 600加粗字体;点击反馈(:active)时transform: scale(0.98)轻微缩小,提升点击质感;加载动画通过伪元素::before实现径向渐变光斑从左到右滑动(animation: shine 3s infinite),营造动态效果。• 链接样式:.forgot-password和#register-link使用var(--primary-color)紫色文本,hover时变为var(--primary-dark)深紫色并添加下划线,明确可交互性。2.4 动画与响应式设计• 渐入动画:定义@keyframes fadeIn(从opacity: 0; transform: translateY(10px)到opacity: 1; transform: translateY(0)),为登录框及内部元素设置不同延迟(.form-group:nth-child(1)延迟0.1s,依次递增),实现序列式入场效果,增强页面生动性。• 错误抖动动画:通过JS动态添加的.error-shake类触发,关键帧shake定义左右摇摆效果(10%-90% translateX(-1px),20%-80% translateX(2px)等),强化错误反馈。• 响应式适配:@media (max-width: 480px)媒体查询针对手机设备,将.login-box内边距从40px减为30px 20px,避免小屏设备内容拥挤。
在CSS中,如果你遇到了“过长”的样式规则或代码,这通常意味着你的样式表不够整洁、优化或者过于复杂。这里有几种方法可以帮助你解决或优化这个问题:效果图:CSS:.css-376mun { -webkit-line-clamp: 4; -webkit-box-orient: vertical; color: #535861; color: var(--GBK04A); display: -webkit-box; font-size: 15px; font-weight: 400; line-height: 25px; overflow: hidden; text-overflow: ellipsis;}HTML:<div class="css-376mun" >HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制HTML5的设计目的是为了在移动设备上支持多媒体。</div>通过以上方法,你可以有效地减少CSS的复杂性和冗余,使你的样式表更加整洁和高效。
HTML部分:<!DOCTYPE html><html><head> <title>JSON分页</title></head><body><script type="text/javascript">function getPageList(pageno){ var req=new XMLHttpRequest(); req.open('get','JSON_Fenye.php?pageNow='+pageno); req.onreadystatechange=function(){ if(req.readyState==4 && req.status==200){ //将传来的字符串转化为对象 eval('var info='+req.responseText); var str='<tr><th>ID</th><th>姓名</th><th>邮箱</th><th>等级</th></tr>'; //循环取出info对象中的数据 for(var i=0,n=info.length-1;i<n;i++){ str+='<tr><td>'+info[i].id+'</td><td>'+info[i].name+'</td><td>'+info[i].email+'</td><td>'+info[i].level+'</td></tr>'; } //分页链接 str+='<tr><td colspan="4" align="center">'; for(var i=1;i<=info[info.length-1];i++){ str+='<a href="javascript:void(0)" onclick="getPageList('+i+')">'+i+'</a> '; console.log(i); } str+='</td></tr>'; //把数据输出到浏览器 document.getElementById('result').innerHTML=str; } } req.send(null);}//默认显示第一页window.onload=function(){ getPageList(1);}</script><table id='result'></table></body></html>PHP面页部分:<?php /***JSON分页*///链接数据库@mysql_connect('localhost','root','');@mysql_select_db('empmanage');@mysql_query('set name utf8');//获取总记录数$rs = mysql_query('select count(*) from emp');$rows = mysql_fetch_row($rs);$recordCount = $rows[0];//每页显示多少条pageSize$pageSize = 5;//总页数 = 总记录/每页显示多少$pageCount=ceil($recordCount/$pageSize);//获取当前页 三元运算 若不存在pageNow则默认显示第1页$pageNow = isset($_GET['pageNow'])? $_GET['pageNow']:1;if ($pageNow < 1) { $pageNow = 1;}elseif ($pageNow > $pageCount) { $pageNow = $pageCount;}//起始位置 每页从第几条数据显示$pageStart = ($pageNow-1)*$pageSize;//从哪条开始显示,限制每页显示几条$sql = "select * from emp limit $pageStart,$pageSize";//链接数据库$rs = mysql_query($sql);//定义数组,把数据存放在数组中$info = array();while ($rows = mysql_fetch_assoc($rs)) { $info[] = $rows;}//将总页码保存到数组$info[] = $pageCount;echo json_encode($info); ?>
根据你提供的要求,以下是一个示例的回答文本,该文本内容为 JSON 格式,用于显示含有图片的文章:“`json{ “title”: “如何制作一杯美味的咖啡”, “content”: [ { “type”: “text”, “text”: “制作一杯美味的咖啡并不复杂,以下是一个简单的步骤:” }, { “type”: “image”, “url”: “https://example.com/images/step_1.jpg”, “caption”: “步骤1:准备所需的咖啡豆” }, { “type”: “text”, “text”: “首先,准备所需的咖啡豆。优质的咖啡豆是制作美味咖啡的关键。选择喜欢的口味和品种,并确保咖啡豆的新鲜度。” }, { “type”: “image”, “url”: “https://example.com/images/step_2.jpg”, “caption”: “步骤2:磨碎咖啡豆” }, { “type”: “text”, “text”: “其次,磨碎咖啡豆。使用咖啡研磨机将咖啡豆磨成适合自己口味的粗细程度。磨碎的咖啡豆能够释放出更多的香气和味道。” }, { “type”: “image”, “url”: “https://example.com/images/step_3.jpg”, “caption”: “步骤3:冲泡咖啡” }, { “type”: “text”, “text”: “然后,冲泡咖啡。使用咖啡机或手冲器具将磨碎的咖啡豆加入热水中进行冲泡。冲泡时间和水温可以根据个人口味进行调整。” }, { “type”: “image”, “url”: “https://example.com/images/step_4.jpg”, “caption”: “步骤4:享受美味” }, { “type”: “text”, “text”: “最后,倒入杯子中,加入糖或牛奶作为调味品,然后静静地品味你制作的美味咖啡。” } ]}“`以上是一个示例的 JSON 文本,通过使用不同类型的对象,分别表示文章中的文字段落和图片。其中,每个图片对象包含了图片的 URL 和说明文字。根据你的需求,这样的 JSON 结构可以帮助你清晰地呈现含有图片的文章内容。
可以将下面的代码保存在一个文件里如:myAjax.js,以后在项目中如果觉得jquery那一套很重,就完全可以使用自己的ajax库,不用担心性能和兼容性!/** * 创建ajax请求对象 * @returns XMLHTTPREQUEST */function createAjaxObj(){ var req ; if(window.XMLHttpRequest){ req=new XMLHttpRequest(); }else{ req=new ActiveXObject("Msxml2.XMLHTTP"); } return req;}/** * 发送 ajax 请求 * @param method get/post * @param url 请求路径 * @param params 参数列表 格式a=?&&b=? * @param async true 异步 false 同步 * @param handle200 处理成功的函数 * @param loading 处理加载中的函数 * @param handle404 处理找不到地址的函数 * @param handle500 处理服务器内部出错的函数 */function sendAjaxReq(method,url,params,async,handle200,loading,handle404,handle500){ var req = createAjaxObj(); req.onreadystatechange = function(){ if(4==req.readyState){ if(200==req.status){ if(handle200){ handle200(req.responseText); } }else if(404==req.status){ if(handle404){ handle404(); } }else if(500==req.status){ if(handle500){ handle500(); } } }else{ if(loading){ loading(); } } }; if("get"==method.toLowerCase()){ req.open(method,url+(params==null?"":"?"+params),async); req.send(null); }else if("post" ==method.toLowerCase()){ req.open(method,url,async); req.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); req.send(params); }}/** For Example// 使用自己的ajax 类库发送 请求 sendAjaxReq("post", "${base}/brandAjax/checkBrandId.do", "brandId="+brandId,true, function(req){ eval(" var data="+ req.responseText); if(data.message==true){ alert("品牌ID:"+brandId+"已存在,不可重复添加!"); $("#hidBrandId")[0].innerHTML=""; $("#brandName").val(""); }else{ submitFlag=1; $("#selBrand")[0].style.display = "none"; } });*/
LayUI 下拉框联动,选择一个其他根据对应关系自动选择。HTML代码如下:<div class='layui-fluid'> <div class='layui-card'> <form class="layui-form layui-card-header layuiadmin-card-header-auto" lay-filter="lay_from"> <div class="layui-form-item"> <div class="layui-inline"> <label class="layui-form-label">监管方式</label> <div class="layui-input-inline"> <select name="tradeMode"> <option value="9710">跨境电商B2B直接出口</option> <option value="9810">跨境电商出口海外仓</option> </select> </div> <label class="layui-form-label">出境关别</label> <div class="layui-input-inline"> <select name="iEPort" lay-filter="iEPort"> <option value="4204">4204-威海海关</option> <option value="4209">4209-荣成海关</option> <option value="4236">4236-荣龙眼办</option> <option value="4201">4201-烟台海关</option> <option value="4202">4202-日照海关</option> <option value="4218">4218-青开发区</option> <option value="4258">4258-青前湾港</option> <option value="4227">4227-青岛大港</option> </select> </div> </div> <div class="layui-inline"> <label class="layui-form-label">离境口岸</label> <div class="layui-input-inline"> <select name="ePort" id="ePort"> <option value="371202">371202-威海港</option> <option value="370401">370401-石岛</option> <option value="370402">370402-龙眼</option> <option value="370302">370302-烟台港</option> <option value="370002">370002-日照</option> <option value="370201">370201-黄岛</option> <option value="370101">370101-青岛港</option> </select> </div> </div> </div> </form> </div></div>JS代码<script type="text/javascript"> layui.use(function () { var upload = layui.upload, form = layui.form; form.on('select(iEPort)',function (data) { //监听到了下拉框选择的选项,传递过来 var port = data.value; // console.log(data);//在控制台输出信息 //匹配规则(对应关系) if (port == 4204){ //表单初始赋值 form.val('lay_from', { //注意lay_from "ePort": 371202 }) } else if(port == 4209){ form.val('lay_from', { "ePort": 370401 }) } else if(port == 4236){ form.val('lay_from', { "ePort": 370402 }) } else if(port == 4201){ form.val('lay_from', { "ePort": 370302 }) } else if(port == 4202){ form.val('lay_from', { "ePort": 370002 }) } else if(port == 4227){ form.val('lay_from', { "ePort": 370101 }) } else { form.val('lay_from', { "ePort": 370201 }) } //重新加载layui的表单 form.render(); }); });</script>
用户账号的唯一性登录是通过限制同一账号在同一时间内的多点登录来确保账户安全、数据一致性和系统资源的合理使用。要用PHP实现这一功能,可以通过在用户登录时记录每个账户的会话信息,并在每次访问时验证会话信息的有效性来实现。实现的方法包括但不限于使用数据库存储会话标识、利用文件系统记录会话信息、以及采用PHP Session机制来维护唯一登录状态。接下来将详细介绍实现过程。一、数据库存储会话标识创建会话标识记录表首先,在数据库中创建一个表用来存储用户的会话标识和登录时间。表结构通常包括用户ID、会话标识(如Token或Session ID)、登录时间等字段。CREATE TABLE `user_sessions` (
`user_id` INT NOT NULL,
`session_id` VARCHAR(255) NOT NULL,
`login_time` DATETIME NOT NULL,
PRIMARY KEY (`user_id`)
);登录时记录会话标识用户登录时,生成一个唯一的会话标识,并将其存入user_sessions表中。如果该用户ID已存在记录,则更新会话标识和登录时间。session_start();
$user_id = // 用户ID;
$session_id = session_id();
$login_time = date('Y-m-d H:i:s');
// 更新或插入数据库
// 注意这里的代码只是示例,实际应用中需考虑SQL注入等安全性问题
$query = "REPLACE INTO user_sessions (user_id, session_id, login_time) VALUES ('$user_id', '$session_id', '$login_time')";
// 执行数据库操作...验证会话标识在用户每次请求时,验证当前的会话标识与数据库中存储的是否一致。如果不一致,说明该账号在其他地方登录了,则当前用户需要被登出。
1、DIV和CSS样式层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。[1]CSS能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。DIV是html的一个标签,css是一个样式表网页中的div与样式表————————————————版权声明:本文为CSDN博主「芝芝又荔枝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_44891093/article/details/127121683
今天遇到了layui运用富文本编辑器 提交表单时内容为空。网上找了很多解决方法,不知道具体在哪加代码。现在整理出来方便自己跟朋友今后操作。html代码如下:<textarea id="content" name="content" style="display: none;" lay-verify="content"></textarea>js如下:layui.use(['layedit','form', 'layer'], function () { $ = layui.jquery; var form = layui.form , layer = layui.layer, layedit = layui.layedit;//富文本编辑器自定义工具栏//下面验证代码中有个index参数,需要在初始化富文本编辑器的时候设置下:var index = layedit.build('content', { tool: ['strong','italic','face','underline','del', 'link', 'unlink', '|', 'left', 'center', 'right','b'] ,height: 150}) //自定义验证规则 //数据异步提交未同步的原因,使用layedit.sync(index) 解决form.verify({ content: function(value) { return layedit.sync(index); }}); //监听提交 form.on('submit(add)', function(data){ //数据异步提交未同步的原因,使用layedit.sync(index) 解决layedit.sync(index);layer.alert(JSON.stringify(data.field), { title: '最终的提交信息'})return false; }); });
兄弟打印机维修思路步骤详细分解...
兄弟打印机维修思路步骤详细分解...
0基础
推广变现
免费观看
佳能打印机维护以及维修教程...
...
0基础
推广变现
免费观看
UI 设计基础及平面设计课程...
...
0基础
推广变现
免费观看
内容3