四零语境前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

123 lines
3.5 KiB

<template>
<view class="yingbing-content" v-html="contentSync"></view>
</template>
<script>
export default {
inject: ['getFontSize', 'getFontFamily', 'getLineHeight', 'getColor', 'getSelectable'],
props: {
item: {
type: Object,
default () {
return new Object
}
}
},
computed: {
color () {
return this.getColor()
},
fontSize () {
return this.getFontSize()
},
fontFamily () {
return this.getFontFamily()
},
lineHeight () {
return this.getLineHeight()
},
selectable () {
return this.getSelectable()
},
contentSync () {
let content = this.item.content || ''
content = content.replace('<whole-render', '<div').replace('<\/whole-render>', '<\/div>')
return `<div class="yingbing-reader-content-html ${this.selectable ? 'user-selectable' : 'user-selectclose'}" style="box-sizing: border-box;color:${this.color};font-family:${this.fontFamily};font-size:${this.fontSize}px;line-height:${this.lineHeight}px;">` + content + '</div>'
}
},
data () {
return {
selectShow: false,
selectTop: 0,
selectLeft: 0,
selectArrowLeft: 0
}
},
mounted() {
// #ifdef H5
// document.addEventListener('selectionchange',() => {
// const selection = window.getSelection();// 获取当前的选区对象
// // 如果选区不为空
// if (selection.toString()) {
// // 获取选区中的第一个范围
// const range = selection.getRangeAt(0);
// // 将选区的边界用于定位操作框
// const rect = range.getBoundingClientRect();
// const box = document.querySelector('.yingbing-reader-select-box')
// this.selectArrowLeft = rect.left
// this.selectTop = rect.top + (box.offsetHeight / 2)
// this.selectLeft = rect.left - (box.offsetWidth / 2)
// const right = box.offsetWidth + this.selectLeft
// const bottom = box.offsetHeight + this.selectTop
// if ( right > document.body.offsetWidth ) this.selectLeft = this.selectLeft - (right - document.body.offsetWidth)
// if ( bottom > document.body.offsetHeight ) this.selectTop = this.selectTop - (bottom - document.body.offsetHeight)
// this.selectShow = true
// } else {
// this.selectShow = false
// }
// });
// #endif
}
}
</script>
<style scoped>
/deep/ .yingbing-img {
max-width: 100%!important;
box-sizing: border-box!important;
}
/deep/ .user-selectable {
-webkit-user-select: text; /*webkit浏览器*/
-khtml-user-select: text; /*早期浏览器*/
-moz-user-select: text; /*火狐*/
-ms-user-select: text; /*IE10*/
user-select: text;
}
/deep/ .user-selectclose {
-webkit-touch-callout: none; /*系统默认菜单被禁用*/
-webkit-user-select: none; /*webkit浏览器*/
-khtml-user-select: none; /*早期浏览器*/
-moz-user-select: none; /*火狐*/
-ms-user-select: none; /*IE10*/
user-select: none;
}
.yingbing-content {
width: 100%;
height: 100%;
box-sizing: border-box;
}
.yingbing-reader-select-box {
position: fixed;
display: flex;
flex-direction: row;
background-color: #fff;
box-shadow: 0 0 10px rgba(0,0,0,.1);
border-radius: 5px;
padding: 15px 10px;
}
.yingbing-reader-select-box .arrow {
position: absolute;
width: 0;
height: 0;
border-top: 6px solid transparent;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #fff;
top: -12px;
}
.yingbing-reader-select-box .select-box-item {
padding: 0 10px;
font-size: 13px;
flex-shrink: 0;
}
</style>