iOS开发如何学习前端(2)
上一篇成果如下。

实现的效果如下。
- 实现了一个横放的
<ul>,也既iOS中的UITableView. - 实现了当鼠标移动到列表中的某一个
<li>,也既iOS中的UITableViewCell,的时候,这个li标签的背景色会变成黑色。
页面很简单。但是仍存在一个小问题。眼尖的同学可以发现。当鼠标悬浮在li上的时候,背景色是变了没错,但是当背景色变的时候,我们发现,其实黑色的li的bottom是超过父控件的,也就是说,我们li的下边没和ul的下边对齐。
这是为什么呢?
我去check了一下我们的css文件。关于<li>和<a>的属性是这样的。
li {
float: left;
height: 44px;
width: auto;
}
li a {
display: block;
text-decoration: none;
color: white;
text-align: center;
padding: 14px 16px
}
这里出问题的地方在于,我用了一个不是很优雅的方法来实现了text的居中。
我是怎么实现的呢?
这里,需要先解释一下在css中,padding的含义。先看一张iOS中的图。

这是一个UILabel,我给他设置了左边距和上边距,熟悉iOS的同学都知道,这时候,这个label的长宽会自动和内容的长宽一致。
那么如果把css中的padding概念套在iOS中,那么可以说,在这种情况下,padding应该是0.
好,这时候我们把约束条件增加两个,我把这个label的宽和高都设置成固定值。

现在这个label变成了什么样子呢?
他变成了这个样子

这个时候,UILabel的宽高远大于text的宽高。那么,这个时候,padding的值就不是0了。
是多少呢?
UIFont有个属性是pointSize,那么padding-top的值就是(UILabel的高 - 内容的高)/2
padding-left的值就是(UILabel的宽 - 内容的宽)/2
所以如果想要文字居中显示的话,就需要padding-top和padding-bottom相同。
但是代码中,我们的padding-top和padding-bottom已经相同了,为什么鼠标悬浮状态的时候感觉<a>大了呢?
实际上,我用chrome的Inspect查看了一下。发现

实际上<a>的高度是46,超过了li的高度,这就是为什么hover状态下,当背景色变的时候,<a>的bottom超过了li的bottom.
直觉告诉我,这种做法不太好。为什么,因为设置padding来实现垂直居中需要耗费大量的精力,还得你自己算字体大小和padding的关系。挺讨厌的。
于是我谷歌了一下。

点击去之后看到了这种做法。

原理就是把line-height这个属性和文字的容器height设置成大小一致即可。
后来我发现了一个问题,就是把line-height设置成百分比的形式是无效的。比如line-height: 100%.
为什么呢?因为line-height只能设置成px形式的值才意味着文字内容和容器内容高度一致,如果设置成百分比形式,那么会让css以为设置的是字体的大小。
然后我们把css改成这样。
li a {
display: block;
text-decoration: none;
color: white;
text-align: center;
line-height: 44px;
padding-left: 16px;
padding-right: 16px;
}
效果如下。

搞定了。
进入正题,弹出菜单
今天想要实现的效果如下。

