精华内容
下载资源
问答
  • 发现图案工具组中的仿制图章工具与图案图章工具一样的,都取样,再复制, 区别在使用仿制图章工具时,好像只能同步复制一点,而图案图章工具可以复制很多, 这就是它们的区别吗?
  • 不对齐的情况下单击左键仿制仿制不会移动的 而对齐的情况下仿制随着位置的移动而移动! 同时,要注意:输入法的大小写切换也会有影响 2. 在需要仿制的地方:ALT+单击,即可完成取样。 每一次涂抹...
    1.
    
    
    不对齐的情况下单击左键仿制,仿制点是不会移动的
    而对齐的情况下仿制点是随着位置的移动而移动!
    同时,要注意:输入法的大小写切换也会有影响
    2.
    在需要仿制的地方:ALT+单击,即可完成取样。
    
    
    每一次涂抹后,如果鼠标松开的话,下一次要重新取样。
    
    
    字体的颜色默认是使用:前景色进行渲染的。
    展开全文
  • 仿制QQ

    2016-10-26 13:46:50
    为了减少心中的“寂寞空虚冷”,加上没有什么实际的项目来练手,便想到做一些小Demo来自我验收一下学习成果,Demo的功能就仿制于各大主流App。至于如何仿制、与原版的区别、UI设计的重要性,且看下文详情分解! :)...

    前言

    最近结束了一个阶段的学习,有点空空荡荡的感觉。为了减少心中的“寂寞空虚冷”,加上没有什么实际的项目来练手,便想到做一些小Demo来自我验收一下学习成果,Demo的功能就仿制于各大主流App。至于如何仿制、与原版的区别、UI设计的重要性,且看下文详情分解! :)

    迷惘总有时

    最初是看到酷狗音乐的一些界面效果很有意思,就是这个:

    这里写图片描述

    点击右边的按钮会动态插入一个视图,正如这样:

    这里写图片描述

    就想着自己也来捣鼓捣鼓,看能不能实现出这样的功能!

    实践1

    当点击按钮时,动态插入一个视图。循着这个思路,浏览了一遍UITableView的方法,下面的方法可能是我想要的:

    - (void)beginUpdates;   // allow multiple insert/delete of rows and sections to be animated simultaneously. 
    
    - (void)endUpdates;     // only call insert/delete/reload calls or change the editing state inside an update block.  otherwise things like row count, etc. may be invalid.
    
    - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
    - (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
    
    - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
    - (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:
    
    - (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection NS_AVAILABLE_IOS(5_0);
    - (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0);

    上述方法在表视图的编辑模式下经常被使用到,但是它们仅能在已有的视图中增加、删除、移动。例如QQ的分组管理视图中,移动分组和删除分组是在原有的视图基础上进行操作。在添加分组时,通过模态视图输入组名,然后刷新表视图的数据源,达到新增分组的目的。显然,此处场景不能应用此方法。

    实践2

    在实践1上一番折腾无果后,就向学长请假了这个问题,他给出了他的解决方法——最开始将每个分组的cell数量设为0,当点击每个分组的headerView时,刷新数据并将cell正常设置为数据源所提供的数量。看了他给出的Demo,发现也正是基于这个巧妙的设计,在最开始进入QQ好友管理列表视图时所有的分组就都是“关闭”的。同时在酷狗音乐中,你的“已下载(XXX)”是无法像“正在下载(XXX)”“折叠”成一个组的。鉴于道理的相通性,笔者在恍然大悟之后就转身投入到仿制QQ的怀抱中了。

    水是由水分子组成的

    为了构建这个界面:

    这里写图片描述

    我们需要一些假数据,包括分组信息、好友信息等。为此笔者设计了groups.plist这个文件,它长成这样:

    这里写图片描述

    当然,还得有一些图片资源充当好友头像之类的。

    接下来,我们就需要从假数据的文件中读取数据并且创建数据实体。根据数据之间的相互依赖关系,笔者构建了DataSourceFriendFriendsGroups,下面是它们的一些关键代码:

    //DataSource.h
    + (NSArray *)dataStore;
    
    //DataSource.m
    + (NSArray *)dataStore {
        NSArray *groupsData = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"groups" ofType:@"plist"]];
    
        return groupsData;
    }
    
    //FriendsGroups.h
    @property (nonatomic, strong, readonly) NSArray *friends;
    
    @property (nonatomic, copy, readonly) NSString *groupName;
    
    @property (nonatomic, assign, readonly) NSNumber *totalPersonCount;
    @property (nonatomic, assign, readonly) NSNumber *onlinePersonCount;
    
    @property (nonatomic, assign, getter=isOpened) BOOL open;
    
    - (instancetype)initWithGroupsMsg:(NSDictionary *)msg;
    
    //FriendsGroups.m
    @synthesize friends = _friends; // because of readonly
    
    #pragma mark - Initializer
    
    - (instancetype)initWithGroupsMsg:(NSDictionary *)msg {
        self = [super init];
        if (self) {
            [self setValuesForKeysWithDictionary:msg]; // KVC
    
            NSMutableArray *friends = [NSMutableArray array];
            for (NSDictionary *friendMsg in self.friends) {
                Friend *friend = [[Friend alloc] initWithFriendMsg:friendMsg];
                [friends addObject:friend];
            }
    
            _friends = friends;
        }
    
        return self;
    }
    
    //Friend.h
    @property (nonatomic, copy, readonly) NSString *iconName;
    @property (nonatomic, copy, readonly) NSString *nickName;
    @property (nonatomic, copy, readonly) NSString *intro;
    
    @property (nonatomic, strong, readonly) NSArray *chatLog;
    
    @property (nonatomic, assign, readonly, getter=isVip) BOOL vip;
    @property (nonatomic, assign, readonly, getter=isOnline) BOOL online;
    
    - (instancetype)initWithFriendMsg:(NSDictionary *)msg;
    
    //Friend.m
    - (instancetype)initWithFriendMsg:(NSDictionary *)msg {
        self = [super init];
        if (self) {
            [self setValuesForKeysWithDictionary:msg]; // KVC
        }
    
        return self;
    }
    

    数据配合与界面的交互,最终的功能就能慢慢的成型了!

    MVVM实践

    正如被误解的MVC和被神化的MVVM一文所说的那样,MVC的问题在于臃肿的控制器,而将那些在控制器中处理的逻辑抽出来,形成一个新的模块:ViewModel,就可以完成MVC到MVVM的过渡。在这个场景中,笔者就构建了一个ListViewModel来处理一些原本在控制器里完成的逻辑(ps:可能有些“不干不净”,经验欠缺,献丑了!),它里面有这样一些代码:

    //ListViewModel.h
    @property (nonatomic, strong, readonly) NSArray<FriendsGroups *> *groups;
    @property (nonatomic, strong, readonly) NSArray<NSNumber *> *groupsStatus;
    @property (nonatomic, strong, readonly) NSArray<NSNumber *> *aGroupFriendCounts;
    
    @property (nonatomic, assign, readonly) NSInteger groupsCount;
    
    //ListViewModel.m
    @synthesize groups = _groups;
    @synthesize groupsCount = _groupsCount;
    @synthesize groupsStatus = _groupsStatus;
    @synthesize aGroupFriendCounts = _aGroupFriendCounts;
    
    #pragma mark - getters
    
    - (NSArray<FriendsGroups *> *)groups {
        if (!_groups) { // lazy load
            NSArray *groupsInfo = [DataStore dataStore];
            NSMutableArray *msgGroups = [NSMutableArray array];
            for (NSDictionary *groupsMsg in groupsInfo) {
                FriendsGroups *group = [[FriendsGroups alloc] initWithGroupsMsg:groupsMsg];
                [msgGroups addObject:group];
            }
    
            _groups = msgGroups;
        }
    
        return _groups;
    }
    
    - (NSInteger)groupsCount {
        if (!_groupsCount) {
            _groupsCount = self.groups.count;
        }
    
        return _groupsCount;
    }
    
    - (NSArray<NSNumber *> *)groupsStatus {
    //    if (!_groupsStatus) { // when the status of group is changed, groupsStatus should update
            NSMutableArray *statusInfo = [NSMutableArray array];
            for (FriendsGroups *group in self.groups) {
                [statusInfo addObject:@(group.isOpened)];
            }
    
            _groupsStatus = statusInfo;
    //    }
    
        return _groupsStatus;
    }
    
    - (NSArray<NSNumber *> *)aGroupFriendCounts {
        if (!_aGroupFriendCounts) {
            NSMutableArray *friendCounts = [NSMutableArray array];
            for (FriendsGroups *group in self.groups) {
                [friendCounts addObject:@(group.friends.count)];
            }
    
            _aGroupFriendCounts = friendCounts;
        }
    
        return _aGroupFriendCounts;
    }

    你用我的,我用你的

    有了上面一系列的准备工作,视图控制器就可以瘦身了。“妈妈再也不用担心我被叫做重度视图控制器了”,某VC如是说。

    //CustomTableViewController.m
    #pragma mark - Table View DataSource
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return self.viewModel.groupsCount;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return [self.viewModel.groupsStatus[section] boolValue] ? [self.viewModel.aGroupFriendCounts[section] integerValue]: 0;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        FriendCell *cell = [tableView dequeueReusableCellWithIdentifier:[FriendCell reuseID] forIndexPath:indexPath];
        cell.cellModel = self.viewModel.groups[indexPath.section].friends[indexPath.row];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        cell.layer.shouldRasterize = YES;
        cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
    
        return cell;
    }
    
    #pragma mark - Table View Delegate
    
    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
        CustomHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:[CustomHeaderView reuseID]];
        headerView.delegate = self;
        headerView.group = self.viewModel.groups[section];
        headerView.sectionIndex = section;
    
        // cache layer to improve preformance
        headerView.layer.shouldRasterize = YES;
        headerView.layer.rasterizationScale = [UIScreen mainScreen].scale;
    
        return headerView;
    }

    为了能在点击headerView,折叠或展开分组,我们需要监听一下它的点击,然后局部刷新视图即可。嗯,代理模式是个不错的选择,说干就干:

    //CustomHeaderView.h
    @protocol foldViewDelegate <NSObject>
    
    @required
    
    - (void)tableViewDidFoldView:(NSInteger)section;
    
    @end
    
    @interface CustomHeaderView : UITableViewHeaderFooterView
    
    @property (nonatomic, strong) FriendsGroups *group;
    
    @property (nonatomic, assign) NSInteger sectionIndex;
    
    @property (nonatomic, weak) id<foldViewDelegate> delegate;
    
    + (NSString *)reuseID;
    
    //CustomHeaderView.m
    static NSString *const headerViewID = @"headerCELL";
    
    @interface CustomHeaderView()
    
    @property (nonatomic, strong) UIImageView *listIcon;
    @property (nonatomic, strong) UIView *lineView;
    
    @property (nonatomic, strong) UILabel *groupNameLabel;
    @property (nonatomic, strong) UILabel *personCountLabel;
    
    @property (nonatomic, strong) UIButton *viewTouched;
    
    @end
    
    @implementation CustomHeaderView
    
    #pragma mark - Initializer
    
    - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier {
        self = [super initWithReuseIdentifier:reuseIdentifier];
        if (self) {
            [self.contentView addSubview:self.listIcon];
            [self.contentView addSubview:self.groupNameLabel];
            [self.contentView addSubview:self.personCountLabel];
            [self.contentView addSubview:self.lineView];
            [self.contentView addSubview:self.viewTouched];
        }
    
        return self;
    }
    
    #pragma mark - Layout Subviews
    
    - (void)layoutSubviews {
        [super layoutSubviews];
    
        [self.listIcon mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerY.equalTo(self);
            make.leading.mas_equalTo(10);
            make.size.mas_equalTo(CGSizeMake(7, 11));
        }];
    
        [self.groupNameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.leadingMargin.equalTo(self.listIcon).mas_equalTo(22);
            make.centerY.equalTo(self.listIcon);
            make.top.equalTo(self);
            make.bottom.equalTo(self);
            make.width.mas_equalTo(187);
        }];
    
        [self.personCountLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.trailingMargin.equalTo(self).mas_equalTo(0);
            make.top.equalTo(self);
            make.bottom.equalTo(self);
            //make.width.mas_equalTo(50);
        }];
    
        [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.leading.equalTo(self);
            make.trailing.equalTo(self);
            make.bottom.equalTo(self);
            make.height.mas_equalTo(1);
        }];
    
        [self.viewTouched mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(self);
        }];
    }
    
    #pragma mark - Interface Method
    
    + (NSString *)reuseID {
        return headerViewID;
    }
    
    #pragma mark - Private  Method
    
    - (void)handleTouched:(UIButton *)sender {
        self.group.open = !self.group.isOpened;
    
        if ([_delegate respondsToSelector:@selector(tableViewDidFoldView:)]) {
            [_delegate tableViewDidFoldView:self.sectionIndex];
        }
    }
    
    #pragma mark - getters and setters
    
    - (UIImageView *)listIcon {
        if (!_listIcon) {
            _listIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"listIcon"]];
            _listIcon.contentMode = UIViewContentModeScaleAspectFit;
        }
    
        return _listIcon;
    }
    
    - (UILabel *)groupNameLabel {
        if (!_groupNameLabel) {
            _groupNameLabel = [[UILabel alloc] init];
            _groupNameLabel.text = @"我是组名怎么滴";
        }
    
        return _groupNameLabel;
    }
    
    - (UILabel *)personCountLabel {
        if (!_personCountLabel) {
            _personCountLabel = [[UILabel alloc] init];
            _personCountLabel.text = @"12/12";
            _personCountLabel.textColor = [UIColor grayColor];
            _personCountLabel.textAlignment = NSTextAlignmentCenter;
        }
    
        return _personCountLabel;
    }
    
    - (UIView *)lineView {
        if (!_lineView) {
            _lineView = [[UIView alloc] init];
            _lineView.backgroundColor = [UIColor grayColor];
        }
    
        return _lineView;
    }
    
    - (UIButton *)viewTouched {
        if (!_viewTouched) {
            _viewTouched = [UIButton buttonWithType:UIButtonTypeSystem];
            _viewTouched.backgroundColor = [UIColor clearColor];
    
            [_viewTouched addTarget:self action:@selector(handleTouched:) forControlEvents:UIControlEventTouchUpInside];
        }
    
        return _viewTouched;
    }
    
    - (void)setGroup:(FriendsGroups *)group {
        if (_group != group) {
            _group = group;
    
            self.groupNameLabel.text = _group.groupName;
            self.personCountLabel.text = [NSString stringWithFormat:@"%@/%@", _group.onlinePersonCount, _group.totalPersonCount];
        }
    
        CGFloat angle = self.group.open ? M_PI_2 : 0;
        self.listIcon.transform = CGAffineTransformMakeRotation(angle);
    }
    
    @end

    然后让视图控制器遵循折叠视图协议,并实现相应方法:

    //CustomTableViewController.m
    @interface CustomTableViewController () <foldViewDelegate>
    
    ......
    
    #pragma mark - Fold View Delegate
    
    - (void)tableViewDidFoldView:(NSInteger)section {
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic];
    }

    至此,好友列表功能就大体实现了,效果是这样的:

    这里写图片描述

    常联系,不冷漠

    笔者在假数据文件中,有一个数据项叫做chatLog,用于记录该好友给你发的消息。当你点击某好友的cell时,视图随之过渡到消息界面,希望你看到那或长或短的简易文字,总能体会到人情的温暖。(ps:煽情结束,^_^)

    毫无疑问,消息界面的cell的高度是随着消息的长度而改变的,所以就需要动态的调整它的高度。好消息是自iOS8后,系统就支持动态调节高度了。对笔者来说是坏消息的是在这个Demo工程中就一直实现不了,曾一度怀疑是不是Xcode8的Bug,然而今天新建了个测试工程就又行了。哎,手动计算加上选取背景图片的不当致使文字嵌套在气泡中的效果没有达到预想中的效果,不过当做演示还算够用!为了给视图控制器减负,笔者再次把玩了下MVVM,下面贴出根据文字及其大小计算它所需要占用的尺寸的代码:

    //MessageViewModel.m
    ......
    
    NSAttributedString *attriMsg = [[NSAttributedString alloc] initWithString:message attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}];
                CGRect msgSize = [attriMsg boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 136.0f, 2000.0f) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    
    ......

    当要通过表视图的代理方法返回cell的高度时,就从存储高度的字典中取出即可,这样就免去了控制器计算的负担。完成后的效果是这样的:

    这里写图片描述

    灰色的区域就是按钮的真实区域。可明显看出因为气泡背景左边的一个尖角对按钮的标题的嵌入不怎么搭配,而且背景也不能完全适应整个按钮的大小,即使控制标题的偏移,这个问题也不能很好的解决。而真实的QQ中使用的气泡是这样的:

    这里写图片描述

    那些主题气泡背景也是这种方方正正的形状,尖角被放置在最顶部估计也是QQ的UI设计团队基于这方面的考量。所以说UI设计是应用的灵魂所在,这也就难怪一些UI设计师一张小小的图片就敢收费几百上千了!

    总结

    不知不觉,文章的篇幅已经这么长了,主要原因估计就是充斥着太多的代码,文字的串接其实比较少。这么做的原因有两点:一是方便看这篇文章的朋友理解Demo的实现,二是笔者文辞有点匮乏,写博客的技巧尚待提高。

    虽然时断时续,不过总算写完了这个类别下的第一篇文章。笔者后面会继续尝试仿制其他的一些功能,一来记录下学习的点滴,二来分享在这过程中用到的一些东西。完整的Demo可以在这里找到,谢谢!

    展开全文
  • 教你用html和css仿制小米官网页面

    千次阅读 多人点赞 2020-12-13 22:05:56
    文章目录仿制小米官网页面(仅用html+css)前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越...

    教你仿制小米官网页面(仅用html+css)

    前言

    哈哈哈,我又来了。经过前面的不懈探索。我感觉我对html和css已经比较熟练了。这是在学完c语言和java后,学习的第三门语言(HTML算不上编程语言吧,哈)。这次我仿写了一个小米的官方网站,话说小米的官方比起淘宝和京东真的简洁啊!正好适合练手了,嘿嘿嘿~。
    PS:我们这里今天下雪了哦!


    废话不多说了(已经说了那么多了),请看:


    一、使用的工具?

    博主使用的是Visual Studio Code。这个是真的方便啊,体型小不说,好用的插件还不少!赞一个。不过为了之后的后端学习,我开始慢慢转向用IDEA 了,这个软件使用起来也是真的不赖啊(想要的小伙伴可以评论区找我哦,我会经常看你们的评论的)

    二、结果展示

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    代码如下(部分示例):

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>小米商城(假的)-小米10Pro</title>
        <link rel="stylesheet" href="style.css">
    </head>
    
    <body>
        <!-- 奔跑的熊 -->
        <div class="bear">
            <div class="xiaopingzi">小瓶子出品</div>
            <div class="bear_box">
            </div>
        </div>
    
        <!-- 网页头部开始 -->
        <div class="ssp">
            <a href="none.html">
                <div class="banner1 clearfix">
                    <a href="none.html">
                        <img src="tupian/banner1.jpg" alt="">
                    </a>
                </div>
            </a>
    
            <!-- 导航栏开始 -->
            <div class="nav clearfix">
                <div class="w clearfix">
                    <ul>
                        <li><a href="https://www.mi.com/index.html">小米商城</a></li>
                        <li><a href="https://www.miui.com/">MiUi</a></li>
                        <li><a href="https://iot.mi.com/">loT</a></li>
                        <li><a href="https://i.mi.com/">云服务</a></li>
                        <li><a href="https://airstar.com/home">天星科技</a></li>
                        <li><a href="https://youpin.mi.com/">有品</a></li>
                        <li><a href="https://xiaoai.mi.com/">小爱开放平台</a></li>
                        <li><a href="https://qiye.mi.com/">企业团购</a></li>
                        <li><a href="https://www.mi.com/aptitude/list/?id=41">资质证照</a></li>
                        <li><a href="https://www.mi.com/aptitude/list/">协议规则</a></li>
                        <li><a href="https://www.mi.com/appdownload/">下载app</a></li>
                        <li><a href="https://xiaomishare.mi.com/?from=micom">智能生活</a></li>
                        <li><a href="none.html">Select Location</a></li>
    
                    </ul>
                    <div>
                        <ul>
                            <li><a href="none.html">登陆</a></li>
                            <li><a href="none.html">注册</a></li>
                            <li><a href="none.html">通知消息</a></li>
                            <span>
                                <a href="https://www.mi.com/buy/cart" class="iconfont"> 购物车(0)</a>
                            </span>
                        </ul>
                    </div>
                </div>
            </div>
    

    css代码如下(部分示例):

    * {
         padding: 0;
         margin: 0;
     }
     
     li {
         list-style: none;
     }
     
     a {
         text-decoration: none;
     }
     
     em,
     i {
         font-style: normal;
         padding: 0;
         margin: 0;
     }
     
     @keyframes bear {
         0% {}
         100% {
             background-position: -1280px 0;
         }
     }
     
     .bear {
         position: fixed;
         top: 400px;
         left: 0;
     }
     /*.xiaopingzi {
         background-color: rgb(11, 205, 240);
         color: rgb(253, 78, 47);
         font-size: 18px;
         font-family: "YouYuan";
         text-align: center;
     }*/
     /* ********************* */
     
     .xiaopingzi {
         background-image: -webkit-linear-gradient(left, blue, #66ffff 10%, #cc00ff 20%, #f3150d 30%, #CCCCFF 40%, #00FFFF 50%, #CCCCFF 60%, #cc0000 70%, #CC00FF 80%, #66FFFF 90%, blue 100%);
         -webkit-text-fill-color: transparent;
         /* 将字体设置成透明色 */
         -webkit-background-clip: text;
         /* 裁剪背景图,使文字作为裁剪区域向外裁剪 */
         -webkit-background-size: 200% 100%;
         -webkit-animation: masked-animation 4s linear infinite;
         font-size: 20px;
         text-align: center;
     }
     
     @keyframes masked-animation {
         0% {
             background-position: 0 0;
         }
         100% {
             background-position: -100% 0;
         }
     }
     /* ************************** */
     
     .bear_box {
         width: 160px;
         height: 80px;
         background: url(tupian/百度浏览器奔跑的熊bear-25676f9.png) no-repeat;
         background-color: rgb(182, 58, 58);
         animation: bear 0.8s steps(8) infinite;
     }
     
     @font-face {
         font-family: 'icomoon';
         src: url('fonts/icomoon.eot?bkblej');
         src: url('fonts/icomoon.eot?bkblej#iefix') format('embedded-opentype'), url('fonts/icomoon.ttf?bkblej') format('truetype'), url('fonts/icomoon.woff?bkblej') format('woff'), url('fonts/icomoon.svg?bkblej#icomoon') format('svg');
         font-weight: normal;
         font-style: normal;
         font-display: block;
     }
     
     input {
         outline: none;
     }
     
     .w {
         width: 1226px;
         margin: 0 auto;
         /* background-color: rgb(204, 206, 105); */
     }
     
     .clearfix:after {
         visibility: hidden;
         clear: both;
         display: block;
         content: ".";
         height: 0;
     }
     
     .clearfix {
         *zoom: 1;
     }
     
    

    因为代码有点多,全部上传后加载太慢,会卡死。所以想要源码的小伙伴们也请在评论区留言吧!看到后我会打包发给你的。


    三、总结

    学习HTML和css也已经有一两个月了。比起后端的c语言和java感觉前端真的轻松,而且视觉冲击很大,写完后浏览器打开会立刻感受到满满的成就感。就像是看着一个孩子在自己手中慢慢的变成自己想要的模样!因为在学校天天都有琐事的原因,导致学习效率并不是很高。大三了,还有考研,还要参加互联网+比赛和大创项目。每天真的好忙啊,但有时候又会没有动力学习。这几天又没去图书馆,害,大概是废了。又想考研,又想参加比赛,还想学好编程,要做的事真的太多了,就会导致一事无成。

    展开全文
  • using System; using System.Collections.Generic;...我想写仿制windows资源管理器的功能,代码和书上的一样,但是书上写到这一步双击左边的盘能打开里面的文件,为什么我写的不显示,帮我看下!
  • 这个动态的我不会,所以只能搞静态的。 功能都差不多, 仅仅做的美化,功能没啥,zc 找回密码什么的都可以点,跟QQ差别不大,做美化个很费时间的事,就简单弄了下至于验证什么的,可以自己动手改改。
  • Electron 仿制WeGame(四)

    2018-10-20 13:36:18
    今天这一节的内容有些多,在...不要问我主页面为什么要搞 腾讯游戏的主页前面其实想照着weGame切页面的,最后下了一个抓包工具,奈何抓不到WeGame的请求头,也就作罢了。里边主要用了控制窗体,控制页面播放视频等...

    今天这一节的内容有些多,在以前的程序上改动也比较多,具体如何描述问题解决和问题修改并不能清楚的说明,所以还是老方法,贴图贴代码。
    想查看源码,请下载源代码传送门

    先上效果图

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    想查看完整效果,请下载源代码传送门
    不要问我主页面为什么要搞 腾讯游戏的主页前面其实是想照着weGame切页面的,最后下了一个抓包工具,奈何抓不到WeGame的请求头,也就作罢了。里边主要用了控制窗体,控制页面播放视频等方法。

    重点代码

    1.Electron 浏览器播放插件

    • 主进程【在主进程的app.on("ready",fn)之前键入以下代码】
    /**
     * 解决浏览器播放问题
     */
    const libDirectory = __dirname+'/apps/lib/';
    const path = require('path');
    // 指定 flash 路径,假定它与 main.js 放在同一目录中。
    let pluginName
    switch (process.platform) {
      case 'win32':
        pluginName = 'pepflashplayer.dll'
        break
      case 'darwin':
        pluginName = 'PepperFlashPlayer.plugin'
        break
      case 'linux':
        pluginName = 'libpepflashplayer.so'
        break
    }
    app.commandLine.appendSwitch('ppapi-flash-path', path.join(__dirname,"/apps/lib/"+ pluginName))
    app.commandLine.appendSwitch('ppapi-flash-version', '22.0.0.192');
    

    以上代码中用到了各个系统的播放插件的插件文件,需要单独下载,官网有详细的教程Electron使用Flash player插件

    • 在页面中的 webview 标签中添加属性 plugins
    <webview  class="frame"  id="player" src="http://fn.qq.com/video/" plugins></webview >
    

    到这里浏览器插件就可以正常播放视频了

    2.窗体的最大化,最小化,窗口化,关闭 代码
    • 推荐在渲染进程中操作(当窗体较多时,如果在主进程中进程监听,就会需要判断提交请求的窗口,会增加工作量)
      • 1.在渲染进程中 得到当前窗口对象 ,使用 require('electron').remote.getCurrentWindow()
    var currwin = require('electron').remote.getCurrentWindow();
    
      • 2.关闭,窗口化,最大化,最小化事件
    switch(click){
                case "restoreForm":
                    currwin.unmaximize();  //窗口化
                break;
                case "maxForm":
                    currwin.maximize();  //最大化
                break;
                case "minForm":
                    currwin.minimize(); //最小化
                break;
                case "closeForm":
                    currwin.close();    //关闭
                break;
            }
    
    3.静音设置
    • 静音设置需要对单独的webview标签进行操作。官网【 webview标签 <webview>.setAudioMuted(muted)
    • 代码如下,
    $("webview")[0].setAudioMuted(true);//将页面中的第一个webview设置成静音
    $("webview")[2].setAudioMuted(false);//将页面中的第二个webview取消静音 
    
    4.webview标签中的外部链接用指定窗口打开
    • 1.创建方法
    /**
     * 接管浏览器器请求,使用系统浏览器打卡
     * @param {jqSelect} webSelector 
     * @param {回调函数} callback 
     */
    function webOpenToForm(webSelector,callback){
        $(webSelector).on('new-window', (e) => {
            var url = e.url||e.originalEvent.url;
            if (url.indexOf('http:')>=0 || url.indexOf('https:')>=0) {
                //shell.openExternal(e.url)
                callback(url); 
                //window.open(url)
            }
        });
    }
    
    • 2.调用
      • a.在窗口1中点击链接,在窗口1中打开
     	webOpenToForm("webview",function(url){
            $("webview:last").attr("src",url);  //将url赋值给webview 标签
       });
    
      • b.在窗口1中点击链接,在窗口2中打开
        注意:就目前而言,我还没有找到好的窗体之间传递参数的方法,只能使用主页面和渲染页面之间通信来实现。如果大神知道,烦请指导。
        • 1.在窗口1中向主进程发送信息
     const ipc = require('electron').ipcRenderer;
     ipc.send("openForm",url);
    
        • 2.主进程接受信息,并发送给窗口2【前提窗口必须已经存在】
    ipcMain.on("openForm",(event,url)=>{
        openFile.show();//显示窗口,该窗口已存在
        openFile.send("setUrl",url);//发送的窗口2的消息
    });
    
        • 3.在窗口2中接受主进程发送过来的消息
    ipcRenderer.on('setUrl', (event,url)=>{
         $("webview:last").attr("src",url);  //将url赋值给webview 标签
    });
    
        • 4.窗口1到窗口2调用
    const ipc = require('electron').ipcRenderer;
    webOpenToForm("webview",function(url){      
     ipc.send("openForm",url);
    });
    

    注意窗口1到窗口2调用的过程是
    窗口1监听webview的'new-window'方法->主进程->主进程发送url->窗口2接受url

    以上就是用的到核心代码,码字不易,转载注明出处

    ====回主目录

    展开全文
  • 什么仿制拜亚A1呢? 烧友们都清楚这拜亚动力几十年磨一剑的精品功放。搭配自家DT880 有着先天的优势条件。许多烧友所追求的搭配。但是原机价格虚高 7000元左右的价格不是一般人能承担的。从一个专业角度来讲...
  • 当然,这款工具无论使用哪种方式安装都近乎一键式的,没有什么复杂的细节。 前述 code-server的官网:http://www.coder.com 其实官网本身就提供ide的在线使用(http://ide.coder.com),但需要登录。不知道什么原因...
  • 是什么? Faux是一个有趣的类Unix操作系统,您可以直接在浏览器中跳入该操作系统。 它通过从各种操作系统中借鉴许多很棒的想法,介绍了一种熟悉的,但是新的计算机使用方式。 有助于 获取 这个项目 克隆到您的...
  • 在 WPF 上可用的控件拖动方法在 UWP 上大多没用,那干脆用 Thumb 仿制一个吧。  关于 Thumb 控件的... 不谈什么属性和方法,大多数都继承的。主要说说 Thumb 的原生事件DragStarted,DragDelta,DragComplet...
  • Dreamweaver5在生成Android仿制种子应用程序时,一直提示 正在为 Android 仿制种子应用程序 也不报错,真不知道是什么问题,不知道有没有大神遇到过这样的问题,请求解决方案。 环境变量如下: JAVA_HOME C:\Java\...
  • 什么是PLL

    千次阅读 2007-01-18 16:53:00
    什么是锁相环?锁相环指一种电路或者模块,它用于在通信的接收机中,其作用对接收 到的信号进行处理,并从其中提取某个时钟的相位信息。或者说,对于接收 到的信号,仿制一个时钟信号,使得这两个信号从某种角度...
  • 这部分的问题非常多,主要原因还是对于之前学习的基础知识不够牢固,练习太少,不知道要达到那样的效果需要用什么样的样式,基本一边百度一边写的。 固定导航栏到页面顶部 margin: 0px; padding: 0px; height...
  • SAP HANA是什么

    千次阅读 2013-06-23 14:27:47
    HANA一个软硬件结合体,供给高性能的数据查询功用,用户能够直接对很多实时事务数据进行查询和剖析,而不需求对事务数据进行建模、聚合等。SAP内存数据库的数据并不是只在内存里,也会不断写到硬盘里,这就用到...
  • 微信仿制的时候常用的抓包工具

    千次阅读 2015-06-03 18:50:07
    在朋友圈看到一款疯转的H5小游戏,想要copy,什么?只能在微信里打开?小样,图样图森破,限制了oauth、微信浏览器内打开,照样能看你源码~ 使用fiddler来抓包 需要先做一些简单的准备工作: 一台带有无线网卡的PC或者...
  • 【生成对抗网络】简单入门指南----利用古董仿制与鉴别来通俗理解GAN了解生成对抗网络什么是生成对抗网络?生成对抗网络(实例)--古董仿制与鉴别生成对抗第一阶段生成对抗第二阶段生成对抗第N阶段生成对抗最后阶段这...
  • python有什么用python作为一门高档编程言语,它bai的诞生尽管du很偶尔,但是它得到zhi程序员的喜欢却必然之dao路,Python入门简略,比较于其他言语,初学者很容易入门,除此之外,Python还具有以下优点:1....
  • 究竟是什么达翡丽敲取舍 如果你期待这些手表敲你把你的脚,你是100%正确的。对于外行来说,敲取舍是长期给假手表。诚然,有很多的人谁就会得到持谨慎态度无论是购买或佩戴这种手表,但他们不用担心。有一个时代,当...
  • Linux是什么? 是一套 Unix-like 的操作体系,是 Unix 的一种,它操控全部体系根本效劳的中心程序 (kernel) 是由 Linus 带头开发出来的,「Linux」这个称号便是以「Linus's unix」来命名,Linus 挑选用「群众公有...
  • 本身社区的风格就很简洁,没有什么花里胡哨的特效,页面交互也很简单,做起来并不像电商页面那样复杂。 目前最大的问题出现在ajax的部分。 问题总结: ajax问题 还无法实现跨域引用api,而是直接复制了网站提供的api...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 158
精华内容 63
关键字:

仿制是什么