layui/example/src/components/LayAsideAnchor.vue

178 lines
3.5 KiB
Vue
Raw Normal View History

<template>
<aside :class="classAside">
<div class="lay-aside-top">
<lay-button
@click="handlerBtnClick()"
type="primary"
size="xs"
:class="classAsideBtn"
>
<lay-icon :type="iconType" size="40"> </lay-icon>
</lay-button>
</div>
<lay-scroll
class="layui-side-scroll-bar layui-side-scroll::-webkit-scrollbar" >
<ul>
<li
v-for="(item, index) in anchorsComput"
:key="index"
class="lay-aside-list"
:class="{ active: index === curridx }"
@click="curridx = index"
>
<a
:href="`#${item}`"
class="lay-aside-link"
:class="{ active: index === curridx }"
>{{ item }}</a
>
</li>
</ul>
</lay-scroll>
</aside>
</template>
<script setup lang="ts">
import { computed, ref } from "vue";
const props = defineProps<{
anchors?: Array<string> | string;
currIndex: number;
show: boolean | string;
}>();
let curridx = ref(props.currIndex);
const show = ref(props.show);
const iconType = ref("layui-icon-right");
const anchor = props.anchors;
const anchorsComput = computed(() => {
return typeof anchor === "string" ? anchor?.split(",") : anchor;
});
const classAside = computed(() => [
"lay-aside",
{ "lay-aside-collapse": !show.value },
]);
const classAsideBtn = computed(() => [
"lay-aside-collapse-btn",
{ "lay-aside-collapse-btn-collapse": !show.value },
]);
const handlerBtnClick = () => {
show.value = !show.value;
iconType.value = show.value ? "layui-icon-right" : "layui-icon-left";
};
</script>
<style lang="less" scoped>
.layui-side-scroll-bar{
overflow-y: scroll;
max-width: 156px;
}
.layui-side-scroll::-webkit-scrollbar {
width: 0;
}
.lay-aside {
position: fixed;
top: 65px;
right: 17px;
box-sizing: border-box;
width: 180px;
padding: 0 25px;
background-color: #ffffff;
border-left: 1px solid rgb(229 230 235);
transition: right 200ms;
height: calc(100% - 60px);
}
.lay-aside-top {
height: 29px;
}
.lay-aside-link {
display: inline-block;
padding: 1px 4px;
color: grey;
font-size: 13px;
line-height: 2;
max-width: 140px;
min-width: 68px;
text-decoration: none;
background-color: transparent;
border-radius: 2px;
cursor: pointer;
transition: all 0.1s cubic-bezier(0, 0, 1, 1);
&:hover {
background-color: #eeeeee;
color: #5fb878;
}
&:active {
background-color: #eeeeee;
color: #89d89f;
}
}
.lay-aside-list {
position: relative;
margin: 5px 0px 0px 4px;
padding-left: 2px;
max-width: 140px;
border-radius: 2px;
list-style: none;
&:hover {
background-color: #eeeeee;
color: #5fb878;
}
}
.active {
background-color: #eeeeee !important;
color: #5fb878 !important;
}
.lay-aside-collapse {
right: -180px;
opacity: 0.7;
}
.lay-aside-collapse-btn {
position: fixed;
right: 167px;
top: 20%;
display: flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
border: none;
background-color: #f6f6f6;
border-radius: 50%;
opacity: 0.7;
box-shadow: 2px 0 8px 0 rgb(29 35 41 / 5%);
&:hover {
background-color: #e2e2e2;
width: 32px;
height: 32px;
}
}
.lay-aside-collapse-btn-collapse {
right: 15px;
}
@media screen and (max-width: 768px) {
.lay-aside {
width: 100px !important;
}
.lay-aside-collapse-btn {
right: 98px;
}
.lay-aside-collapse-btn-collapse {
right: 15px;
}
.lay-aside-list {
max-width: 68px;
}
.layui-side-scroll-bar{
max-width: 68px;
}
}
</style>