@lizlalala
2016-12-04T05:42:49.000000Z
字数 3313
阅读 1454
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//group2L = lineto H = horizontal lineto V = vertical lineto //直线终点eg L 100 200//group3C =curveto S = smooth curvetoQ = quadratic Bézier curve T = smoothC 为两个控制点+终点,如三次贝塞尔曲线中,会有两个控制点。eg.<path d="M70 60 C 70 80, 110 80, 110 60" stroke="black" fill="transparent"/>S:表示简写控制点,表示它的第一个控制点与前面的S/C的控制点的对称点:S C2 endPQ 为二次贝塞尔曲线的一个控制点,类似于CT前面需要有Q或者TA = elliptical ArcA x-radius y-radius x-rotation large-arc-flag(角度大小)sweep-flagZ = 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 hereonMouseDownFlag = 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回调。