zoukankan      html  css  js  c++  java
  • 页面上怎么使用svg

    svg标签直接在页面使用

    不多说。

    其他标签使用svg

    除了直接使用svg标签,还有如下方法:

    <object data="your.svg" type="image/svg+xml" id="svg1">
        <img src="yourfallback.jpg" />
    </object>
    <img src="your.svg" alt="" id="svg2">
    <div style=" 30px;height: 30px;background:url(your.svg)"></div>
    <iframe src="your.svg"></iframe>
    <embed src="your.svg" id="svg3" type="image/svg+xml" />
    

    上面your.svg的内容如下:

    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30px" height="30px" viewBox="0 0 40 40" enable-background="new 0 0 40 40" xml:space="preserve">
      <path opacity="0.2" class="aaa" fill="#FF6700" d="M20.201,5.169c-8.254,0-14.946,6.692-14.946,14.946c0,8.255,6.692,14.946,14.946,14.946
          s14.946-6.691,14.946-14.946C35.146,11.861,28.455,5.169,20.201,5.169z M20.201,31.749c-6.425,0-11.634-5.208-11.634-11.634
          c0-6.425,5.209-11.634,11.634-11.634c6.425,0,11.633,5.209,11.633,11.634C31.834,26.541,26.626,31.749,20.201,31.749z"></path>
      <path fill="#FF6700" class="bbb" d="M26.013,10.047l1.654-2.866c-2.198-1.272-4.743-2.012-7.466-2.012h0v3.312h0
          C22.32,8.481,24.301,9.057,26.013,10.047z" transform="rotate(42.1171 20 20)">
          <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 20 20" to="360 20 20" dur="0.5s" repeatCount="indefinite"></animateTransform>
      </path>
    </svg>
    

    其中如果用img background iframe 方式外链svg,css和js均无法修改svg内部path,rect ,circle的填充颜色;

    而使用object,embed方式,我们可以通过js修改填充颜色:

    document.getElementById("svg1").addEventListener("load", function() {
        var doc = this.getSVGDocument();
        var path = doc.querySelector("path");
        path.setAttribute("fill", "green");  // 换个颜色
    });
    

    在vue项目中使用svg

    svg-spirite-loader的应用

    定义icon组件:

    <template>
        <svg class="svg-icon">
            <use :xlink:href="iconName"></use>
        </svg>
    </template>
    
    <script>
    
    export default {
      name: 'icon',
        props: {
           name: {
             type: String,
                 required: true
             }
        },
        computed: {
             iconName () {
                return `#${this.name}`
             }
        }
    }
    </script>
    

    使用icon组件

    <template>
       <div id="app">
          <icon name="icon-svgexport-2"></icon>
       </div>
    </template>
    
    <script>
    import icon from './icon.vue'
    require('./icons/svgexport-2.svg')
    export default {
    	name: 'App',
    	components: {
    		icon
    	},
    }
    </script>
    

    webpack loader配置

    {
      test: /.svg$/,
      loader: 'svg-sprite-loader',
      include: [resolve('src/icons')],
      options: {
        symbolId: 'icon-[name]'
      }
    },
    

    注意:使用svg-sprite-loader之后,解析png等图片使用url-loader的时候,需要排除被svg-spirite-loader解析的svg,否则会报错

    demo地址

    react使用svg-sprite-loader

    在webpack.config.js中添加配置:

    {
      test: /.svg$/,
      loader: 'svg-sprite-loader',
      include: [path.resolve(__dirname, '../src/icons')], // 只处理指定svg的文件
      options: {
        symbolId: 'icon-[name]'
      }
    },
    

    定义Icon组件:

    import React, {Component} from 'react'
    export default class extends Component{
      render() {
        const {className,type} = this.props
        return (
            <svg className={className}>
              <use xlinkHref={`#icon-${type}`}></use>
            </svg>
        )
      }
    }
    

    使用组件:

    import Icon from 'src/components/icon'
    ......
    <Icon className="icon-user-icon icon-s-normal-tny" type="user-icon" />
    
    注意:create-react-app中的file-loader设置了对svg处理,导致svg-sprite-loader失效,在下面的exclude添加/.svg$/:
     {
        loader: require.resolve('file-loader'),
        exclude: [/.(js|mjs|jsx|ts|tsx)$/, /.html$/, /.json$/],
     		options: {
             name: 'static/media/[name].[hash:8].[ext]',
         },
     },
    

    @svgr/webpack在react中使用svg

    如果不使用svg-spirite-loader,create-react-app项目中还支持一种使用svg的方法,在webpack.config.js的babel-loader中的配置:

    require.resolve('babel-plugin-named-asset-import'),
    {
      loaderMap: {
        svg: {
          ReactComponent: '@svgr/webpack?-svgo,+titleProp,+ref![path]',
        },
      },
    },
    

    在需要使用icon的页面如下引用

    import{ReactComponent as User} from  'src/icons/user-icon.svg' //ReactComponent是必须的
    

    在页面中像使用React组件一样使用:

    <User />
    

    此处的babel插件babel-plugin-named-asset-import的作用是将:

    import {ReactComponent as User} from  'src/icons/user-icon.svg'
    

    转换为:

    import { ReactComponent as User } from "@svgr/webpack?-svgo,+titleProp,+ref!/static/media/user-icon.dccd0fcf.svg";
    

    然后由@svgr/webpack处理。

  • 相关阅读:
    异步非阻塞
    jdbc简单入门
    网络编程
    多线程
    java方法
    java之面向对象
    java-多线程
    Java之反射机制
    使用C#完成冒泡排序
    TextEdit不能空验证设置
  • 原文地址:https://www.cnblogs.com/walkermag/p/13389501.html
Copyright © 2011-2022 走看看