vuepress-theme-reco/components/HomeBlog.vue

354 lines
8.5 KiB
Vue
Raw Normal View History

<template>
<div class="home-blog">
2019-12-06 19:40:21 +08:00
<div class="hero" :style="{ ...bgImageStyle }">
<div
class="mask"
:style="{
background: `url(${$frontmatter.bgImage ? $withBase($frontmatter.bgImage) : require('../images/home-bg.jpg')}) center/cover no-repeat`}"></div>
<ModuleTransition>
2019-12-06 19:40:21 +08:00
<img
2019-12-09 11:31:35 +08:00
v-if="recoShowModule && $frontmatter.heroImage"
:style="heroImageStyle || {}"
:src="$withBase($frontmatter.heroImage)"
2019-12-06 19:40:21 +08:00
alt="hero">
</ModuleTransition>
2019-12-09 11:31:35 +08:00
<ModuleTransition delay="0.04">
2019-12-08 20:12:48 +08:00
<h1 v-if="$frontmatter.isShowTitleInHome !== false">{{ $frontmatter.heroText || $title || '午后南杂' }}</h1>
</ModuleTransition>
<ModuleTransition delay="0.08">
2019-12-15 13:19:22 +08:00
<p v-show="recoShowModule" class="description">
{{ $description || 'Welcome to your vuePress-theme-reco site' }}
</p>
</ModuleTransition>
<ModuleTransition delay="0.16">
<p
class="huawei"
2019-12-06 00:22:20 +08:00
v-if="recoShowModule && $themeConfig.huawei === true">
<i class="iconfont reco-huawei" style="color: #fc2d38"></i>&nbsp;&nbsp;&nbsp;华为为中华而为之
</p>
</ModuleTransition>
</div>
<ModuleTransition delay="0.24">
2019-12-15 13:19:22 +08:00
<div v-show="recoShowModule" class="home-blog-wrapper">
<div class="blog-list">
<!-- 博客列表 -->
<note-abstract
:data="$recoPosts"
:currentPage="currentPage"></note-abstract>
<!-- 分页 -->
<pagation
class="pagation"
:total="$recoPosts.length"
:currentPage="currentPage"
@getCurrentPage="getCurrentPage" />
</div>
<div class="info-wrapper">
<PersonalInfo/>
<h4><i class="iconfont reco-category"></i> 分类</h4>
<ul class="category-wrapper">
<li class="category-item" v-for="(item, index) in this.$categories.list" :key="index">
<router-link :to="item.path">
<span class="category-name">{{ item.name }}</span>
<span class="post-num" :style="{ 'backgroundColor': getOneColor() }">{{ item.pages.length }}</span>
</router-link>
</li>
</ul>
<hr>
<h4 v-if="$tags.list.length !== 0"><i class="iconfont reco-tag"></i> 标签</h4>
<TagList @getCurrentTag="getPagesByTags" />
<h4 v-if="$themeConfig.friendLink && $themeConfig.friendLink.length !== 0"><i class="iconfont reco-friend"></i> 友链</h4>
<FriendLink />
</div>
2019-09-20 13:54:13 +08:00
</div>
</ModuleTransition>
<ModuleTransition delay="0.36">
2019-12-15 13:19:22 +08:00
<Content v-show="recoShowModule" class="home-center" custom/>
</ModuleTransition>
</div>
</template>
<script>
import TagList from '@theme/components/TagList'
import FriendLink from '@theme/components/FriendLink'
import NoteAbstract from '@theme/components/NoteAbstract'
import pagination from '@theme/mixins/pagination'
import ModuleTransition from '@theme/components/ModuleTransition'
import PersonalInfo from '@theme/components/PersonalInfo'
import { getOneColor } from '@theme/helpers/other'
import moduleTransitonMixin from '@theme/mixins/moduleTransiton'
export default {
mixins: [pagination, moduleTransitonMixin],
components: { NoteAbstract, TagList, FriendLink, ModuleTransition, PersonalInfo },
data () {
return {
2019-07-06 02:00:12 +08:00
recoShow: false,
2019-10-04 22:35:38 +08:00
currentPage: 1,
2019-09-20 13:54:13 +08:00
tags: []
}
},
computed: {
2019-09-20 13:54:13 +08:00
actionLink () {
2019-10-27 20:34:46 +08:00
const {
actionLink: link,
actionText: text
} = this.$frontmatter
2019-10-27 20:34:46 +08:00
return {
2019-10-27 20:34:46 +08:00
link,
text
2019-09-20 13:54:13 +08:00
}
},
heroImageStyle () {
return this.$frontmatter.heroImageStyle || {
maxHeight: '200px',
margin: '6rem auto 1.5rem'
}
2019-07-06 02:00:12 +08:00
},
bgImageStyle () {
2019-10-27 20:34:46 +08:00
const initBgImageStyle = {
2019-07-06 02:00:12 +08:00
height: '350px',
textAlign: 'center',
overflow: 'hidden'
}
2019-10-27 20:34:46 +08:00
const {
bgImageStyle
} = this.$frontmatter
2019-10-04 22:35:38 +08:00
2019-10-27 20:34:46 +08:00
return bgImageStyle ? { ...initBgImageStyle, ...bgImageStyle } : initBgImageStyle
},
2019-10-04 22:35:38 +08:00
heroHeight () {
return document.querySelector('.hero').clientHeight
2019-07-06 02:00:12 +08:00
}
},
mounted () {
this.recoShow = true
this._setPage(this._getStoragePage())
},
methods: {
2019-10-04 22:35:38 +08:00
// 获取当前页码
getCurrentPage (page) {
this._setPage(page)
setTimeout(() => {
window.scrollTo(0, this.heroHeight)
}, 100)
},
// 根据分类获取页面数据
getPages () {
let pages = this.$site.pages
pages = pages.filter(item => {
const { home, date } = item.frontmatter
return !(home == true || date === undefined)
})
// reverse()是为了按时间最近排序排序
this.pages = pages.length == 0 ? [] : pages
},
getPagesByTags (tagInfo) {
this.$router.push({ path: tagInfo.path })
2019-07-06 02:00:12 +08:00
},
2019-10-04 22:35:38 +08:00
_setPage (page) {
this.currentPage = page
this.$page.currentPage = page
this._setStoragePage(page)
},
getOneColor
}
2019-09-20 13:54:13 +08:00
}
</script>
<style lang="stylus">
.home-blog {
padding: $navbarHeight 0 0;
margin: 0px auto;
.hero {
2019-12-06 19:40:21 +08:00
position relative
.mask {
position absolute
top 0
bottom 0
left 0
right 0
2019-12-09 11:31:35 +08:00
z-index -1
2019-12-06 19:40:21 +08:00
&:after {
display block
content ' '
background var(--mask-color)
position absolute
top 0
bottom 0
left 0
right 0
z-index 0
opacity .2
}
}
figure {
position absolute
background yellow
}
h1 {
2019-07-25 19:01:14 +08:00
margin:7rem auto 1.8rem;
font-size: 2.5rem;
}
h1, .description, .action, .huawei {
color #fff
}
.description {
margin: 1.8rem auto;
font-size: 1.6rem;
line-height: 1.3;
}
}
2019-07-06 02:00:12 +08:00
.home-blog-wrapper {
display flex
align-items: flex-start;
margin 20px auto 0
max-width 1126px
2019-10-08 22:57:03 +08:00
.blog-list {
flex auto
width 0
.abstract-wrapper {
.abstract-item:last-child {
margin-bottom: 0px;
}
}
2019-10-08 22:57:03 +08:00
}
.info-wrapper {
position: -webkit-sticky;
position: sticky;
top: 70px;
transition all .3s
margin-left 15px;
2019-10-09 10:44:26 +08:00
flex 0 0 300px
height auto;
box-shadow var(--box-shadow);
border-radius $borderRadius
2019-07-06 02:00:12 +08:00
box-sizing border-box
padding 0 15px
background var(--background-color)
&:hover {
box-shadow: var(--box-shadow-hover);
}
h4 {
color var(--text-color)
}
2019-07-06 02:00:12 +08:00
.category-wrapper {
list-style none
padding-left 0
.category-item {
2019-10-04 22:50:05 +08:00
margin-bottom .4rem
2019-07-06 02:00:12 +08:00
padding: .4rem .8rem;
2019-09-20 13:54:13 +08:00
transition: all .5s
border-radius $borderRadius
box-shadow var(--box-shadow)
background-color var(--background-color)
2019-07-06 02:00:12 +08:00
&:hover {
transform scale(1.04)
2019-07-06 02:00:12 +08:00
}
a {
display flex
justify-content: space-between
.post-num {
width 1.6rem;
height 1.6rem
text-align center
line-height 1.6rem
border-radius $borderRadius
2019-07-06 02:00:12 +08:00
background #eee
font-size .6rem
color #fff
2019-07-06 02:00:12 +08:00
}
}
}
}
}
}
}
@media (max-width: $MQMobile) {
2019-07-06 02:00:12 +08:00
.home-blog {
padding-left: 1.5rem;
padding-right: 1.5rem;
.hero {
margin 0 -1.5rem
height 450px
img {
max-height: 210px;
margin: 2rem auto 1.2rem;
}
h1 {
margin: 6rem auto 1.8rem ;
font-size: 2rem;
}
h1, .description, .action {
// margin: 1.2rem auto;
}
.description {
font-size: 1.2rem;
}
.action-button {
font-size: 1rem;
padding: 0.6rem 1.2rem;
}
}
2019-07-06 02:00:12 +08:00
.home-blog-wrapper {
.info-wrapper {
2019-07-06 02:00:12 +08:00
display none!important
}
}
}
}
@media (max-width: $MQMobileNarrow) {
2019-07-06 02:00:12 +08:00
.home-blog {
padding-left: 1.5rem;
padding-right: 1.5rem;
.hero {
margin 0 -1.5rem
2019-07-06 02:00:12 +08:00
height 350px
img {
max-height: 210px;
margin: 2rem auto 1.2rem;
}
h1 {
margin: 6rem auto 1.8rem ;
font-size: 2rem;
}
h1, .description, .action {
// margin: 1.2rem auto;
}
.description {
font-size: 1.2rem;
}
.action-button {
font-size: 1rem;
padding: 0.6rem 1.2rem;
}
}
2019-07-06 02:00:12 +08:00
.home-blog-wrapper {
.info-wrapper {
2019-07-06 02:00:12 +08:00
display none!important
}
}
}
}
</style>