如何使用CSS?

thbcm阅读(182)

导读:本章主要讲解在 HTML 页面中如何使用 CSS 样式以及 CSS 的语法结构。通过本小节的学习,我们将掌握 CSS 语法中最为基础核心的内容。这些内容也将成为后续我们编写 CSS 样式代码必备的内容。

如何使用 CSS

CSS 样式主要的应用场景是在 HTML 页面中,其作用就是为 HTML 页面设置在浏览器运行后的显示效果。而在 HTML 页面使用 CSS 样式具有三种方式:

  • 内联样式
  • 内嵌样式表
  • 外联样式表

内联样式

HTML 元素的 style 属性的作用是为该元素设置 CSS 样式。如下示例代码所示展示了内联样式的写法:

<div style="color: lightcoral;">这是测试内容.</div>

内联样式的语法结构如下图所示:

但使用内联样式的缺点也非常明显,具体缺点如下:

  1. HTML 内容与 CSS 样式属于强耦合,并没有实现网页的内容和样式的有效分离。
  2. 如果为不同元素设置相同的 CSS 样式的话,会导致相同的 CSS 样式代码被重复定义,产生冗余代码。

内联样式表

HTML 元素中的 元素可以用来为当前 HTML 页面的元素设置 CSS 样式。如下示例代码所示展示了内嵌样式表的写法:

<style type="text/css">
p {
color: lightcoral;
font-size: 24px;
}
</style>

使用内嵌样式表的优点在于解决内联样式中的两个问题:

  • HTML 内容与 CSS 样式的强耦合问题,使得网页的内容和样式有效地分离。
  • 如果为不同元素设置相同的 CSS 样式的话,只需要定义一次 CSS 样式代码。

但内嵌样式表依旧编写在 HTML 文件中。如果一个 HTML 页面中包含大量的 CSS 样式的话,会导致 HTML 文件变得很大,从而浏览器加载 HTML 页面时耗时变长。

外联样式

CSS 样式代码可以定义在一个 CSS 文件中,这样有效地解决了内嵌样式表中的问题。具体的做法如下所示:

  1. 创建一个扩展名为 .css 的文件,并且将 CSS 样式代码编写在这个文件中。
  2. 在 HTML 页面中,通过 元素中的 元素将创建的 CSS 文件引入到 HTML 页面中。如下示例代码所示展示了 “ 元素如何引入 CSS 文件:<link rel=”stylesheet” href=”style/demo.css”>1rel 属性:用来定义引入文件与当前 HTML 页面的关系,该属性值必须是链接类型值。href 属性:用来定义引入文件的 URL。说明:一个 HTML 页面允许引入多个 CSS 文件,多个 CSS 文件的加载顺序按照 HTML 页面引入的顺序进行加载。

外联样式表的加载过程

需要注意的是,外联样式表不会与 HTML 页面同步被浏览器加载。具体的加载过程如下所示:

  1. 浏览器会加载 HTML 页面并进行解析。
  2. 解析到 <link> 元素引入的 CSS 文件,并通过 href 属性读取到 CSS 文件的路径。
  3. 根据读取的路径,开始加载 CSS 文件并进行解析。

如下图所示展示了外联样式表的加载过程:

CSS语法结构

无论是以上三种方式引入 CSS 样式的哪一种,我们都需要学习 CSS 的语法结构,这也是学习 CSS 后续内容的基础。 如下示例所示展示了 CSS 样式的基本代码结构:

p {
color: lightcoral;
font-size: 24px;
}

如下图所示展示了CSS 的语法结构以及相关概念:

CSS 语法的基本结构可分为:

  • 选择器(Selector):用来定位当前 HTML 页面中的元素,可以是一个元素也可以是多个元素(元素集)。
  • 声明块(Declaration block):用来包含一个或多个 CSS 声明,其语法结构是一对花括号。

CSS 声明

CSS 语法结构中除了选择器之外,就是声明了。CSS 声明是一个由 CSS 定义的规则,具体的语法结构是一对键/值对形式。

CSS 声明的语法结构可分为:

  • 属性(Properties):用来定义 HTML 元素样式的方式,是由 CSS 给定的。例如 color 属性是用来定义元素的文本颜色等。
  • 属性的值(Property value):用来定义 HTML 元素的样式。例如 color 属性的值可以是 lightcoral 等。注意:不同的 CSS 属性对应的属性值是不同的。具体的可以参考 MDN提供的参考文档
  • 分隔符:是一个冒号(:),用来分隔 CSS 属性和值的。
  • 结束符:是一个分号(;),用来表示一个 CSS 声明结束。

CSS注释

CSS 与 HTML 同样提供了注释,其作用也与 HTML 的注释类似。不过 CSS 的注释语法与 HTML 不同,如下图所示展示了 CSS 注释的语法结构:

总结

本小节讲解了在 HTML 页面引入 CSS 样式的三种方式和 CSS 的语法结构,以及注释等内容。其中:

  • 三种引入 CSS 样式的方式,每一种都存在优点和缺点,要根据实际开发的情况选择使用哪一种引入 CSS 样式。
  • CSS 的语法结构,主要分为选择器和声明两块内容,这也是我们在后续章节中继续进行讲解的内容。
  • CSS 注释的作用与 HTML 注释类似,但语法结构不同。在实际开发中不要混淆。

际开发的情况选择使用哪一种引入 CSS 样式。

  • CSS 的语法结构,主要分为选择器和声明两块内容,这也是我们在后续章节中继续进行讲解的内容。
  • CSS 注释的作用与 HTML 注释类似,但语法结构不同。在实际开发中不要混淆。

CSS 中如何定义变量并使用

thbcm阅读(198)

CSS 中原生的变量定义语法是:–,变量使用语法是:var(–) ; 其中*表示我们的变量名称;

vue 项目中定义 css 全局变量的话:

1,首先在 assets 目录下新建 index.css 文件:(

:root 文档的根元素,这是一个放自定义属性的好地方,因为我们可以根据其他个别特别的样式的选择性来覆盖自定义属性)

2,然后在 main.js 文件中引入:

3,使用:在 .vue 文件中的 style 中使用:

background:var(–baseBackground);

更多介绍:

css中定义变量
定义变量可分多种情况:
1、定义全局变量
:root {
--borderColor: #ccc;
}
使用:width:var(--borderColor);

2、定义某元素下的变量
.look{
--borderColor: #ccc;
}

3、定义媒体查询下的变量
@media screen and (min-width: 1025px) {
  :root {
      --borderColor: #ccc;
   }
}
使用:
.has-border-table > tr > td {
border-right: 1px solid var(--borderColor);
}
less中定义变量
定义:
@bg-color : #d9d9d9;
使用:
.has-border-table > tr > td {
border-right: 1px solid var(@bg-color);
}
sass中定义变量
定义:
$bg-color : #d9d9d9;
使用:
.has-border-table > tr > td {
border-right: 1px solid var($bg-color);
}

利用Python爬取当当、京东、亚马逊图书信息代码实例源码

thbcm阅读(190)

本文主要介绍了利用 Python 来爬取当当、京东、亚马逊平台上的图书信息代码实例,具有一定借鉴价值,正在学习Python爬虫 或正好有需要的朋友可以参考下。

注:

1.本程序采用 MSSQLserver 数据库存储,请运行程序前手动修改程序开头处的数据库链接信息;

2.需要 bs4、requests、pymssql 库支持;

3.支持多线程。

源码

from bs4 import BeautifulSoup 
import re,requests,pymysql,threading,os,traceback 

 
try: 
  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='book',charset="utf8") 
  cursor = conn.cursor() 
except: 
  print('\\\\n错误:数据库连接失败') 

 
#返回指定页面的html信息 
def getHTMLText(url): 
  try: 
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'} 
    r = requests.get(url,headers = headers) 
    r.raise_for_status() 
    r.encoding = r.apparent_encoding 
    return r.text 
  except: 
    return '' 
#返回指定url的Soup对象 
def getSoupObject(url): 
  try: 
    html = getHTMLText(url) 
    soup = BeautifulSoup(html,'html.parser') 
    return soup 
  except: 
    return '' 
#获取该关键字在图书网站上的总页数 
def getPageLength(webSiteName,url): 
  try: 
    soup = getSoupObject(url) 
    if webSiteName == 'DangDang': 
      a = soup('a',{'name':'bottom-page-turn'}) 
      return a[-1].string 
    elif webSiteName == 'Amazon': 
      a = soup('span',{'class':'pagnDisabled'}) 
      return a[-1].string 
  except: 
    print('\\\\n错误:获取{}总页数时出错...'.format(webSiteName)) 
    return -1 

 
