@lizlalala
2016-12-04T13:42:49.000000Z
字数 3313
阅读 1210
js
css
日常玩耍
demo
svg
分两种,单行跟多行。
.ellipsis-single{
width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
多行的话,设置最多行数(-webkit-line-clamp)
-webkit-line-clamp,
display: -webkit-box
-webkit-box-orient
具体的demo见[codepen]哈
See the Pen ellipsis test with single line and multiple lines by lu (@luchen) on CodePen.
这个demo目的是:
1. 轮子,交互友好,因为常用pocket跟evernote,就有打tag的场景,但是element没有相应的组件。
2. 实践了一下vue所说的v-model的语法糖。总结来说就是
v-model = value+ $emit('input')
。
子组件新建一个data,维持从父类传来的props(value)作为初始值,每次子组件data(或者更精确点说是:要传出去的数值)变动时$emit,通知父组件变动。是由内往外的数据传输。
part1:基础知识:
通用指令:
stroke stroke-width stroke-color stroke-linecap stroke-dashedarray fill
常用指令:
<circle cx cy r></circle>
<path d></path>
<polygon points></polygon>
所有的大写表示绝对路径,小写为相对偏移
path相关指令:
M = moveto 标志起点终点等 eg M 100 100
//group2
L = lineto H = horizontal lineto V = vertical lineto //直线终点
eg L 100 200
//group3
C =curveto S = smooth curveto
Q = quadratic Bézier curve T = smooth
C 为两个控制点+终点,如三次贝塞尔曲线中,会有两个控制点。
eg.
<path d="M70 60 C 70 80, 110 80, 110 60" stroke="black" fill="transparent"/>
S:表示简写控制点,表示它的第一个控制点与前面的S/C的控制点的对称点:S C2 endP
Q 为二次贝塞尔曲线的一个控制点,类似于C
T前面需要有Q或者T
A = elliptical Arc
A x-radius y-radius x-rotation large-arc-flag(角度大小)sweep-flag
Z = closepath
part2: 划重点
最终的demo戳这个链接,但是不知道为什么放到codepen里面,第三幅图的数据没有更新(func props没有传下去)。实测是可以的。
See the Pen sliding circle via svg by lu (@luchen) on CodePen.
补充:
因为同时有click跟mousedown,mousemove,mouseup。为了避免冲突,楼主把mouse部分放在了path上,click放在了circle上。具体场景可以看
可以看到当在只注册了mousedown,up的path上进行click,会依次执行down,up。
如果绑在同一个元素上,就有冲突,会执行三条,那么就需要用时间进行下面的区分操作:
在mousedown的时候,记录当前的时间,然后在mouseup的时候,再取当前时间,然后判断这两个时间差,当它大于某个数值的时候(因为如果是click,那么会在很短时间内产生mouseup),就不认为它是click。更精确的还可以加上mousedown和mouseup的坐标,不同则非click。
网上看到一个setTimeout的解决方案,小于200ms的就执行click操作:
$(element).click(function(){
// click code in here
});
$(element).MouseDown(function(){
onMouseDownFlag = false;
mouseDownAndUpTimer = setTimeout(function(){
// OnMouseDown Code in here
onMouseDownFlag = true;
},200);
}).MouseUp(function(){
if(onMouseDownFlag){
// OnMouseUp Code in here
}else{
clearTimeout(mouseDownAndUpTimer); // 清除延迟时间
}
});
PS:
楼主之前看到circle还有一种很巧妙的方法。简要来说是用path(arc)+stroke-dasharray去处理。一个环就是一个stoke-dasharray [first second]。first的长度即为当前percent的亮色部分。second即为灰色的部分。
但是这种方法不是很好做mousemove。所以楼主就作罢嘞
对比一下tagged input和circle,这两个都是vue组件的编写,都涉及父子组件的通信,区别在于,第一种是 子组件新建一个data,维持从父类传来的props作为初始值,每次子组件变动时$emit,通知父组件变动。是由内往外的数据传输。
第二种的version1版本是父组件传props进内部,外部进行变动,反应到子组件,相应变化。(此时没有data.)当需要增加需求(version2,即需要交互滑动circle)时,就需要增加一个currentValue的data,以props percent初始化,一方面需要watch percent的变动(外->内),另一方面当自己变化时,需要告知外部,即调用onPercentChange(val) 的props回调。