博客zhu虎康
"">博客zhu虎康
"text">
"text" disabled>
:first-child
选择某个元素的第一个子元素:last-child
选择某个元素的最后一个子元素:nth-child()
选择谋和元素的一个或多个特定的子元素:nth-last-child()
选择某个元素的一个或多个特定的子元素,从这个元素的最后一个子元素开始算:nth-of-type()
选择指定的元素:nth-last-of-type()
选择指定的元素,从元素的最后一个开始计算:first-of-type
选择一个上级元素下的第一个同类子元素:last-of-type
选择一个上级元素的最后一个同类子元素:first-letter
将特殊的样式添加到文本的首字母:first-line
将特殊的样式添加到文本的首行:before
在某元素之前插入某些内容:after
在某元素之后插入某些内容
"dialog">
Everyone, I'm 博客zhu虎康!
"dialog">
Everyone, I'm 博客zhu虎康!
♥
画太极阴阳图
animation: mymove 2s infinite alternate;
"utf-8">
@keyframes关键帧
"rect">
Loading动画
```css
字体设置
发光字体
Apple Style
3D 字体效果
text-overflow:ellipsis;
-webkit-text-overflow:ellipsis;
overflow: hidden;
white-space: nowrap;
text-overflow解决文字排版问题
这里放置字体,这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体这里放置字体
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>浮动布局+定位布局title>
head>
<body>
<div class="father">
<div class="nav">div>
<div>
<div class="div1 lfMove">div>
<div class="div2 lfMove">div>
<div class="div3 lfMove">div>
div>
<div style="float:right">
<div class="div4">div>
<div class="div5">div>
<div class="div6">div>
div>
div>
<style type="text/css">
.father{
width: 100%;
height: 1000px;
position: relative;
background-color: #bfbfbf;
padding: 0;
margin: 0;
}
.nav{
width: 100%;
height: 80px;
top: 0;
position: sticky;
background-color: #592c86;
}
.lfMove{
float: left;
width: 200px;
height: 300px;
margin: 10px;
}
.div1{
background-color: orangered;
}
.div2{
background-color: lawngreen;
}
.div3{
background-color: skyblue;
}
.div4{
width: 400px;
height: 100px;
background-color: orangered;
margin: 10px;
}
.div5{
width: 100px;
height: 300px;
background-color: orange;
margin: 10px;
float: left;
}
.div6{
width: 100px;
height: 300px;
background-color: palegreen;
float: right;
margin: 10px;
}
style>
body>
html>
定位布局position,一般设置为子绝父相
什么是grid布局?
Flex 布局是轴线布局,只能指定“项目”针对轴线的位置,可以看作是
一维布局
,Grid布局则是将容器划分成行和列,产生单元格,然后指定“项目所在”的单元格,可以看作是二维布局,Grid布局远比Flex布局强大
left
top
button
right
因此:
1. 如果是PC端页面布局,我们还是传统布局
2. 如果是移动端或者不考虑兼容性问题的PC端页面布局,我们还是使用flex弹性布局
flex 是 flexible Box 的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为flex布局
即通过给父盒子添加flex属性,来控制子盒子的位置盒排列方式
先给父级 display:flex;
flex布局子项常见属性
1
2
3
top
表示在页面不同大小时展现的效果不同
min-device-width
:移动端设备宽度min-width
:PC端网页宽度@media screen and (min-device-width:100px) and (max-device-width:300px){}
cursor: pointer;
div
一直位于底部:position:fixed;bottom:0;
给body加上一个min-width最小宽度,以px为单位,这样当页面变小时,当达到你所设置的最小宽度,body的宽度不再改变,超出的部分会用横向滚动条显示,其内所有元素的布局也不会受影响。
使用百分比设置宽度,所有会在页面变化后布局改变的元素的宽度都设置成百分比宽度,这样在缩放时,页面内的各个元素也会跟着缩放,宽度占比不变,当然前提是设置CSS样式前,先给body和html这两个元素设置宽度为100%,避免后面出错。
justify-content
属性:项目位于各行之间留有空白的容器内:display: flex; justify-content: space-between;
项目位于各行之前、之间、之后都留有空白的容器内:display: flex; justify-content: space-around;
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>块元素绝对居中title>
<style>
html,body,table{
margin:0;
height:100%;
}
table{
width:100%;
}
#box{
width:300px;
height:300px;
background:teal;
margin:auto;
}
style>
head>
<body>
<table>
<tr>
<td>
<div id="box">div>
td>
tr>
table>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>块元素绝对居中title>
<style>
*{
margin:0;
}
#box{
width:300px;
height:300px;
background:maroon;
position:absolute;
left:50%;
top:50%;
transform:translate(-50%,-50%);
}
style>
head>
<body>
<div id="box">div>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>块元素绝对居中title>
<style>
*{
margin:0;
}
#box{
width:300px;
height:300px;
background:silver;
position:absolute;
left:50%;
top:50%;
margin-left:-150px;
margin-top:-150px;
}
style>
head>
<body>
<div id="box">div>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>块元素绝对居中title>
<style>
*{
margin:0;
}
#box{
width:300px;
height:300px;
background:pink;
position:absolute;
left:0;
right:0;
top:0;
bottom:0;
margin:auto;
}
style>
head>
<body>
<div id="box">div>
body>
html>
background-color: transparent;
input{{
outline: none;
}
input:focus{
outline: none;
}
input::-webkit-input-placeholder{
color: #FFFFFF;
}
opacity: 0;
box-shadow:0 15px 35px rgba(0,0,0,0.1);
display: inline-block;
vertical-align: middle;
#body1{
width: 100%;
/*把行高和div高度设置成一样的,是因为 vertical-align 是相对于line-heigjt设置的*/
height: 300px;
line-height: 300px;
background-color: aqua;
/*水平居中*/
text-align: center;
}
.switch{
/*对于vertical-align来说对行内元素起作用*/
display: inline-block;
vertical-align: middle;
width: 80%;
height: 274px;
background-color: dodgerblue;
}
行内元素,父元素设置:
div{
height:60px
line-height:60px;
text-align: center;
}
块级元素,已知宽度
div {
width:100px;
margin:0 auto;
}
块级元素,未知宽度-- flex/定位,
flex布局
div{
display: flex;
justify-content: center;
align-items: center;
}
绝对定位
div{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}
flex: 1:的使用:https://www.cnblogs.com/zhuhukang/p/15717197.html
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
li
标签的快捷键 ul>li{消息$}*4
<ul>
<li>消息1</li>
<li>消息2</li>
<li>消息3</li>
<li>消息4</li>
</ul>
css中position相对定位和绝对定位:https://www.cnblogs.com/yy95/p/5672440.html
position 属性的四个值:
默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。
生成相对定位的元素,通过top,bottom,left,right的设置相对于其正常(原先本身)位置进行定位。可通过z-index进行层次分级。 无论父级存在不存在,无论有没有TRBL,均是以父级的左上角进行定位,但是父级的Padding属性会对其影响。
定位为relative的元素脱离正常的文本流中,但其在文本流中的位置依然存在。
他是默认参照父级的原始点为原始点,无父级则以文本流的顺序在上一个元素的底部为原始点,配合TRBL进行定位,当父级内有padding等CSS属性时,当前级的原始点则参照父级内容区的原始点进行定位,有以下属性:
以上三点可以总结出,无论父级存在不存在,无论有没有TRBL,均是以父级的左上角进行定位,但是父级的Padding属性会对其影响。
综合上面对relative的叙述,我们就可以将position属性为relative的DIV视成可以用TRBL进行定位的的普通DIV,或者说 只要将我们平时布局页面的div的CSS属性中加上position:relative后,就不只是用float布局页面了,还可以用TRBL进行布局页 面 了,或者说加上position:relative的DIV也可以像普通的DIV进行布局页面了,只不过还可以用TRBL进行布局页面。但是 position属性为absolute不可以用来布局页面,因为如果用来布局的话,所有的DIV都相对于浏览器的左上角定位了,所以只能用于将某个元素 定位于属性为absolute的元素的内部某个位置。
Top的值表示对象相对原位置向下偏移的距离,bottom的值表示对象相对原位置向上偏移的距离,两者同时存在时,只有Top起作用。left的值表示对象相对原位置向右偏移的距离,right的值表示对象相对原位置向左偏移的距离,两者同时存在时,只有left起作用。
生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。可通过z-index进行层次分级。
定位为absolute的层脱离正常文本流,但与relative的区别是其在正常流中的位置不再存在。
这个属性总是有人给出误导。说当position属性设为absolute后,总是按照浏览器窗口来进行定位的,这其实是错误的。实际上,这是fixed属性的特点。
以上三点可以总结出,若想把一个定位属性为absolute的元素定位于其父级元素内,只有满足两个条件:
第一:设定TRBL
第二:父级设定Position属性
上面的这个总结非常重要,可以保证你在用absolue布局页面的时候,不会错位,并且随着浏览器的大小或者显示器分辨率的大小,而不发生改变。
只要有一点不满足,元素就会以浏览器左上角为原点,这就是初学者容易犯错的一点,已经定位好的板块,当浏览器的大小改变,父级元素会随之改变,但是设 定Position属性为absolute的板块和父级元素的位置发生改变,错位了,这就是因为此时元素以浏览器的右上角为原点的原因。
若想定位到父级板块中,并且当浏览器的大小改变或显示器的分辨率改变,布局不发生改变,是需要满足两个条件的,只要有一点不满足,元素就会以浏览器左上角为原点,从而导致页面布局错位。
Top的值表示对象上边框与浏览器窗口顶部的距离,bottom的值表示对象下边框与浏览器窗口底部的距离,两者同时存在时,只有Top起作用;如果两者都未指定,则其顶端将与原文档流位置一致,即垂直保持位置不变。left的值表示对象左边框与浏览器窗口左边的距离,right的值表示对象右边框与浏览器窗口右边的距离,两者同时存在时,只有left起作用;如果两者都未指定,则其左边将与原文档流位置一致,即水平保持位置不变。
在Position属性值为absolute的同时,如果有一级父对象(无论是父对象还是祖父对象,或者再高的辈分,一样)的Position属性值为Relative时,则上述的相对浏览器窗口定位将会变成相对父对象定位,这对精确定位是很有帮助的。
生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。可通过z-index进行层次分级。
6. 使用static 定位或无position定位的元素z-index属性是无效的
只有三种情况会使得元素脱离文档流,分别是:浮动绝对定位和相对定位。
文档流是将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素
实现效果如下:在滑动滚动条的时候,对表头“购物街”进行定位,不让它随着滚动而消失
实现思路代码:
padding-top
,为了防止top脱离文档流#home{
padding-top:44px;
.nav{
position:fixed;
left:0;
right:0;
top:0;
z-index:0;
可以使用定位实现:对大的父级设置relative相对定位,对小的子级设置absolute绝对定位
.native
使用封装返回顶部的组件.native
- 对组件的监听事件@click.native="backClick"
,执行对原生组件的根元素的监听src/components/content/backTop/BackTop.vue
<template>
<div class="back-top">
<img src="~assets/img/common/top.png" alt="">
</div>
</template>
<script>
export default {
name: "BackTop"
}
</script>
<style scoped>
.back-top {
position: fixed;
right: 8px;
bottom: 55px;
}
.back-top img {
width: 43px;
height: 43px;
}
</style>
src/components/common/scroll/Scroll.vue
<template>
<div class="wrapper" ref="wrapper">
<div class="content">
<slot></slot>
</div>
</div>
</template>
<script>
import BScroll from 'better-scroll'
export default {
name: "Scroll",
props: {
probeType: {
type: Number,
default: 0
},
pullUpLoad: {
type: Boolean,
default: false
}
},
data() {
return {
scroll: null,
message: '哈哈哈'
}
},
mounted() {
// 1.创建BScroll对象
this.scroll = new BScroll(this.$refs.wrapper, {
click: true,
probeType: this.probeType,
pullUpLoad: this.pullUpLoad
})
// 2.监听滚动的位置
if (this.probeType === 2 || this.probeType === 3) {
this.scroll.on('scroll', (position) => {
// console.log(position);
this.$emit('scroll', position)
})
}
// 3.监听scroll滚动到底部
if (this.pullUpLoad) {
this.scroll.on('pullingUp', () => {
this.$emit('pullingUp')
})
}
},
methods: {
scrollTo(x, y, time=300) {
this.scroll && this.scroll.scrollTo(x, y, time)
},
refresh() {
this.scroll && this.scroll.refresh()
},
finishPullUp() {
this.scroll && this.scroll.finishPullUp()
},
getScrollY() {
return this.scroll ? this.scroll.y : 0
}
}
}
</script>
<style scoped>
</style>
src/views/home/Home.vue
<template>
<div id="home" class="wrapper">
<nav-bar class="home-nav"><div slot="center">购物街</div></nav-bar>
<tab-control :titles="['流行', '新款', '精选']"
@tabClick="tabClick"
ref="tabControl1"
class="tab-control" v-show="isTabFixed"/>
<scroll class="content"
ref="scroll"
:probe-type="3"
@scroll="contentScroll"
:pull-up-load="true"
@pullingUp="loadMore">
<home-swiper :banners="banners" @swiperImageLoad="swiperImageLoad"/>
<recommend-view :recommends="recommends"/>
<feature-view/>
<tab-control :titles="['流行', '新款', '精选']"
@tabClick="tabClick"
ref="tabControl2"/>
<good-list :goods="showGoods"/>
</scroll>
<back-top @click.native="backClick" v-show="isShowBackTop"/>
</div>
</template>
<script>
import HomeSwiper from './childComps/HomeSwiper'
import RecommendView from './childComps/RecommendView'
import FeatureView from './childComps/FeatureView'
import NavBar from 'components/common/navbar/NavBar'
import TabControl from 'components/content/tabControl/TabControl'
import GoodList from 'components/content/goods/GoodsList'
import Scroll from 'components/common/scroll/Scroll'
import BackTop from 'components/content/backTop/BackTop'
import { getHomeMultidata, getHomeGoods } from "network/home"
import {debounce} from "common/utils";
export default {
name: "Home",
components: {
HomeSwiper,
RecommendView,
FeatureView,
NavBar,
TabControl,
GoodList,
Scroll,
BackTop
},
data() {
return {
banners: [],
recommends: [],
goods: {
'pop': {page: 0, list: []},
'new': {page: 0, list: []},
'sell': {page: 0, list: []},
},
currentType: 'pop',
isShowBackTop: false,
tabOffsetTop: 0,
isTabFixed: false,
saveY: 0
}
},
computed: {
showGoods() {
return this.goods[this.currentType].list
}
},
destroyed() {
console.log('home destroyed');
},
activated() {
this.$refs.scroll.scrollTo(0, this.saveY, 0)
this.$refs.scroll.refresh()
},
deactivated() {
this.saveY = this.$refs.scroll.getScrollY()
},
created() {
// 1.请求多个数据
this.getHomeMultidata()
// 2.请求商品数据
this.getHomeGoods('pop')
this.getHomeGoods('new')
this.getHomeGoods('sell')
},
mounted() {
// 1.图片加载完成的事件监听
const refresh = debounce(this.$refs.scroll.refresh, 50)
this.$bus.$on('itemImageLoad', () => {
refresh()
})
},
methods: {
/**
* 事件监听相关的方法
*/
tabClick(index) {
switch (index) {
case 0:
this.currentType = 'pop'
break
case 1:
this.currentType = 'new'
break
case 2:
this.currentType = 'sell'
break
}
this.$refs.tabControl1.currentIndex = index;
this.$refs.tabControl2.currentIndex = index;
},
backClick() {
/*返回顶部*/
this.$refs.scroll.scrollTo(0, 0)
},
/*该方法是判断滑动的时候是否显示返回顶部的按钮*/
contentScroll(position) {
// 1.判断BackTop是否显示,加负号是为了让其转为正数
this.isShowBackTop = (-position.y) > 1000
// 2.决定tabControl是否吸顶(position: fixed)
this.isTabFixed = (-position.y) > this.tabOffsetTop
},
loadMore() {
this.getHomeGoods(this.currentType)
},
swiperImageLoad() {
this.tabOffsetTop = this.$refs.tabControl2.$el.offsetTop;
},
/**
* 网络请求相关的方法
*/
getHomeMultidata() {
getHomeMultidata().then(res => {
this.banners = res.data.banner.list;
this.recommends = res.data.recommend.list;
})
},
getHomeGoods(type) {
const page = this.goods[type].page + 1
getHomeGoods(type, page).then(res => {
this.goods[type].list.push(...res.data.list)
this.goods[type].page += 1
// 完成上拉加载更多
this.$refs.scroll.finishPullUp()
})
}
}
}
</script>
<!--scoped 表示局部作用域,代表此处的css只在当前文件中起效果
-->
<style scoped>
#home {
/*padding-top: 44px;*/
height: 100vh; /*vh 表示viewport height视口高度*/
position: relative;
}
.home-nav {
background-color: var(--color-tint);
color: #fff;
/*在使用浏览器原生滚动时, 为了让导航不跟随一起滚动*/
/*position: fixed;*/
/*left: 0;*/
/*right: 0;*/
/*top: 0;*/
/*z-index: 9;*/
}
.content {
overflow: hidden;
position: absolute;
top: 44px;
bottom: 49px;
left: 0;
right: 0;
}
.tab-control {
position: relative;
z-index: 9;
}
/*.content {*/
/*height: calc(100% - 93px);*/
/*overflow: hidden;*/
/*margin-top: 44px;*/
/*}*/
</style>
img.onload = function(){}
@load='方法'
,this.$bus.$emit('时间名称','参数')
this.$bus.$on('事件名称',回调函数(参数))
body{
background: url("image.png") no-repeat;
height:100%;
width:100%;
overflow: hidden;
background-size:cover;或者background-size:100%,100%;
}
如果你插入的图片是通过标签的方式来插入的话,可以通过自身的属性控制图片大小,代码格式如下。
https://blog.csdn.net/qq_53810245/article/details/122402152
https://blog.csdn.net/qq_53810245/article/details/122340603
https://blog.csdn.net/qq_53810245/article/details/122505746
实现方法如下:在 input 框前放一个 label ,并注明为input中的id服务
<form action="">
<label for="demo">账号:</label>
<input type="text" id="demo">
</form>
width:100%