这个实现原理,类似于iOS中的把一个父View的其中一个子View的hidden设置为true。然后添加一个事件,比如点击之后,把这个view的hidden设置为false。那么这个子view就显示出来了。
那么在css中对应的属性就是display了。
先看看html。
<html>
<head>
<link rel="stylesheet" href="dropdown.css" type="text/css">
</head>
<body>
<div class="dropBtn">
DropDown
<div class="dropdown">
<ul class="dropdownul">
<li><a href="#">Link </a></li>
<li><a href="#">Link </a></li>
<li><a href="#">Link </a></li>
</ul>
</div>
</div>
</body>
</html>
那么class为dropBtn的就是我们的父view,对应的子view是class为dropdown的div。里面还内嵌一个列表ul,我们现在需要做的就是先把div.dropdown的display属性设置为none.
div.dropBtn div.dropdown {
display: none;
}
然后,效果是当鼠标滑动到div.dropBtn上的时候,列表显示。
那么就可以这么写。
div.dropBtn:hover div.dropdown {
display: inline;
}
搞定。
完整的css文件如下。
* {
margin: 0px;
padding: 0px;
}
div.dropBtn {
width: 100px;
background: green;
}
div.dropBtn div.dropdown {
display: none;
}
div.dropBtn:hover div.dropdown {
display: inline;
}
div.dropdown {
position: relative;
}
ul.dropdownul {
width: 100%;
}
li {
list-style: none;
display: block;
background: yellow;
height: 40px;
}
li:hover {
background: red;
}
li a {
display: block;
text-decoration: none;
text-align: center;
}
解释一下.
- 第一段就是把所有选择器的margin和padding都设置为0,防止出现一些乱七八糟的问题。
- 第二段设置最外层的div的宽度
- 第三段,先把里面的div.dropdown隐藏
- div.dropBtn:hover div.dropdown 这句就是检测到鼠标移动到最外层div的时候显示里面的div
完毕。
iOS开发如何学习前端(2)的更多相关文章
- iOS开发如何学习前端(1)
iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或 ...
- iOS开发如何学习前端
原文链接 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或者设置Frame的ViewController.好比 ...
- 关于iOS开发的学习
关于iOS开发的学习,打个比方就像把汽车分解: 最底层的原料有塑料,钢铁 再用这些底层的东西造出来发动机,座椅 最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...
- IOS开发---菜鸟学习之路--(二十二)-近期感想以及我的IOS学习之路
在不知不觉当中已经写了21篇内容 其实一开始是没有想些什么东西的 只是买了Air后 感觉用着挺舒服的,每天可以躺在床上,就一台笔记本,不用网线,不用电源,不用鼠标,不用键盘,干干脆脆的就一台笔记本. ...
- IOS开发---菜鸟学习之路--(一)
PS(废话): 看了那么多的博客文章,发现大部分人都一直在强调写技术博客的重要性,索性自己也耐着性子写写看吧. 写博客的重要性之类的说明,我就不做复制黏贴的工作了.因为自己没有写过多少,所也不清楚是不 ...
- iOS开发架构学习记录
闲着没事看了一些iOS开发架构的视频,简单的介绍了几个常用的架构设计,现将它记录如下,以后有时间再专门写这方面的内容,大家可以看看,感兴趣的就进一步学习. 一.架构基础 1.架构设计的目的 进一步解耦 ...
- IOS开发---菜鸟学习之路--(二十三)-直接利用键值对的方式来处理数据的感想
首先声明,本文纯粹只是做为本人个人新手的理解.文中的想法我知道肯定有很多地方是错的. 但是这就是我作为一个新人的使用方法,对于大牛非常欢迎指导,对于喷子请绕道而行. 由于这是早上跟我学长讨论数据处理时 ...
- IOS开发---菜鸟学习之路--(十七)-利用UITableView实现个人信息界面
首先来看下我们要实现的效果 需要实现这样的效果 然后我们开始动手吧. 首先选择添加一个新的ViewController 然后打开XIB文件,添加一UITableView 并将样式设置为分组 同时将按住 ...
- iOS开发RunLoop学习:一:RunLoop简单介绍
一:RunLoop的简单介绍 #import "ViewController.h" @interface ViewController () @end @implementatio ...
随机推荐
- ubuntu设置自动关机
windows可以设置自动关机时间.那么ubuntu的命令是什么呢? 首先要能拿到sudo权限,还好我是在home下编译的,一路上都不用sudo,因此可以把sudo给shutdown了.呵呵 ...
- sqlserver的convert函数
定义和用法 CONVERT() 函数是把日期转换为新数据类型的通用函数. CONVERT() 函数可以用不同的格式显示日期/时间数据. 语法 CONVERT(data_type(length),dat ...
- aligned_storage简单学习
#include <iostream> #include <type_traits> #include <string> /* template< std:: ...
- ios实例开发精品文章推荐(8.5)
IOS基础知识记录 IOS基础知识记录一 http://www.apkbus.com/android-131902-1-1.htmlIOS基础知识记录二 http://ww ...
- 工欲善其事,必先利其器 软件工具开发关键词 protractor自动化测试工具 RegexBuddy正则 CodeSmith,LightSwitch:代码生成 CheatEngine:玩游戏修改内存值必备神器 ApkIDE:Android反编译工具 Reflector:反编译dll动态链接库
工欲善其事,必先利其器 本文版权归翟士丹(Stan Zhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利. 原文地址:http ...
- CentOS 7.0关闭默认firewall防火墙启用iptables防火墙
操作系统环境:CentOS Linux release 7.0.1406(Core) 64位CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤. 1.关闭f ...
- 【java】JVM的内存区域划分
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行 ...
- 环信集成 2---基于环信Demo3.0,实现单聊功能
这几天在做环信,所以把环信相关的东西拿过来,做个系统点的东西 注意: 这里Demo集成的是带有实时语音功能的(libEaseMobClientSDK.a). 环信库是直接拖拽EaseMobSDK文件夹 ...
- 日志收集-Flume-ng-mongodb-sink
本文主要介绍使用Flume传输数据到MongoDB的过程,内容涉及环境部署和注意事项. 一.环境搭建 1.flune-ng下载地址:http://www.apache.org/dyn/closer.c ...
- aaronyang的百度地图API之LBS云 笔记[开发准备]
我的脚印 1.注册百度账号 先到163邮箱注册个邮箱(注册邮箱),用这个邮箱注册百度账号(注册百度),激活百度账号 2.登陆百度账号,进入 百度地图 申请为LBS开发者 2.1 注册申请为百度开发者( ...