html5,placeholder属性里面文字颜色样式
::-webkit-input-placeholder { color:#999;}
:-moz-placeholder { color:#999;}
::-moz-placeholder {color:#999;}
:-ms-input-placeholder {color:#999;}
分类: 前端开发
HTML5CSS、JavaScript、php、JAVA、ActionScript、WindowPhone
手机拖动时js停止运行,倒计时实例
问题描述
在手机中拖动手机屏幕(window的scroll事件)或关闭手机屏幕时,会让js暂停运行。
这个状况会直接导致类似倒计时这样的效果出现问题。
比如你做了个页面上的倒计时,按照秒的精度倒数,当你拖动屏幕浏览内容时只要你的手没有放开,那时间是不动的。(可以联想到类似轨迹动画也是会停止的)。
我的解决办法
一、改变拖动的方式。
将scroll事件改为touchMove,可以让你在拖动的时候仍然保持js的运行。
典型的插件iscroll,虽然这个插件还不是完全体,有一些已知的bug,但是可以给你一个思路让你解决问题。
这个只能解决拖动上得问题,关闭手机屏幕还是无解的。
二、利用机器时间差异
这个算是曲线救国(谢谢数学老师),做一个setInterval来循环调用机器时间(间隔事件根据需要设定),如果与上次的调用时间超出预计,那就是产生了拖动和灭屏的状况,那么我们根据这个时间差,来计算目标时间应该达到的目标状态,并重置到这个状态。
我觉得是个代价相对较小的方法。
假设刚进入页面的时间是准确的
已知服务器时间 x 和当前机器时间 y
因为服务器时间和机器时间不一定相等
所以我们假定这个时间差z = x-y;
z为恒定值
获取当前机器时间的代码代价较小,我们可以在定时器中一直获取动态的y,再根据z,校准当前的确定的服务器时间,而不用反复请求。
如果是倒计时,需要的是时间差
那就需要一个目标时间a
时间差b的校准公式应该是
b= a-y-z;
三、面对鬼畜产品经理
“我要拖动的时候时间是动的,灭屏回来时间也是对的!”
这个时候结合方法一和二,就可以解决了。
我比较懒,方法在上面,自己写一写…
“什么?灭屏回来会卡顿?”
Sorry…
用其他dom触发input:file
字pc端用click事件来触发就可以了,但是在移动端click是触发不到file的input,要用touch。
如果想pc端和移动端都可以正常使用,可以用FastClick解决兼容问题。
另外在移动端用file是访问手机的相机或者相册(测试了ios,android是可以,wp不行)。
关于input的radio和checkBox组件的一些用法总结
最近用的比较多,在这里总结一下。
要注意的是我下面的东西主要是在移动端开发测试的,chrome也测试了,pc端其他浏览器我会在之后补上说明的。
我这里说的click是已经优化过的点击,自己在合适的时候切换成touch。
另外,无视jquery2+。
大家都知道的
在input外面加上label,或者通过label中的for属性指向input,可以通过点击label区域触发input的change或者focus。
针对radio和checkBox主要就是change事件。
那么触发input:radio和input:checkBox会有什么操作呢?
radio:如果已选中,不会有变化。如果未选中,那么在同一个name里面,选中该radio,原来选中的radio取消选中。
checkBox: 如果已选中,取消选中;如果未选中,改变为选中状态。
你可能不知道的
前提:
这里以jquery的语法描述。
不在html中直接操作checked属性,因为要做遍历。
先说radio:
我们要通过label间接改变一个radio组的状态可以用click事件,也可以用change事件
以$(this).find(“input:radio”).is(‘:checked’)来判断当前的子元素是不是选中状态。
以$(this).find(“input:radio”).get(0).checked = false;来取消选中状态(如果你默认一个都不选中有可能会用到这个)。
click与change的区别就是,不管你该元素的状态是否变化,click都会触发。
而change只有在你元素选中与否变化时才会触发。所以我认为change是优选。
而你想通过其他方式修改这组单选状态的时候,可以通过$(this).find(“input:radio”).eq(index).trigger(“click”)来实现,不能用change。
以上的操作在pc端是没问题的,但是在移动端,想用change操作input的属性是不可以的。
那checkBox呢:
从上面对radio和radio其实没有不同。
但在做特别样式的展示,并且要把丑陋的input隐藏时,要注意保持展示和看不到的input状态是一致的。
我开始用click测试的时候就发现展示状态改变正常,但是input可能没有变化~
总结一些用法
如何确定该选择项目是否被选中:
有人说我要用$(this).attr(“checked”)来查看当前状态,那在我上面说的这个方发现,这么判断永远是空…
用$(this).is(‘:checked’)可以达到判断是否选中。当然你愿意用class标记是否选中也可以。
change和click:
pc端用change提高效率,移动端用click。
综合实例说事
点击查看实例 >>
或者扫码。
一款滚动条插件mCustomScrollbar
考虑到之前自己写的那个功能有欠缺,比如我的只是纵向滚动,这次在自己更新jscroll之余也找到了一个比较完善的插件mCustomScrollbar。
mCustomScrollbar
官网:http://manos.malihu.gr/jquery-custom-content-scroller/
github:https://github.com/malihu/malihu-custom-scrollbar-plugin
插件的demo很详细,如果你觉得插件有点大,可以自己优化一下去掉不想要的功能。
注意这类滚动条的插件都要在你的目标元素显示在画布时(能读取到长宽的时候),才能正确渲染,不然你就要自己定宽高了。
我在最近的一个项目中用了它,涉及到一个初始化时内容区域要滚动条从end点开始,并且是横向的。
看代码:
$(".scroll").mCustomScrollbar({
horizontalScroll:true,//横向滚动
scrollButtons:{//是否要左右的箭头按钮
enable:true
},
scrollInertia : 20//滚动的缓动速度
}).mCustomScrollbar("scrollTo","right");//跳到最右
这里注意如果不把scrollInertia设置的低一点,载入的时候会有从左滚到右的动画,最近很懒,就选择了这个比较简单的方案。
一段以userAgent判断是否为手机浏览器的js代码
虽然我不关心,但同事说腾讯是这么用的。
其实就是写了个正则字典穷举手机的可能。个人感觉适用性能覆盖90%以上的用户(只要“安全”浏览器不把userAgent改的太奇葩,或者用户不太奇葩)。
if(/AppleWebKit.*Mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/.test(navigator.userAgent))){
if(window.location.href.indexOf("?mobile")<0){
try{
if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)){
//移动端
}else if(/iPad/i.test(navigator.userAgent)){
//这里对ipad做了处理
}else{
//移动端
}
}catch(e){}
}
}else{
//pc端
}
wp是个特殊的存在(IE),要怎么单独判断wp呢。
var ISWP = !!(navigator.userAgent.match(/Windows\sPhone/i));
因为wp的特殊性海量的方法给你判断,具体情况再具体分析。
【项目总结】K Point Fashion
网站地址:http://kpoint-fashion.com/
外部引用的类库:
基本类库:jquery
自主开发的插件:
图片横向滚动插件:imgShowXmove
CMS系统:
遇到的障碍:
问题:
如果栏目为三级,如何在三级取到二级菜单的 内容。
解决:
dede本身是可以通过channel里面的type=“self”,来得到同级类别里面的数据的,但是不包含自己。
可以通过run=“php”用php的读取数据库的方式来达到目的。
{dede:field.typeid runphp="yes"}
global $dsql;
$reid = $dsql->GetOne("SELECT reid FROM kp_arctype where id=@me");
@me=$reid["reid"];
{/dede:field.typeid}
这是读取的父级id,如果会弄数据库,你可以根据数据库的字段读取自己想要的东西。
问题延伸:读取的地址带有dede标签格式怎么处理。
解答:有个MfTypedir函数可以帮助我们解决问题
得到上述方法,许多二次开发的东西举一反三都可以迎刃而解了。就是写的难看点,有php功底写到模块里面就更好了。
问题:关于dede搜索功能的应用。
解答:搜索功能默认依赖两个主要文件。
plus/search.php
templets/default/search.htm
从search.php下面的代码中我们可以了解到搜索接值的逻辑
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;</code>
if(!isset($orderby)) $orderby=”;
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
if(!isset($keyword)){
if(!isset($q)) $q = ”;
$keyword=$q;
}
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
看一下dede的标签变量就很容易理解上面的变量是接受的什么值了。如果我想搜索某类别下的产品。
<form name=”formsearch” action=”{dede:global.cfg_cmsurl/}/plus/search.php”>
<input type=”hidden” name=”kwtype” value=”0″ />
<input type=”hidden” name=”typeid” value=”{dede:field.typeid/}” />
<input type=”hidden” name=”channeltype” value=”13″ />
<input type=”hidden” name=”searchtype” value=”title” />
<input name=”q” type=”text” class=”search-keyword” value=”” placeholder=”search” />
<button type=”submit”> </button>
</form>
channeltype里面的13是我产品模型的id;
searchtype如果是title就是检索标题,如果是titlekeyword就是模糊搜索。
【项目总结】韩雪官方网站
网站地址:
响应式网站:
以宽度为标准响应设备。
外部引用的类库:
基本类库:jquery;
音乐播放插件:audiojs;
视频(图片)展示插件:fancybox。
二次开发的插件:
专辑页面的图片滚动:gallery(从17素材采集)。
自主开发的插件:
区域滚动条:jsscroll;
仿ios幻灯片:picFocus
CMS系统:
CMS二次开发内容:
跨栏目读取图片;
多层级栏目读取。
遇到的障碍:
问题:
图片列表页到幻灯片页面的跳转与定位问题。
解决方案:
从列表页通过修改跳转ur,带值到幻灯片页面,来判断当前应该显示哪一张图片。
设置跳转的目标参数:
url = $(this).attr("href")+"?index="+index;
读取参数:
initIndex = window.location.href.split("index=")[1]
问题:
专辑页面的仿ios的滚动效果,原例中是三张图片循环,要改成显示所有图片,如何让图片从一边到另一边且不影响中间的主要图片。
解决:
插件的原思路就是用transition结合transform来完成切换动画的。以透视效果(perspective),来完成透视效果。原例中用了preserve-3d,加了这个属性,元素间的层叠关系便不再受z-index控制,会影响到切换的效果,所以实例中移除了这个属性。
至于姜三张图片变为多张图片,其实就是加了图片定位的初始化,计算出初始化时,左侧与右侧应该有多少张图片,再加上一定的距离规则让他们平均分布。下面是计算分布的代码块。
this.leftCount = parseInt(this.itemsCount / 2);
this.rightCount = parseInt(this.itemsCount / 2);
this.baseDistance = 280;
this.baseRange = 50;
if (!(this.itemsCount % 2)) {
this.rightCount--;
}
this.baseRange = this.baseRange / this.rightCount;
问题:
专辑页面专辑图片的类别问题。
解决:
因为后台结构中音乐没有音乐专辑图片的直接分类,所以就要单独划出一个分类专门做专辑封面的管理,该项目中我走了弯路,导致从专辑图片到专辑音乐页面的跳转产生了问题,该项目中是利用dede中权重这个参数手动配对,才能保证一个专辑图片能正确链接到该专辑的音乐页面,实际上只要在专辑类别上定一个专辑的模型就可以正确链接到类别列表页面,或者在产品上增加专辑图片的字段,然后将图片推荐到封面页面就好了。
问题:
关于百度分享插件的图片分享。
解决:
我这边测试的结果是图片的分享要图片已经在页面中载入后,统一对符合条件(tag)的图片进行绑定。
而如果你要通过分享链接自动抓取图片显然条件更苛刻了,我这里是自己用js方法去取我想要取的图片,然后将这个图片放到插件的默认参数里面,来达到抓取页面图片的效果。
var picSrc = "{dede:field.picname/}";
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"{dede:field.title/}","bdMini":"2","bdMiniList":false,"bdPic":picSrc,"bdStyle":"2","bdSize":"24"},"share":{},"image":{"viewList":["tsina","tqq"],"viewText":"","viewSize":"24","tag":"shareImg"}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
问题:
跨栏目层级读取,并读取子栏目中的第一个文章的缩略图。
解决:
涉及到了php的循环和嵌套中的sql查表,直接看代码。
{dede:field.typeid runphp="yes"}//根据typeid做遍历的变量
global $dsql;
$dsql -> SetQuery("SELECT * FROM test_arctype where reid=@me");//查当前类别下的所有子类别
@me="";
$dsql -> Execute();
$dsqls = $dsql;
while($son = $dsqls->GetArray()){//开始循环输出
$sid = $son['id'];
$sonarc = $dsql->GetOne("SELECT litpic FROM test_archives where typeid=$sid ORDER BY `snow_archives`.`senddate` desc");//查出子类里面第一个文档的缩略图
$sonarc = $sonarc['litpic'];
@me=@me.MfTypedir($son['typedir']).$son['id'].$sonarc;//MfTypedir函数格式化地址
}
{/dede:field.typeid}
遗留问题:php变量的操作出现点障碍。
问题:
取消手机中屏幕拖动事件。
解决:
$("body").bind("touchmove",function(event){
event.preventDefault();
});
$("body").unbind("touchmove");//恢复拖动
问题:
织梦CMS各种不明默认数值让我抓狂。
解决:
因为问题出现的时候已经生产,我只有没羞没臊的在各种列表都加了个很大的最小输出量,而避免二次开发,文字默认长度也给了很大的限制。
手机端按钮包含按钮的触发问题
问题
如果给一个dom添加触摸事件以后,那这个dom里面子元素的触摸事件还可以触发么?这是最近项目中遇到的一个问题。
之后我做了个测试。
测试
测试环境:iphone4&ios6,lumia920&wp8,某安卓机
测试的点击方式:默认的click、MBP、Fastclick、Zepto&tap。
测试演示:http://gaofeiyu.com/demo/click/click.html
演示的基本逻辑是黄色块点击后会隐藏自己,黑色的底色块和红色块点击后会改变色块内的html并记录点击次数。
演示里面可以看出click和Fastclick的子元素和父元素都会触发,而MBP和tap事件只有当前dom会触发。
总结
在移动项目中还是Zepto和Fastclick混用的方案比较合适,无论点透还是这种逻辑混乱的交互都搞得通。
建议在项目中尽量用一种触摸事件触发方式,不然碰到问题改代码会很难看。我这边最开始用的是tap,之后发现各种问题搞得不得不做很多多余的操作,在优化后还是统一用了Fastclick,父子元素的问题,也只能换个方向去解决,毕竟这个问题本身的用户体验就不是很好。
我还顺便写了个连点的小样例在演示里面,有心的人可以分析一下。
关于移动设备“点透”的问题
“点透”是什么
你可能碰到过在列表页面上创建一个弹出层,弹出层有个关闭的按钮,你点了这个按钮关闭弹出层后后,这个按钮正下方的内容也会执行点击事件(或打开链接)。我暂时定义为这是一个“点透”现象。
如何产生的
一般来说我们用原生的touch事件,还有jqueryMobile和zepto的tap可能会产生上面的问题。
相关的内容可以参考http://blog.youyo.name/archives/zepto-tap-click-through-research.html
注:当你点击链接页面刷新太快也会出现点透状况,这个是要在测试中特别注意的。
来说点转载文章中没说到的
规避这个点透现象除了上面参考文章说的方法,有更简单的方法。
推荐方法是引入Fastclick.js插件,该插件重写了默认的click事件,你可以通过
FastClick.attach(document.body);
来对整个文档操作,也可以对某节点单独操作。
那么我之前写的《触屏网页防止误点击(GHOSTCLICK)》中的 MBP 也可以避免这个问题,选择你喜欢的方法去解决。