/*设置文字不能被选中 以下为css样式*/
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
/*设置文字不能被选中 以下为css样式*/
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
css中鼠标放上去变成手型怎么设置:其实就是一个属性的问题,
css的cursor属性
cursor:pointer;
default:标准箭头 //这是默认的样式
pointer:手形光标
wait :等待光标
text:I形光标
vertical-text :水平I形光标
no-drop:不可拖动光标
not-allowed:无效光标
help:帮助光标
all-scroll:三角方向标
move :移动标
crosshair:十字标
有的地方手型用hand,在这里隆重的说明,不要用hand,有些浏览器不支持。
github地址:https://github.com/binwind8/tncode
重要的文件:
1、tncode.js
/*! tncode 1.2 author:weiyingbin email:277612909@qq.com
//@ object webiste: http://www.39gs.com/archive/259.html
//@ https://github.com/binwind8/tncode
*/
if(!document.getElementByClassName){
function hasClass(elem, cls) {
cls = cls || '';
if (cls.replace(/\s/g, '').length == 0) return false; //当cls没有参数时,返回false
var ret = new RegExp(' ' + cls + ' ').test(' ' + elem.className + ' ');
return ret;
}
document.getElementByClassName = function(className,index){
var nodes=document.getElementsByTagName("*");//获取页面里所有元素,因为他会匹配全页面元素,所以性能上有缺陷,但是可以约束他的搜索范围;
var arr=[];//用来保存符合的className;
for(var i=0;i<nodes.length;i++){
if(hasClass(nodes[i],className)) arr.push(nodes[i]);
}
if(!index)index=0;
return index==-1?arr:arr[index];
};
function addClass( elements,cName ){
if( !hasClass( elements,cName ) ){
elements.className += " " + cName;
};
}
function removeClass( elements,cName ){
if( hasClass( elements,cName ) ){
elements.className = elements.className.replace( new RegExp( "(\\s|^)" + cName + "(\\s|$)" )," " ); // replace方法是替换
};
}
}
function appendHTML(o,html) {
var divTemp = document.createElement("div"), nodes = null
, fragment = document.createDocumentFragment();
divTemp.innerHTML = html;
nodes = divTemp.childNodes;
for (var i=0, length=nodes.length; i<length; i+=1) {
fragment.appendChild(nodes[i].cloneNode(true));
}
o.appendChild(fragment);
nodes = null;
fragment = null;
};
var _ajax = function() {};
_ajax.prototype = {
request: function(method, url, callback, postVars) {
var xhr = this.createXhrObject()();
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
(xhr.status === 200) ?
callback.success(xhr.responseText, xhr.responseXML) :
callback.failure(xhr,status);
};
if (method !== "POST"&&postVars) {
url += "?" + this.JSONStringify(postVars);
postVars = null;
}
xhr.open(method, url, true);
xhr.send(postVars);
},
createXhrObject: function() {
var methods = [
function() { return new XMLHttpRequest(); },
function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
],
i = 0,
len = methods.length,obj;
for (; i < len; i++) {
try {
methods[i];
} catch(e) {
continue;
}
this.createXhrObject = methods[i];
return methods[i];
}
throw new Error("ajax created failure");
},
JSONStringify: function(obj) {
return JSON.stringify(obj).replace(/"|{|}/g, "")
.replace(/b:b/g, "=")
.replace(/b,b/g, "&");
}
};
var tncode = {
_obj:null,
_tncode:null,
_img:null,
_img_loaded:false,
_is_draw_bg:false,
_is_moving:false,
_block_start_x:0,
_block_start_y:0,
_doing:false,
_mark_w:50,
_mark_h:50,
_mark_offset:0,
_img_w:240,
_img_h:150,
_result:false,
_err_c:0,
_onsuccess:null,
_bind:function(elm,evType,fn){
//event.preventDefault();
if (elm.addEventListener) {
elm.addEventListener(evType, fn);//DOM2.0
return true;
}else if (elm.attachEvent) {
var r = elm.attachEvent(evType, fn);//IE5+
return r;
}
},
_block_start_move:function(e){
if(tncode._doing||!tncode._img_loaded){
return;
}
e.preventDefault();
var theEvent = window.event || e;
if(theEvent.touches){
theEvent = theEvent.touches[0];
}
console.log("_block_start_move");
var obj = document.getElementByClassName('slide_block_text');
obj.style.display="none";
tncode._draw_bg();
tncode._block_start_x = theEvent.clientX;
tncode._block_start_y = theEvent.clientY;
tncode._doing = true;
tncode._is_moving = true;
},
_block_on_move:function(e){
if(!tncode._doing)return true;
if(!tncode._is_moving)return true;
e.preventDefault();
var theEvent = window.event || e;
if(theEvent.touches){
theEvent = theEvent.touches[0];
}
tncode._is_moving = true;
console.log("_block_on_move");
//document.getElementById('msg').innerHTML = "move:"+theEvent.clientX+";"+theEvent.clientY;
var offset = theEvent.clientX - tncode._block_start_x;
if(offset<0){
offset = 0;
}
var max_off = tncode._img_w - tncode._mark_w;
if(offset>max_off){
offset = max_off;
}
var obj = document.getElementByClassName('slide_block');
obj.style.cssText = "transform: translate("+offset+"px, 0px)";
tncode._mark_offset = offset/max_off*(tncode._img_w-tncode._mark_w);
tncode._draw_bg();
tncode._draw_mark();
},
_block_on_end:function(e){
if(!tncode._doing)return true;
e.preventDefault();
var theEvent = window.event || e;
if(theEvent.touches){
theEvent = theEvent.touches[0];
}
console.log("_block_on_end");
tncode._is_moving = false;
tncode._send_result();
},
_send_result:function(){
var haddle = {success:tncode._send_result_success,failure:tncode._send_result_failure};
tncode._result = false;
var re = new _ajax();
re.request('get',tncode._currentUrl().replace('houtai/assets/js', 'config/libs')+'tn_check.php?tn_r='+tncode._mark_offset,haddle);
},
_send_result_success:function(responseText,responseXML){
tncode._doing = false;
if(responseText=='ok'){
tncode._showmsg('验证成功',1);
tncode._result = true;
document.getElementByClassName('hgroup').style.display="block";
//setTimeout(tncode.hide,2500);
setTimeout(function(){
tncode.hide();
tncode._tncode.style.backgroundColor = "#52d192";
tncode._tncode.style.border = "1px solid #52d192";
tncode._tncode.innerHTML = '验证成功';
},2500);
if(tncode._onsuccess){
tncode._onsuccess();
}
}else{
var obj = document.getElementById('tncode_div');
addClass( obj,'dd');
setTimeout(function(){
removeClass( obj,'dd');
},200);
tncode._result = false;
tncode._showmsg('验证失败');
tncode._err_c++;
if(tncode._err_c>5){
tncode.refresh();
}
}
},
_send_result_failure:function(xhr,status){
},
_draw_fullbg:function(){
var canvas_bg = document.getElementByClassName('tncode_canvas_bg');
var ctx_bg = canvas_bg.getContext('2d');
ctx_bg.drawImage(tncode._img, 0, tncode._img_h*2, tncode._img_w, tncode._img_h, 0, 0, tncode._img_w, tncode._img_h);
},
_draw_bg:function(){
if(tncode._is_draw_bg){
return;
}
tncode._is_draw_bg = true;
var canvas_bg = document.getElementByClassName('tncode_canvas_bg');
var ctx_bg = canvas_bg.getContext('2d');
ctx_bg.drawImage(tncode._img, 0, 0, tncode._img_w, tncode._img_h, 0, 0, tncode._img_w, tncode._img_h);
},
_draw_mark:function(){
var canvas_mark = document.getElementByClassName('tncode_canvas_mark');
var ctx_mark = canvas_mark.getContext('2d');
//清理画布
ctx_mark.clearRect(0,0,canvas_mark.width,canvas_mark.height);
ctx_mark.drawImage(tncode._img, 0, tncode._img_h, tncode._mark_w,tncode._img_h,tncode._mark_offset,0,tncode._mark_w, tncode._img_h);
var imageData = ctx_mark.getImageData(0, 0, tncode._img_w, tncode._img_h);
// 获取画布的像素信息
// 是一个一维数组,包含以 RGBA 顺序的数据,数据使用 0 至 255(包含)的整数表示
// 如:图片由两个像素构成,一个像素是白色,一个像素是黑色,那么 data 为
// [255,255,255,255,0,0,0,255]
// 这个一维数组可以看成是两个像素中RBGA通道的数组的集合即:
// [R,G,B,A].concat([R,G,B,A])
var data = imageData.data;
//alert(data.length/4);
var x = tncode._img_h,y=tncode._img_w;
for(var j = 0; j < x; j++) {
var ii = 1,k1=-1;
for(var k=0;k<y&&k>=0&&k>k1;){
// 得到 RGBA 通道的值
var i = (j*y+k)*4;
k+=ii;
var r = data[i]
, g = data[i+1]
, b = data[i+2];
// 我们从最下面那张颜色生成器中可以看到在图片的右上角区域,有一小块在
// 肉眼的观察下基本都是白色的,所以我在这里把 RGB 值都在 245 以上的
// 的定义为白色
// 大家也可以自己定义的更精确,或者更宽泛一些
if(r+g+b<200) data[i+3] = 0;
else{
var arr_pix = [1,-5];
var arr_op = [250,0];
for (var i =1; i<arr_pix[0]-arr_pix[1]; i++) {
var iiii = arr_pix[0]-1*i;
var op = parseInt(arr_op[0]-(arr_op[0]-arr_op[1])/(arr_pix[0]-arr_pix[1])*i);
var iii = (j*y+k+iiii*ii)*4;
data[iii+3] = op;
}
if(ii==-1){
break;
}
k1 = k;
k = y-1;
ii = -1;
};
}
}
ctx_mark.putImageData(imageData, 0, 0);
},
_reset:function(){
tncode._mark_offset = 0;
tncode._draw_bg();
tncode._draw_mark();
var obj = document.getElementByClassName('slide_block');
obj.style.cssText = "transform: translate(0px, 0px)";
},
show:function(){
var obj = document.getElementByClassName('hgroup');
if(obj){
obj.style.display="none";
}
tncode.refresh();
tncode._tncode = this;
document.getElementById('tncode_div_bg').style.display="block";
document.getElementById('tncode_div').style.display="block";
},
hide:function(){
document.getElementById('tncode_div_bg').style.display="none";
document.getElementById('tncode_div').style.display="none";
},
_showmsg:function(msg,status){
if(!status){
status = 0;
var obj = document.getElementByClassName('tncode_msg_error');
}else{
var obj = document.getElementByClassName('tncode_msg_ok');
}
obj.innerHTML = msg;
var setOpacity = function (ele, opacity) {
if (ele.style.opacity != undefined) {
///兼容FF和GG和新版本IE
ele.style.opacity = opacity / 100;
} else {
///兼容老版本ie
ele.style.filter = "alpha(opacity=" + opacity + ")";
}
};
function fadeout(ele, opacity, speed) {
if (ele) {
var v = ele.style.filter.replace("alpha(opacity=", "").replace(")", "") || ele.style.opacity || 100;
v < 1 && (v = v * 100);
var count = speed / 1000;
var avg = (100 - opacity) / count;
var timer = null;
timer = setInterval(function() {
if (v - avg > opacity) {
v -= avg;
setOpacity(ele, v);
} else {
setOpacity(ele, 0);
if(status==0){
tncode._reset();
}
clearInterval(timer);
}
}, 100);
}
}
function fadein(ele, opacity, speed) {
if (ele) {
var v = ele.style.filter.replace("alpha(opacity=", "").replace(")", "") || ele.style.opacity;
v < 1 && (v = v * 100);
var count = speed / 1000;
var avg = count < 2 ? (opacity / count) : (opacity / count - 1);
var timer = null;
timer = setInterval(function() {
if (v < opacity) {
v += avg;
setOpacity(ele, v);
} else {
clearInterval(timer);
setTimeout(function() {fadeout(obj, 0, 6000);},1000);
}
}, 100);
}
}
fadein(obj, 80, 4000);
},
_html:function(){
var d = document.getElementById('tncode_div_bg');
if(d)return;
var html = '<div class="tncode_div_bg" id="tncode_div_bg"></div><div class="tncode_div" id="tncode_div"><div class="loading">加载中</div><canvas class="tncode_canvas_bg"></canvas><canvas class="tncode_canvas_mark"></canvas><div class="hgroup"></div><div class="tncode_msg_error"></div><div class="tncode_msg_ok"></div><div class="slide"><div class="slide_block"></div><div class="slide_block_text">拖动左边滑块完成上方拼图</div></div><div class="tools"><div class="tncode_close"></div><div class="tncode_refresh"></div><div class="tncode_tips"></div></div></div>';
var bo = document.getElementsByTagName('body');
appendHTML(bo[0],html);
},
_currentUrl:function(){
var list = document.getElementsByTagName('script');
for (var i in list) {
var d=list[i];
if(d.src.indexOf('tn_code')!==-1){//js文件名一定要带这个字符
var arr = d.src.split('tn_code');
return arr[0];
}
}
},
refresh:function(){
var isSupportWebp = !![].map && document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0;
var _this = this;
tncode._err_c = 0;
tncode._is_draw_bg = false;
tncode._result = false;
tncode._img_loaded = false;
var obj = document.getElementByClassName('tncode_canvas_bg');
obj.style.display="none";
obj = document.getElementByClassName('tncode_canvas_mark');
obj.style.display="none";
tncode._img = new Image();
var img_url = tncode._currentUrl().replace('houtai/assets/js', 'config/libs')+"tncode.php?t="+Math.random();
if(!isSupportWebp){//浏览器不支持webp
img_url+="&nowebp=1";
}
tncode._img.src = img_url;
tncode._img.onload = function(){
tncode._draw_fullbg();
var canvas_mark = document.getElementByClassName('tncode_canvas_mark');
var ctx_mark = canvas_mark.getContext('2d');
//清理画布
ctx_mark.clearRect(0,0,canvas_mark.width,canvas_mark.height);
tncode._img_loaded = true;
obj = document.getElementByClassName('tncode_canvas_bg');
obj.style.display="";
obj = document.getElementByClassName('tncode_canvas_mark');
obj.style.display="";
};
//alert("Hong Kong ForHarvest Technology and Culture Development Co. Limited".length);
obj = document.getElementByClassName('slide_block');
obj.style.cssText = "transform: translate(0px, 0px)";
obj = document.getElementByClassName('slide_block_text');
obj.style.display="block";
},
init:function(){
var _this = this;
if(!tncode._img){
tncode._html();
var obj = document.getElementByClassName('slide_block');
tncode._bind(obj,'mousedown',_this._block_start_move);
tncode._bind(document,'mousemove',_this._block_on_move);
tncode._bind(document,'mouseup',_this._block_on_end);
tncode._bind(obj,'touchstart',_this._block_start_move);
tncode._bind(document,'touchmove',_this._block_on_move);
tncode._bind(document,'touchend',_this._block_on_end);
var obj = document.getElementByClassName('tncode_close');
tncode._bind(obj,'touchstart',_this.hide);
tncode._bind(obj,'click',_this.hide);
var obj = document.getElementByClassName('tncode_refresh');
tncode._bind(obj,'touchstart',_this.refresh);
tncode._bind(obj,'click',_this.refresh);
var objs = document.getElementByClassName('tncode',-1);
for (var i in objs) {
var o = objs[i];
o.innerHTML = '点击按钮进行验证';
tncode._bind(o,'touchstart',_this.show);
tncode._bind(o,'click',_this.show);
}
}
},
result:function(){
return tncode._result;
},
onsuccess:function(fn){
tncode._onsuccess = fn;
}
};
var $TN = tncode;
var _old_onload = window.onload;
window.onload = function(){
if(typeof _old_onload == 'function'){
_old_onload();
}
tncode.init();
};
2、TnCode.class.php
<?php /*! tncode 1.2 author:weiyingbin email:277612909@qq.com //@ object webiste: http://www.39gs.com/archive/259.html //@ https://github.com/binwind8/tncode */ class TnCode { var $im = null; var $im_fullbg = null; var $im_bg = null; var $im_slide = null; var $bg_width = 240; var $bg_height = 150; var $mark_width = 50; var $mark_height = 50; var $bg_num = 6; var $_x = 0; var $_y = 0; //容错象素 越大体验越好,越小破解难道越高 var $_fault = 3; function __construct(){ //ini_set('display_errors','On'); // error_reporting(0); if(!isset($_SESSION)){ session_start(); } } function make(){ $this->_init(); $this->_createSlide(); $this->_createBg(); $this->_merge(); $this->_imgout(); $this->_destroy(); } function check($offset=''){ if(!$_SESSION['tncode_r']){ return false; } if(!$offset){ $offset = $_REQUEST['tn_r']; } $ret = abs($_SESSION['tncode_r']-$offset)<=$this->_fault; if($ret){ unset($_SESSION['tncode_r']); }else{ $_SESSION['tncode_err']++; if($_SESSION['tncode_err']>10){//错误10次必须刷新 unset($_SESSION['tncode_r']); } } return $ret; } private function _init(){ $bg = mt_rand(1,$this->bg_num); $file_bg = dirname(__FILE__).'/tn_img/bg/'.$bg.'.png'; $this->im_fullbg = imagecreatefrompng($file_bg); $this->im_bg = imagecreatetruecolor($this->bg_width, $this->bg_height); imagecopy($this->im_bg,$this->im_fullbg,0,0,0,0,$this->bg_width, $this->bg_height); $this->im_slide = imagecreatetruecolor($this->mark_width, $this->bg_height); $_SESSION['tncode_r'] = $this->_x = mt_rand(50,$this->bg_width-$this->mark_width-1); $_SESSION['tncode_err'] = 0; $this->_y = mt_rand(0,$this->bg_height-$this->mark_height-1); } private function _destroy(){ imagedestroy($this->im); imagedestroy($this->im_fullbg); imagedestroy($this->im_bg); imagedestroy($this->im_slide); } private function _imgout(){ if(!$_GET['nowebp']&&function_exists('imagewebp')){//优先webp格式,超高压缩率 $type = 'webp'; $quality = 40;//图片质量 0-100 }else{ $type = 'png'; $quality = 7;//图片质量 0-9 } header('Content-Type: image/'.$type); $func = "image".$type; $func($this->im,null,$quality); } private function _merge(){ $this->im = imagecreatetruecolor($this->bg_width, $this->bg_height*3); imagecopy($this->im, $this->im_bg,0, 0 , 0, 0, $this->bg_width, $this->bg_height); imagecopy($this->im, $this->im_slide,0, $this->bg_height , 0, 0, $this->mark_width, $this->bg_height); imagecopy($this->im, $this->im_fullbg,0, $this->bg_height*2 , 0, 0, $this->bg_width, $this->bg_height); imagecolortransparent($this->im,0);//16777215 } private function _createBg(){ $file_mark = dirname(__FILE__).'/tn_img/tn_mark.png'; $im = imagecreatefrompng($file_mark); header('Content-Type: image/png'); //imagealphablending( $im, true); imagecolortransparent($im,0);//16777215 //imagepng($im);exit; imagecopy($this->im_bg, $im, $this->_x, $this->_y , 0 , 0 , $this->mark_width, $this->mark_height); imagedestroy($im); } private function _createSlide(){ $file_mark = dirname(__FILE__).'/tn_img/tn_mark2.png'; $img_mark = imagecreatefrompng($file_mark); imagecopy($this->im_slide, $this->im_fullbg,0, $this->_y , $this->_x, $this->_y, $this->mark_width, $this->mark_height); imagecopy($this->im_slide, $img_mark,0, $this->_y , 0, 0, $this->mark_width, $this->mark_height); imagecolortransparent($this->im_slide,0);//16777215 //header('Content-Type: image/png'); //imagepng($this->im_slide);exit; imagedestroy($img_mark); } } ?>
3、tn_style.css
/*按钮*/ .clear{clear: both;} .tncode{ border: 1px solid #ccc; background-color: white; border-radius: 4px; width: 100%; height: 44px; cursor: pointer; opacity: 1; line-height: 44px; } /*浮层*/ .tncode_div_bg{ width: 100%;height: 100%;position: absolute; top:0; left:0; z-index:1000; background-color: rgba(0,0,0,0.5); opacity:0.3; filter: alpha(opacity=30); background-color:#000; *zoom:1; display: none; } .tncode_div{ display: none; background-color: white; z-index: 1000000; width: 260px;height: 260px; position: absolute; left: 50%;top:50%; margin-top: -130px; margin-left: -130px; border: 1px solid #d1d1d1; border-radius: 2px; overflow: hidden; filter: progid:DXImageTransform.Microsoft.Shadow(color='#969696',Direction=135, Strength=5);/*for ie6,7,8*/ /*background-color: #ccc;*/ -moz-box-shadow:2px 2px 5px #969696;/*firefox*/ -webkit-box-shadow:2px 2px 5px #969696;/*webkit*/ box-shadow:2px 2px 5px #969696;/*opera或ie9*/ } .tncode_div .tncode_canvas_bg{ z-index: 0; } .tncode_div .tncode_canvas_mark{ z-index: 10000; } .tncode_div canvas{ position: absolute; left: 10px; top: 10px; } .tncode_div .loading{ padding-top: 60px; position: absolute; left: 10px; top: 10px; background-color: #ccc; width: 240px; height: 150px; text-align: center; box-sizing:border-box; } .dd{ -webkit-transform: rotate(-45deg); -moz-transform: rotate(-45deg); -ms-transform: rotate(-45deg); -o-transform: rotate(-45deg); transform: rotate(-45deg); -webkit-animation: ddf 0.1s ease-in 0s infinite; -o-animation: ddf 0.1s ease-in 0s infinite; animation: ddf 0.1s ease-in 0s infinite; } @-webkit-keyframes ddf { 0% {-webkit-transform: translate(-8px, 3px);} 20% {-webkit-transform: translate(-3px, 1.5px);} 50% {-webkit-transform: translate(0px, 0px) ;} 70% {-webkit-transform: translate(5px, -1.5px) ;} 100% {-webkit-transform: translate(0px, 0px);} } @-o-keyframes ddf { 0% {-o-transform: translate(-8px, 3px);} 20% {-o-transform: translate(-3px, 1.5px);} 50% {-o-transform: translate(0px, 0px) ;} 70% {-o-transform: translate(5px, -1.5px) ;} 100% {-o-transform: translate(0px, 0px);} } @-moz-keyframes ddf { 0% {-moz-transform: translate(-8px, 3px);} 20% {-moz-transform: translate(-3px, 1.5px);} 50% {-moz-transform: translate(0px, 0px) ;} 70% {-moz-transform: translate(5px, -1.5px) ;} 100% {-moz-transform: translate(0px, 0px);} } @keyframes ddf { 0% {transform: translate(-8px, 3px);} 20% {transform: translate(-3px, 1.5px);} 50% {transform: translate(0px, 0px) ;} 70% {transform: translate(5px, -1.5px) ;} 100% {transform: translate(0px, 0px);} } .hgroup{ z-index: 20000; content: ""; position: absolute; left: -800px; top: 70px; width: 250px; height: 15px; background-color: rgba(255,255,255,.5); -webkit-transform: rotate(-45deg); -moz-transform: rotate(-45deg); -ms-transform: rotate(-45deg); -o-transform: rotate(-45deg); transform: rotate(-45deg); -webkit-animation: searchLights 3s ease-in 0s infinite; -o-animation: searchLights 3s ease-in 0s infinite; animation: searchLights 3s ease-in 0s infinite; } @-webkit-keyframes searchLights { 0% { left: -800px; top: 70px; } to { left: 350px; top: 70px } } @-o-keyframes searchLights { 0% { left: -800px; top: 70px; } to { left: 350px; top: 70px } } @-moz-keyframes searchLights { 0% { left: -800px; top: 70px; } to { left: 350px; top: 70px } } @keyframes searchLights { 0% { left: -800px; top: 70px; } to { left: 350px; top: 70px } } /*拉条*/ .slide,.slide_block,.tools .tncode_close,.tools .tncode_refresh{ background-repeat: no-repeat; background-image: url('../img/tn_icon.png'); } .tncode_msg_ok{ background-color: #24C628; } .tncode_msg_error{ background-color: #DE5145; } .tncode_msg_ok,.tncode_msg_error{ position: absolute; top:136px; left: 10px; width: 240px; /* 同tncode_canvas_bg */ height: 24px; color: #fff; margin: 0; padding: 2px 10px; overflow: visible; background-position: 0px 0px; font-size: 14px; opacity:0; filter: alpha(opacity=0.5); z-index: 10000; text-align: center; } .slide{ position: absolute; top:160px; width: 93.52%; height: 0px; background-color: white; background-size: 100%; margin: 5.39% 3.24%; padding: 0px 0px 13.67%; overflow: visible; background-position: 0px 0px; } .tools{ position: absolute; top:210px; width: 93.52%; height: 0px; background-color: white; background-size: 100%; margin: 5.39% 3.24%; padding: 5px 0px 13.67%; overflow: visible; background-position: 0px 0px; border-top: 1px solid #EEEEEE; } .slide_block{ background-position: 0px 12.9794%; width: 65px; height: 65px; position: absolute; left: 0px; top: 0px; margin: -4.62% 0 0 -2.31%; cursor: pointer; } .slide_block_text{ background-position: 0px 12.9794%; height: 65px; position: absolute; left: 65px; top: 20px; margin: -4.62% 0 0 -2.31%; cursor: pointer; font-size: 14px; color: rgb(136, 148, 157); } .tncode_canvas_bg,.tncode_canvas_mark{ /* width: 240px;*/ } .tools .tncode_close{ background-position: 0 50%; height: 30px; width: 30px; float: left; margin-right: 10px; cursor: pointer; } .tools .tncode_refresh{ background-position: 0 94%; height: 30px; width: 30px; float: left; cursor: pointer; } .tools .tncode_tips{ float: right; } .tools .tncode_tips a{ text-decoration: none; font-size: 10px; color: rgb(136, 148, 157); }
PHP网站后台模板还是有很多的,网上随便搜索也能查找出来很多,我只是想说的是:PHP网站后台模板分为两种:一种是纯静态的PHP网站后台模板;另一种就是可以用前端框架来做后台模板;
做网站的都明白:大部分的 Web 应用和动态网站都需要一个后台管理系统用于管理前台界面的信息展示以及用户信息。管理后台的设计虽然不像前台界面那样要求设计精美,但是也需要有清晰的管理模块划分,这样使用后台管理系统的人员才能够方便的进行操作和管理。
百度网盘下载链接: https://pan.baidu.com/s/1slbNKpJ 密码: j5tf
在线预览:
百度网盘下载链接: https://pan.baidu.com/s/1cEmhpO 密码: zqgq
在线预览:
百度网盘下载链接: https://pan.baidu.com/s/1hr8tZzm 密码: gn6y
在线预览:
百度网盘下载链接: https://pan.baidu.com/s/1dE0Y9vN 密码: xe1y
在线预览:
百度网盘下载链接: https://pan.baidu.com/s/1boDnOEb 密码: qpgj
在线预览:
百度网盘下载链接: https://pan.baidu.com/s/1qYDJBpq 密码: 9pye
在线预览:
百度网盘下载链接: https://pan.baidu.com/s/1i4LjjV3 密码: 6ucc
在线预览:
百度网盘下载链接: https://pan.baidu.com/s/1jIwuQMi 密码: f3u7
在线预览:
百度网盘下载链接: https://pan.baidu.com/s/1gf5U1UV 密码: pdka
在线预览:
百度网盘下载链接: https://pan.baidu.com/s/1eS6CwaY 密码: tdww
在线预览:
综上百度网盘链接: https://pan.baidu.com/s/1lJ26rrPLgJcZKq3JeJLchA 提取码: fjpv
Amaze UI 中国首个开源 HTML5 跨屏前端框架;
官方网址是:http://amazeui.org/
bootstrap是一个简洁、直观、强悍的前端开发框架,让web开发更迅速、更简单。
官方网址是:http://getbootstrap.com/
H-ui前端框架是在bootstrap的思想基础上基于 HTML、CSS、JAVASCRIPT开发的轻量级web前端框架,开源免费,简单灵活,兼容性好,满足大多数中国网站,H-ui——专注前端解决方案。
官方网址是:http://www.h-ui.net/
官方网址是:http://www.layui.com
Demo: https://www.layui.com/admin/pro/
后台模板下载: https://fly.layui.com/download/layuiAdmin/
文档: https://www.layui.com/doc/
官方网址是: http://jui.org/ (已经基本不更新了)
官方网址是:http://www.b-jui.com (已经有几年没更新了)
旧官网地址b-jui.cn已失效
新版1.3的Demo: http://demo.b-jui.com/
旧版1.2的Demo: http://demo.b-jui.com/1.2/
旧版1.2下载: http://www.b-jui.com/download.html
官网地址: https://www.topjui.com/
DEMO: http://demo.topjui.com/
https://gitee.com/xvpindex/ewsdCMS
官网地址: https://www.mdui.org/
官网地址:https://pro.ant.design/index-cn
GitHub源码:https://github.com/ant-design/ant-design-pro
核心使用了UmiJs框架: https://umijs.org
后台模板源码:
1、bootstrap各种后台管理模板
Git源码:https://gitee.com/theseason5/theme
2、hAdmin
Git源码: https://gitee.com/mirrors/hadmin
很多人用bootstrap框架中的hAdmin来做网站后台;
hAdmin是一个免费的后台管理模版,该模版基于bootstrap与jQuery制作,集成了众多常用插件,基本满足日常后台需要,修改时可根据自身需求,来定制后台模版。
3、光年(Light Year Admin)后台管理系统模板
Git源码: https://gitee.com/yinqi/Light-Year-Admin-Template
演示地址: http://lyear.itshubao.com
4、X-admin
基于Layui后台模板
Git源码: https://gitee.com/daniuit/X-admin
演示地址 http://x.xuebingsi.com/x-admin/v2.2/
5、WeAdmin
基于Layui的后台管理系统前端模板
Git源码: https://gitee.com/lovetime/WeAdmin
演示地址:http://lovetime.gitee.io/weadmin/
6、layui-mini
Git源码: https://gitee.com/zhongshaofa/layuimini
7、nepadmin
基于 layui 的后台单页面模板
Git源码: https://gitee.com/june000/nep-admin
演示地址:https://june000.gitee.io/nep-admin/
8. QAdmin
基于layui框架与Vue.js构建
官网:http://www.qadmin.net/
Git源码: https://gitee.com/flash127/qadmin
演示地址:http://demo.qadmin.net/
bootstrap收费模板(含免费):
上面介绍完后台静态模板,也顺便介绍几个几款比较强大的cms
1. iCms (基于iPHP框架的cms系统,强大的云插件市场)
2. 齐博CMS之X1 (基于thinkphp5开发的内容管理系统) (齐博CMS: 从PHP168分离出来的一个分支,独立发展出来的CMS)
3. xunruicms (finecms进化改名而来)
poscms(跟finecms一样)
finecms (核心基于CI框架的cms)
像phpcms,帝国CMS大家应该耳熟能详,这些我就不推荐了
其他参考资料:
参考文章:https://www.cnblogs.com/liluxiang/p/9592003.html
※使用之前,我们先来掌握3个东西是用来干什么的。
· npm: Nodejs下的包管理器。
· webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的合并和打包。
· vue-cli: 用户生成Vue工程模板。(帮你快速开始一个vue的项目,也就是给你一套vue的结构,包含基础的依赖库,只需要 npm install就可以安装)
npm config set prefix “D:\nodejs\node_global”
npm config set cache “D:\nodejs\node_cache”
懂的越多,不会的也就越多,知识之路是不断进取的
DOM
DOM - Document Object Model This model can be described as a tree structure: Document | Root element:<html> | ———————————————————————— | | Element:<head> Element:<body> | | | ——————————————————— Element:<title> | | | Element:<a> Element:<h1> | Attribute: "href" | | | | Text:"my title" Text:"my link" Text:"my header"
DOM是W3C(万维网联盟)的标准,它定义了访问HTML和XML文档的标准:W3C-DOM是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。
W3C-DOM分成3个不同的部分:
· 核心DOM:针对任何结构文档的标准模型
· XML DOM:针对XML文档的标准模型
· HTML DOM:针对HTML文档的标准模型
这里对HTML DOM进行详述
关于HTML DOM,它是:
· HTML的标准对象模型
· HTML的标准编程接口
· W3C标准
HTML DOM定义了所有HTML元素的对象和属性,以及访问它们的方法。
在HTML DOM中,所有事物都是节点(Node)。DOM是视为节点树的HTML。
· 整个文档是一个文档节点
· 每个HTML元素是元素节点
· HTML元素内的文本是文本节点
· 每个HTML属性是属性节点
· 注释是注释节点
HTML DOM方法和属性
HTML DOM方法是我们可以在节点上执行的动作。
HTML DOM属性是我们可以在节点设置和修改的值。
可通过JavaScript(或其他编程语言)对HTML DOM进行访问。
所有HTML元素被定义为对象,而编程接口则是对象的方法和属性。
方法是能执行的动作。属性是能够获取或设置的值。
如,一些常用的HTML DOM方法:
· getElementById
· appendChild
· removeChild
· getElementsByTagName
· getElementsByClassName
· replaceChild
· insertBefore
· createAttribute
· createTextNode
· getAttribute
· setAttribute
一些常用的HTML DOM属性:
· innerHTML – 获取元素内容
· parentNode
· childNode
· attributes
nodeName属性规定节点的名称↓↓
nodeValue属性规定节点的值↓↓
nodeValue属性规定节点的值↓↓
<p id="intro">Hello World!</p>
<script>
x=document.getElementById("intro");
document.write(x.firstChild.nodeValue);
</script>
nodeType属性:返回节点的类型,nodeType是只读的。
比较重要的节点类型有:
元素类型 NodeType
元素 1
属性 2
文本 3
注释 8
文档 9
访问HTML元素等同于访问节点,可通过不同方式来访问HTML元素:
HTML DOM的修改=改变元素、属性、样式和事件
<div id="div1">
<p id="p1">这是一个段落</p>
<p id="p2">这是第二段落</p>
</div>
<script>
var para = document.createElement("p");
var node = document.createTextNode("这是个新段落");
para.appendChild(node);
var ele = document.getElementById("div1");
ele.appendChild(para);
</script>
<p id="p1">Hey</p>
<script>
document.getElementById("p1").innerHTML = "新内容在这";
</script>
<p id="p1">hey</p>
<p id="p2">world</p>
<script>
document.getElementById("p2").style.color = "blue";
document.getElementById("p2").style.fontFamily = "Arial";
document.getElementById("p2").style.fontSize = "larger";
</script>
<input type="button" onclick="document.body.style.backgroundColor = 'lavender';" value="修改背景颜色" />
也可以:<script>
function changeBg()
{
document.body.style.backgroundColor="lavender";
}
</script><input type="button" onclick="changeBg()" value="修改背景色" />
HTML DOM允许JavaScript对HTML事件做出反应,当事件发生时,可以执行JavaScript,如用户点击某个元素时执行代码,则把JS代码添加到HTML事件属性中:onclick=JavaScript
HTML事件例子:
~用户点击鼠标时
~网页已加载
~图片已加载
~鼠标移动到元素上
~输入字段被改变
~HTML表单被提交时
~用户触发按键时
以下两个方式等效:a) <button onclick="displayDate()">点我</button>
b) document.getElementById("myBtn").onclick = function(){dispalyDate()};
onload,onunload,onchange
用户进入或离开页面时,会触发onload和onunload事件
onload事件可用于检查方可的浏览器类型和版本,以便基于这些信息来加载不同版本的网页。
onload和onunload事件都可用于处理cookies
onchange事件常用于输入字段的验证,如:<input type="text" id="fname" onchange="upperCase()" />
HTML DOM 事件对象参考手册:
https://www.w3school.com.cn/jsref/index.asp
https://www.runoob.com/jsref/jsref-tutorial.html
DOM根节点的两个特殊属性可以访问全部文档
~ document.documentElement 全部文档
~ document.body 文档主体
体积:33k
虚拟dom,更高的运行效率
双向数据绑定
生态丰富,基于vue.js的ui框架、常用组件
使用场景广泛
安装与部署
1、<script>引用<script src="https://cdn.jsdelivr.net/npm/" />
2、CLI命令行工具使用,npm
3、CDN
创建第一个vue应用
视图+脚本
视图:<div id="app">
{{mes}}
</div>
脚本:<script type="text/javascript">
var app = new Vue({
el: '#app',
data:{
mes: 'hello vue!'
}
});
</script>
数据与方法
每个Vue应用是通过Vue函数创建新的Vue实例开始的var vm = new Vue({});
<div id = "app">
{{a}} {{b}}
</div>
<script type="text/javascript">
var data = { a: 1 };
var vm = new Vue({
el : "#app",
data : data
});
data.a = 2;
</script>
Vue实例使用$区分方法和属性
e.g.
vm.data
vm.$watch —>方法list
生命周期
学习->API->生命周期钩子
生命周期函数不能使用箭头函数,箭头函数没有this
beforeCreate
created
beforeMount:相关的渲染函数首次被调用
mount ed:el创建成功
beforeUpdate:数据更新前
updated:数据更新完成
errorCaptured
activated, destroyed
模板语法
Vue.js使用用了基于HTML的模板语法,所有Vue.js的模板都是合法的HTML,能被遵循规范的浏览器和解析器解析。
文本:{{}}进行数据绑定
v-once,进行一次性插值
原始HTML,v-html标签可以使用html代码,v-bind绑定属性<div id = "app">
<p v-html="rawHtml"></p>
<div v-bind:class="color">test…</div>
<p>{{number + 1}}</p>
<p>{{ ok? 'YES' : 'NO' }} </p>
<p>{{ mes.split('').reverse().join(' ') }} </p>
</div>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data:{
msg: "hey",
rawHtml: '<span style="color:red">this is should be red</span>',
color: 'red1',
number: 9 ,
ok : 1
}
});
<style type="text/css">
.red1{color: red;}
.blue1{color:blue: font-size:100px;}
</style>
指令
v-前缀的特殊属性
v-if=”seen”
参数,一些指令能接受参数
修饰符,用.指明 <div @click="click1">
<div @click.stop="click2">click here</div>
</div>
class与style绑定v-bind:class="[ isActive ? 'active' : '', isGreen ? 'green' : '']"
v-bind:class="{active : isActive, green : isGreen}"
在中括号里可以使用条件表达式
{}只能是json数组
条件渲染
v-if v-else-if v-else:条件改变少适用
v-show:始终渲染,常切换适用
数组渲染
v-for item in items
事件绑定:v-on
<button v-on:事件名:”方法名(参数,…,$event)”>
事件名:不同元素拥有各自的事件,如click,dblclick
$event 是原始DOM事件 常用事件修饰符:stop,prevent,passive,capture,self,once 表单输入绑定
v-model 在input,textarea,select上进行数据双向绑定
vue的组件应用:全局组件注册
component的局部注册,是在实例中添加component部分,并注册其名称,如下示范:
<div id="app">
<button-counter></button-counter>
<test></test>
</div>
<script type="text/javascript">
Vue.component('button-counter', {
props: ['title'],
data: function () {
return {}
},
template: '<div><h1>hi…</h1></div>',
methods:{
}
})
var vm = new Vue({
el : "#app",
data : {
},
methods:{
clicknow : function (e) {
console.log(e);
}
},
components:{
test : {
template:"<h2>h2…</h2>"
}
}
});
</script>
实际应用中很少如上这样局部注册,更多的是通过类似java那样的单文件注册来完成的:
import ComponentA from './ComponentA' import ComponentC from './ComponentC' export default { components: { ComponentA, ComponentC }, // ... }
单文件注册需要进行环境配置:
· 安装 npm
npm
全称为 Node Package Manager
,是一个基于Node.js
的包管理器,也是整个Node.js
社区最流行、支持的第三方模块最多的包管理器。
npm -v
· 由于网络原因 安装 cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
· 安装 vue-cli
cnpm install -g @vue/cli
· 安装 webpack
webpack
是 JavaScript
打包器(module bundler)
cnpm install -g webpack