[英]How to calculate points on a curve that matches CSS3 created border radius? Geometry geniuses?
我有一个用 css3 边界半径(图像部分)创建的弯曲 div。 我旁边有文本行,我想将曲线对齐 20px 左右,就像这样(不能发布图片,不记得旧登录名):
诀窍是曲线的变化取决于 window 的大小,所以我希望能够计算出曲线上文本应该偏移的点,基本上是创建一个真正的手动文本换行。
最终,我需要能够使用 javascript 进行计算和更新。
(编辑添加每条评论如下):曲线 css 用于演示目的是border-bottom-left-radius:316px 698px; 但这是由脚本根据页面大小计算的。 另外,值得一提的是,我根本不需要支持 IE 或 FireFox——只需要 webkit(独立的信息亭应用程序)。
要计算沿圆的一点的 position,您可以使用以下公式:
c^2 = a^2 + b^2
其中 c = 半径,a 是距中心的垂直距离,b 是距中心的水平距离。
因此,知道了这一点,我构建了一个非常人为的示例供您查看。 请注意,有几件事可以帮助提高性能,例如缓存半径平方,但我将其省略以避免使演示复杂化。
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<style>
#wrapper { position: relative; }
#curved {
position: absolute;
left: 200px;
-moz-border-radius-bottomleft: 200px;
-webkit-border-bottom-left-radius: 200px;
border-bottom-left-radius: 200px
border: 1px solid red;
padding: 100px;
background: red;
}
#magiclist { padding-top: 15px; width: 325px; list-style-type: none; }
li { text-align: right; }
</style>
<script>
$(function() {
/* c^2 = a^2 + b^2, c = radius, a = verticalShift, b = horizontalShift */
/* Therefore b = sqrt(c^2 - b^2), so now we can calculate the horizontalShift */
var radius = 200;
var verticalShift = 0;
var horizontalShift = 0;
/* iterate over the list items and calculate the horizontalShift */
$('li').each(function(index, element) {
/* calculate horizontal shift by applying the formula, then set the css of the listitem */
var horizontalShift = Math.sqrt(Math.pow(radius,2) - Math.pow(verticalShift,2));
$(element).css('padding-right', horizontalShift + 'px');
/* need to track how far down we've gone, so add the height of the element as an approximate counter */
verticalShift += $(element).height();
});
});
</script>
</head>
<div id="wrapper">
<div id="curved">test</div>
<ul id="magiclist">
<li>one</li>
<li>one</li>
<li>one</li>
<li>one</li>
<li>one</li>
<li>one</li>
<li>one</li>
<li>one</li>
<li>one</li>
<li>one</li>
</ul>
</div>
</html>
正如 duri 评论中所建议的,您可以使用圆形方程: http://www.wolframalpha.com/input/?i=%28x-5%29 ^2%2B%28y%2B4%29^2%3D25(其中中心在 5;-4 r=5)
但是,我使用贝塞尔曲线在 Javascript 中绘图。 它们非常灵活,由两个向量组成,它们形成的曲线从第一个向量的初始点开始,到第二个向量的结束。 更多: http://en.wikipedia.org/wiki/B%C3%A9zier_curve (请注意,绘制圆矢量的一部分将是垂直的)
好的,我已经玩了一段时间了。 这是一个早期的概念; 它效率低下,不适用于滚动条,到目前为止它仅在 Internet Explorer 9 和 Firefox 5 中工作(或多或少)(我没有测试这些浏览器的其他版本)。 我跳过了那些数学内容并以另一种方式进行了 - 我使用 document.elementFromPoint 来找出曲线范围的位置。 这就是它在 Chrome 中不起作用的原因——它的 elementFromPoint 实现不尊重边界半径(看这个例子); 因此我可能不得不改造整个脚本。 尽管如此,我还是向您展示了我创建的内容,因为它可能对愿意帮助您的其他人产生很好的启发。 我会努力改进我的剧本; 当我取得一些进展时,我会告诉你的。
如果您可以使用 jQuery,我创建了一个名为jCurvy的 jQuery 插件,它允许您沿着贝塞尔曲线使用 position 元素。
您需要调整传递到曲线 function 中的参数以匹配变化的曲线,这可能很棘手。 你的曲线变化了多少?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.