class DangDangThread(threading.Thread): 
  def __init__(self,keyword): 
    threading.Thread.__init__(self) 
    self.keyword = keyword 
  def run(self): 
    print('\\\\n提示:开始爬取当当网数据...') 
    count = 1 

   
    length = getPageLength('DangDang','http://search.dangdang.com/?key={}'.format(self.keyword))#总页数 
    tableName = 'db_{}_dangdang'.format(self.keyword) 

 
    try: 
      print('\\\\n提示:正在创建DangDang表...') 
      cursor.execute('create table {} (id int ,title text,prNow text,prPre text,link text)'.format(tableName)) 
      print('\\\\n提示:开始爬取当当网页面...') 
      for i in range(1,int(length)): 
        url = 'http://search.dangdang.com/?key={}&page_index={}'.format(self.keyword,i) 
        soup = getSoupObject(url) 
        lis = soup('li',{'class':re.compile(r'line'),'id':re.compile(r'p')}) 
        for li in lis: 
          a = li.find_all('a',{'name':'itemlist-title','dd_name':'单品标题'}) 
          pn = li.find_all('span',{'class': 'search_now_price'}) 
          pp = li.find_all('span',{'class': 'search_pre_price'}) 

 
          if not len(a) == 0: 
            link = a[0].attrs['href'] 
            title = a[0].attrs['title'].strip() 
          else: 
            link = 'NULL' 
            title = 'NULL' 

 
          if not len(pn) == 0: 
            prNow = pn[0].string 
          else: 
            prNow = 'NULL' 

 
          if not len(pp) == 0: 
            prPre = pp[0].string 
          else: 
            prPre = 'NULL' 
          sql = "insert into {} (id,title,prNow,prPre,link) values ({},'{}','{}','{}','{}')".format(tableName,count,title,prNow,prPre,link) 
          cursor.execute(sql) 
          print('\\\\r提示:正在存入当当数据,当前处理id:{}'.format(count),end='') 
          count += 1 
          conn.commit() 
    except: 
      pass 


class AmazonThread(threading.Thread): 
  def __init__(self,keyword): 
    threading.Thread.__init__(self) 
    self.keyword = keyword 

 
  def run(self): 
    print('\\\\n提示:开始爬取亚马逊数据...') 
    count = 1 
    length = getPageLength('Amazon','https://www.amazon.cn/s/keywords={}'.format(self.keyword))#总页数 
    tableName = 'db_{}_amazon'.format(self.keyword) 

     
    try: 
      print('\\\\n提示:正在创建Amazon表...') 
      cursor.execute('create table {} (id int ,title text,prNow text,link text)'.format(tableName)) 

   
      print('\\\\n提示:开始爬取亚马逊页面...') 
      for i in range(1,int(length)): 
        url = 'https://www.amazon.cn/s/keywords={}&page={}'.format(self.keyword,i) 
        soup = getSoupObject(url) 
        lis = soup('li',{'id':re.compile(r'result_')}) 
        for li in lis: 
          a = li.find_all('a',{'class':'a-link-normal s-access-detail-page a-text-normal'}) 
          pn = li.find_all('span',{'class': 'a-size-base a-color-price s-price a-text-bold'}) 
          if not len(a) == 0: 
            link = a[0].attrs['href'] 
            title = a[0].attrs['title'].strip() 
          else: 
            link = 'NULL' 
            title = 'NULL' 

 
          if not len(pn) == 0: 
            prNow = pn[0].string 
          else: 
            prNow = 'NULL' 

 
          sql = "insert into {} (id,title,prNow,link) values ({},'{}','{}','{}')".format(tableName,count,title,prNow,link) 
          cursor.execute(sql) 
          print('\\\\r提示:正在存入亚马逊数据,当前处理id:{}'.format(count),end='') 
          count += 1 
          conn.commit() 
    except: 
      pass 


class JDThread(threading.Thread): 
  def __init__(self,keyword): 
    threading.Thread.__init__(self) 
    self.keyword = keyword 
  def run(self): 
    print('\\\\n提示:开始爬取京东数据...') 
    count = 1 

 
    tableName = 'db_{}_jd'.format(self.keyword) 

     
    try: 
      print('\\\\n提示:正在创建JD表...') 
      cursor.execute('create table {} (id int,title text,prNow text,link text)'.format(tableName)) 
      print('\\\\n提示:开始爬取京东页面...') 
      for i in range(1,100): 
        url = 'https://search.jd.com/Search?keyword={}&page={}'.format(self.keyword,i) 
        soup = getSoupObject(url) 
        lis = soup('li',{'class':'gl-item'}) 
        for li in lis: 
          a = li.find_all('div',{'class':'p-name'}) 
          pn = li.find_all('div',{'class': 'p-price'})[0].find_all('i') 

 
          if not len(a) == 0: 
            link = 'http:' + a[0].find_all('a')[0].attrs['href'] 
            title = a[0].find_all('em')[0].get_text() 
          else: 
            link = 'NULL' 
            title = 'NULL' 

           
          if(len(link) > 128): 
            link = 'TooLong' 

 
          if not len(pn) == 0: 
            prNow = '¥'+ pn[0].string 
          else: 
            prNow = 'NULL' 
          sql = "insert into {} (id,title,prNow,link) values ({},'{}','{}','{}')".format(tableName,count,title,prNow,link) 
          cursor.execute(sql) 
          print('\\\\r提示:正在存入京东网数据,当前处理id:{}'.format(count),end='') 
          count += 1 
          conn.commit() 
    except : 
      pass 
def closeDB(): 
  global conn,cursor 
  conn.close() 
  cursor.close() 

 
def main(): 
  print('提示:使用本程序,请手动创建空数据库:Book,并修改本程序开头的数据库连接语句') 
  keyword = input("\\\\n提示:请输入要爬取的关键字:") 

 
  dangdangThread = DangDangThread(keyword) 
  amazonThread = AmazonThread(keyword) 
  jdThread = JDThread(keyword) 
   dangdangThread.start() 
  amazonThread.start() 
  jdThread.start() 
  dangdangThread.join() 
  amazonThread.join() 
  jdThread.join() 
   closeDB() 
   print('\\\\n爬取已经结束,即将关闭....') 
  os.system('pause') 

   
main() 

示例截图:

关键词:Android 下的部分运行结果(以导出至 Excel

总结

以上就是编程狮(w3cschool.cn) 为你整理的关于Python爬取当当、京东、亚马逊图书信息代码实例的全部内容,希望对大家有所帮助。

HTML页面中的head头部区域的编码书写规范

thbcm阅读(165)

我们这里所说的head区域,是指网页html代码的<head></head>之间的内容。在w3cschool.cn的文章中,主要介绍了大量的csshtml 入门知识,及其他前后端、Python 等编程技术教程。

今天我们简单的介绍一下head区域主要放置了哪些内容。这里就不强调css和javascript 了,这两者大家应该都有所了解了,如有不明白可在编程狮w3cschool查阅相关教程。

head区一般必须加入的标识有:

公司版权注释

<!--- the site is designed by W3Cschool 01/2021 ---> 

网页显示字符集

简体中文:

<meta http-equiv="content-type" content="text/html; charset=gb2312">

繁体中文:

<meta http-equiv="content-type" content="text/html; charset=big5">

英 语:

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
或者:
<meta http-equiv="content-type" content="text/html; charset=utf-8">

原始制作者信息

<meta name="author" content="52css@w3cschool.cn"> 

网站简介

<meta name="description" content="这里填您网站的简介"> 

搜索关键字

<meta name="keywords" content="关键字1,关键字2,关键字3,..."> 

网页的css规范

<link href="style/style.css" rel="stylesheet" type="text/css"> 

网页标题

<title>这里是你的网页标题</title> 

head区可选加入的标识有:

<!--- 设定网页的到期时间。一旦网页过期,必须到服务器上重新调阅。 ---> 
<meta http-equiv="expires" content="wed, 26 feb 2058 08:21:57 gmt"> 


<!--- 禁止浏览器从本地机的缓存中调阅页面内容。 ---> 
<meta http-equiv="pragma" content="no-cache"> 


<!--- 用来防止别人在框架里调用你的页面。 ---> 
<meta http-equiv="window-target" content="_top"> 


<!--- 自动跳转(5指时间停留5秒)。 ---> 
<meta http-equiv="refresh" content="5;url=www.w3cschool.cn">


<!--- 网页搜索机器人向导.用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。 ---> 
<meta name="robots" content="none">
<!--- content的参数有all,none,index,noindex,follow,nofollow。默认是all。  ---> 


<!--- 收藏夹图标 ---> 
<link rel = "shortcut icon" href="favicon.ico"> 

以上就是编程狮(w3cschool.cn)为你整理的关于HTML页面中的head头部区域的编码书写规范,希望对你有所帮助~

如何利用Python开发APP?

thbcm阅读(191)

作者:nmask

来源:WinTogether安全团队

我很早之前就想开发一款 app 玩玩,无奈对java不够熟悉,之前也没有开发 app 的经验,因此一直耽搁了。最近想到尝试用 python 开发一款 app ,google 搜索了一番后,发现确实有路可寻,目前也有了一些相对成熟的模块,于是便开始了动手实战,过程中发现这其中有很多坑,好在最终依靠 google 解决了,因此小记一番。

说在前面的话

python 语言虽然很万能,但用它来开发 app 还是显得有点不对路,因此用 python 开发的 app 应当是作为编码练习、或者自娱自乐所用,加上目前这方面的模块还不是特别成熟,bug比较多,总而言之,劝君莫轻入。

准备工作

利用 python 开发app需要用到 python 的一个模块–kivykivy是一个开源的,跨平台的 Python 开发框架,用于开发使用创新的应用程序。简而言之,这是一个 python 桌面程序开发框架(类似wxpython 等模块),强大的是kivy支持 linux、mac、windows、android、ios平台,这也是为什么开发app需要用到这个模块。 虽然 kivy 是跨平台的,但是想要在不同的平台使用 python 代码,还需要将 python 代码打包成对应平台的可执行程序,好在 kivy 项目下有个打包工具项目–、buildozer,这是官方推荐的打包工具,因为相对比较简单,自动化程度高,其他项目比如:python-for-android也能起到类似的作用,这里不展开介绍。

搭建kivy开发环境

需要在 pc 上安装 kivy 开发环境,这里演示下 mac 与 linux 下的安装过程。

install kivy for mac

安装一些依赖包:

brew install pkg-config sdl2 sdl2_image sdl2_ttf sdl2_mixer gstreamer

安装 cython 以及 kivy

pip install cython==0.25
pip install kivy

如果安装 kivy 报错,则使用下面的方式安装 kivy

git clone https://github.com/kivy/kivy
python setup.py install

安装后测试:

$python
Python 2.7.10 (default, Jul 15 2017, 17:16:57)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import kivy
[INFO   ] [Logger      ] Record log in /Users/didi/.kivy/logs/kivy_18-05-08_4.txt
[INFO   ] [Kivy        ] v1.10.1.dev0, git-5f6c66e, 20180507
[INFO   ] [Python      ] v2.7.10 (default, Jul 15 2017, 17:16:57)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)]

