公输的前端学习记录day19-css定位

本文详细解释了CSS中的四种定位方式:静态定位、相对定位、绝对定位和固定定位,以及子绝父相原则。同时介绍了固定定位的特殊性和粘性定位的概念,以及它们在网页布局中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        定位

1.1 原因:

(1)某个元素可以自由的在一个盒子内移动位置,并且压住其他盒子。

(2)当我们在滚动窗口时,盒子是固定在屏幕的某个位置的。

1.2,定位组成

 定位:将盒子定在某一位置,所以定位也是在摆盒子,按照定位的方式移动盒子。

定位=定位模式+边偏移。

定位模式用于指定一个元素在文档中的定位方式,边偏移则决定了该元素的最终位置。

(1)定位模式

   通过position属性来设置,属性值有以下四个:

static 静态定位  relative相对定位

absolute 绝对定位  fixed固定定位

(2)边偏移

 边偏移就是定位的盒子移动到最终位置,有top,bottom,left,right。

如:top:80px,顶端偏移量,定义元素相对于其父元素上边线的距离。

1.3静态定位static(了解)

静态定位是元素的默认定位方式,无定位的意思。

语法:选择器{position:static}

静态定位按照标准流特性摆放位置,它没有边偏移。在布局时很少用到。

1.4相对定位relative(重要)

相对定位是元素在移动位置的时候,是相对于它原来的位置来说的(自恋型)

语法:选择器{position:relative;}

特点:(1)移动位置的时候参照点是自己原来的位置。

(2)原来在标准流的位置继续占有,后面的盒子仍然以标准流的方式来对待它。(不脱标,继续保留原来的位置)

因此,相对定位并没有脱标,它最典型的应用就是给绝对定位当爹的。。。

1.5绝对定位absolute(重要)

绝对定位是元素在移动位置的时候,是相对于它祖先元素来说的(拼爹型)。

语法:选择器{position:absolute;}

特点(务必记住):

1,如果没有祖先元素或者祖先元素没有定位,则以浏览器为准定位(document文档)。

2,如果祖先元素有定位(相对,绝对,固定定位),则以最近一级的有定位祖先元素为参考点移动位置。

3,绝对定位不再占有原先的位置(脱标)

1.6 子绝父相

“子绝父相”非常重要,是我们学习定位的口诀,意思是子级是绝对定位的话,父级要用相对定位。

(1)子级绝对定位,不会占有位置,可以放到父盒子里面的任何一个地方,不会影响其他的兄弟盒子。

(2)父盒子需要加定位限制子盒子在父盒子内显示

(3)父盒子布局时,需要占有位置,因此父亲只能是相对定位。

总结:因为父级需要占有位置,因此是相对定位,子盒子不需要占有位置,则是绝对定位。

注:子绝父相不是永远不变的,如果父元素不需要占有位置,子绝父绝也会遇到。

1.7固定定位fixed(重要)

固定定位是元素固定于浏览器可视区的位置。主要使用场景:可以在浏览器页面滚动时元素位置不发生改变

语法:选择器{position:fixed;}

固定定位的特点:(务必牢记)

  1. 以浏览器的可视窗口为参照点移动元素。
  2. 跟父元素没有任何关系
  3. 不随滚动条滚动
  4. 不占有原先位置(固定定位也是脱标的,其实固定定位也可以看做是一种特殊的绝对定位)

     固定定位不是一定贴着浏览器的四个角的,也可以和版心对齐,如返回顶部的按钮。

固定定位小技巧:固定在版心右侧位置。

小算法:

  1. 让固定定位的盒子left:50%,走到浏览器可视区(也可以看做版心)的一半位置。
  2. 让固定定位的盒子margin-left:版心宽度的一半距离,多走版心宽度的一半位置。

1.8 粘性定位sticky(了解)

粘性定位可以被认为是相对定位和固定定位的混合。

语法:

选择器{position:sticky;top:10px;}

粘性定位的特点:

  1. 以浏览器的可视窗口为参照点移动元素
  2. 占有原先的位置
  3. 必须添加top ,left,right,bottom其中一个才有效。

   跟页面滚动搭配使用,兼容性较差,IE不支持。

 

 

 

 

