摘要:使用实现任意大小,任意方向,任意角度的箭头网页开发中,经常会使用到下拉箭头,右侧箭头这样的箭头。的和就是箭头的边长,通过调整可以获取任意边长的箭头。
使用css实现任意大小,任意方向, 任意角度的箭头
网页开发中,经常会使用到 下拉箭头,右侧箭头 这样的箭头。 一般用css来实现:
{ display: inline-block; margin: 72px; border-top: 24px solid; border-right: 24px solid; width: 120px; height: 120px; transform: rotate(45deg); }
因为这是利用div的border-top, border-right,然后通过旋转div来实现的。
任意角度的箭头这里有个问题: 假如需要一个角度为120度的箭头怎么办呢? 由于border-top, border-right一直是90度, 所以仅仅通过旋转不行。
我们可以先把div 旋转45度, 让它成为一个 菱形 然后再伸缩,达到任意的角度, 这样就可以得到一个 任意角度的箭头。由于用到了旋转和伸缩两种变换,所以需要使用
transform: matrix(a,b,c,d,e,f) 这个变换矩阵。 这里的6个变量组成了一个3介的变换矩阵
$$ left[ egin{matrix} a & c & e b & d & f 0 & 0 & 1 end{matrix} ight] $$
任意点p(x,y)的平移, 旋转, 伸缩变换以及他们的各种组合都可以通过这个变换矩阵做到:
$$ left[ egin{matrix} x y 1 end{matrix} ight] left[ egin{matrix} a & c & e b & d & f 0 & 0 & 1 end{matrix} ight]= left[ egin{matrix} x" y" 1 end{matrix} ight] $$
注:这里用齐次坐标 来表达一个点。 简单说就是p(x, y) 表示为p"(x", y", 1)
v(x, y) 沿着x轴平移tx, 沿着y轴平移ty。 则有:
x" = x + tx y" = y + ty
所以平移矩阵:
$$ left[ egin{matrix} x" y" 1 end{matrix} ight]= left[ egin{matrix} 1 & 0 & tx 0 & 1 & ty 0 & 0 & 1 end{matrix} ight] left[ egin{matrix} x y 1 end{matrix} ight] $$
v(x, y) 点绕原点旋转θ到v"(x", y")
则有:
x = r * cos(ϕ ) y = r * sin(ϕ ) x" = r * cos(θ + ϕ) = r * cos(θ) * cos(ϕ) - r * sin(θ) * sin(ϕ ) // 余弦公式 y" = r * sin(θ + ϕ) = r * sin(θ) * cos(ϕ) + r * cos(θ) * sin(ϕ ) // 正弦公式
所以:
x" = x * cos(θ) - y * sin(θ) y" = x * sin(θ) + y * cos(θ)
所以旋转矩阵:
$$ left[ egin{matrix} x" y" 1 end{matrix} ight]= left[ egin{matrix} cos(θ) & -sin(θ) & 0 sin(θ) & cos(θ) & 0 0 & 0 & 1 end{matrix} ight] left[ egin{matrix} x y 1 end{matrix} ight] $$
假设x轴,y轴的伸缩率分别是kx, ky。 则有:
x" = x * kx y" = y * ky
所以:
$$ left[ egin{matrix} x" y" 1 end{matrix} ight]= left[ egin{matrix} kx & 0 & 0 0 & ky & 0 0 & 0 & 1 end{matrix} ight]= left[ egin{matrix} x y 1 end{matrix} ight] $$
如果是对p(x, y)先平移(变换矩阵A), 然后旋转(变换矩阵B), 然后伸缩(变换矩阵C)呢?
p" =C(B(Ap)) ==> p" = (CBA)p //矩阵乘法结合率
现在任意角度o的箭头就很简单了:
先把div旋转45度 成为 菱形, 变换为 M1
伸缩x轴, y轴 :
x" = size * cos(o/2) = x * √2 * cos(o/2) y" = size * sin(o/2) = y * √2 * sin(o/2)
即: kx = √2 cos(o/2); ky = √2 sin(o/2)
这样就得到了任意角度的箭头。 变换为M2
如果箭头的方向不是指向右侧, 在进行一次旋转就可以得到任意方向的箭头。变换为M3
那么由于 p" =C(B(Ap)) ==> p" = (CBA)p, 我们就可以先计算出 M3M2M1,然后对div进行相应的变换,就可以得到任意角度, 任意方向的箭头了。
div的width和height就是箭头的边长, 通过调整可以获取任意边长的箭头。
React组件为了方便使用, 这个箭头被封装为了一个 React组件。git地址
简单箭头 | 模拟select | 发散箭头 |
---|---|---|
name | type | default | description |
---|---|---|---|
degree | number | 90 | 箭头的张角, 角度制 |
offsetDegree | number | 0 | 箭头的方向,默认指向右边 |
color | string | - | 箭头的颜色 |
size | string | 10px | 箭头边长 |
npm install rc-arrow --save
import Arrow from "rc-arrow" class Hw extends Component { render() { return () } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/115766.html
摘要:中文译为转换,但我更倾向于称呼它变形大名鼎鼎的变形金刚叫。意为缩放,顾名思义,是用于改变元素的大小。每个时间点对应一个状态,代表一个关键帧。我们可以在可视化的创建我们自己的贝塞尔曲线。 简介 Animation可以让你不用依赖javascript或jquery,用纯CSS在网页中轻松实现各种动画效果。 兼容性 animation在绝大部分主流浏览器都得到了很好的支持!还在兼容IE9的同...
摘要:图片预览插件,支持图片切换旋转缩放移动浏览器支持不支持旋转功能效果预览源码地址默认键盘操作方向键左右前后图片切换,上下顺时针逆时针旋转滚动鼠标缩放支持自定义配置,详见页尾使用浏览器初始化参数见参数说明处使用方法点击缩略图,查 zx-image-view 图片预览插件,支持图片切换、旋转、缩放、移动... 浏览器支持:IE10+, (IE9不支持旋转功能) 效果预览:https://ca...
阅读 1367·2021-10-13 09:39
阅读 1333·2021-09-23 11:22
阅读 2241·2019-08-30 14:05
阅读 1057·2019-08-29 17:03
阅读 769·2019-08-29 16:24
阅读 2225·2019-08-29 13:51
阅读 654·2019-08-29 13:00
阅读 1288·2019-08-29 11:24