css - 根据另一个元素旋转元素(粘性)
问题描述
我正在尝试旋转应该始终粘在红色矩形底部的文本块(就像在 Figma 中一样,但更简单)。例如,如果我将矩形旋转 180 度,文本应该在顶部,并且它不应该进入 rect 视觉部分或高度偏离它。我怎样才能做到这一点?
也许它是关于变换起源的,但我已经打破了我的头,试图动态设置它。
最小的小提琴包含由 svg.js 创建的 rect 和 text 元素(svg.js 不是交易的一部分,所以你可以用纯 css 来做):
https://jsfiddle.net/8h4q0fLc/1/
这是代码:
<head>
<link rel="stylesheet" href="https://rawcdn.githack.com/svgdotjs/svg.select.js/3.0.1/dist/svg.select.min.css">
</head>
<body>
<div id="editor"></div>
<script src="https://rawcdn.githack.com/svgdotjs/svg.js/2.7.1/dist/svg.min.js" defer></script>
<script src="https://rawcdn.githack.com/svgdotjs/svg.select.js/3.0.1/dist/svg.select.min.js" defer></script>
<script src="https://rawcdn.githack.com/svgdotjs/svg.resize.js/1.4.3/dist/svg.resize.min.js" defer></script>
<script>
const editor = SVG('editor').size('100vw', '100vh');
const rect = editor.rect(100, 100).fill('red').move(50, 50).selectize().resize();
const {x: rectX, y: rectY, width: rectWidth, height: rectHeight} = rect.bbox();
const text = editor.text(`${rectWidth} x ${rectHeight}`).resize();
const { width: textWidth } = text.rbox();
text.move(rectX + (rectWidth - textWidth)/2, rectY + rectHeight);
rect.on('resizing', function() {
text.rotate(this.transform('rotation'));
});
</script>
</body>
解决方案
回复评论:这不是伏都教,而是一个简单的旋转矩阵,添加了平移以抵消 svg 的默认原点(顺便说一句,它是 svg 画布的左上角)
如果你想一起旋转文本和矩形,你可以做的最简单的事情就是把它放到同一个组中,然后旋转整个组。另一种方法是围绕矩形的中心旋转文本。因此,您必须传递第二个和第三个参数才能旋转。
const {x: rectX, y: rectY, width: rectWidth, height: rectHeight, cx, cy} = rect.bbox();
rect.on('resizing', function() {
text.rotate(rect.transform('rotation'), cx, cy);
});
推荐阅读
- html - 在 laravel Blade 中显示 pdf 文件
- .net-core - 如何修复“MessageReceived 处理程序正在阻止网关任务。” 在 DiscordBot
- css - Vuetify 底部导航栏扩展
- r - 你如何检查文件是否存在于共享中
- sql - SQL Server 中 LAG() 的替代方法
- react-native - uploadProgress 没有被触发 rn-fetch-blob
- java - 如何在java中创建具有空参数列表的方法
- javascript - Ruby RSpec/Capybara/Selenium 最近没有运行 javascript
- node.js - 用于自引用实体的 Typeorm 嵌套关系
- java - 从java中的url中删除端口号