【vue.js】手把手教你用css实现毛巾纹理文字效果

效果

在这里插入图片描述

在这里插入图片描述

背景

通过svg的filter等属性实现背景凹凸不平质感的文字,我们知道css有filter属性,那么svg可以理解为更强大的css,为了实现凹凸不平,主要思路是动态生成灰度图。废话不多说,3、2、1,上代码~

代码

<!DOCTYPE html>
<html lang="en" style="overflow: hidden;">
<head>
  <title>毛巾测试</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  <link rel="shortcut icon" href="../../favicon.ico">
  <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/element-plus/2.3.3/index.css" rel="stylesheet">
  <script src="https://unpkg.com/vue@3"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/element-plus/2.3.3/index.full.js"></script>
</head>
<body>
  <div id="app">
    <div style="width: 300px;margin: 10px auto;display: flex;">
      <el-select v-model="backgroundImg">
        <el-option
          v-for="item in options"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        />
      </el-select>
      <el-input v-model="text"></el-input>
      <el-color-picker v-model="color" />
    </div>
    <svg viewBox="0 0 600 330" style="width: 60%;margin: 0 auto;display: block;">
      <defs>
        <filter id="conform">
          <feImage
            :href="`./${backgroundImg}`"
            x="0"
            y="0"
            width="100%"
            height="100%"
            preserveAspectRatio="none"
            result="ORIGIN_IMAGE"
          ></feImage>
          <feColorMatrix
            in="ORIGIN_IMAGE"
            type="saturate"
            values="0"
            result="GRAY_IMAGE"
          ></feColorMatrix>
          <feDisplacementMap
            in="SourceGraphic"
            in2="GRAY_IMAGE"
            scale="15"
            xChannelSelector="R"
            yChannelSelector="R"
            result="TEXTURE_TEXT"
          ></feDisplacementMap>
          <feImage
            :href="`./${backgroundImg}`"
            x="0"
            y="0"
            width="100%"
            height="100%"
            preserveAspectRatio="none"
            result="BG"
          ></feImage>
          <feColorMatrix
            in="TEXTURE_TEXT"
            result="OPACITY_TEXT"
            type="matrix"
            values="1 0 0 0 0
                    0 1 0 0 0
                    0 0 1 0 0
                    0 0 0 0.9 0"
          ></feColorMatrix>
          <feBlend
            in="BG"
            in2="OPACITY_TEXT"
            mode="multiply"
            result="BLENDED_TEXT"
          ></feBlend>
        </filter>
      </defs>
      <Image
        :href="`./${backgroundImg}`"
        x="0"
        y="0"
        width="100%"
        height="100%"
        preserveAspectRatio="none"
      ></Image>
      <text
        x="50%"
        y="50%"
        font-size="9em"
        font-weight="bold"
        text-anchor="middle"
        alignment-baseline="middle"
        :fill="color"
        filter="url(#conform)"
      >{{ text }}</text>
    </svg>
  </div>
  <script type="text/javascript">
    const { createApp, reactive, ref } = Vue
    const app = createApp({
      setup() {
        const text = ref('纹理文字')
        const color = ref('#73767a')
        const backgroundImg = ref('towel3.jpg')
        const options = ref([
          {
            value: 'towel.jpg',
            label: 'towel.jpg'
          },
          {
            value: 'towel2.jpg',
            label: 'towel2.jpg'
          },
          {
            value: 'towel3.jpg',
            label: 'towel3.jpg'
          },
        ])
        return {
          text,
          color,
          backgroundImg,
          options
        }
      }
    })
    app.use(ElementPlus).mount("#app")
  </script>
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饺子大魔王12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值