局部引入vuetify样式不生效_Vuetify实现带有LOGO的app-bar

本文介绍了在Vuetify中遇到的样式问题,特别是如何在app-bar中添加LOGO并实现跳转。通过设置app属性,使用<v-img>组件并调整布局来解决LOGO显示和定位问题,同时讨论了不同解决方案的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

我尝试着使用Vuetify作为我的项目的UI框架,在踩坑两天之后基本清楚了Vuetify的结构,但还是有很多模糊的地方。

不多不说,说Vuetify不适合国人不仅仅是因为Material Design,其中文文档太过贫瘠(虽然我一直认为这些框架的文档都很贫瘠),更不用说中文的博客和文章了。

这也就是我把这一次踩坑的过程写下来的原因。

问题

就目前我所观察到的,Vuetify虽然是一个多终端兼容的框架,但是其本质依然是一个基于移动端UI的框架,尤其是体现在设计层面,这一点与ElementUI完全不同,也有点颠覆我之前开发前端的世界观。当我尝试着把我的界面理解成一个移动端的App,很多疑惑就消失了。

例如,在ElementUI中常见的Header,我目前还没有在Vuetify中看到类似的概念(更有可能是我学习的不够),取而代之的是bars。

而至于bars是什么,可以参考Vuetify的官方文档:

https://vuetifyjs.com/zh-Hans/components/app-bars/​vuetifyjs.com

现在,需要解决一个非常普遍的需求,在bars(header)中加入一个LOGO,并且可以让这个LOGO跳转到页面,一般来说是主页。

解决方案

这个问题并不难解决,难的是具体的布局。在传统的html与css里,这个功能可以通过简单的<ul><li>标签实现,但是在Vuetify里绕了一点弯路。

首先,既然我们选择app-bar替代header,那么我们需要一些基础的设置:

<template>
  <v-app>
    <v-app-bar color="#ffffff" elevation="18" app>
    </v-app-bar>
  </v-app>

这里需要注意的一点是,一定要指明app属性,否则会出现很多问题。

至于为什么会出现这么多问题,我还不清楚,我也不太想搞清楚。

ca6f27d3ee1fa0b604268c4a3770f0f7.png

效果如图,其中elevation被翻译成海拔,实际指的是阴影的深度和面积,类似Photoshop中图层阴影效果的距离和扩散还有不透明度。

但是翻译成海拔是认真的吗?我真的觉得elevation翻译成距离都比海拔更具体。

接下来要插入LOGO。在这里有一个特殊情况,就是我的LOGO比较长,而一般的LOGO都是正方形或者一个短矩形,所以接下来一些问题也具有特异性。

我们使用<v-img>标签插入LOGO。这是Vuetify中的一个组件,用于替代img。

需要注意一点,在这里不能使用<v-app-bar>的src属性,src使用的是背景图。

ae053aa65a3d683e54b1519c739bce8c.png

意料之中,但是如何处理这个不受约束的v-img呢?我面对StackOverflow编程得出了答案:

How to add logo to AppBar in Vuetify?​stackoverflow.com
32323511d745dda668978b1c73f7db70.png

其中:

You can add a v-img component like this:
<v-app-bar color="light-blue lighten-3" app>

  <v-img
    class="mx-2"
    src="https://i.imgur.com/qgGY4tB.png"
    max-height="40"
    max-width="40"
    contain
  ></v-img>

  <v-toolbar-title class="ml-2">
    Page title
  </v-toolbar-title>

</v-app-bar>
It's important to set a max-height and max-width, otherwise the image will overflow the nav vertically and push over the title horizontally. And also set contain to preserve the aspect ratio

大概意思就是说一定要定义max属性防止图像溢出,同时使用contain属性防止图片被裁切。

而同时为了固定LOGO位置,我依据API文档使用position属性:

<template>
  <v-app>
    <v-app-bar color="#ffffff" elevation="18" app>
      <v-img
        alt="LIKEDREAMWALKER"
        src="./assets/LDW_2020_Web.png"
        max-height="5vh"
        max-width="40vw"
        position="center left"
        contain
      ></v-img>
    </v-app-bar>
  </v-app>
</template>

这样也就完美解决了这个问题。

187f6ef82d24464d455981a56cd8cdd7.gif

而在多终端的适配上,由于我的LOGO比较长,出现了一些小问题,尤其是在屏幕宽度较窄的情况下。我的解决方案就是尽可能的增大max-width属性的值,但是这不是一个完美的解决方案。

280396ebc0e85a97de812dc24b3c16a6.gif

至于其他的解决方案其实还有很多,例如完全使用原始的img和布局方案,这一点也有人做出了回答:

Yon can juste use the <img> balise from native html to set your logo.
Then you can resize them with width or height property.

超链接

超链接是我目前还没有很好解决的问题。

在我没有使用框架开发的时候,我一般会使用<img>和<a>标签嵌套,同时重定义<a>的样式,效果非常好。

<template>
  <v-app>
    <v-app-bar color="#ffffff" elevation="18" app>
      <a href="https://cn.bing.com">
        <v-img
          alt="LIKEDREAMWALKER"
          src="./assets/LDW_2020_Web.png"
          max-height="5vh"
          max-width="40vw"
          position="center left"
          contain
        ></v-img>
      </a>
    </v-app-bar>
  </v-app>
</template>

不过这个方法有一个小问题,就是我无法很好的控制实际的<v-img>标签尺寸,所以超链接区域实际上是非常大的,这很容易造成误操作。但是如果你是使用了一个相对固定的LOGO,例如一个正方形,就基本不会出现这个问题。

fc17bd6d1307a23a7ca795b3168cacf3.gif

综上,可能解决问题的最好方法就是消灭问题吧,换一个LOGO就完全没有这么多问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值