说明:导入 kivy 模块没有报错则说明安装成功。

install kivy for centos7

先安装依赖:

yum install \\\\
make \\\\
mercurial \\\\
automake \\\\
gcc \\\\
gcc-c++ \\\\
SDL_ttf-devel \\\\
SDL_mixer-devel \\\\
khrplatform-devel \\\\
mesa-libGLES \\\\
mesa-libGLES-devel \\\\
gstreamer-plugins-good \\\\
gstreamer \\\\
gstreamer-python \\\\
mtdev-devel \\\\
python-devel \\\\
python-pip \\\\
java-devel

安装 cython 以及 kivy :

pip install Cython==0.20
pip install kivy

centos 安装 kivy 参考:在Linux上安装Kivy pip

说明:其他安装 kivy 方式可移步:kivy官方下载 (需要翻墙)

用kivy开发第一个python app

安装完 kivy 就可以开发 app 程序了,这里演示下 hello-world 程序,关于 kivy 更复杂的用法不是本文重点,后面再成文介绍。 1) 创建一个 main.py 文件,写入:

#! -*- coding:utf-8 -*-
from kivy.app import App
class HelloApp(App):
pass
if __name__ == '__main__':
HelloApp().run()

2)创建一个hello.kv文件,写入:

Label:
text: 'Hello, World! I am nMask'

简单说明:main.py是入口函数,定义了一个HelloApp类,该类继承kivy.apphello.kv文件是kivy程序,相当于定义界面风格等,该文件命名规则为类名小写且去除 app。

运行第一个python app

python main.py

运行结果:

安装buildozer工具

通过以上的编码,我创建了自己的第一个 python app 程序,该程序可以直接在 mac、linux、windows平台下运行,那么如何让它在安卓或者苹果手机上运行呢?我们知道在安卓上运行,需要将其打包成 apk 安装程序,因此就需要用到前面提到过的 buildozer 工具,(buildozer 工具可以打包 kivy 程序,支持 android、ios 等),buildozer的安装过程比较简单:

pip install buildozer

使用buildozer工具将kivy程序打包成apk

在 python 项目目录下运行:

buildozer init

运行成功将会创建一个配置文件 buildozer.spec,可以通过修改配置文件更改 app 的名称等,然后运行:

buildozer android debug deploy run

运行以上命令将会生成跨平台的安装包,可适用安卓、ios 等,如果用于安卓,则是利用 python-for-android 项目。

在第一次运行以上命令的时候,会自动在系统中下载安卓 sdk 等必要文件,如下图。(过程需要翻墙,而且有很多依赖需要下载)

说明:这里只演示打包成 apk 文件,iso 平台的可自行研究,Buildozer 参考文档

python apk程序测试

如果以上步骤都运行成功的话,应该会在项目目录下的 bin 目录下生成一个 apk 文件,类似如下:

然后将 apk 下载到安卓系统的手机上,安装即可,测试效果如下: 打开 app:

buildozer使用说明

Usage:
buildozer [--profile <name>] [--verbose] [target] <command>...
buildozer --version
Available targets:
android        Android target, based on python-for-android project
ios            iOS target, based on kivy-ios project
android_old    Android target, based on python-for-android project (old toolchain)
Global commands (without target):
distclean          Clean the whole Buildozer environment.
help               Show the Buildozer help.
init               Create a initial buildozer.spec in the current directory
serve              Serve the bin directory via SimpleHTTPServer
setdefault         Set the default command to run when no arguments are given
version            Show the Buildozer version
Target commands:
clean      Clean the target environment
update     Update the target dependencies
debug      Build the application in debug mode
release    Build the application in release mode
deploy     Deploy the application on the device
run        Run the application on the device
serve      Serve the bin directory via SimpleHTTPServer
Target "android_old" commands:
adb                Run adb from the Android SDK. Args must come after --, or
use --alias to make an alias
logcat             Show the log from the device
Target "ios" commands:
list_identities    List the available identities to use for signing.
xcode              Open the xcode project.
Target "android" commands:
adb                Run adb from the Android SDK. Args must come after --, or
use --alias to make an alias
logcat             Show the log from the device
p4a                Run p4a commands. Args must come after --, or use --alias
to make an alias

buildozer打包过程中的坑点

如果在打包过程中遇到报错,可以修改buildozer.spec配置文件中的log_level2,然后重新运行,可以看具体的错误信息。

报错:You might have missed to install 32bits libs

这个错是我在centos7上运行时报的错,大意是系统缺少了某些32位的依赖文件。 解决方案:

yum -y install --skip-broken glibc.i686 arts.i686 audiofile.i686 bzip2-libs.i686 cairo.i686 cyrus-sasl-lib.i686 dbus-libs.i686 directfb.i686 esound-libs.i686 fltk.i686 freeglut.i686 gtk2.i686 hal-libs.i686 imlib.i686 lcms-libs.i686 lesstif.i686 libacl.i686 libao.i686 libattr.i686 libcap.i686 libdrm.i686 libexif.i686 libgnomecanvas.i686 libICE.i686 libieee1284.i686 libsigc++20.i686 libSM.i686 libtool-ltdl.i686 libusb.i686 libwmf.i686 libwmf-lite.i686 libX11.i686 libXau.i686 libXaw.i686 libXcomposite.i686 libXdamage.i686 libXdmcp.i686 libXext.i686 libXfixes.i686 libxkbfile.i686 libxml2.i686 libXmu.i686 libXp.i686 libXpm.i686 libXScrnSaver.i686 libxslt.i686 libXt.i686 libXtst.i686 libXv.i686 libXxf86vm.i686 lzo.i686 mesa-libGL.i686 mesa-libGLU.i686 nas-libs.i686 nss_ldap.i686 cdk.i686 openldap.i686 pam.i686 popt.i686 pulseaudio-libs.i686 sane-backends-libs-gphoto2.i686 sane-backends-libs.i686 SDL.i686 svgalib.i686 unixODBC.i686 zlib.i686 compat-expat1.i686 compat-libstdc++-33.i686 openal-soft.i686 alsa-oss-libs.i686 redhat-lsb.i686 alsa-plugins-pulseaudio.i686 alsa-plugins-oss.i686 alsa-lib.i686 nspluginwrapper.i686 libXv.i686 libXScrnSaver.i686 qt.i686 qt-x11.i686 pulseaudio-libs.i686 pulseaudio-libs-glib2.i686 alsa-plugins-pulseaudio.i686 python-matplotli