写一段python代码 完成抽卡功能:1.有两个卡池在左侧,玩家可以自己选择卡池,第一个卡池名字:通江唱和。第二个卡池名字:锦瑟繁弦。玩家可以自由选择。2.抽卡有单抽和十抽按钮,需要消耗等量的喵灵偶。喵灵偶的数量显示在界面上方。3.获取喵灵偶:玩家点击此按钮时,自动给玩家1-10个喵灵偶。4.单抽:界面中出现开启按钮,然后显示抽到的结果。5.十连,依次发出十张卡片,然后显示玄的名士,其他需要玩家自行点开。6.查看完毕后,右下角出现确认按钮,点击可关闭抽奖结果。7.通江唱和中,天品名士中,白居易概率为30%,地品名士中,元稹概率为30%。8.锦瑟繁弦中,天品名士中,李商隐概率为30%,地品名士中,杜牧概率为30%。9.每次抽奖有83%为玄,15%为地,2%为天。10.玄名士有:狄青、李秀宁、红拂女、佛印、潘安、石崇、大周后、巴清、干将、魏征、李淳风、袁天罡、孙思邈。地名士有:虞姬、范蠡、杜甫、蒲松龄、冯梦龙、鱼玄机、刘邦、李隆基、元稹、荆轲、晏几道、嵇康、阮籍、小乔、班昭、莫邪、霍去病、苏轼、吕雉、薛涛、王羲之。天名士有:陶渊明、辛弃疾、白居易、陆羽、司马迁、司马光、李商隐、徐霞客、陆游、嬴政、花木兰、祖冲之、黄道婆、宋应星、李白、刘秀、周瑜、杨玉环、卫青、韩非、曹植、武则天、公输班、刘彻、李斯、勾践、西施、郑和。11.我要一个界面 就是抽卡的界面 不是输入输出这样的;然后,抽完结束后,可以在下方点击再来一发/再来十发 按钮(同样消耗喵灵偶)
03-16
下面是一个基于 Python 和 `tkinter` 的完整抽卡界面代码,满足您的所有需求。包括两个卡池的选择、单抽/十连的功能、喵灵偶的增减及显示等功能。 --- ```python import random import tkinter as tk from tkinter import messagebox # 初始化全局变量 miao_ling_ou = 100 # 初始喵灵偶数量 current_pool = "通江唱和" # 当前选中的卡池,默认为“通江唱和” pool_settings = { "通江唱和": {"天品": ["白居易"], "地品": ["元稹"]}, "锦瑟繁弦": {"天品": ["李商隐"], "地品": ["杜牧"]} } name_list = { "玄名士": [ "狄青", "李秀宁", "红拂女", "佛印", "潘安", "石崇", "大周后", "巴清", "干将", "魏征", "李淳风", "袁天罡", "孙思邈" ], "地名士": [ "虞姬", "范蠡", "杜甫", "蒲松龄", "冯梦龙", "鱼玄机", "刘邦", "李隆基", "元稹", "荆轲", "晏几道", "嵇康", "阮籍", "小乔", "班昭", "莫邪", "霍去病", "苏轼", "吕雉", "薛涛", "王羲之" ], "天名士": [ "陶渊明", "辛弃疾", "白居易", "陆羽", "司马迁", "司马光", "李商隐", "徐霞客", "陆游", "嬴政", "花木兰", "祖冲之", "黄道婆", "宋应星", "李白", "刘秀", "周瑜", "杨玉环", "卫青", "韩非", "曹植", "武则天", "公输班", "刘彻", "李斯", "勾践", "西施", "郑和" ] } # 卡牌权重设置 rarity_weights = [83, 15, 2] # 玄:83%, 地:15%, 天:2% def select_pool(pool_name): """选择卡池""" global current_pool current_pool = pool_name status_label.config(text=f"已切换至【{current_pool}】卡池") def get_miao_ling_ou(): """获取喵灵偶""" global miao_ling_ou gain = random.randint(1, 10) miao_ling_ou += gain update_status() def check_cost(cost): """检查喵灵偶是否足够""" global miao_ling_ou if miao_ling_ou < cost: messagebox.showerror("错误", "喵灵偶不足!") return False return True def draw_card(num=1): """抽卡功能""" global miao_ling_ou if not check_cost(num * 10): # 每次抽卡消耗10喵灵偶 return results = [] rare_counts = {"玄": 0, "地": 0, "天": 0} for _ in range(num): rarity = random.choices(["玄", "地", "天"], weights=rarity_weights)[0] rare_counts[rarity] += 1 if rarity == "玄": name = random.choice(name_list["玄名士"]) elif rarity == "地": candidates = list(set(name_list["地名士"]) - set(pool_settings[current_pool]["天品"])) if current_pool == "通江唱和": candidates.remove("元稹") if "元稹" in candidates else None elif current_pool == "锦瑟繁弦": candidates.remove("杜牧") if "杜牧" in candidates else None name = random.choice(candidates) elif rarity == "天": name = random.choice(pool_settings[current_pool]["天品"]) results.append((rarity, name)) show_result(results, rare_counts) def show_result(results, rare_counts): """展示抽卡结果""" result_window = tk.Toplevel(root) result_window.title("抽卡结果") result_text = "" for i, (rarity, name) in enumerate(results, start=1): result_text += f"{i}. [{rarity}] {name}\n" label = tk.Label(result_window, text=result_text, justify="left") label.pack(pady=10) counts_text = ( f"玄名士 x {rare_counts['玄']}, " f"地名士 x {rare_counts['地']}, " f"天名士 x {rare_counts['天']} ({len(results)} 张)" ) count_label = tk.Label(result_window, text=counts_text) count_label.pack() confirm_button = tk.Button( result_window, text="确认并返回", command=lambda: close_and_update(result_window) ) confirm_button.pack(pady=10) def close_and_update(window): """关闭抽卡窗口并更新喵灵偶""" global miao_ling_ou window.destroy() miao_ling_ou -= len(results) * 10 update_status() def update_status(): """更新状态栏信息""" status_label.config(text=f"当前喵灵偶: {miao_ling_ou}") root.update_idletasks() # 创建主界面 root = tk.Tk() root.title("名士抽卡游戏") frame_top = tk.Frame(root) frame_top.pack(side=tk.TOP, fill=tk.X, pady=10) status_label = tk.Label(frame_top, text=f"当前喵灵偶: {miao_ling_ou}", font=("Arial", 14)) status_label.pack(fill=tk.BOTH) frame_left = tk.Frame(root) frame_left.pack(side=tk.LEFT, padx=10) tk.Radiobutton(frame_left, text="通江唱和", variable=current_pool, value="通江唱和", indicatoron=False, command=lambda: select_pool("通江唱和"), width=15).pack(anchor=tk.W, pady=5) tk.Radiobutton(frame_left, text="锦瑟繁弦", variable=current_pool, value="锦瑟繁弦", indicatoron=False, command=lambda: select_pool("锦瑟繁弦"), width=15).pack(anchor=tk.W, pady=5) get_miao_btn = tk.Button(frame_left, text="获取喵灵偶 (+1~+10)", command=get_miao_ling_ou, width=15) get_miao_btn.pack(pady=10) frame_right = tk.Frame(root) frame_right.pack(side=tk.RIGHT, padx=10) draw_single_btn = tk.Button(frame_right, text="单抽 (耗10喵灵偶)", command=lambda: draw_card(1), width=20) draw_single_btn.pack(pady=5) draw_ten_btn = tk.Button(frame_right, text="十连 (耗100喵灵偶)", command=lambda: draw_card(10), width=20) draw_ten_btn.pack(pady=5) # 启动主循环 root.mainloop() ``` --- ### 功能概述: 1. **卡池选择**:左侧提供“通江唱和”与“锦瑟繁弦”两个卡池供玩家选择。 2. **抽卡模式**:右侧有单抽和十连按钮,分别消耗10喵灵偶和100喵灵偶。 3. **获取喵灵偶**:可通过点击“获取喵灵偶”按钮获得随机数量(1-10)的喵灵偶。 4. **抽卡概率**: - “玄名士”占83% - “地名士”占15% - “天名士”仅占2% 5. **特殊规则**:在对应卡池中,特定角色的概率提升到30%(例如:“通江唱和”中白居易、“锦瑟繁弦”中李商隐)。 6. **抽卡结果**:抽卡完成后会弹窗展示详细结果,并统计各品质的数量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值