08——<use>&<defs>标签创建图形引用

在 js中,当我们需要重复使用一个字段,会将它定义为一个变量,在多个地方使用
在svg中,当我们需要重复使用一个图形时,要怎么处理呢?

一、通过<use>&<defs>标签,在html中直接使用

使用方式:

  • 将图形等放在 <defs> 中提前定义好,并设置 id(defs中可设置多个)
  • <use> 标签的 xlink:href 属性指定对应的 id
  • 注意,defs 中的内容并不会直接渲染,在使用时才会渲染
<svg>
  <defs>
    <polygon id="star" points="0 0 50 0 25 50" fill="blue" transform="scale(1)"></polygon>
    <!-- 多个平铺 -->
    <polygon id="test"></polygon>
  </defs>
  
  <use xlink:href="#star"></use>
</svg>

在这里插入图片描述

二、也可以在js中生成引用,来看实例

前面03篇讲到,可以用js创建svg,同样的use也可以用js创建。直接来看一个综合实例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>use标签的使用</title>
    <style>
        html, body {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
            background: #001122;
            /* svg标签是内联元素,撑满了会有滚动条出来,不想要这个滚动条所以需要重置这两个值 */
            line-height: 0;
            font-size: 0;
        }
    </style>
</head>
<body>
    <svg width="100%" height="100%" viewBox="-400 -300 800 600" preserveAspectRatio="xMidYMid slice">
        <defs>
            <polygon id="star" points="0 -10 2 -2 10 0 2 2 0 10 -2 2 -10 0 -2 -2" fill="white"></polygon>
        </defs>
        <!-- 星星 -->
        <g id="star-group"></g>
    </svg>
   
</body>


<script>
    // nameSpace
    var SVG_NS = 'http://www.w3.org/2000/svg'
    var XLINK_NS = 'http://www.w3.org/1999/xlink'


    var paper = document.querySelector('svg')


    renderStar()


    // 通过一个已有元素,生成它的引用: <use xlink:href="#star"></use>
    function use(origin) {
        var _use = document.createElementNS(SVG_NS, 'use')
        _use.setAttributeNS(XLINK_NS, 'xlink:href', '#' + origin.id)
        return _use
    }


    // 获得任意两个数 之间的 随机数
    function random (min, max) {
        return min + (max - min) * Math.random()
    }

	// 渲染星空
    function renderStar () {
        var starRef = document.getElementById('star')
        var starGroup = document.getElementById('star-group')
        var starCount = 500


        var star
        while( starCount -- ) {
            // 生成star的引用
            star = use(starRef)
            // 设置透明度
            star.setAttribute('opacity', `${random(0.1, 0.5)}`)
            // 设置transform值(translate、scale之间无分号)
            // polygon内部如果使用transform,会在父级use变换的基础上,继续进行变换(没有覆盖,只是继续进行)
            star.setAttribute('transform', `translate(${random(-400, 400)}, ${random(-300, 300)})scale(${random(0.1, 0.5)})`)
            // 追加进去
            starGroup.appendChild(star)
        }


    }
</script>
</html>
这样我们就得到了一个星空~

在这里插入图片描述

三、defs的其他用法

defs中除了可以定义图形,也可以定义 渐变效果 ,只是使用时就不通过use了

后面我们一起来学习 渐变

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SVG(Scalable Vector Graphics)是一种基于 XML 的矢量图形格式,而 defs 元素是 SVG 中的一个重要元素,用于定义可重复使用的图形元素或属性。下面是对 svg defs 的详细解释: 1. 定义:defs 元素是 SVG 的一个容器元素,用于存放可重复使用的图形元素或属性定义。它不会直接呈现任何图形,而是被其他 SVG 元素引用。 2. 用途:defs 元素主要用于定义共享的图形元素,以便在整个 SVG 文档中重复使用。通过将这些图形元素放在 defs 中,可以减少代码的冗余,并提高可维护性。 3. 嵌套规则:defs 元素可以包含各种 SVG 元素,如路径、文本、图像等。它可以被放置在 SVG 根元素或其他容器元素中,以便在需要的时候引用。 4. 引用方式:要引用 defs 中的图形元素或属性,可以使用使用 <use> 元素。通过在 <use> 元素中指定 xlink:href 属性,并指向 defs 中定义的元素,就可以在文档中使用这些定义的图形元素。 5. 示例:以下是一个使用 defs 元素定义和引用共享图形元素的示例: ```html <svg width="200" height="200"> <defs> <circle id="myCircle" cx="50" cy="50" r="40" fill="red" /> </defs> <use xlink:href="#myCircle" /> </svg> ``` 在上述示例中,定义了一个圆形元素,并将其放在 defs 中,然后使用 <use> 元素引用了这个圆形元素。这样就可以在 SVG 中重复使用这个圆形元素,而不需要重复定义。 总结:svg defs 元素是 SVG 中的一个容器元素,用于定义可重复使用的图形元素或属性。通过将图形元素放在 defs 中,并使用 <use> 元素引用,可以在整个 SVG 文档中重复使用这些定义的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值