参考:https://ask.fedoraproject.org/en/question/9556/how-do-i-install-32bit-libraries-on-a-64-bit-fedora/

报错:Error compiling Cython file

错误大意为cython文件出错,可能是cython模块没有安装,或者版本有问题。 解决方案:

pip install cython==0.25

报错:IOError: [Errno 2] No such file or directory…..

这是在打包的最后一步,将 apk 文件 copy 到项目bin目录下时报的错,是 buildozer 的一个 bug。 解决方案: 修改/usr/local/lib/python2.7/dist-packages/buildozer/tagets/android.py文件: (1)在文件开头导入:

from distutils.version import LooseVersion

(2) 将786行:XXX found how the apk name is really built from the title这一行以下的代码替换为:

__sdk_dir = self.android_sdk_dir
build_tools_versions = os.listdir(join(__sdk_dir, 'build-tools'))
build_tools_versions = sorted(build_tools_versions, key=LooseVersion)
build_tools_version = build_tools_versions[-1]
gradle_files = ["build.gradle", "gradle", "gradlew"]
is_gradle_build = any((exists(join(dist_dir, x)) for x in gradle_files)) and build_tools_version >= ’25.0'

buildozer虚拟机

kivy 官方推出了一个 buildozer 虚拟机镜像,已经安装好了 buildozer 以及一些依赖文件,为 buildozer 打包测试提供平台。由于之前我在 mac 上利用 buildozer 打包一直报错,后来换成 centos 也依然没有成功,因此便下载了此虚拟机,测试效果如下:

虚拟机下载地址:http://txzone.net/files/torrents/kivy-buildozer-vm-2.0.zip

说明:对于无法解决依赖问题的朋友,可以使用此虚拟机进行程序打包,开发环境还是推荐用自己的本机。

kivy开发实例

因为本文重点在于介绍如何利用kivy+buildozer开发一款 python app,因此对于kivy的开发过程,以及 app 功能进行了最简化。想要学习如何开发更复杂的 app,可参考:https://muxuezi.github.io/posts/kivy-perface.html#

Linux file 结构体和 inode 结构体

thbcm阅读(215)

在设备驱动程序中,一般需要关心两个结构体:file 和 inode。

1. file 结构体

file 结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的 struct file。

它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。

注:在内核和驱动源代码中,struct file 的指针通常被命名为 file 或 filp(即 file pointer)。

struct file {
        union {
           struct llist_node         fu_llist;
           struct rcu_head          fu_rcuhead;
        } 
        f_u;
        struct path               f_path;
        struct inode              *f_inode;/* cached value */
        const struct file_operations      *f_op;/* 和文件关联的操作 */
        /*
         * Protects f_ep_links, f_flags.
         * Must not be taken from IRQ context.
         */
        spinlock_t                f_lock;
        enum rw_hint              f_write_hint;
        atomic_long_t              f_count;
        unsigned int              f_flags;/* 文件标志,如O_RDONLY、O_NONBLOCK、O_SYNC */
        fmode_t                 f_mode;/* 文件读/写模式,FMODE_READ、FMODE_WRITE */
        struct mutex              f_pos_lock;
        loff_t                  f_pos;/* 当前读写位置 */
        struct fown_struct        f_owner;
        const struct cred        *f_cred;
        struct file_ra_state        f_ra;
        u64                f_version;

        #ifdef CONFIG_SECURITY
        void *f_security;
        #endif
        /* needed for tty driver, and maybe others */
        void *private_data; /* 文件私有数据 */
        #ifdef CONFIG_EPOLL
        /* Used by fs/eventpoll.c to link all the hooks to this file */
        struct list_head f_ep_links;
        struct list_head f_tfile_llink;
        #endif /* #ifdef CONFIG_EPOLL */
        struct address_space *f_mapping;
        errseq_t f_wb_err;
    }
    __randomize_layout
  __attribute__((aligned(4)));/* lest something weird decides that 2 is OK */
  
    struct file_handle {
      __u32 handle_bytes;
      int handle_type;
      /* file identifier */
      unsigned char f_handle[0];
    };

文件读/写模式 mode、标志 f_flags 都是设备驱动关心的内容,而私有数据指针 private_data 在设备驱动中被广泛应用,大多被指向设备驱动自定义以用于描述设备的结构体。

2. inode 结构体

VFS inode 包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改事件等信息。它是 Linux 管理文件系统的基本单位,也是文件系统连接任何子目录、文件的桥梁,inode 结构体的定义如下:

struct inode {

        umode_t                        i_mode;

/* inode的权限 */

        unsigned short                i_opflags;

        kuid_t                        i_uid;

/* inode拥有者的id */

        kgid_t                        i_gid;

/* inode所属的群组id */

        unsigned int                i_flags;

#ifdef CONFIG_FS_POSIX_ACL

        struct posix_acl        *i_acl;

        struct posix_acl        *i_default_acl;

#endif

        const struct inode_operations        *i_op;

        struct super_block        *i_sb;

        struct address_space        *i_mapping;

#ifdef CONFIG_SECURITY

        void                        *i_security;

#endif

        /* Stat data, not accessed from path walking */

        unsigned long                i_ino;

        /*

         * Filesystems may only read i_nlink directly.  They shall use the

         * following functions for modification:

         *

         *    (set|clear|inc|drop)_nlink

         *    inode_(inc|dec)_link_count

         */

        union {

                const unsigned int i_nlink;

                unsigned int __i_nlink;

        };

        dev_t                        i_rdev;

/* 若是设备文件,此字段将记录设备的设备号 */

        loff_t                        i_size;

/* inode所代表的文件大小 */

        struct timespec                i_atime;

/* inode最近一次的存取时间 */

        struct timespec                i_mtime;

/* inode最近一次的修改时间 */

        struct timespec                i_ctime;

/* inode的产生时间 */

        spinlock_t                i_lock;

/* i_blocks, i_bytes, maybe i_size */

        unsigned short          i_bytes;

        unsigned int                i_blkbits;

        enum rw_hint                i_write_hint;

        blkcnt_t                i_blocks;

/* inode所使用的block数,一个block为512字节 */

#ifdef __NEED_I_SIZE_ORDERED

        seqcount_t                i_size_seqcount;

#endif

        /* Misc */

        unsigned long                i_state;

        struct rw_semaphore        i_rwsem;

        unsigned long                dirtied_when;

/* jiffies of first dirtying */

        unsigned long                dirtied_time_when;

        struct hlist_node        i_hash;

        struct list_head        i_io_list;

/* backing dev IO list */

#ifdef CONFIG_CGROUP_WRITEBACK

        struct bdi_writeback        *i_wb;

/* the associated cgroup wb */

        /* foreign inode detection, see wbc_detach_inode() */

        int                        i_wb_frn_winner;

        u16                        i_wb_frn_avg_time;

        u16                        i_wb_frn_history;

#endif

        struct list_head        i_lru;

/* inode LRU list */

        struct list_head        i_sb_list;

        struct list_head        i_wb_list; 

/* backing dev writeback list */

        union {

                struct hlist_head        i_dentry;

                struct rcu_head                i_rcu;

        };

        u64                        i_version;

        atomic_t                i_count;

        atomic_t                i_dio_count;

        atomic_t                i_writecount;

#ifdef CONFIG_IMA

        atomic_t                i_readcount;

/* struct files open RO */

#endif

        const struct file_operations        *i_fop;

/* former ->i_op->default_file_ops */

        struct file_lock_context        *i_flctx;

        struct address_space        i_data;

        struct list_head        i_devices;

        union {

                struct pipe_inode_info        *i_pipe;

                struct block_device        *i_bdev;

/* 若是块设备,为其对应的block_device结构体指针 */

                struct cdev                *i_cdev;

/* 若是字符设备,为其对应的cdev结构体指针 */

                char                        *i_link;

                unsigned                i_dir_seq;

        };

        __u32                        i_generation;

#ifdef CONFIG_FSNOTIFY

        __u32                        i_fsnotify_mask;

/* all events this inode cares about */

        struct fsnotify_mark_connector __rcu        *i_fsnotify_marks;

#endif

#if IS_ENABLED(CONFIG_FS_ENCRYPTION)

        struct fscrypt_info        *i_crypt_info;

#endif

        void                        *i_private;

/* fs or device private pointer */

} __randomize_layout;

Bootstrap组件介绍

thbcm阅读(203)

一、下拉菜单

用于显示链接列表的可切换、有上下文的菜单。下拉菜单的 JavaScript 插件让它具有了交互性。

1、实例

