一、关于字数统计的问题
在使用textarea时常会对textarea中的文字数目进行统计,一般来说,可以使用onkeyup事件来解决问题。
<textarea id="description" onkeyup="keypress()"></textarea>
<span id="wordsCounting">500字</span>
function keypress(){
var description = document.getElementById("description").value;
var remainNum = 500 - description.length;
if(remainNum < 0){
remainNum = 0;
vm.wishContent = description.substring(0,500);
alert('最多只能输入500个字符哟~');
}
document.getElementById("wordsCounting").innerText = remainNum + "字";
}
但是当使用粘贴功能的时候,由于onkeyup事件并没有调用,所以字数统计就会出现问题,因此需要更改一下。
<textarea rows="15" id="description" v-model="content"></textarea>
<span id="wordsCounting">500字</span>
watch: {
content: function(curVal,oldVal){
var remainNum = 500 - curVal.length;
if(remainNum < 0){
remainNum = 0;
vm.content = curVal.substring(0,500);
api.alert({
msg: '最多只能输入500个字符哟~',
});
}
document.getElementById("wordsCounting").innerText = remainNum + "字";
},
},
二、关于一段文字的行数计算判断是否显示更多按钮
在获取到文本之后调用vm.countLines();来计算该文段的行数。
<div id="target" class="introduce" :class="isEllipsis == 1?'aui-ellipsis-2':''">
<div class="aui-margin-l-15 aui-margin-r-15" v-html="wishContent"></div>
</div>
countLines:function(){
this.$nextTick(function(){
var target = document.getElementById("target");
var styles = window.getComputedStyle(target, null);
var lh = parseInt(styles.lineHeight, 10); // 行高
var h = parseInt(styles.height, 10); // 文段高度
var lc = h / lh; // 行数
if(lc > 2){
vm.isEllipsis = 1;
$api.css($api.byId("getMore"), 'display:block;');
}else{
vm.isEllipsis = 0;
$api.css($api.byId("getMore"), 'display:none;');
}
});
},
三、一行两端对齐的文字(使用了jQuery-weui)
<div class="weui-cells">
<div class="weui-cell">
<div class="weui-cell__hd"><span>单号</span></div>:
<div class="weui-cell__bd">
<input class="weui-input" type="text" />
</div>
</div>
<div class="weui-cell">
<div class="weui-cell__hd"><span>用户名</span></div>:
<div class="weui-cell__bd">
<input class="weui-input" type="text" />
</div>
</div>
<div class="weui-cell">
<div class="weui-cell__hd"><span>地址</span></div>:
<div class="weui-cell__bd">
<input class="weui-input" type="text" />
</div>
</div>
</div>
.weui-cell__hd{
width: 60px;
height: 24px;
padding-left:15px;
text-align: justify;
display: inline-block;
}
.weui-cell__hd span:after{
content:"";
display: inline-block;
width: 100%;
height: 0;
}
效果如图:
四、不会被拉伸或者压缩的缩略图(类似微信朋友圈中为保持图片原有比例而只显示图片中间部分)
参考文档:https://www.zhangxinxu.com/wordpress/2015/03/css3-object-position-object-fit/
在显示图片的缩略图时,设置一下缩略图的宽高(width&height),同时给图片添加object-fit:cover;的属性即可。
img{
width: 2rem;
height: 2rem;
object-fit: cover;
}
五、一段文字中,中英文使用不同的字体
参考文章来源:https://www.jb51.net/article/25219.htm
function justifyText(text, fontFamily){ // text-需要显示不同字体的文本 fontFamily-
var newText = "";
for(var i = 0; i < text.length; i++){
if(text.charCodeAt(i) > 255){ //遍历判断字符串中每个字符的Unicode码,大于255则为中文
newText +=text[i];
}else{
newText +="<span style='font-family:"+fontFamily+"!important'>"+text[i]+"</span>";
}
}
return newText;
}
六、不完整环形进度条(canvas)
设计图如下:
<canvas :id="'myCanvas'+index" width="60" height="60" style="margin:0 auto;"></canvas>
<!--由于canvas绘制的图在手机上会失真,因而引用hidpi-canvas.min.js来解决该问题-->
<script type="text/javascript" src="../script/hidpi-canvas.min.js"></script>
function drawProgress(index, leftPercent){ // index-获取数据数组后的排序位置 leftPercent-剩余值
var myCanvas = document.getElementById("myCanvas"+index);
var textContent = leftPercent +"%";
var progressX = document.getElementById("myCanvas"+index).offsetWidth / 2;
var progressY = document.getElementById("myCanvas"+index).offsetHeight / 2;
var changedArc = 1.9*(100-leftPercent)/100;
if(changedArc <= 0.4){
var endArc = 0.4 - changedArc;
}else if(changedArc > 0.4 && changedArc <= 0.9){
var endArc = 2 - (changedArc - 0.4);
}else if(changedArc > 0.9 && changedArc <= 1.4){
var endArc = 1.5 - (changedArc - 0.9);
}else if(changedArc >= 1.9){
var endArc = 0.6;
}else{
var endArc = 1 - (changedArc - 1.4);
}
var ctx = myCanvas.getContext("2d");
//总数
ctx.beginPath();
ctx.arc(progressX, progressY, 24, 0.4*Math.PI, 0.6*Math.PI, true); // 横纵坐标、半径、起始角、结束角、顺逆时针(顺时针为false)
// 轮廓线
ctx.strokeStyle = "#37CBD5";
ctx.lineWidth = 5;
ctx.stroke();
// 填充区
ctx.fillStyle = "#37CBD5";
ctx.font = "10px FZLTXH";
ctx.fillText("还剩", (progressX-10), progressY-2);
ctx.font = "10px Helvetica";
ctx.fillText(textContent, (progressX - ctx.measureText(textContent).width/2), (progressY+8)); // ctx.measureText().width获取文字长度
ctx.textAlign="center";
ctx.textBaseline = "middle";
ctx.closePath();
//进度
ctx.beginPath();
ctx.arc(progressX, progressY, 24, 0.4*Math.PI, endArc*Math.PI, true);
ctx.strokeStyle = "#57E3EC";
ctx.lineWidth = 5;
ctx.stroke();
ctx.closePath();
// 改善canvas在手机端的失真问题
var getPixelRatio = function(ctx) {
var backingStore = ctx.backingStorePixelRatio ||
ctx.webkitBackingStorePixelRatio ||
ctx.mozBackingStorePixelRatio ||
ctx.msBackingStorePixelRatio ||
ctx.oBackingStorePixelRatio ||
ctx.backingStorePixelRatio || 1; return (window.devicePixelRatio || 1) / backingStore;
};
}
七、手机端:整个页面的背景图
当某个页面的背景是一张图且该页面含有输入框的时候,弹出键盘,会使背景图被压缩,发生改变,因此需要防止背景图被压缩。
<div id="app" style="background:url(imagePath);" :style="{'height':bodyHeight+'px'}"></div>
var vm = new Vue({
el: '#app',
data: {
bodyHeight:""
},
mounted:function(){
this.bodyHeight = document.documentElement.clientHeight;
}
})
八、时间戳转化时间(yyyy-mm-dd hh:mm:ss)
/*对Date的扩展,将 Date 转化为指定格式的String
*月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
*年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
*例子:
*(new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
*(new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
*/
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
} function gettingTime(time){
var date = new Date();
date.setTime(time);
return date.Format("yyyy-MM-dd hh:mm:ss");
}
九、CST时间(Fri Aug 28 09:37:46 CST 2009)转化日期格式(yyyy-MM-dd hh:mm:ss)
var time = dateFormat(CSTtime, "yyyy-MM-dd hh:mm:ss");
function dateFormat (date, format) {
date = new Date(date);
date.setHours(date.getHours()-14);
var o = {
'M+' : date.getMonth() + 1, //month
'd+' : date.getDate(), //day
'H+' : date.getHours(), //hour
'm+' : date.getMinutes(), //minute
's+' : date.getSeconds(), //second
'q+' : Math.floor((date.getMonth() + 3) / 3), //quarter
'S' : date.getMilliseconds() //millisecond
}; if (/(y+)/.test(format))
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); for (var k in o)
if (new RegExp('(' + k + ')').test(format))
format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)); return format;
}