菜单显示博客页

news2024/11/18 9:22:31

结果图

在这里插入图片描述

难点及其实现

滚动条自定义:

.card::-webkit-scrollbar {
width: 4px;

}

.card::-webkit-scrollbar-thumb {
border-radius: 8px;
box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
background: #666666;
}

.card::-webkit-scrollbar-thumb:hover {
background: #333333;
}

鼠标点击样式

样式图

请添加图片描述

逻辑

每次点击的时候先把鼠标位置赋值给:root,然后隔100ms出现一个圈,达到类似水波的样式

const clickFun = (event) => {
    document.documentElement.style.setProperty('--mouseX', event.clientX + 'px')
    document.documentElement.style.setProperty('--mouseY', event.clientY + 'px')
    const circle1 = document.createElement('div');
    circle1.className = 'firstCircle'
    document.body.appendChild(circle1);
    const circle2 = document.createElement('div');
    circle2.className = 'secondCircle'
    const circle3 = document.createElement('div');
    circle3.className = 'thirdCircle'
    setTimeout(() => {
        document.body.appendChild(circle2);
    }, 100)
    setTimeout(() => {
        document.body.appendChild(circle3);
        document.body.removeChild(circle1);
    }, 200); // 1000ms = 1s
    setTimeout(() => {
        document.body.removeChild(circle2);
    }, 300); // 1000ms = 1s
    setTimeout(() => {
        document.body.removeChild(circle3);
    }, 400); // 1000ms = 1s
} 

代码实现

<template>
    <div class="card" ref="card" @click="clickFun">
        <h1>{{ middle.name }}</h1>
        <ul>
            <li v-for="(item, index) in middle.contentList" :key="index"><a class="navigator" ref="navigator" href="#">{{
                item }}</a></li>
        </ul>
        <div v-html="htms"></div>
    </div>
</template>
<script setup>
import { onMounted, watch, ref, defineProps } from 'vue';
import showdown from 'showdown';
var converter = new showdown.Converter();
const card = ref(null);
const navigator = ref(null);

const props = defineProps(["middle"]);
const middle = ref(props.middle);
const htms = ref('');


const setMakedown = () => {
    htms.value = converter.makeHtml();
}

const clickFun = (event) => {
    document.documentElement.style.setProperty('--mouseX', event.clientX + 'px')
    document.documentElement.style.setProperty('--mouseY', event.clientY + 'px')
    const circle1 = document.createElement('div');
    circle1.className = 'firstCircle'
    document.body.appendChild(circle1);
    const circle2 = document.createElement('div');
    circle2.className = 'secondCircle'
    const circle3 = document.createElement('div');
    circle3.className = 'thirdCircle'
    setTimeout(() => {
        document.body.appendChild(circle2);
    }, 100)
    setTimeout(() => {
        document.body.appendChild(circle3);
        document.body.removeChild(circle1);
    }, 200); // 1000ms = 1s
    setTimeout(() => {
        document.body.removeChild(circle2);
    }, 300); // 1000ms = 1s
    setTimeout(() => {
        document.body.removeChild(circle3);
    }, 400); // 1000ms = 1s
}

watch(props, (newVal, oldVal) => {
    card.value.style.width = window.innerWidth * 0.6 + 'px';
    card.value.style.maxHeight = window.innerHeight * 0.6 + 'px';
    card.value.style.backgroundColor = newVal.middle.backgroundColor;
    console.log(newVal, oldVal, '123545648798');
    middle.value = newVal.middle;
})

onMounted(() => {
    document.documentElement.style.setProperty('--fontColor', middle.value.fontcolor)
    document.documentElement.style.setProperty('--textBgColor', middle.value.textBgColor)
    console.log(navigator.value, 12345);
    setMakedown()
    card.value.style.width = window.innerWidth * 0.6 + 'px';
    card.value.style.maxHeight = window.innerHeight * 0.6 + 'px';
    card.value.style.backgroundColor = middle.value.backgroundColor;
    window.addEventListener('resize', () => {
        card.value.style.width = window.innerWidth * 0.6 + 'px';
        card.value.style.maxHeight = window.innerHeight * 0.6 + 'px';
    })
})
</script>
<style>
/* body {
    scrollbar-color: black;
} */

:root {
    --fontColor: blue;
    --textBgColor: blue;
    --mouseX: 0px;
    --mouseY: 0px;
}

.firstCircle {
    width: 10px;
    height: 10px;
    border: rgb(21, 21, 204) solid 2px;
    border-radius: 50%;
    position: absolute;
    left: calc(var(--mouseX) - 5px);
    top: calc(var(--mouseY) - 5px);
    box-sizing: border-box;
    /*怪异地盒子模型*/

}