将下拉菜单触发器和下拉菜单都包裹在 .dropdown 里,或者另一个声明了 position: relative; 的元素。然后加入组成菜单的 HTML 代码。

<div class="dropdown">
 <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
  Dropdown
   <span class="caret"></span>
 </button>
 <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
   <li><a href="#">Action</a></li>
   <li><a href="#">Another action</a></li>
   <li><a href="#">Something else here</a></li>
   <li role="separator" class="divider"></li>
   <li><a href="#">Separated link</a></li>
 </ul>
</div>

  aria-haspopup :true表示点击的时候会出现菜单或是浮动元素; false表示没有pop-up效果。

  aria-expanded:表示展开状态。默认为undefined, 表示当前展开状态未知。其它可选值:true表示元素是展开的;false表示元素不是展开的

  aria-labelledby:当想要的标签文本已在其他元素中存在时,可以使用aria-labelledby,并将其值为所有读取的元素的id。如下:

  当ul获取到焦点时,屏幕阅读器是会读:“选择您的职位”

  data-toggle: 表示什么事件类型发生

二、按钮式下拉菜单

  把任意一个按钮放入 .btn-group 中,然后加入适当的菜单标签,就可以让按钮作为菜单的触发器了。

1、单按钮下拉菜单

<!-- Single button -->
<div class="btn-group">
 <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  Action <span class="caret"></span>
 </button>
 <ul class="dropdown-menu">
   <li><a href="#">Action</a></li>
   <li><a href="#">Another action</a></li>
   <li><a href="#">Something else here</a></li>
   <li role="separator" class="divider"></li>
   <li><a href="#">Separated link</a></li>
 </ul>
</div>

  鼠标指向时,显示背景颜色。

2、分裂式下拉菜单

只是多一个分开的按钮。

<!-- Split button -->
<div class="btn-group">
 <button type="button" class="btn btn-danger">Action</button>
 <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
   <span class="caret"></span>
   <span class="sr-only">Toggle Dropdown</span>​
 </button>
 <ul class="dropdown-menu">
   <li><a href="#">Action</a></li>
   <li><a href="#">Another action</a></li>
   <li><a href="#">Something else here</a></li>
   <li role="separator" class="divider"></li>
   <li><a href="#">Separated link</a></li>
 </ul>
</div>

  可以看到分成了左右两个按钮。

三、面板

某些时候你可能需要将某些 DOM 内容放到一个盒子里。对于这种情况,可以试试面板组件。

1、基本实例

默认的 .panel 组件所做的只是设置基本的边框(border)和内补(padding)来包含内容。

<div class="panel panel-default">
 <div class="panel-body">
  Basic panel example
 </div>
</div>

  显示效果:

  

2、带标题的面板

通过 .panel-heading 可以很简单地为面板加入一个标题容器。你也可以通过添加设置了 .panel-title 类的 <h1>-<h6> 标签,添加一个预定义样式的标题。不过,<h1>-<h6> 标签的字体大小将被 .panel-heading 的样式所覆盖。

为了给链接设置合适的颜色,务必将链接放到带有 .panel-title 类的标题标签内。

Bootstrap常见面试题

thbcm阅读(236)

1.为什么使用 bootstrap?

Bootstrap 具有移动设备优先、浏览器支持良好、容易上手、响应式设计等优点,所以 Bootstrap 被广泛应用。

2.为了让 Bootstrap 开发的网站对移动设备友好,确保适当的绘制和触屏缩放,需要在网页的 head 之中添加 viewport meta 标签,width 属性控制设备的宽度。假设您的网站将被带有不同屏幕分辨率的设备浏览,那么将它设置为 device-width 可以确保它能正确呈现在不同设备上。

initial-scale=1.0 确保网页加载时,以 1:1 的比例呈现,不会有任何的缩放。

在移动设备浏览器上,通过为 viewport meta 标签添加 user-scalable=no 可以禁用其缩放(zooming)功能。

通常情况下,maximum-scale=1.0 与 user-scalable=no 一起使用。这样禁用缩放功能后,用户只能滚动屏幕,就能让您的网站看上去更像原生应用的感觉,所以要加上以下代码:

<metanamemetaname="viewport" content="width=device-width,initial-scale=1">

3.对于各类尺寸的设备,Bootstrap 设置的 class 前缀分别是什么?

超小设备手机(<768px):.col-xs-

小型设备平板电脑(>=768px):.col-sm-

中型设备台式电脑(>=992px):.col-md-

大型设备台式电脑(>=1200px):.col-lg-

4. Bootstrap 如何设置响应式表格?

增加 class=”table-responsive”

5、使用 Bootstrap 创建垂直表单的基本步骤?

(1)向父<form>元素添加 role=”form”;

(2)把标签和控件放在一个带有 class=”form-group”的<div>中,这是获取最佳间距所必需的;

(3)向所有的文本元素<input>、<textarea>、<select>添加 class=”form-control”。

6、使用 Bootstrap 创建水平表单的基本步骤?

(1)向父<form>元素添加 class=”form-horizontal”;

(2)把标签和控件放在一个带有 class=”form-group”的<div>中;

(3)向标签添加 class=”control-label”。

7、使用 Bootstrap 如何创建表单控件的帮助文本?

增加 class=”help-block”的 span 标签或 p 标签。

8、使用 Bootstrap 激活或禁用按钮要如何操作?

激活按钮:给按钮增加 .active的class

禁用按钮:给按钮增加 disabled=”disabled”的属性

9、Bootstrap 有哪些关于<img>的 class?

(1).img-rounded 为图片添加圆角

(2).img-circle 将图片变为圆形

(3).img-thumbnail 缩略图功能

(4).img-responsive 图片响应式 (将很好地扩展到父元素)

10、Bootstrap 中有关元素浮动及清除浮动的 class?

(1)class=”pull-left” 元素浮动到左边

(2)class=”pull-right” 元素浮动到右边

(3)class=”clearfix” 清除浮动

11、除了屏幕阅读器外,其他设备上隐藏元素的 class?

class=”sr-only”

12、Bootstrap 如何制作下拉菜单?

(1)将下拉菜单包裹在 class=”dropdown”的<div>中;

(2)在触发下拉菜单的按钮中添加:class=”btn dropdown-toggle” id=”dropdownMenu1″ data-toggle=”dropdown”

(3)在包裹下拉菜单的ul中添加:class=”dropdown-menu” role=”menu” aria-labelledby=”dropdownMenu1″

(4)在下拉菜单的列表项中添加:role=”presentation”。其中,下拉菜单的标题要添加 class=”dropdown-header”,选项部分要添加 tabindex=”-1″。

13、Bootstrap 如何制作按钮组?以及水平按钮组和垂直按钮组的优先级?

(1)用 class=”btn-group”的<div>去包裹按钮组;class=”btn-group-vertical”可设置垂直按钮组。

(2)btn-group 的优先级高于 btn-group-vertical 的优先级。

14、Bootstrap 如何设置按钮的下拉菜单?

在一个 .btn-group 中放置按钮和下拉菜单即可。

15、Bootstrap 中的输入框组如何制作?

(1)把前缀或者后缀元素放在一个带有 class=”input-group”中的<div>中;

(2)在该<div>内,在 class=”input-group-addon”的<span>里面放置额外的内容;

(3)把<span>放在<input>元素的前面或后面。

16、Bootstrap 中的导航都有哪些?

(1)导航元素:有 class=”nav nav-tabs”的标签页导航,还有 class=”nav nav-pills”的胶囊式标签页导航;

(2)导航栏:class=”navbar navbar-default” role=”navigation”;

(3)面包屑导航:class=”breadcrumb”

17、Bootstrap 中设置分页的 class?

默认的分页:class=”pagination”

默认的翻页:class=”pager”

18、Bootstrap 中显示标签的 class?

class=”label”

19、Bootstrap 中如何制作徽章?

<span class="badge">26</span>

20、Bootstrap 中超大屏幕的作用是什么?

设置 class=”jumbotron” 可以制作超大屏幕,该组件可以增加标题的大小并增加更多的外边距。

10个html5增加的重要新特性和内容

thbcm阅读(230)

文章开篇之前我们先了解一下什么是 html5,百度上是这样定义 html5 的:万维网的核心语言、标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改。

其实说白了 html5 也就是人为定义的一些规则和新的 api 的集合。下面我就介绍一些开发常用的 html5 新特性:

一:canvas 标签

<!DOCTYPE HTML>
<html>
<body>
<canvas id="myCanvas">your browser does not support the canvas tag </canvas>
<script type="text/javascript">
var canvas=document.getElementById('myCanvas');
var ctx=canvas.getContext('2d');
ctx.fillStyle='#FF0000';
ctx.fillRect(0,0,80,100);
</script>
</body>
</html>

