我正在try 使用带有图标的标志层L.divIcon(带有SVG文本)来显示传单中的文本.这个很好用.但是,旋转文本时,文本将被剪裁到视口外.我试着用几种方法来调整这一点,但都无济于事.例如,我try 在旋转后提取BBox,然后更新SVG Viewbox参数,但这并不能像预期的那样工作.

在这里,您可以看到包含旋转文本的SVG视图框.文本内容125BET被剪裁.文本10665几乎没有旋转,并且显示正确.

enter image description here

下面是Text组件的ViewBox,我想使用此信息来避免裁剪:

enter image description here

代码:

let svgIcon = L.divIcon({
  html: `
<svg
  version="1.1"
  id="${svgGcTextId}"
  preserveAspectRatio="none"
  xmlns="http://www.w3.org/2000/svg"
>
  <text width="5000" height="5000" x="0" y="${fontSize}" transform="rotate(${rotation})" font-size="${fontSize}">${text}</text>
</svg>`,
  className: "",
  iconSize: [24, 10],
  iconAnchor: [0, fontSize],
});

let marker = L.marker(latlng, { icon: svgIcon, interactive: false });

Edit:

try 按照彼得斯的建议添加变换原点.尽管这看起来很管用,但它改变了文本的插入点,这是不可取的.见下面的图片,其中125BET中的"1"被平移到大楼的南边.不过,可以看到更多的文本,因为更多的文本位于ViewBox中.

enter image description here

Edit2:

这是一把小提琴.更改旋转和字号的值以测试不同的方案.注意,我有在zoom 时zoom 字体大小的代码(但这在这里不应该是相关的)

https://jsfiddle.net/6vw5z20k/20/

Edit3 - solved

多亏了彼得斯的输入,我设法用下面的代码解决了这个问题.需要指定一个大的视框(例如600 x 600),然后使用x和y将文本插入中心.还需要指定变换原点,以便正确执行旋转.最后但并非最不重要的一点是,SVG必须使用icAnchor在引用锁定处居中.

const svgIcon = L.divIcon({
  html: `
<svg
  version="1.1"
  id="${svgGcTextId}"
  preserveAspectRatio="none"
  xmlns="http://www.w3.org/2000/svg"
  width="600"
  height="600"
>
  <text x="300" y="300" transform-origin="300 300" transform="rotate(${rotation})" font-size="${fontSize}">${text}</text>
</svg>`,
  className: "",
  iconSize: [24, 10],
  iconAnchor: [300, 300],
});

let marker = L.marker(latlng, { icon: svgIcon, interactive: false });

这里有很大的空间来旋转文本125BET,但如果放大太远,文本zoom 过大,ViewBox可能会变小.

推荐答案

最初,我认为您所需要做的就是在svg代码的<text>元素中添加:transform-origin="120 60"(或类似的东西).

然而,一旦您更新了您的问题,问题很可能是在svg上设置heightwidth本身.

您仍然可以使用transform-origin来移动原点,或者只需在<text>元素上设置xy即可.

以下是我的代码片段(基于您的jsFdle).请找一下轮换的伦敦.

var map = L.map('map').setView([51.505, -0.09], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  maxZoom: 19,
  attribution: '© OpenStreetMap'
}).addTo(map);

let fontSize = "60px";
let svgGcTextId = "";
let rotation = "45";
let text = "LONDON";
let latlng = [51.505, -0.09];

let svgIcon = L.divIcon({
  html: `
<svg
  version="1.1"
  id="${svgGcTextId}"
  preserveAspectRatio="none"
  xmlns="http://www.w3.org/2000/svg"
  width="300"
  height="300"
>
  <text width="5000" height="5000" x="30" y="30" transform="rotate(${rotation})" font-size="${fontSize}">${text}</text>
</svg>`,
  className: "",
  iconSize: [24, 10],
  iconAnchor: [0, 0],
});

let marker = L.marker(latlng, {
  icon: svgIcon,
  interactive: true
});
map.addLayer(marker);

let referenceMarker = L.circleMarker(latlng, {radius: 5});
map.addLayer(referenceMarker);
#map {
  height: 400px;
}
<html>
<head>
  <link rel="stylesheet" href="https://unpkg.com/leaflet@1.8.0/dist/leaflet.css" integrity="sha512-hoalWLoI8r4UszCkZ5kL8vayOGVae1oxXe/2A4AO6J9+580uKHDO3JdHb7NzwwzK5xr/Fs0W40kiNHxM9vyTtQ==" crossorigin="" />
  <!-- Make sure you put this AFTER Leaflet's CSS -->
  <script src="https://unpkg.com/leaflet@1.8.0/dist/leaflet.js" integrity="sha512-BB3hKbKWOc9Ez/TAwyWxNXeoV9c1v6FIeYiBieIWkpLjauysF18NzgR1MBNBXf8/KABdlkX68nAhlwcDFLGPCQ==" crossorigin=""></script>
  <body>
    <div id="map"></div>
  </body>
</head>
</html>

Javascript相关问答推荐

如何在使用fast-xml-parser构建ML时包括属性值?

Spring boot JSON解析错误:意外字符错误

如何从隐藏/显示中删除其中一个点击?

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

为什么useState触发具有相同值的呈现

Angular 中的类型错误上不存在获取属性

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

覆盖TypeScrip中的Lit-Element子类的属性类型

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

当代码另有说明时,随机放置的圆圈有时会从画布上消失

在Odoo中如何以编程方式在POS中添加产品

背景动画让网站摇摇欲坠

如何根据输入数量正确显示alert ?

我正在试着做一个TicTacToe Ai来和我玩.但是,我试着在第一个方块被点击时出现一个X,然后在第二个方块之后出现一个O

使用可配置项目创建网格

需要刷新以查看Mern堆栈应用程序中的更改

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

CSS网格使页面自动滚动