.secondCircle {
    width: 20px;
    height: 20px;
    border: rgb(0, 110, 255) solid 3px;
    border-radius: 50%;
    position: absolute;
    left: calc(var(--mouseX) - 10px);
    top: calc(var(--mouseY) - 10px);
    box-sizing: border-box;
    /*怪异地盒子模型*/

}

.thirdCircle {
    width: 30px;
    height: 30px;
    border: rgb(0, 174, 255) solid 4px;
    border-radius: 50%;
    position: absolute;
    left: calc(var(--mouseX) - 15px);
    top: calc(var(--mouseY) - 15px);
    box-sizing: border-box;
    /*怪异地盒子模型*/
}

.card {
    position: fixed;
    border-radius: 14px;
    background-color: white;
    bottom: 240px;
    left: 50%;
    transform: translate(-50%, 0);
    height: fit-content;
    overflow-y: auto;
}

.card::-webkit-scrollbar {
    width: 4px;
}

.card::-webkit-scrollbar-thumb {
    border-radius: 8px;
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
    background: #666666;
}

.card::-webkit-scrollbar-thumb:hover {
    background: #333333;
}


ul {
    margin-top: 20px;
    padding: 0px;
}

li {
    height: 24px;
    line-height: 24px;
    list-style-type: none;
}

.navigator {
    color: var(--fontColor);
    text-decoration: none;
    position: relative;
}

.navigator::after {
    content: '';
    position: absolute;
    z-index: -1;
    top: 60%;
    left: -0.35em;
    right: -0.35em;
    bottom: 0;
    transition: top 200ms cubic-bezier(0, 0.8, 0.13, 1);
    background-color: var(--textBgColor);
    border-radius: 5px;
}