渲染结果:

通过这个元素你可以绘制你想要的图案。

二:video标签​​

<video src="视频地址" controls="controls" autoplay="autoplay" > 
your browser does not support the video tag   //可以在开始标签和结束标签之间放置文本内容,这样老的浏览器就可以显示出不支持该标签的信息。
</video>

video 标签具有以下属性:

  1.autoplay:如果出现该属性,则视频在就绪之后马上播放

  2.controls:如果出现该属性,则向用户显示控件,比如播放按钮

  3.height:设置视频播放器高度

  4.loop:如果出现该属性,则会重复播放

  5.preload:如果出现该属性,则视频在页面加载时进行加载,并预备播放。如果使用“autoplay”,则忽略该属性。

  6.src:视频地址

  7.width:设置视频播放器宽度

三:localStorage 和 sessionStorage

   Web Storage 的概念和 cookie 相似,区别是它是为了更大容量存储设计的。Cookie 的大小是受限的,并且每次你请求一个新的页面的时候 Cookie 都会被发送过去,这样无形中浪费了带宽,另外 cookie 还需要指定作用域,不可以跨域调用。

   1.localStorage: 用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。

   2.sessionStorage: 用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此 sessionStorage 不是一种持久化的本地存储,仅仅是会话级别的存储。

   Web Storage 拥有 setItem,getItem,removeItem,clear 等方法,不像 cookie 需要前端开发者自己封装 setCookie,getCookie。

  sessionStorage.setItem("name", "三十亿少女的梦");    
  console.log(sessionStorage.getItem("name")); //三十亿少女的梦

四:语义化标签

在 HTML5 出来之前,我们用 div 构建页面,但是这些 div 都没有实际意义。我们只能通过 id 等属性认为赋予它一些身份。为了便于开发者观察和 seo(搜索引擎优化),html5 推出了这些语义化标签。

  header:代表“网页”或“section”的页眉。

  footer:代表“网页”或“section”的页脚,通常含有该节的一些基本信息,譬如:作者,相关文档链接,版权资料。

  hgroup:代表“网页”或“section”的标题,当元素有多个层级时,该元素可以将 h1 到 h6 元素放在其内,譬如文章的主标题和副标题的组合

  nav:元素代表页面的导航链接区域。用于定义页面的主要导航部分。

  aside:被包含在 article 元素中作为主要内容的附属信息部分,其中的内容可以是与当前文章有关的相关资料、标签、名次解释等。

  section:代表文档中的“节”或“段”,“段”可以是指一篇文章里按照主题的分段;“节”可以是指一个页面里的分组。

  article:最容易跟 section 和 div 容易混淆,其实 article 代表一个在文档,页面或者网站中自成一体的内容,其目的是为了让开发者独立开发或重用。譬如论坛的帖子,博客上的文章,一篇用户的评论,一个互动的 widget 小工具。(特殊的section)

五:新表单控件

  html5 中添加了 date(日期选择)、time(时间选择)、email(邮箱地址)、url(链接)等表单控件,我个人非常喜欢这些添加。比如 email 控件,以前我们没有这个控件的时候要判断用户输入的是不是 email 格式只能通过js正则表达式来判断,但 h5 之后只用在 input 的 type 属性写上 email 就可以了,但这只是基本的判断不能保证百分百过滤,为了安全,后台还是要进行 email 格式判断的。

<input type="email" />

六:去掉 script 和 link 标签里的 type 属性

html5 之后你的 script 和 link 不用再加 type 属性,一样可以工作正常,但是为了不出差错,最好还是加上。

七:contenteditable 属性

你的任何 dom 节点只要加上 contenteditable=”true”就可以变得可编辑,也是一个很棒的属性添加,用这个你可以模拟 textarea。

八:input 添加了 placeholder,required,autofocus,pattern 等属性

<input type="text" placeholder="请输入姓名" />  
<!--当这个输入框为空时框内显示:请输入姓名 -->
<input type="text" required /> <!--输入框为必填,否则不能提交表单 -->
<input type="text" autofocus /> <!--进入页面,自动聚焦到这个input -->
<input type="text" name="country_code" pattern="[A-z]{3}"> <!--输入值必须与正则匹配-->

九:mark标签

使用 mark 标签可以使你的内容有醒目的标记,从 mark 这个单词相信你就能猜出这个标签大概用途

十:pageInput 创建滑块

HTML5 引用的 range 类型可以创建滑块,它接受 min, max, step 和 value 属性,可以使用 css 的 :before 和 :after 来显示 min 和 max 的值 ,但是显示的不是很友善。

<style>
input[type=range]:before {
content: attr(min);
padding-right: 5px;
}

input[type=range]:after {
content: attr(max);
padding-left: 5px;}
}
</style>
<input type=”range” name=”range” min=”0″ max=”10″ step=”1″ />

web前端开发初学者如何科学的快速学会CSS?

thbcm阅读(268)

很多前端初学者对 CSS 表示很头大,咨询w3cschool小狮妹”如何学习 CSS “。总结发现一部分原因是由于我们对 CSS 没有很好的认识。虽然 CSS 只是前端工作的一小部分,但是它直接关系到网页最终显示效果,很值得我们去学习。

本文主要概述 CSS 的一些常见基础知识,帮助大家更好的理解 CSS 。

什么是 CSS?

CSS(层叠样式表)——英文 Cascading Style Sheets 的缩写,是一种计算机标记语言,用来表现 HTML (标准通用标记语言的一个应用)或 XML (标准通用标记语言的一个子集)等文件样式。

CSS 知识点太多记不住?

CSS 知识点确实很多,我们只需要学习并理解它的基础知识和原理,需要用到的时候再到w3cschool 查询CSS参考手册 ,不需要学习完所有的属性和值,但是学习 CSS 要有一些前端基础,如果没有这些基础,您将很难理解它,你可以先在W3Cschool上学习HTML 。 这样可以节省大量时间、少走很多弯路。

认识选择器(SELECTORS)

HTML 页面中的元素是通过 CSS 选择器 来进行控制的,可以实现一对一,一对多或者多对一的控制,学习 CSS 首先要掌握的就是选择器。一般使用 class 选择器(程序中称“类选择器”),或直接在 body 中使用 HTML 元素(elements) (指的是从开始标签(start tag)到结束标签(end tag)的所有代码。)来设置样式(Style),但是一些更复杂的操作就需要更高级的选择器来实现了,如一些对象直接位于元素之后,或者是要选择表格中的奇数行,就需要根据元素在文档中的位置来选择元素。

这些选择器属于 CSS3 规范的一部分(你可能听说过它们被称为 CSS3 选择器)具有出色的浏览器支持。 有关可以使用的各种选择器的详细信息,请参阅W3Cschool的 CSS 选择器

有些选择器的行为就好像你已经将“类”( class) 应用于文档中的某些内容一样。 例如p:first-child就像你在第一个p元素中添加了一个“类”一样,这些被称为“伪对象选择符”(Pseudo-Element Selectors)。 “伪对象选择符”的作用类似于动态插入元素,例如::first-line的作用与用span 包裹第一行文本类似。但是,如果该行的长度发生变化,它将重新应用,如果插入该元素,就不会出现这种情况。 现在你可能会觉得这些选择器很复杂, 下面示例中是一个用伪类(Pseudo-class )伪元素(Pseudo Element) 例子。 我们使用 :first-child 伪类定位第一个 p 元素,然后 ::first-line 选择器选择该元素的第一行,就好像在第一行周围添加了一个<span>以使其变粗并更改颜色一样。

HTML代码

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>认识CSS选择器(SELECTORS)- 编程狮(w3cschool.cn)</title>
<style type="text/css">
@import url("style/style.css");
</style>
</head>


<body>
<div class="container">
    <p>大学之道,在明明德,在亲民,在止于至善。</p>
    <p>知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。物有本末,事有终始。知所先后,则近道矣。</p>
    <p>古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知。致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。自天子以至于庶人,壹是皆以修身为本。</p>
<p>其本乱而末治者,否矣。其所厚者薄,而其所薄者厚,未之有也。</p>
</div>
</body>
</html>

CSS代码

body {
  padding: 20px;
  font: 1em Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,arial,sans-serif;
  background-color: wheat;
}


* {box-sizing: border-box;}


p {
  margin: 0 0 1.7em 0;
}


.container {  
  border: 1px solid rgb(254,106,0);
  border-radius: .5em;
  padding: 20px;
  column-count: 1;
}


.container p:first-child::first-line {
  font-weight: bold;
  color: rgb(254,106,0);
}

效果

继承和层叠(INHERITANCE AND THE CASCADE)

