目标: 首页图标区域的布局与逻辑实现

创建index-icons分支

码云上创建一个名为index-icons的分支,然后在项目目录下git pull将在线的分支拉到本地,git checkout index-icons 转到当前分支进行开发。

准备阶段

  1. 在components目录下创建Icons.vue组件

    1. 基本框架: template、script、style
    2. 设置导出的接口对象exports default {name: 'HomeIcons'}
  2. Home.vue组件中引用子组件
    1. import
    2. components对象中添加HomeIcons
    3. 使用子组件<home-icons></home-icons>

Icons.vue组件开发

  1. 最外层设置的div用于占位,设置该区域的宽高比,大概是2:1。(因为是一个div,所以可以省略width: 100%)

    <style lang="stylus" scoped>.iconsoverflow: hiddenheight: 0padding-bottom: 50%</style>
    
  2. 小图标的布局呈现

    1. 布局
    <div class="icon"></div>
    
    1. 样式
    .iconfloat: leftwidth: 25% 这里是父元素宽的25%,padding-bottom: 25%  注意: 高度设置的时候不能使用height: 50%, 因为父盒子的高度是0, 但是这里为什么是25%? 首先: 在css里面,padding-top,padding-bottom,margin-top,margin-bottom取值为百分比的时候,参照的是父元素的宽度。第一种理解是: 因为icon宽度是父盒子的25%, 而它撑开的那个高度也应该是跟这个宽度一样大,同样是占父元素宽度的25%,这个padding-bottom的百分比的设置是基于父元素的宽。第二种理解: 父元素的那个50%就可以看成那个撑开的高度, 而他本身的高度应该是父元素的高度的一半,所以是50%的一半。
    
    1. 呈现一个icon中的图标与文字
     <div class="icon"><img src="图片地址" /><p>表述内容</p></div>
    

    此时会发现图标比盒子大,明显撑开,解决方法:

     <div class="icon"><div class="icon-img"><img src="图片地址" /></div>    <p>表述内容</p></div>
    
    .iconoverflow: hidden float: leftwidth: 25% padding-bottom: 25%position: relative.icon-imgposition: absolute  不要忘记子绝父相top: 0left: 0right: 0   // 这里上左右都设置为0是为了保证装图片的这个盒子始终与父盒子一样宽,这里我们不知道具体的高度, 这里是要定位一个放置图标的盒子, 此时图标的大小还是原来的大小。 bottom: .44rem   // 这里是为了预留出需要写文字的部分
    

    此时发现:图标太大,而且高度不是50%,解决方法: 先给img添加一个icon-img-content的类名,

     .icon-imgposition: absolute  top: 0left: 0right: 0 bottom: .44rem .icon-img-contentheight: 100%
    

    解决高度超出50%的问题:.icon添加一个height: 0的样式
    实现图标的水平居中显示:

    .icon-imgposition: absolute  top: 0left: 0right: 0  bottom: .44rembox-sizing: border-box  // IE盒子模型  2种盒模型:https://blog.csdn.net/zwkkkk1/article/details/79678177  box-sizing的默认属性是content-boxpadding: .1rem .icon-img-contentdisplay: block  //默认情况下,block元素宽度自动填满其父元素宽度margin: 0 autoheight: 100%
    

    设置文字样式:

    .icon-descposition: absolute  left: 0right: 0 bottom: 0height: .44remline-height: .44remtext-align: centercolor: $darkTextColor 这里使用的是网站主题文字颜色变量,该变量的自定义方法与$bgColor一样。
    
    1. 手动呈现8个图标
  3. 图标区域的逻辑实现:

    1. 需求说明: 首页的一个页面上呈现的是8个图标,刚有9个图标的时候,希望能够实现在两页上的轮播呈现。 ---- 借用swiper
    <swiper><swiper-slide><div class="icon"><div class="icon-img"><img class="icon-img-content" src="图片网址" /></div><p class="icon-desc"></p></div></swiper-slide><swiper-slide><div class="icon"><div class="icon-img"><img class="icon-img-content" src="图片网址" /></div><p class="icon-desc"></p></div></swiper-slide>
    </swiper>
    

    一个小问题: 只有在上部拖动的时候才会出现轮播的效果,下面那一部分无效,原因是:swiper-container的高度只有图标的高度,但是icons的高度很高,所以内容上并没有跟它有相同的高度。解决方法:
    将.icons下面的样式全部往前提一个tab, 然后重写.icons的样式:

    .icons >>> .swiper-container<!--overflow: hidden 这个样式可以去掉, 因为.swiper-container自带了overflow: hidden-->height: 0padding-bottom: 50%
    
    1. 设置data函数的返回数据对象,实现图标的循环呈现
    <script>export default {data () {return {iconList: [{id: '0001',imgUrl: '图片地址',desc: '图标描述'},{id: '0002',imgUrl: '图片地址',desc: '图标描述'},{id: '0003',imgUrl: '图片地址',desc: '图标描述'},{id: '0004',imgUrl: '图片地址',desc: '图标描述'}]}}}
    </script>
    

    要写9个图标的信息数据,这里的数据代码是很冗余的,以后会用ajax获取到的数据。此时,就可以使用循环的形式来写:

    <swiper><swiper-slide><div class="icon"v-for="item of iconList":key="item.id"><div class="icon-img"><img class="icon-img-content" src="item.imgUrl" /></div><p class="icon-desc">{{item.desc}}</p></div></swiper-slide>
    </swiper>
    

    但是,以上的写法会将第9个图标隐藏,无法实现轮播显示—使用计算属性来实现。在data的后面定义一个计算属性(自带缓存机制,且语法简单):

     <script>export default {data () {return {iconList: [......]}},computed: {pages () {const pages = []this.iconList.forEach((item, index) => {const page = Math.floor(index / 8)if (!pages[page]) {pages[page] = []}pages[page].push(item)})return pages}}}</script>
    

    循环代码的修改:

    <swiper><swiper-slide v-for="(page, index) of pages" :key="index"><div class="icon"v-for="item of page":key="item.id"><div class="icon-img"><img class="icon-img-content" src="item.imgUrl" /></div><p class="icon-desc">{{item.desc}}</p></div></swiper-slide>
    </swiper>
    

    一点优化: 当图标下方的文字描述部分比较多的时候,多出的部分呈现三个点的形式,使用css样式来实现。在.icon-desc下添加

    overflow: hidden
    whit-space: nowrap
    text-overflow: ellipsis
    

    会发现,可能很多地方都能用到这个3个css样式,所以可以借助stylus提供的Mixins将它封装起来—封装方法:在styles目录下创建mixins.styl文件,在该文件中定义一个ellipsis方法,注意与小括号中间不要有空格:

    ellipsis()overflow: hiddenwhit-space: nowraptext-overflow: ellipsis
    

    使用的时候,先在style标签下@import '~styles/mixins.styl',然后在.icon-desc中直接使用:ellipsis()