.navigator:hover:after {
    top: 0%;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1359104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c# windows10大小端试

测试代码&#xff1a; unsafe public void ceshi() {byte[] by BitConverter.GetBytes(0x12345678);Debug.WriteLine(" byte[0] 0x" by[0].ToString("x2"));Debug.WriteLine(" byte[1] 0x" by[1].ToString("x2"));Debug.WriteLi…

MinIO 批处理框架添加了对过期时间的支持

您现在可以使用 MinIO 批处理框架执行 S3 删除操作&#xff0c;以通过单个 API 请求删除大量对象。借助 MinIO 批处理框架&#xff0c;可以快速轻松地在 MinIO 部署中执行重复或批量操作&#xff0c;例如批量复制和批量密钥轮换。MinIO 批处理框架处理所有手动工作&#xff0c;…

【自动化测试总结】优点、场景、流程、项目人员构成

一、自动化测试的概念 以程序测试程序&#xff0c;以代码代替思维&#xff0c;以脚本的运行代替手工测试&#xff0c;可以大大提高工作测试的效率。 二、自动化测试的优点 1.回归测试更为方便&#xff0c;可靠。自动化测试最主要的任务和特点&#xff0c;特别是在程序修改比较…

Minitab 20安装包下载及安装教程

Minitab 20下载链接&#xff1a;https://docs.qq.com/doc/DUmNYVGxtUnZkWUpk 1.选中下载好的安装包&#xff0c;鼠标右键解压到”Minitab 20“文件夹 2.选中Setup&#xff0c;鼠标右击选择“以管理员身份运行” 3.点击“下一步” 4.点击“下一步” 5.勾选我接受许可协议中的条…

oracle语法学习

oracle语法学习 1.备份表 create table bd_psndoc_temp as select * from bd_psndoc2.还原表 drop table bd_psndoc; create table bd_psndoc as select * from bd_psndoc_temp3.查询表的前5条记录 select * from bd_psndoc_temp where rownum<54.从一个表中复制所有的列…

stm32学习笔记:TIM-输出比较

四部分讲解内容&#xff0c;本文是第二部分 输出比较主要用于PWM波形的控制电机&#xff08;驱动电机的必要条件&#xff09; 1、定时器基本定时&#xff0c;定一个时间&#xff0c;然后让定时器每隔一段时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目…

HarmoryOS Ability页面的生命周期

接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 Ability页面的生命周期 学习前端&#xff0c;第一步最重要的是要理解&#xff0c;页面启动和不同场景下的生命周期的…

老师们居然这样把期末考试成绩发给家长——群发成绩系统的妙用

在现代社会&#xff0c;随着科技的发展和教育的进步&#xff0c;家校之间的沟通方式也在不断更新和完善。其中&#xff0c;群发成绩系统作为一种新型的教育信息化工具&#xff0c;在期末考试成绩的传递方面发挥了重要作用。老师们通过群发成绩系统&#xff0c;将期末考试成绩快…

合合TextIn团队发布 - 文档图像多模态大模型技术发展、探索与应用

合合信息TextIn&#xff08;Text Intelligence&#xff09;团队在2023年12月31日参与了中国图象图形学学会青年科学家会议 - 垂直领域大模型论坛。在会议上&#xff0c;丁凯博士分享了文档图像大模型的思考与探索&#xff0c;完整阐述了多模态大模型在文档图像领域的发展与探索…

在pycharm中执行 os.makedirs 提示用户名或密码不正确

问题&#xff1a;在pycharm中运行脚本&#xff0c;在 \10.0.21.249\share 共享目录下创建目录提示错误 发现&#xff1a;手动在该目录下创建目录没有问题。 解决方法&#xff1a; 切换到cmd 命令行运行该脚本成功创建 猜测&#xff1a;感觉应该是pycharm中使用的用户名和密码存…

医疗设备产生谐波对配电系统危害有哪些

1.对电网的影响 电网中的谐波会增加系统损耗&#xff0c;使设备发热&#xff0c;影响设备使用寿命。此外当并联的无功补偿电容器容抗与系统感抗匹配时&#xff0c;将发生n次并联谐振&#xff0c;造成电容器组的过电压和过电流。当基波频率为时&#xff0c;谐振频率&#xff0c…

【重磅新品】小眼睛科技推出紫光同创盘古系列FPGA开发板套件,盘古200K开发板,紫光同创PG2L200H,Logos2系列

FPGA&#xff0c;即现场可编程门阵列&#xff0c;作为可重构电路芯片&#xff0c;已经成为行业“万能芯片”&#xff0c;在通信系统、数字信息处理、视频图像处理、高速接口设计等方面都有不俗的表现。近几年&#xff0c;随着国家战略支持和产业发展&#xff0c;国产FPGA迎来迅…

LLM(九)| 使用LlamaIndex本地运行Mixtral 8x7大模型

欧洲人工智能巨头Mistral AI最近开源Mixtral 8x7b大模型&#xff0c;是一个“专家混合”模型&#xff0c;由八个70亿参数的模型组成。Mistral AI在一篇博客文章&#xff08;https://mistral.ai/news/mixtral-of-experts/&#xff09;介绍了Mixtral 8x7b&#xff0c;在许多基准上…

代码随想录算法训练营第十五天| 二叉树 513. 找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 层序遍历 本题用层序遍历可以直接秒了&#xff0c;直接提取每一层中最左边的元素&#xff08;i0&#xff09;&#xff0c;然后保存到最后一层即可。 class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> que;int…

【金猿人物展】东方金信董事长兼总经理王伟哲:价值化、智能化驱动下的大数据,治理仍需深化...

‍ 王伟哲 本文由东方金信董事长兼总经理王伟哲撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度趋势人物榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 2023年&#xff0c;数据要素、公共数据授权运营成为热点话题&#xff0c;也是激活数据…

Flume基础知识(二):Flume安装部署

1. Flume 安装部署 1.1 安装地址 &#xff08;1&#xff09;Flume 官网地址&#xff1a;Welcome to Apache Flume — Apache Flume &#xff08;2&#xff09;文档查看地址&#xff1a;Flume 1.11.0 User Guide — Apache Flume &#xff08;3&#xff09;下载地址&#xf…

Halcon计算封闭区域(孔洞)的面积area_holes

Halcon计算封闭区域&#xff08;孔洞&#xff09;的面积 除了可以用area_center 算子计算区域的面积以外&#xff0c;在Halcon中还可以使用area_holes算子计算图像中封闭区域&#xff08;孔洞&#xff09;的面积。该面积指的是区域中孔洞部分包含的像素数。一个区域中可能不只…

深入了解Swagger注解:@ApiModel和@ApiModelProperty实用指南

在现代软件开发中&#xff0c;提供清晰全面的 API 文档 至关重要。ApiModel 和 ApiModelProperty 这样的代码注解在此方面表现出色&#xff0c;通过增强模型及其属性的元数据来丰富文档内容。它们的主要功能是为这些元素命名和描述&#xff0c;使生成的 API 文档更加明确。 Api…

解读 $mash 通证 “Fair Launch” 规则(Staking 玩法解读篇)

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台&#xff0c;该平台旨在为 Solana 原生铭文项目&#xff0c;以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash&#xff0c;将会有更多的 Solana 生态的铭…

静态网页设计——电影推荐网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1NK411x7oK/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…