前置教程:
引用站外地址
Hexo Butterfly博客魔改的一点点基础
Ariasakaの小窝
本教程仅适用于hexo-theme-butterfly,其余主题请自行探讨
  前言现在随着显示器成本降低,越来越多的人都用上了大屏幕,这时博客的标准宽度就显得很憋屈了,空间利用率太低,无法充分展示博文内容。
而且看起来也不舒服,尤其是加了首页banner之后,我放出以前没有宽屏的博客版本(Vercel每次部署都有单独域名,好东西)
这是很远古的博客了,所以啥也没有。。。见谅。
LYXの小窝 (lyxoffpage-22gpafksa-lyxofficial.vercel.app) 
怎么样,憋屈吗?
所以宽屏适配很重要,像是洪哥的博客就很舒服(翻了翻日志以前没做适配的时候也是没那么舒服)
宽屏适配当然不是这么一句css能完全搞定的,不然看起来很难受~~(你以为为什么我会为了这玩意专门写这么多)~~
1 2 3 .layout {  max-width :1400px ; } 
好的,教程正式开始。
为了适用于大部分情况,本教程使用纯净的未魔改过的butterfly4.3.1全新环境进行教学,不确保butterfly旧版一定可用(4.1.0+放心食用,3.x、2.x甚至1.x谨慎食用)
  基础  引入css事先说明一下引入css的方式:
在 [blogRoot]/themes/butterfly/source/css里面添加一个css文件,名字任意。
然后在主题配置文件的inject部分这样编写:
1 2 3 4 5 inject:   head:    -  <link  rel="stylesheet"  href="/css/{你的css文件名}">    bottom:    -  ...  
注意要放在主题的source里面,放在hexo的source会出现bug。
然后你可以试着引入开始那个css了
  修改边栏卡片大小如果你直接引入那个css的话,你大概会看见这样的场面
