2020-09-28-x
2020-09-28
todo-list
- 耗材NPI打样编辑页面
record-list
html中javascript右键自定义菜单
右键菜单html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48<tr v-for="(x, index) in itemList" v-bind:key="index" v-on:contextmenu="itemRightClick($event, index)">
<td><input v-model="x.itemNo"></td>
<td><input v-model="x.customer"></td>
<td><input v-model="x.project"></td>
<td><input v-model="x.product"></td>
<td><input v-model="x.machine"></td>
<td><input v-model="x.clampPosition"></td>
<td><input v-model="x.productName"></td>
<td><input v-model="x.sampleMaterial"></td>
<td><input v-model="x.processMaterial"></td>
<td><input v-model="x.brand"></td>
<td><input v-model="x.specification"></td>
<td><input v-model="x.processDemand"></td>
<td><input v-model="x.rohsDemand"></td>
<td><input v-model="x.workstation"></td>
<td><input v-model="x.demandNum"></td>
<td><input v-model="x.demandDate"></td>
<td><input v-model="x.averageUse"></td>
<td><input v-model="x.verifyFlag"></td>
<td><input v-model="x.verifyDate"></td>
<td><input v-model="x.verifyCycle"></td>
<td><input v-model="x.applyReason"></td>
</tr>
<tr v-for="(x, index) in compareList" v-bind:key="index" v-on:contextmenu="compareRightClick($event, index)">
<td><input v-model="x.itemNo"/></td>
<td><input v-model="x.project"/></td>
<td><input v-model="x.product"/></td>
<td><input v-model="x.machine"/></td>
<td><input v-model="x.clampPosition"/></td>
<td><input v-model="x.productName"/></td>
<td><input v-model="x.materialNo"/></td>
<td><input v-model="x.brand"/></td>
<td><input v-model="x.specification"/></td>
<td><input v-model="x.vendor"/></td>
<td><input v-model="x.instruction"/></td>
<td><input v-model="x.averageUse"/></td>
<td><input v-model="x.measureUnit"/></td>
<td><input v-model="x.memo"/></td>
</tr>
<!-- 右键菜单 -->
<div class="menu" v-if="menuDisplay" v-bind:style="{top: menuY + 'px', left: menuX + 'px'}">
<ul>
<li v-on:click="menuType === 'item' ? addItemRow() : addCompareRow()"><a href="###">添加一行</a></li>
<li v-if="itemList.length !== 1" v-on:click="menuType === 'item' ? deleteItemRow() : deleteCompareRow()"><a href="###">删除本行</a></li>
</ul>
</div>右键菜单javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48appClick () {
this.menuDisplay = false;
},
menuShow (e) {
this.menuDisplay = true;
this.menuX = e.clientX;
this.menuY = e.clientY;
e.stopPropagation();
e.returnValue = false;
},
itemRightClick (e, index) {
this.menuType = 'item';
this.itemClickedIndex = index;
this.menuShow(e);
},
compareRightClick (e, index) {
this.menuType = 'compare';
this.compareClickIndex = index;
this.menuShow(e);
},
addItemRow () {
this.itemList.splice(this.itemClickedIndex + 1, 0, new CsDemandNewItem());
this.updateItemListNo();
},
deleteItemRow () {
this.itemList.splice(this.itemClickedIndex, 1);
this.updateItemListNo();
},
updateItemListNo () {
let count = 0;
this.itemList.forEach(item => {
item.itemNo = ++count;
});
},
addCompareRow () {
this.compareList.splice(this.compareClickIndex + 1, 0, new CsDemandNewCompare());
this.updateCompareListNo();
},
deleteCompareRow () {
this.compareList.splice(this.compareClickIndex, 1);
this.updateCompareListNo();
},
updateCompareListNo () {
let count = 0;
this.compareList.forEach(compare => {
compare.itemNo = ++count;
});
},右键菜单css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40/* 右键菜单 */
.menu {
margin: 0;
padding: 0;
list-style-type: none;
background: white;
width: 5rem;
border: 1px solid #ccc;
position: absolute;
box-shadow: 0 0 5px rgba(0,0,0,.2);
transition: all .1s ease;
font-size: 1px;
}
.menu ul {
margin: 0;
padding: 0;
}
.menu li {
margin: 0;
padding: 0;
border: 1px solid #ccc;
list-style-type: none;
width: 100%;
}
.menu li a {
display: inline-block;
text-decoration: none;
color: #555;
width: 100%;
padding: 5px 0;
text-align: center;
}
.menu li:first-of-type{
border-radius: 5px 5px 0 0;
}
.menu li a:hover,
.menu li a:active {
background: #eee;
color: #0AAF88;
}核心代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<tr v-for="(x, index) in itemList" v-bind:key="index" v-on:contextmenu="itemRightClick($event, index)">
</tr>
<!-- 右键菜单 -->
<div class="menu" v-if="menuDisplay" v-bind:style="{top: menuY + 'px', left: menuX + 'px'}">
<ul>
<li v-on:click="menuType === 'item' ? addItemRow() : addCompareRow()"><a href="###">添加一行</a></li>
<li v-if="itemList.length !== 1" v-on:click="menuType === 'item' ? deleteItemRow() : deleteCompareRow()"><a href="###">删除本行</a></li>
</ul>
</div>
<script>
menuShow (e) {
this.menuDisplay = true;
this.menuX = e.clientX;
this.menuY = e.clientY;
e.stopPropagation();
e.returnValue = false;
},
</script>解释:contextmenu事件通过$event向下传递, menuShow方法从而获取e.clientX和e.clientY,右键菜单div的css属性top = menuY + ‘px’, left: menuX + ‘px’
home-record-list
- 回来看了LOL全球总决赛入围赛,然后开始注册GoogleCloud,注册成功了。
- GCP上装了V2Ray,使用测试来看,台湾的两个服务器其实都不够好,可以再多建几个VM实例进行测试,找到最稳定延迟最小的VM,暂时感觉没YouTube上视频说的那么NB,放假了再来测试。
- 注册GCP的信息放在了自己的GitLab上
reference-site-list
JavaScript
GoogleCloud
- 本文标题:2020-09-28-x
- 本文作者:Xplorist
- 创建时间:2020-09-28 13:30:13
- 本文链接:https://xplorist.tech/2020/09/28/9f6c472bd0f0/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
评论
// variables
$gt-color-main := #6190e8
$gt-color-sub := #a1a1a1
$gt-color-loader := #999999
$gt-color-error := #ff3860
$gt-color-hr := #e9e9e9
$gt-color-comment-txt := #333333
$gt-color-link-active := #333333
$gt-color-btn := #ffffff
$gt-size-base := 16px // default font-size
$gt-size-border-radius := 5px
$gt-breakpoint-mobile := 479px
$gt-mask-z-index := 9999
// functions & mixins
clearfix() {
&:before
&:after {
display table
clear both
content ""
}
}
em($px, $base-size = $gt-size-base) {
u = unit($px)
if (u is 'px') {
unit($px / $base-size, 'em')
}
else {
unit($px, u)
}
}
mobile() {
@media (max-width $gt-breakpoint-mobile) {
{block}
}
}
// variables - calculated
$gt-size-loader-dot := em(6px)
$gt-size-loader := em(28px)
$gt-size-avatar := em(50px)
$gt-size-avatar-mobi := em(32px)
// styles
// Put everything under container to avoid style conflicts
.comments-container {
.gt-container {
box-sizing border-box
* {
box-sizing border-box
}
font-size $gt-size-base
// common
a {
color $gt-color-main
&:hover {
color lighten($gt-color-main, 20%)
border-color lighten($gt-color-main, 20%)
}
&.is--active {
color $gt-color-link-active
cursor default !important
&:hover {
color $gt-color-link-active
}
}
}
.hide {
display none !important
}
// icons
.gt-svg {
display inline-block
width em(16px)
height em(16px)
vertical-align sub
svg {
width 100%
height 100%
fill $gt-color-main
}
}
.gt-ico {
display inline-block
&-text {
margin-left em(5px)
}
&-github {
width 100%
height 100%
.gt-svg {
width 100%
height 100%
}
svg {
fill inherit
}
}
}
// loader
.gt-spinner {
position relative
&::before {
position absolute
top 3px
box-sizing border-box
width em(12px)
height em(12px)
margin-top em(-3px)
margin-left em(-6px)
border 1px solid $gt-color-btn
border-top-color $gt-color-main
border-radius 50%
animation gt-kf-rotate 0.6s linear infinite
content ''
}
}
.gt-loader {
position relative
display inline-block
width $gt-size-loader
height $gt-size-loader
font-style normal
// font-size: $gt-size-loader
line-height $gt-size-loader
border 1px solid $gt-color-loader
border-radius 50%
animation ease gt-kf-rotate 1.5s infinite
&:before {
position absolute
top 0
left 50%
display block
width $gt-size-loader-dot
height $gt-size-loader-dot
margin-top -($gt-size-loader-dot / 2)
margin-left -($gt-size-loader-dot / 2)
background-color $gt-color-loader
border-radius 50%
content ''
}
}
// avatar
.gt-avatar {
display inline-block
width $gt-size-avatar
height $gt-size-avatar
+mobile() {
width $gt-size-avatar-mobi
height $gt-size-avatar-mobi
}
img {
width 100%
height auto
border-radius 3px
}
&-github {
width $gt-size-avatar - em(2px)
height $gt-size-avatar - em(2px)
cursor pointer
+mobile() {
width $gt-size-avatar-mobi - em(2px)
height $gt-size-avatar-mobi - em(2px)
}
}
}
// button
.gt-btn {
display inline-block
padding em(12px) em(20px)
color $gt-color-btn
font-size em(12px)
line-height 1
white-space nowrap
text-decoration none
background-color $gt-color-main
border 1px solid $gt-color-main
border-radius $gt-size-border-radius
outline none
cursor pointer
&-text {
font-weight 400
}
&-loading {
position relative
display inline-block
width em(12px)
height em(16px)
margin-left em(8px)
vertical-align top
}
&.is--disable {
cursor not-allowed
opacity 0.5
}
&-login {
margin-right 0
}
&-preview {
color $gt-color-main
background-color var(--background-color)
&:hover {
background-color var(--second-background-color)
}
}
&-public {
&:hover {
background-color lighten($gt-color-main, 20%)
border-color lighten($gt-color-main, 20%)
}
}
}
}
&-loadmore
// loadmore
/* error */
.gt-error {
margin em(10px)
color $gt-color-error
text-align center
}
// initing
.gt-initing {
padding em(20px) 0
text-align center
&-text {
margin em(10px) auto
font-size 92%
}
}
// no int
.gt-no-init {
padding em(20px) 0
text-align center
}
// link
.gt-link {
border-bottom 1px dotted $gt-color-main
&-counts
&-project {
text-decoration none
}
}
// meta
.gt-meta {
position relative
z-index 10
margin em(20px) 0
padding em(16px) 0
font-size em(16px)
border-bottom 1px solid $gt-color-hr
clearfix()
}
.gt-counts {
margin 0 em(10px) 0 0
color var(--default-text-color)
}
.gt-user {
float right
margin 0
font-size 92%
&-pic {
width 16px
height 16px
margin-right em(8px)
vertical-align top
}
&-inner {
display inline-block
cursor pointer
.gt-user-name {
color var(--default-text-color)
}
}
.gt-ico {
margin 0 0 0 em(5px)
svg {
fill var(--default-text-color)
}
}
.is--poping {
.gt-ico {
svg {
fill $gt-color-main
}
}
}
}
.gt-version {
margin-left em(6px)
color $gt-color-sub
}
.gt-copyright {
margin 0 em(15px) em(8px)
padding-top em(8px)
border-top 1px solid var(--border-color)
}
// popup
.gt-popup {
position absolute
top em(38px)
right 0
display inline-block
padding em(10px) 0
font-size em(14px)
letter-spacing 0.5px
background var(--background-color)
border 1px solid var(--border-color)
.gt-action {
position relative
display block
margin em(8px) 0
padding 0 em(18px)
text-decoration none
cursor pointer
&.is--active {
&:before {
position absolute
top em(7px)
left em(8px)
width em(4px)
height em(4px)
background $gt-color-main
content ''
}
}
}
}
// header
.gt-header {
position relative
display flex
&-comment {
flex 1
margin-left em(20px)
+mobile() {
margin-left em(14px)
}
}
&-textarea {
display block
box-sizing border-box
width 100%
min-height em(82px)
max-height em(240px)
padding em(12px)
color var(--default-text-color)
font-size em(14px)
word-wrap break-word
background-color var(--fourth-text-color)
border 1px solid var(--border-color)
border-radius $gt-size-border-radius
outline none
transition all 0.25s ease
resize vertical
&:hover {
background-color var(--background-color)
}
}
&-preview {
padding em(12px)
background-color var(--background-color)
border 1px solid var(--border-color)
border-radius $gt-size-border-radius
}
&-controls {
position relative
margin em(12px) 0 0
clearfix()
+mobile() {
margin 0
}
&-tip {
color $gt-color-main
font-size em(14px)
text-decoration none
vertical-align sub
+mobile() {
display none
}
}
.gt-btn {
float right
margin-left em(20px)
+mobile() {
float none
width 100%
margin em(12px) 0 0
}
}
}
}
&:after {
position fixed
top 0
right 0
bottom 100%
left 0
opacity 0
content ''
}
&.gt-input-focused {
position relative
&:after {
position fixed
top 0
right 0
bottom 0
left 0
z-index $gt-mask-z-index
background #000
opacity 0.6
transition opacity 0.3s, bottom 0s
content ''
}
.gt-header-comment {
z-index $gt-mask-z-index + 1
}
}
// comments
.gt-comments {
padding-top em(20px)
&-null {
text-align center
}
&-controls {
margin em(20px) 0
text-align center
}
}
// comment
.gt-comment {
position relative
display flex
padding em(10px) 0
&-content {
flex 1
margin-left em(20px)
padding em(12px) em(16px)
overflow auto
background-color var(--second-background-color)
transition all ease 0.25s
+mobile() {
margin-left em(14px)
padding em(10px) em(12px)
}
}
&-header {
position relative
margin-bottom em(8px)
font-size em(14px)
}
&-block-1 {
float right
width em(32px)
height em(22px)
}
&-block-2 {
float right
width em(64px)
height em(22px)
}
&-username {
color $gt-color-main
font-weight 500
text-decoration none
&:hover {
text-decoration underline
}
}
&-text {
margin-left em(8px)
color $gt-color-sub
}
&-date {
margin-left em(8px)
color $gt-color-sub
}
&-like
&-edit
&-reply {
position absolute
height em(22px)
&:hover {
cursor pointer
}
}
&-like {
top 0
right em(32px)
}
&-edit
&-reply {
top 0
right 0
}
&-body {
// color: $gt-color-comment-txt !important
color var(--second-text-color) !important
.email-hidden-toggle a {
display inline-block
height 12px
padding 0 9px
color #444d56
font-weight 600
font-size 12px
line-height 6px
text-decoration none
vertical-align middle
background #dfe2e5
border-radius 1px
&:hover {
background-color #c6cbd1
}
}
.email-hidden-reply {
display none
white-space pre-wrap
.email-signature-reply {
margin 15px 0
padding 0 15px
color #586069
border-left 4px solid #dfe2e5
}
}
.email-hidden-reply.expanded {
display block
}
}
&-admin {
.gt-comment-content {
background-color var(--fourth-text-color)
}
}
}
@keyframes gt-kf-rotate {
0% {
transform rotate(0)
}
100% {
transform rotate(360deg)
}
}
}