布局框架

文章页面网格布局页面UI设计

阿里云


这是一款非常时尚的响应式文章页面网格布局页面 UI 设计效果。该设计在页面中所有的文章以网格的形式排列布局,当用户点击了某一篇文章之后,该文章网格会全屏放大,并在其上显示出文章的详细内容。在文章页还可以通过导航按钮来查看下一篇文章的内容。

HTML 结构

这个网格 ui 布局的 HTML 结构非常简单。文章列表的网格使用一个无序列表来制作,每一篇具体的文字内容是一个 section.post 元素。

也想出现在这里?联系我们
创客主机
  1. <ul class="grid">
  2.   <li class="grid__item grid__item--4">
  3.     <a href="" class="grid__link">
  4.       <h2 class="grid__title">...</h2>
  5.       <p>...</p>
  6.     </a>
  7.   </li>
  8.   ......
  9. </ul>
  10. <section class="post">
  11.   <article class="post__wrapper">
  12.     <h1>...</h1>
  13.     <h3>...</h3>
  14.     <p>...</p>
  15.   </article>
  16.   <a href="" class="post__back">
  17.     <svg width="24" height="24" viewBox="0 0 24 24">
  18.     <path d="M4 11h5v-6h-5v6zm0 7h5v-6h-5v6zm6 0h5v-6h-5v6zm6 0h5v-6h-5v6zm-6-7h5v-6h-5v6zm6-6v6h5v-6h-5z"/>
  19.     <path d="M0 0h24v24h-24z" fill="none"/>
  20. </svg> Back to posts
  21.   </a>
  22.   <a href="" class="post__forw">
  23.     Next post<svg width="24" height="24" viewBox="0 0 24 24">
  24.     <path d="M0 0h24v24h-24z" fill="none"/>
  25.     <path d="M12 4l-1.41 1.41 5.58 5.59h-12.17v2h12.17l-5.58 5.59 1.41 1.41 8-8z"/></svg> 
  26.   </a>
  27. </section>
  28. ...

CSS 样式

为了创建在用户点击时网格的缩放效果,这里主要是设置了网格 ul.grid 的 transform-origin 和 scale 属性。为了获取 transform-origin 的值,特效中使用 jQuery 来计算鼠标在页面中的 x 和 y 的值,并将它们转换为一个百分比。

  1. .grid {
  2.   overflow: auto;
  3.   will-change: transform, transform-origin;
  4.   -webkit-transition: -webkit-transform 0.55s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform-origin 0.05s ease;
  5.           transition: transform 0.55s cubic-bezier(0.23, 1, 0.32, 1), -ms-transform-origin 0.05s ease;
  6.           transition: transform 0.55s cubic-bezier(0.23, 1, 0.32, 1), transform-origin 0.05s ease;
  7. }

每一个网格的高度为视口高度的 1/3,它们都是左浮动,组成一个弹性网格布局。同时使用媒体查询在屏幕小于 700 像素时使网格占据整个屏幕的宽度。

  1. .grid__item {
  2.   position: relative;
  3.   float: left;
  4.   height: 33.333vh;
  5.   background: #f7f7f7;
  6. }
  7. .grid__item:hover .grid__title {
  8.   color: #ef5350;
  9. }
  10. .grid__item--4 {
  11.   width: 33.333%;
  12. }
  13. @media (max-width: 700px) {
  14.   .grid__item {
  15.     width: 100%;
  16.   }
  17. }

每一篇具体的文章初始时透明度都为 0,尺寸被缩小为屏幕尺寸的 0.4 倍。在文章被激活的时候,透明度变为 1,尺寸扩展为这个屏幕的大小。

  1. .post {
  2.   position: fixed;
  3.   z-index: 10;
  4.   top: 0;
  5.   left: 0;
  6.   width: 100%;
  7.   height: 100%;
  8.   overflow-y: auto;
  9.   min-height: 100vh;
  10.   visibility: hidden;
  11.   opacity: 0;
  12.   -webkit-transform: scale(0.4);
  13.       -ms-transform: scale(0.4);
  14.           transform: scale(0.4);
  15.   background: #f7f7f7;
  16.   -webkit-backface-visibility: hidden;
  17.           backface-visibility: hidden;
  18.   -webkit-transition: all 0.7s 0.5s cubic-bezier(0.23, 1, 0.32, 1);
  19.           transition: all 0.7s 0.5s cubic-bezier(0.23, 1, 0.32, 1);
  20. }
  21. .post--active {
  22.   visibility: visible;
  23.   opacity: 1;
  24.   -webkit-transform: scale(1);
  25.       -ms-transform: scale(1);
  26.           transform: scale(1);
  27. }
  28. .post--hide {
  29.   -webkit-transition: all 0.6s 0s cubic-bezier(0.23, 1, 0.32, 1);
  30.           transition: all 0.6s 0s cubic-bezier(0.23, 1, 0.32, 1);
  31. }

JAVASCRIPT

正如前面提到的,为了获取 transform-origin 的值,特效中使用 jQuery 来计算鼠标在页面中的 x 和 y 的值,并将它们转换为一个百分比。在代码中通过 zoom()函数来实现:

  1. var zoom = function(event) {
  2.   var content = $(this).find('.grid__link');
  3.   var self = $(this);
  4.   var index = self.index();
  5.   var vw = w.innerWidth();
  6.   var vh = w.innerHeight();
  7.   var ds = $(document).scrollTop();
  8.   var px = event.pageX;
  9.   var py = event.pageY;
  10.  
  11.   // scale stuff
  12.   var iw = $(this).innerWidth();
  13.   var ih = $(this).innerHeight();
  14.   var sx = vw/iw;
  15.   var sy = vh/ih;
  16.  
  17.   // transform-origin stuff
  18.   var o = $(this).offset();
  19.   var xc = vw/2;
  20.   var yc = ds + vh/2;
  21.  
  22.   var dsp = ds/ (vh+ds) * 100;
  23.  
  24.   tox = px/vw *100;
  25.   toy = py/vh *100;
  26.   toy = toy - dsp;
  27.  
  28.   if (!isBig && vw >= breakpoint) {
  29.     grid.css({
  30.       'transform-origin': tox + '% ' + toy + '%'
  31.     });
  32.  
  33.     setTimeout(function() {
  34.       requestAnimationFrame(function() {
  35.         grid.css({
  36.           'transform-origin': tox + '% ' + toy + '%',
  37.           'transform': 'scale(' + sx + ',' + sy + ')'
  38.         });
  39.         itemContent.css({'opacity': '0'});
  40.         $('body').css('overflow', 'hidden');
  41.         showPost(index); // show post function
  42.         isBig = true;
  43.       });
  44.     }, 50);
  45.   } else {
  46.     itemContent.css({
  47.       'opacity': '0'
  48.     });
  49.     showPost(index);
  50.     isBig = true;
  51.   }
  52.   return false;
  53. };

其它的实现代码请参考源文件。

文章页面网格布局页面 UI 设计

已有 532 人购买
查看演示升级 VIP立刻购买

演示地址 下载地址
收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!