有没有什么感觉?对吧,右侧的卡片宽度太宽了,看起来很不舒服,我们想要的是跟之前一样的右侧卡片
所以要限制一下卡片的尺寸。
点击查看魔改教程 加入以下css:
1 2 3 4 5 6 7 .aside-content {    max-width :312px ;     min-width :300px ; } .recent-posts {  width :auto!important ; } 
现在右侧卡片就窄一点了。
但是这样的话如果使用平板的尺寸浏览的话,底部卡片就会无法完全伸展(如下图),显得很bug
这时有两种解决方案:
第一招:不显示 第二招:根据屏幕尺寸自适应max-width 效果如下:
添加如下css:
1 2 3 4 5 6 @media  screen and  (max-width : 900px ){    .card-widget :not (#card-toc ){         display :none!important ;     }      } 
效果如下:
简单说就是在宽度小于900px时不设置max-width,添加以下css:
1 2 3 4 5 @media  screen and  (max-width : 900px ){    .aside-content {         max-width :none!important ;     } } 
  分页适配看到洪哥的分页界面是没有作者卡片的(下图),如果你也想实现这样的效果的话,你可以按照下面魔改
点击查看魔改教程 添加以下css:
1 2 3 4 5 6 #archive ,#page ,#category ,#tag {    width :100% ; } .page  .aside-content {    display : none; } 
然后你会发现文章页确实没有了卡片,可是首页也没了(如下图),我们想要的是首页有卡片分页没有,对吧?
所以我们要魔改主题以便css区分主页和分页,按照下面修改 [blogRoot]\themes\butterfly\layout\includes\layout.pug
1 2 3 4 5 6 7 8 9  - var htmlClassHideAside = theme.aside.enable && theme.aside.hide ? 'hide-aside' : ''  - page.aside = is_archive() ? theme.aside.display.archive: is_category() ? theme.aside.display.category : is_tag() ? theme.aside.display.tag : page.aside  - var hideAside = !theme.aside.enable || page.aside  - - var pageType = is_post() ? 'post' : 'page' + - var pageType = is_home() ? 'page home' : is_post() ? 'post' : 'page' doctype html html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside)   ... 
或者直接用改好的pug(4.2.2&4.3.1可以食用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 - var  htmlClassHideAside = theme.aside .enable  && theme.aside .hide  ? 'hide-aside'  : ''  - page.aside  = is_archive () ? theme.aside .display .archive : is_category () ? theme.aside .display .category  : is_tag () ? theme.aside .display .tag  : page.aside  - var  hideAside = !theme.aside .enable  || page.aside  === false  ? 'hide-aside'  : ''  - var  pageType = is_home () ? 'page home'  : is_post () ? 'post'  : 'page'  doctype html html (lang=config.language  data-theme=theme.display_mode  class =htmlClassHideAside)  head     include ./head.pug    body     if  theme.preloader        !=partial ('includes/loading/loading' , {}, {cache : true })     if  theme.background        #web_bg        !=partial ('includes/sidebar' , {}, {cache : true })     if  page.type  !== '404'        #body-wrap (class =pageType)         include ./header/index.pug          main#content-inner.layout (class =hideAside)           if  body             div!= body           else              block content             if  theme.aside .enable  && page.aside  !== false                include widget/index.pug          - var  footerBg = theme.footer_bg          if  (footerBg)           if  (footerBg === true )             - var  footer_bg = bg_img           else              - var  footer_bg = theme.footer_bg .indexOf ('/' ) !== -1  ? `background-/image: url('${url_for(footerBg)} ')`  : `background: ${footerBg} `          else            - var  footer_bg = ''          footer#footer (style=footer_bg)           !=partial ('includes/footer' , {}, {cache : true })     else        include ./404. pug     include ./rightside.pug      !=partial ('includes/third-party/search/index' , {}, {cache : true })     include ./additional-js.pug  
现在主页的class就变成page home了,接下来将前面的css改为以下:
1 2 3 4 5 6 7 #archive ,#page ,#category ,#tag {    width :100% ; } .page :not (.page .home ) .aside-content {    display : none; } 
现在主题就能智能区分主页和分页了,可以自动选择卡片显示。
如果想要背景透明(如下图)的话
添加如下css:
1 2 3 4 5 6 .page  #page :not (.home  #page ),.page  #tag ,.page  #archive ,.page  #category {    background : transparent!important ;     border : none!important ;     box-shadow : none!important ;     padding-top : 0 ; } 
  首页卡片适配宽度这么宽,首页只显示一行一张卡片确实有点浪费,可以安装butterfly-article-double-row插件解决,但是————
这个插件没有自适应,也就是说在低分辨率网页较窄的时候显得很拥挤,所以这次使用手动魔改的方式。
点击查看魔改教程 加入以下css(参考自冰老师的butterfly-article-double-row):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 @media  screen and  (min-width : 1200px ) {    #recent-posts {         margin-top :-1rem ;           align-content :flex-start;         display : flex;         flex-wrap : wrap;          justify-content : space-between;      }     #recent-posts  > .recent-post-item  {                margin-top : 1rem ;        display : inline-block;       height :auto;        width :49% ;     }     #recent-posts  > .recent-post-item  .post_cover  {       width : 100% ;          height : 200px ;     }     #recent-posts  > .recent-post-item  .post_cover  img .post_bg  {       width : 100% ;       height : 100% ;     }     #recent-posts  > .recent-post-item  {          -webkit-flex-direction : column;        -ms-flex-direction : column;        flex-direction : column;         }     #recent-posts  > .recent-post-item  .left_radius  {         border-radius : 8px  8px  0  0 ;     }     #recent-posts  > .recent-post-item  .right_radius  {         border-radius : 8px  8px  0  0 ;     }     .recent-post-item {         height :auto !important ;     }        .recent-post-info  {          padding : 0  40px ;       margin-top : 1em ;       width : 100% !important ;     }     #recent-posts  > .recent-post-item  > .recent-post-info  > .article-title  {         -webkit-line -clamp: 1 ;         margin-top : 0.3rem ;          margin-bottom : 0.3rem ;         font-size : 1.2em ;          line-height : 1.4 ;         }     #recent-posts  > .recent-post-item  >.recent-post-info  > .article-meta-wrap  {         margin-bottom : 1rem ;     } } 
这时进入网站会发现实现了自适应功能,但是双栏下文章信息挂在了文章下面,看起来很不舒服,这时要修改主题pug文件
修改
提示:魔改有风险,因为每个版本的butterfly的这个pug都不太一样,且pug对缩进要求高,小白容易出错,且我无法给出旧版改好的pug(因为不一样),所以请备份文件,以免出错。
打开 `[blogRoot]\themes\Butterfly\layout\includes\mixins\post-ui.pug`
把这一句改到 .article-title(href=url_for(link) title=title)= title这句后面,原来的删掉:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 case  theme.index_post_content .method   when false      - break    when 1      .content != article.description    when 2      if  article.description        .content != article.description    else      - const  content = strip_html (article.content )     - let  expert = content.substring (0 , theme.index_post_content .length )      - content.length  > theme.index_post_content .length  ? expert += ' ...'  : ''      .content != expert   default      - const  content = strip_html (article.content )     - let  expert = content.substring (0 , theme.index_post_content .length )      - content.length  > theme.index_post_content .length  ? expert += ' ...'  : ''      .content != expert 
diff:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 mixin postUI(posts)   each article , index in page.posts.data     .recent-post-item       -       ...         a.article-title(href=url_for(link) title=title)= title +        case theme.index_post_content.method +          when false +            - break +          when 1 +            .content!= article.description +          when 2 +            if article.description +              .content!= article.description +            else +              - const content = strip_html(article.content) +              - let expert = content.substring(0, theme.index_post_content.length)  +              - content.length > theme.index_post_content.length ? expert += ' ...' : '' +              .content!= expert +          default +            - const content = strip_html(article.content) +            - let expert = content.substring(0, theme.index_post_content.length)  +            - content.length > theme.index_post_content.length ? expert += ' ...' : '' +            .content!= expert         .article-meta-wrap           if (is_home() && (article.top || article.sticky > 0))             span.article-meta               i.fas.fa-thumbtack.sticky               span.sticky= _p('sticky')               span.article-meta-separator |           ...         //- Display the article introduction on homepage -        case theme.index_post_content.method -                when false -                    - break -                when 1 -                    .content!= article.description -                when 2 -                    if article.description -                    .content!= article.description -                    else -                    - const content = strip_html(article.content) -                    - let expert = content.substring(0, theme.index_post_content.length)  -                    - content.length > theme.index_post_content.length ? expert += ' ...' : '' -                    .content!= expert -                default -                    - const content = strip_html(article.content) -                    - let expert = content.substring(0, theme.index_post_content.length)  -                    - content.length > theme.index_post_content.length ? expert += ' ...' : '' -                    .content!= expert     if theme.ad && theme.ad.index       ... 
The edited code for butterfly 4.2.2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 mixin postUI (posts)   each article , index in  page.posts .data      .recent -post-item.words        -         let  link = article.link  || article.path          let  title = article.title  || _p ('no_title' )         const  position = theme.cover .position          let  leftOrRight = position === 'both'             ? index%2  == 0  ? 'left'  : 'right'            : position === 'left'  ? 'left'  : 'right'          let  post_cover = article.cover          let  no_cover = article.cover  === false  || !theme.cover .index_enable  ? 'no-cover'  : ''        -       if  post_cover && theme.cover .index_enable          .post_cover (class =leftOrRight)           a (href=url_for (link) title=title)             img.post_bg (src=url_for (post_cover) onerror=`this.onerror=null;this.src='` + url_for (theme.error_img .post_page ) + `'`  alt=title)       .recent -post-info (class =no_cover)         a.article -title (href=url_for (link) title=title)= title                  case  theme.index_post_content .method            when false              - break            when 1              .content != article.description            when 2              if  article.description                .content != article.description              else                - const  content = strip_html (article.content )               - let  expert = content.substring (0 , theme.index_post_content .length )                - content.length  > theme.index_post_content .length  ? expert += ' ...'  : ''                .content != expert           default              - const  content = strip_html (article.content )             - let  expert = content.substring (0 , theme.index_post_content .length )              - content.length  > theme.index_post_content .length  ? expert += ' ...'  : ''              .content != expert         .article -meta-wrap           if  (is_home () && (article.top  || article.sticky  > 0 ))             span.article -meta               i.fas .fa -thumbtack.sticky                span.sticky = _p ('sticky' )               span.article -meta-separator |           if  (theme.post_meta .page .date_type )             span.post -meta-date               if  (theme.post_meta .page .date_type  === 'both' )                 i.far .fa -calendar-alt                 span.article -meta-label=_p ('post.created' )                 time.post -meta-date-created (datetime=date_xml (article.date ) title=_p ('post.created' ) + ' '  + full_date (article.date ))=date (article.date , config.date_format )                 span.article -meta-separator |                 i.fas .fa -history                 span.article -meta-label=_p ('post.updated' )                 time.post -meta-date-updated (datetime=date_xml (article.updated ) title=_p ('post.updated' ) + ' '  + full_date (article.updated ))=date (article.updated , config.date_format )               else                  - let  data_type_updated = theme.post_meta .page .date_type  === 'updated'                  - let  date_type = data_type_updated ? 'updated'  : 'date'                  - let  date_icon = data_type_updated ? 'fas fa-history'  :'far fa-calendar-alt'                  - let  date_title = data_type_updated ? _p ('post.updated' ) : _p ('post.created' )                 i (class =date_icon)                 span.article -meta-label=date_title                 time (datetime=date_xml (article[date_type]) title=date_title + ' '  + full_date (article[date_type]))=date (article[date_type], config.date_format )           if  (theme.post_meta .page .categories  && article.categories .data .length  > 0 )             span.article -meta               span.article -meta-separator |               i.fas .fa -inbox               each item, index in  article.categories .data                  a (href=url_for (item.path )).article -meta__categories #[=item.name ]                 if  (index < article.categories .data .length  - 1 )                   i.fas .fa -angle-right.article -meta-link           if  (theme.post_meta .page .tags  && article.tags .data .length  > 0 )             span.article -meta.tags                span.article -meta-separator |               i.fas .fa -tag               each item, index in  article.tags .data                  a (href=url_for (item.path )).article -meta__tags #[=item.name ]                 if  (index < article.tags .data .length  - 1 )                   span.article -meta-link #[='•' ]                  mixin countBlockInIndex             - needLoadCountJs = true              span.article -meta               span.article -meta-separator |               i.fas .fa -comments               if  block                 block               span.article -meta-label= ' '  + _p ('card_post_count' )                  if  theme.comments .card_post_count              case  theme.comments .use [0 ]               when 'Disqus'                when 'Disqusjs'                  +countBlockInIndex                   a (href=full_url_for (link) + '#disqus_thread' )               when 'Valine'                  +countBlockInIndex                   a (href=url_for (link) + '#post-comment'  itemprop="discussionUrl" )                     span.valine -comment-count (data-xid=url_for (link) itemprop="commentCount" )               when 'Waline'                  +countBlockInIndex                   a (href=url_for (link) + '#post-comment' )                     span.waline -comment-count (id=url_for (link))               when 'Twikoo'                  +countBlockInIndex                   a.twikoo -count (href=url_for (link) + '#post-comment' )               when 'Facebook Comments'                  +countBlockInIndex                   a (href=url_for (link) + '#post-comment' )                     span.fb -comments-count (data-href=urlNoIndex (article.permalink ))          if  theme.ad  && theme.ad .index        if  (index + 1 ) % 3  == 0          .recent -post-item.ads -wrap!=theme.ad .index  
The edited code for butterfly 4.3.1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 mixin postUI (posts)   each article , index in  page.posts .data      .recent -post-item       -         let  link = article.link  || article.path          let  title = article.title  || _p ('no_title' )         const  position = theme.cover .position          let  leftOrRight = position === 'both'            ? index%2  == 0  ? 'left'  : 'right'            : position === 'left'  ? 'left'  : 'right'          let  post_cover = article.cover          let  no_cover = article.cover  === false  || !theme.cover .index_enable  ? 'no-cover'  : ''        -       if  post_cover && theme.cover .index_enable          .post_cover (class =leftOrRight)           a (href=url_for (link) title=title)             img.post_bg (src=url_for (post_cover) onerror=`this.onerror=null;this.src='` + url_for (theme.error_img .post_page ) + `'`  alt=title)       .recent -post-info (class =no_cover)              a.article -title (href=url_for (link) title=title)= title         case  theme.index_post_content .method            when false              - break            when 1              .content != article.description            when 2              if  article.description                .content != article.description              else                - const  content = strip_html (article.content )               - let  expert = content.substring (0 , theme.index_post_content .length )                - content.length  > theme.index_post_content .length  ? expert += ' ...'  : ''                .content != expert           default              - const  content = strip_html (article.content )             - let  expert = content.substring (0 , theme.index_post_content .length )              - content.length  > theme.index_post_content .length  ? expert += ' ...'  : ''              .content != expert         .article -meta-wrap           if  (is_home () && (article.top  || article.sticky  > 0 ))             span.article -meta               i.fas .fa -thumbtack.sticky                span.sticky = _p ('sticky' )               span.article -meta-separator |           if  (theme.post_meta .page .date_type )             span.post -meta-date               if  (theme.post_meta .page .date_type  === 'both' )                 i.far .fa -calendar-alt                 span.article -meta-label=_p ('post.created' )                 time.post -meta-date-created (datetime=date_xml (article.date ) title=_p ('post.created' ) + ' '  + full_date (article.date ))=date (article.date , config.date_format )                 span.article -meta-separator |                 i.fas .fa -history                 span.article -meta-label=_p ('post.updated' )                 time.post -meta-date-updated (datetime=date_xml (article.updated ) title=_p ('post.updated' ) + ' '  + full_date (article.updated ))=date (article.updated , config.date_format )               else                  - let  data_type_updated = theme.post_meta .page .date_type  === 'updated'                  - let  date_type = data_type_updated ? 'updated'  : 'date'                  - let  date_icon = data_type_updated ? 'fas fa-history'  :'far fa-calendar-alt'                  - let  date_title = data_type_updated ? _p ('post.updated' ) : _p ('post.created' )                 i (class =date_icon)                 span.article -meta-label=date_title                 time (datetime=date_xml (article[date_type]) title=date_title + ' '  + full_date (article[date_type]))=date (article[date_type], config.date_format )           if  (theme.post_meta .page .categories  && article.categories .data .length  > 0 )             span.article -meta               span.article -meta-separator |               i.fas .fa -inbox               each item, index in  article.categories .data                  a (href=url_for (item.path )).article -meta__categories #[=item.name ]                 if  (index < article.categories .data .length  - 1 )                   i.fas .fa -angle-right.article -meta-link           if  (theme.post_meta .page .tags  && article.tags .data .length  > 0 )             span.article -meta.tags                span.article -meta-separator |               i.fas .fa -tag               each item, index in  article.tags .data                  a (href=url_for (item.path )).article -meta__tags #[=item.name ]                 if  (index < article.tags .data .length  - 1 )                   span.article -meta-link #[='•' ]                  mixin countBlockInIndex             - needLoadCountJs = true              span.article -meta               span.article -meta-separator |               i.fas .fa -comments               if  block                 block               span.article -meta-label= ' '  + _p ('card_post_count' )                  if  theme.comments .card_post_count              case  theme.comments .use [0 ]               when 'Disqus'                  +countBlockInIndex                   a (href=full_url_for (link) + '#disqus_thread' )                     i.fa -solid.fa -spinner.fa -spin               when 'Disqusjs'                  +countBlockInIndex                   a (href=full_url_for (link) + '#disqusjs' )                     span.disqus -comment-count (data-disqus-url=full_url_for (link))                       i.fa -solid.fa -spinner.fa -spin               when 'Valine'                  +countBlockInIndex                   a (href=url_for (link) + '#post-comment' )                     span.valine -comment-count (data-xid=url_for (link))                       i.fa -solid.fa -spinner.fa -spin               when 'Waline'                  +countBlockInIndex                   a (href=url_for (link) + '#post-comment' )                     span.waline -comment-count (id=url_for (link))                       i.fa -solid.fa -spinner.fa -spin               when 'Twikoo'                  +countBlockInIndex                   a.twikoo -count (href=url_for (link) + '#post-comment' )                     i.fa -solid.fa -spinner.fa -spin               when 'Facebook Comments'                  +countBlockInIndex                   a (href=url_for (link) + '#post-comment' )                     span.fb -comments-count (data-href=urlNoIndex (article.permalink ))                       i.fa -solid.fa -spinner.fa -spin               when 'Remark42'                  +countBlockInIndex                   a (href=url_for (link) + '#post-comment' )                     span.remark42__counter (data-url=urlNoIndex (article.permalink ))                       i.fa -solid.fa -spinner.fa -spin                   if  theme.ad  && theme.ad .index        if  (index + 1 ) % 3  == 0          .recent -post-item.ads -wrap!=theme.ad .index  
然后你就能看到合理的文章页面了。
  友链界面适配在你弄好了其它内容之后,你会发现一个新的难看之处————友链。
友链一行默认只显示3个链接,但是就是因为这一点,导致一个友链宽度很大,看起来不舒服。
这时只需要你加入一点点css,就能让一行显示更多的友链图标:
1 2 3 4 5 6 7 8 .flink-list-item {    width :calc (100%  / 4  - 15px )!important ; } @media  screen and  (max-width : 1250px ) {    .flink-list-item {         width :calc (100%  / 3  - 15px )!important ;     } } 
好了,现在你就拥有了一个内容承载更多的博客了!