去哪儿-04-iconsDev
目标: 首页图标区域的布局与逻辑实现
创建index-icons分支
码云上创建一个名为index-icons的分支,然后在项目目录下git pull
将在线的分支拉到本地,git checkout index-icons
转到当前分支进行开发。
准备阶段
- 在components目录下创建Icons.vue组件
- 基本框架: template、script、style
- 设置导出的接口对象
exports default {name: 'HomeIcons'}
- Home.vue组件中引用子组件
- import
- components对象中添加HomeIcons
- 使用子组件
<home-icons></home-icons>
Icons.vue组件开发
最外层设置的div用于占位,设置该区域的宽高比,大概是2:1。(因为是一个div,所以可以省略width: 100%)
<style lang="stylus" scoped>.iconsoverflow: hiddenheight: 0padding-bottom: 50%</style>
小图标的布局呈现
- 布局
<div class="icon"></div>
- 样式
.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%的一半。
- 呈现一个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一样。
- 手动呈现8个图标
图标区域的逻辑实现:
- 需求说明: 首页的一个页面上呈现的是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%
- 设置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相关推荐
- Win10和Ubuntu20.04双系统启动引导项修复指南
1.背景 本机安装了Win10和Ubuntu20.04的双系统,开机时出了点问题,不小心点了Restore UEFI,导致进不去Ubuntu20.04了,在Win10下安装了Easy BCD,不小心把 ...
- 一位10年程序员生涯的总结与经验忠告分享
展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的1 ...
- 进程和线程基础知识全家桶,30 张图一套带走
前言 先来看看一则小故事 我们写好的一行行代码,为了让其工作起来,我们还得把它送进城(进程)里,那既然进了城里,那肯定不能胡作非为了. 城里人有城里人的规矩,城中有个专门管辖你们的城管(操作系统),人 ...
- php7-fpm webtatic,如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud
如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud 关注:154 答案:1 mip版 解决时间 2021-01-11 20:51 提问者你若离去丶巴掌扇去 ...
- SEO快速排名算法独家揭秘
在2015年11月份的时候在卢松松博客投递了一份关于SEO快速排名独家揭秘的算法流程,时过境迁已经过去了大半年,随之而来的也是搜索引擎的点击算法也发生了一些变化,这次我将完善以前的一份算法资料. 下面 ...
- 【转】老程序猿给新程序猿的13点建议
展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的1 ...
- c++局部对象是什么_面向对象三大特征: 封装
今日内容 面向对象概述 类和对象的关系 面向对象内存图 private.this关键字和封装 面向对象之构造方法 面向对象三大特征 封装 继承 多态 01. 面向过程和面向对象思想概述 什么是面向过程 ...
- Cheat Engine Tutorial 闯关手记
Cheat Engine Tutorial 闯关手记 第一关 Cheat Engine 能做什么?修改游戏的数值,就象<金山游侠V>,但它能胜任动态地址的查找:制作游戏专用的修改器,补丁, ...
- 某资深程序员写给后来者的忠告
展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的1 ...
- 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告...
走过的路回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在不断变化,但是很可能你也会走我已经做过的10来年的路程,有些心得体会您可以借鉴一下,觉得说得有道理的接纳,觉得说得没道 ...
最新文章
- [转]window.open居中
- ORA-01994 故障一例
- C语言分区排序partition sort 算法(附完整源码)
- 思科 IPSec ***配置2:
- gitlab project项目迁移
- 微服务等于Spring Cloud?一文告诉你微服务到底是什么
- extJS 中 ext.data 介绍
- Redis的主从复制和 哨兵模式
- Python入门到精通三天速成第一讲——创建自定义类
- python编写ftp客户端_python实现ftp客户端示例分享
- ASP.NET Core 新建项目 - macOS 环境 - ASP.NET Core 基础教程 - 简单教程,简单编程
- 2015-nature-deep learning-LeCun, Bengio and Hinton
- 场内场外交易成本_场内基金与场外基金交易手续费是多少?怎么算?
- perl安装的详细步骤
- 千锋培训学python怎么样
- Netty 学习笔记(已完结)
- Visual Studio 2019 发行说明
- 【收藏】如何优雅的在 Python设置报警通知(邮件、短信、电脑外放声音)
- Mysql索引Hash和BTree的区别
- 地震周边地区的摇篮生活和地震综合症
热门文章
- TBXML常用API
- 使用PostgREST的RestAPI操作之管理与优化
- 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 情感分析
- 【熊猫多模式站群开发日志】流程总览
- mac chrome 打包扩展程序
- 【Java】利用循环嵌套实现输出一天的小时和分钟
- C#LeetCode刷题之#824-山羊拉丁文​​​​​​​(Goat Latin)
- gatsby_什么是环境变量?如何在Gatsby和Netlify中使用它们?
- freecodecamp_freeCodeCamp的服务条款
- 大脚导入配置选择哪个文件_IntelliJ IDEA详细图解最常用的配置,新人必备