层叠定义了一个元素应用了多个样式规则时,应该哪个规则优先应用。 如果你无法理解为什么某些 CSS 似乎没有应用的情况,那可能是层叠没有运用好。 层叠与继承紧密相关,继承定义了子元素可以继承父元素的样式属性。 它还与特异性有关,不同的选择器具有不同的特异性,当有几个选择器可以应用于一个元素时,继承可以决定应用哪个规则。

注意:为了理解这些内容,建议阅读 W3Cschool 中的 CSS 样式级联

如果你正在尝试将一些 CSS 应用于一个元素,那么你的浏览器开发者工具(DevTools)是最好的选择。看看下面这个例子,我用元素选择器 h1h1 标题设置为橙色。同时,我也使用类选择器将h1 标题设置为紫色。 由于类的优先级更高,因此h1标题是紫色的。 在开发者工具中,您可以看到元素选择器被划掉了,因为它没有被应用。 一旦你看到浏览器正在获取你的 CSS(但其他东西已经推翻了它),那么你可以开始找出原因了。

HTML代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>继承和层叠 - 编程狮(w3cschool.cn)</title>
<link rel="stylesheet" href="./style.css">
</head>


<body>
<div class="container">
    <h1 class="greatlearning">大学</h1>
    <p>大学之道,在明明德,在亲民,在止于至善。</p>
    <p>知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。物有本末,事有终始。知所先后,则近道矣。</p>
    <p>古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知。致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。自天子以至于庶人,壹是皆以修身为本。</p>
<p>其本乱而末治者,否矣。其所厚者薄,而其所薄者厚,未之有也。</p>
</div>
</body>
</html>

CSS代码:

body {
  padding: 20px;
  font: 1em Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,arial,sans-serif;
  background-color: wheat;
}


* {box-sizing: border-box;}


p {
  margin: 0 0 1.7em 0;
}


.container {  
  border: 1px solid rgb(254,106,0);
  border-radius: .5em;
  padding: 20px;
  column-count: 1;
}


.greatlearning {
  color: rebeccapurple;
}


h1 {
  color: orange;
}

效果:

盒模型(Box Model )

css将html元素看作一个个盒子,来设计和布局。盒子有它们的属性,盒子之间也可嵌套。标准的 CSS 盒模型 (CSS Box Model) 采用你给定元素的宽度,然后将内边框和边框添加到该宽度上——这意味着元素占用的空间大于给定的宽度。

  • 属性:margin、padding、border、content
  • 根据display属性值的不同,如,block\\\\\\\\inline-block\\\\\\\\inline(默认),可设置为块模型\\\\\\\\内联块模型\\\\\\\\内联模型
  • 分类:标准模型、IE模型(替代盒子模型)

除了标准盒子模型外还有一个盒子模型叫 IE 模型(替代盒子模型),盒子的宽度是页面上可见框的宽度,因此内容区域的宽度是该宽度减去填充和边框的宽度。详细请查阅W3Cschool上的CSS Box Model (盒子模型)

下面演示两个盒子, 两者的宽度均为200像素,边框为1像素,内边距为20像素。 第一个框使用标准盒子模型,因此占用总宽度为 242 像素,第二个框使用替代盒子模型,因此实际上是 200 像素宽。

HTML代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CSS 盒模型 -编程狮(w3cschool.cn)</title>
<link rel="stylesheet" href="./style.css">
</head>


<body>
<div class="box">
    我是标准盒子模型。
</div>


<div class="box box2">
    我是替代盒子模型。
</div>
</body>
</html>

CSS代码:

body {
  padding: 20px;
  font: 1em Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,arial,sans-serif;
  background-color: wheat;
}


p {
  margin: 0 0 1em 0;
}


.box {  
  border: 1px solid rgb(254,106,0);
  border-radius: .5em;
  padding: 20px;
  width: 200px;
  margin-bottom: 2em;
}


.box2 {
  box-sizing: border-box;
}

效果:

浏览器开发者工具(DevTools)可以再次帮助你了解正在使用的盒子模型。 在下图中,我使用火狐浏览器的开发者工具使用默认的 content-box盒模型工具。 工具告诉我这是正在使用的盒模型,我可以看到大小以及如何将边框和内边框添加到指定的宽度。

DevTools可帮助您了解为什么盒具有一定大小以及所使用的盒模型

注意:在 IE8 以前,如果想要兼容的话,就需要用 W3C 标准,声明。在 IE8+ ,浏览器中使用哪个盒模型可以由 box-sizing 控制,默认值为 content-box,即标准盒模型。

在 W3Cschool的 CSS Box Model 中,有关于盒模型、盒子尺寸详细说明。