代码提交

lipsis方法,注意与小括号中间不要有空格:
css ellipsis() overflow: hidden whit-space: nowrap text-overflow: ellipsis
使用的时候,先在style标签下@import '~styles/mixins.styl',然后在.icon-desc中直接使用:ellipsis()

代码提交

去哪儿-04-iconsDev相关推荐

  1. Win10和Ubuntu20.04双系统启动引导项修复指南

    1.背景 本机安装了Win10和Ubuntu20.04的双系统,开机时出了点问题,不小心点了Restore UEFI,导致进不去Ubuntu20.04了,在Win10下安装了Easy BCD,不小心把 ...

  2. 一位10年程序员生涯的总结与经验忠告分享

    展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的1 ...

  3. 进程和线程基础知识全家桶,30 张图一套带走

    前言 先来看看一则小故事 我们写好的一行行代码,为了让其工作起来,我们还得把它送进城(进程)里,那既然进了城里,那肯定不能胡作非为了. 城里人有城里人的规矩,城中有个专门管辖你们的城管(操作系统),人 ...

  4. php7-fpm webtatic,如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

    如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud 关注:154  答案:1  mip版 解决时间 2021-01-11 20:51 提问者你若离去丶巴掌扇去 ...

  5. SEO快速排名算法独家揭秘

    在2015年11月份的时候在卢松松博客投递了一份关于SEO快速排名独家揭秘的算法流程,时过境迁已经过去了大半年,随之而来的也是搜索引擎的点击算法也发生了一些变化,这次我将完善以前的一份算法资料. 下面 ...

  6. 【转】老程序猿给新程序猿的13点建议

    展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的1 ...

  7. c++局部对象是什么_面向对象三大特征: 封装

    今日内容 面向对象概述 类和对象的关系 面向对象内存图 private.this关键字和封装 面向对象之构造方法 面向对象三大特征 封装 继承 多态 01. 面向过程和面向对象思想概述 什么是面向过程 ...

  8. Cheat Engine Tutorial 闯关手记

    Cheat Engine Tutorial 闯关手记 第一关 Cheat Engine 能做什么?修改游戏的数值,就象<金山游侠V>,但它能胜任动态地址的查找:制作游戏专用的修改器,补丁, ...

  9. 某资深程序员写给后来者的忠告

    展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的1 ...

  10. 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告...

    走过的路回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在不断变化,但是很可能你也会走我已经做过的10来年的路程,有些心得体会您可以借鉴一下,觉得说得有道理的接纳,觉得说得没道 ...

最新文章

  1. [转]window.open居中
  2. ORA-01994 故障一例
  3. C语言分区排序partition sort 算法(附完整源码)
  4. 思科 IPSec ***配置2:
  5. gitlab project项目迁移
  6. 微服务等于Spring Cloud?一文告诉你微服务到底是什么
  7. extJS 中 ext.data 介绍
  8. Redis的主从复制和 哨兵模式
  9. Python入门到精通三天速成第一讲——创建自定义类
  10. python编写ftp客户端_python实现ftp客户端示例分享
  11. ASP.NET Core 新建项目 - macOS 环境 - ASP.NET Core 基础教程 - 简单教程,简单编程
  12. 2015-nature-deep learning-LeCun, Bengio and Hinton
  13. 场内场外交易成本_场内基金与场外基金交易手续费是多少?怎么算?
  14. perl安装的详细步骤
  15. 千锋培训学python怎么样
  16. Netty 学习笔记(已完结)
  17. Visual Studio 2019 发行说明
  18. 【收藏】如何优雅的在 Python设置报警通知(邮件、短信、电脑外放声音)
  19. Mysql索引Hash和BTree的区别
  20. 地震周边地区的摇篮生活和地震综合症

热门文章

  1. TBXML常用API
  2. 使用PostgREST的RestAPI操作之管理与优化
  3. 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 情感分析
  4. 【熊猫多模式站群开发日志】流程总览
  5. mac chrome 打包扩展程序
  6. 【Java】利用循环嵌套实现输出一天的小时和分钟
  7. C#LeetCode刷题之#824-山羊拉丁文​​​​​​​(Goat Latin)
  8. gatsby_什么是环境变量?如何在Gatsby和Netlify中使用它们?
  9. freecodecamp_freeCodeCamp的服务条款
  10. 大脚导入配置选择哪个文件_IntelliJ IDEA详细图解最常用的配置,新人必备