常规流(normal flow

也有人翻译为“文档流”,具体叫什么名字不重要,我们理解它的原理就行了。标题和段落将以新行开始,单词显示为句子,并且它们之间只有一个空格。用于格式化的标签(例如em)不会破坏句子流。此内容以“常规流(normal flow)”或“块流布局(Block Flow Layout)”显示。内容的每个部分都被描述为“在流中(in flow)”;它知道其余内容,因此不会重叠。

我们要接受这种行为,学起来才会变得更加轻松。这是为什么从一个正确标记的HTML文档开始很有意义的原因之一,由于浏览器遵守常规流和内置样式表,你的内容从可读的地方开始。

格式化上下文(FORMATTING CONTEXTS)

一旦文档的内容处于正常流程中,您可能希望更改其中一些内容的外观。 你可以通过更改元素的格式上下文来完成此操作。 举个一个非常简单的示例,如果你希望所有段落连在一起而不是从新行开始,你可以设置 p 元素的样式属性display:inline ,将 p 元素由块级元素变成内联元素。

本质上,格式化上下文定义了外部和内部类型。外部控制元素与页面上其他元素的行为,内部控制子元素的外观。例如,当你设置 display:flex ,你在设置外部为块格式化上下文,设置子元素为 flex 格式化上下文。

注意:最新版本的 Display 规范改变了 display 的值,显式声明外部和内部的类型。因此,将你可能会声明 display:block flex; (外部为 block,内部为 flex)。

在W3Cschool的 CSS display显示 上阅读更多关于 display的信息。

在流中或脱离流(BEING IN OR OUT OF FLOW)

CSS 中的元素被描述为“在流中(in flow)”或“脱离流(out of flow)”。流中的元素被赋予空间,并且空间被流中的其他元素所影响。 如果通过浮动或定位元素使元素脱离流,则该元素的空间将不再受到其他流元素的影响。

对于绝对定位的元素,是最明显的。 如果你设置一个元素 position: absolute ,该元素会从流中脱离,你需要确保这个元素不会与流中的元素重叠,且不影响你布局的其他部分的可读性。

HTML代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CSS flow - 编程狮(w3cschool.cn)</title>
<link rel="stylesheet" href="./style.css">
</head>


<body>
<div class="container">

  
    <p>子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知而不愠,不亦君子乎?</p>
    <p>有子曰:“其为人也孝弟而好犯上者,鲜矣;不好犯上而好作乱者,未之有也。君子务本,本立而道生。孝弟也者,其为仁之本与!”</p>
    <p>子曰:“巧言令色,鲜矣仁!”</p>
    <p>曾子曰“吾日三省吾身:为人谋而不忠乎?与朋友交而不信乎?传不习乎?”</p>
    <p>子曰:“道千乘之国,敬事而信,节用而爱人,使民以时。”</p>
    <p>子曰:“弟子入则孝,出则弟,谨而信,泛爱众,而亲仁。行有余力,则以学文。”</p>
    <p>子夏曰:“贤贤易色;事父母,能竭其力;事君,能致其身;与朋友交,言而有信。虽曰未学,吾必谓之学矣。”</p>
    <p>子曰:“君子不重则不威,学则不固。主忠信,无友不如己者,过则勿惮改。”</p>
    <p>曾子曰:“慎终追远,民德归厚矣。”</p>
    <p>子禽问于子贡曰:“夫子至于是邦也,必闻其政,求之与,抑与之与?”子贡曰:“夫子温、良、恭、俭、让以得之。夫子之求之也,其诸异乎人之求之与?”</p>
    <p>子曰:“父在,观其志。父没,观其行;三年无改于父之道,可谓孝矣。”</p>
    <p>有子曰:“礼之用,和为贵。先王之道,斯为美,小大由之。有所不行,知和而和,不以礼节之,亦不可行也。”</p>
    <p>有子曰:“信近于义,言可复也。恭近于礼,远耻辱也。因不失其亲,亦可宗也。”</p>
    <p>子曰:“君子食无求饱,居无求安,敏于事而慎于言,就有道而正焉。可谓好学也已。”</p>
    <p>子贡曰:“贫而无谄,富而无骄,何如?”子曰:“可也。未若贫而乐,富而好礼者也。”子贡曰:“《诗》云:‘如切如磋,如琢如磨’,其斯之谓与?”子曰:“赐也,始可与言《诗》已矣,告诸往而知来者。”</p>
    <p>子曰:“不患人之不己知,患不知人也。”</p>

  
    <div class="item">绝对定位和脱离流。</div>
</div>
</body>
</html>

CSS代码:

body {
  padding: 20px;
  font: 1em Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,arial,sans-serif;
  background-color: wheat;
}


* {box-sizing: border-box;}


p {
  margin: 0 0 1em 0;
}


.container {  
  border: 1px solid rgb(254,106,0);
  border-radius: .5em;
  padding: 10px;
  column-count: 2;
  max-width: 400px;
  position: relative;
}


.item {
  border-radius:.5em;
  position: absolute;
  top: 10px;
  left: 20px;
  background-color: rgba(254,106,0,.9);
  color: #fff;
  padding: 20px;
  width: 200px;
}

效果:

然而,浮动元素也会从流中脱离,但后面的元素的文本将环绕该浮动元素。你可以设置后面元素的背景颜色,你会看到他们会上升并占用了原来浮动元素原来的空间。

HTML代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CSS flow - 编程狮(w3cschool.cn)</title>
<link rel="stylesheet" href="./style.css">
</head>


<body>
<div class="container">


    <div class="item">浮动和脱离流</div>  
    <p>子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知而不愠,不亦君子乎?</p>
    <p>有子曰:“其为人也孝弟而好犯上者,鲜矣;不好犯上而好作乱者,未之有也。君子务本,本立而道生。孝弟也者,其为仁之本与!”</p>
    <p>子曰:“巧言令色,鲜矣仁!”</p>
    <p>曾子曰“吾日三省吾身:为人谋而不忠乎?与朋友交而不信乎?传不习乎?”</p>
    <p>子曰:“道千乘之国,敬事而信,节用而爱人,使民以时。”</p>
    <p>子曰:“弟子入则孝,出则弟,谨而信,泛爱众,而亲仁。行有余力,则以学文。”</p>
    <p>子夏曰:“贤贤易色;事父母,能竭其力;事君,能致其身;与朋友交,言而有信。虽曰未学,吾必谓之学矣。”</p>
    <p>子曰:“君子不重则不威,学则不固。主忠信,无友不如己者,过则勿惮改。”</p>
    <p>曾子曰:“慎终追远,民德归厚矣。”</p>
    <p>子禽问于子贡曰:“夫子至于是邦也,必闻其政,求之与,抑与之与?”子贡曰:“夫子温、良、恭、俭、让以得之。夫子之求之也,其诸异乎人之求之与?”</p>
    <p>子曰:“父在,观其志。父没,观其行;三年无改于父之道,可谓孝矣。”</p>
    <p>有子曰:“礼之用,和为贵。先王之道,斯为美,小大由之。有所不行,知和而和,不以礼节之,亦不可行也。”</p>
    <p>有子曰:“信近于义,言可复也。恭近于礼,远耻辱也。因不失其亲,亦可宗也。”</p>
    <p>子曰:“君子食无求饱,居无求安,敏于事而慎于言,就有道而正焉。可谓好学也已。”</p>
    <p>子贡曰:“贫而无谄,富而无骄,何如?”子曰:“可也。未若贫而乐,富而好礼者也。”子贡曰:“《诗》云:‘如切如磋,如琢如磨’,其斯之谓与?”子曰:“赐也,始可与言《诗》已矣,告诸往而知来者。”</p>
    <p>子曰:“不患人之不己知,患不知人也。”</p>

  
</div>
</body>
</html>

CSS代码:

body {
  padding: 20px;
  font: 1em Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,arial,sans-serif;
  background-color: wheat;
}


* {box-sizing: border-box;}


p {
  margin: 0 0 1em 0;
}


.container {  
  border: 1px solid rgb(254,106,0);
  border-radius: .5em;
  padding: 10px;
  max-width: 500px;
}


.item {
  border-radius:.5em;
  float: left;
   background-color: rgba(254,106,0,.9);
  color: #fff;
  padding: 20px;
  width: 100px;
  margin: 10px;
}


.container p:nth-of-type(1) {
  background-color: yellow;
}

效果:

注意: 需要记住的重要一点是,如果从流中取出一个元素,则需要自己管理重叠,因为块流布局的常规规则不再适用。

布局(Layout)

过去我们们在 HTML 中一般使用 CSS 进行布局,常见的布局有:单列布局、两列自适应布局、圣飞布局和双飞翼布局、伪等高布局、粘连布局。重点介绍下 Flex 布局和 grid 布局:

Flex布局

Flex布局,也叫弹性盒子布局,区区简单几行代码就可以实现各种页面的的布局。

//html部分同上
.parent {
    display:flex;
}  
.right {
    margin-left:20px; 
    flex:1;
}

推荐W3Cschool上的的Flexbox布局基础入门 ,可以更好的帮你掌握Flex。

grid布局

Grid 布局,是一个基于网格的二维布局系统,目的是用来优化用户界面设计。

//html部分同上
.parent {
    display:grid;
    grid-template-columns:auto 1fr;
    grid-gap:20px
} 

对齐(Alignment)

大多数人都会把对齐(Alignment)当作 Flexbox 的一部分,但是这些属性适用于所有布局方法值得在这种情况下理解它们,而不是考虑“ Flexbox Alignment”或“ Flexbox Alignment” “ CSS网格对齐。” 我们有一组Alignment属性,它们在可能的情况下可以以一种通用的方式工作。然后,由于不同的布局方法的行为方式,它们会有一些差异。

尺寸(Sizing)

在 web 上,我们习惯用长度或百分比来设置尺寸,这就是我们如何使用浮动来制作网格类型布局的方法。然而,现代的布局方法可以为我们做很多空间分配——如果我们允许的话。值得花时间去了解 Flexbox 如何分配空间(或 Grid fr 单元如何工作)。

响应式设计(Responsive Design)

通常,新的 Grid 和 Flexbox 布局方法意味着我们可以使用比旧方法更少的媒体查询,因为它们非常灵活,可以响应视口或组件大小的变化,而无需我们更改元素的宽度。 但是,有些地方需要添加一些断点来进一步增强设计。

字体和排版

与布局一样,网络上的字体使用在发生了巨大的变化。现在,可变字体,使单个字体文件具有无限的变化。 要了解它们是什么以及它们如何工作,请观看Mandy Michael的精彩简短演讲:可变字体和网页设计的未来。 另外,我会推荐Jason Pamental动态排版与现代CSS和可变字体

为了探索可变字体和它们的功能,微软提供了一个有趣的演示,以及一些尝试可变字体的游乐场 – Axis Praxis是最知名的(我也喜欢字体游乐场)。

MDN上的指南将证明一开始使用可变字体是非常有用的。要了解如何为不支持可变字体的浏览器实现回退解决方案,请阅读 Oliver Schondorfer的《使用回退Web字体实现可变字体Firefox DevTools字体编辑器还支持使用可变字体。

变形和动画

CSS转换和动画绝对是我需要知道的基础。 我不经常需要使用它们,在使用时会忘记语法。 值得庆幸的是,MDN上的参考资料帮助了我,我建议从使用CSS变换和使用CSS3动画的指南开始。 Zell Liew也有一篇很好的文章,为CSS过渡提供了很好的解释。

要发现一些可能的事情,请查看Animista网站。

关于动画可能令人困惑的事情之一是采取哪种方法。 除了 CSS 支持的内容之外,你可能还需要涉及 JavaScript SVG 或 Web Animation API,而这些事情往往都会被混为一谈。 在她的演讲中,选择你的动画冒险记录在事件中,Val Head解释了这些选项。

使用参考手册

在使用 Grid 或 Flexbox 很多人会很依赖w3cschool上的CSS参考手册 ,如果没有参考手册就没法工作。这是没有问题的,前面我们也提到可以合理的利用参考手册来提升开发效率,但是前提是得先理解透原理。否则我们在复制语法时,可能会忽略为什么要这样写。然后,当遇到该属性似乎表现不同的情况时,这种明显的不一致会令人困惑找不出问题出在哪。

CSS 是一门经过多年进化的语言,一直在更新,如果是把自己当成学习者的心态来学习的话,永远也是学不完的。然而,一旦你把基础知识及底层原理打牢了以后,你就可以很轻松的面对各种变化了。如果要系统的学习前端推荐学习W3Cschool上的从0基础到前端开发 课程。

以上就是编程狮为你整理的关于web前端开发初学者如何科学的快速学会CSS?的全部内容,希望给对css望而生畏初学者有所帮助,如果你有更好的学习方法欢迎分享~

联系我们