-webkit-background-origin
时间: 2023-07-12 22:04:53 浏览: 146
`-webkit-background-origin` 是一个 CSS 属性,用于指定背景图片的起始位置。它是 WebKit 浏览器引擎私有的属性,在其他浏览器中不被支持。该属性可支持的值有 `padding-box`、`border-box` 和 `content-box`。其中,`padding-box` 表示背景图片从 padding 区域开始显示;`border-box` 表示背景图片从 border 区域开始显示;`content-box` 表示背景图片从 content 区域开始显示。
相关问题
如何让IOS富文本支持background: linear-gradient(90deg, black 50%, #D3D3D3 50%);-webkit-background-clip: text;-webkit-text-fill-color: transparent;
要让iOS富文本支持该样式,你可以使用Core Text框架来实现。下面是一个示例代码:
```swift
import UIKit
import CoreText
extension NSMutableAttributedString {
func applyLinearGradient(colors: [CGColor], startPoint: CGPoint, endPoint: CGPoint) {
let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: colors as CFArray, locations: nil)!
let stringRange = NSRange(location: 0, length: self.length)
let line = CTLineCreateWithAttributedString(self)
let runs = CTLineGetGlyphRuns(line)
for runIndex in 0..<CFArrayGetCount(runs) {
let run = CFArrayGetValueAtIndex(runs, runIndex)!
let runRange = CTRunGetStringRange(run)
var runRect = CGRect.zero
CTRunGetTypographicBounds(run, CFRangeMake(0, 0), &runRect.origin, &runRect.size, nil)
let glyphCount = CTRunGetGlyphCount(run)
var glyphPositions = Array<CGPoint>(repeating: .zero, count: glyphCount)
CTRunGetPositions(run, CFRangeMake(0, 0), &glyphPositions)
for glyphIndex in 0..<glyphCount {
let glyphRange = CFRangeMake(glyphIndex, 1)
let position = glyphPositions[glyphIndex]
let glyphRect = CGRect(x: runRect.origin.x + position.x, y: runRect.origin.y + position.y, width: runRect.size.width, height: runRect.size.height)
let glyphLocation = runRange.location + glyphRange.location
let characterRange = CFRangeMake(glyphLocation, glyphRange.length)
let tokenRange = CTLineGetStringRange(line)
let adjustedRange = CFRangeMake(characterRange.location - tokenRange.location, characterRange.length)
self.enumerateAttribute(.font, in: adjustedRange, options: []) { (value, range, stop) in
let font = value as! UIFont
let fontSize = font.pointSize
let glyphPath = CTFontCreatePathForGlyph(font, glyphRange.location, nil)!
let glyphBoundingBox = glyphPath.boundingBox
let textMatrix = CGAffineTransform(scaleX: 1, y: -1).translatedBy(x: 0, y: -runRect.size.height)
let glyphTransform = glyphBoundingBox.applying(textMatrix)
let startPoint = CGPoint(x: startPoint.x + glyphRect.origin.x, y: startPoint.y + glyphRect.origin.y)
let endPoint = CGPoint(x: endPoint.x + glyphRect.origin.x, y: endPoint.y + glyphRect.origin.y)
let gradientTransform = CGAffineTransform(translationX: startPoint.x, y: startPoint.y).scaledBy(x: (endPoint.x - startPoint.x) / glyphBoundingBox.width, y: (endPoint.y - startPoint.y) / glyphBoundingBox.height)
let gradientPath = glyphPath.copy(using: &gradientTransform)!
let gradientBoundingBox = gradientPath.boundingBox
let boundingBoxTransform = CGAffineTransform(translationX: -gradientBoundingBox.origin.x, y: -gradientBoundingBox.origin.y)
let transformedGradientPath = gradientPath.copy(using: &boundingBoxTransform)!
let context = UIGraphicsGetCurrentContext()!
context.addPath(transformedGradientPath)
context.clip()
context.drawLinearGradient(gradient, start: startPoint, end: endPoint, options: [.drawsBeforeStartLocation, .drawsAfterEndLocation])
}
}
}
}
}
// 使用示例
let label = UILabel()
let attributedText = NSMutableAttributedString(string: "Your text here")
let colors = [UIColor.black.cgColor, UIColor(red: 211/255, green: 211/255, blue: 211/255, alpha: 1).cgColor]
let startPoint = CGPoint(x: 0, y: 0)
let endPoint = CGPoint(x: label.bounds.width, y: 0)
attributedText.addAttribute(.foregroundColor, value: UIColor.clear, range: NSRange(location: 0, length: attributedText.length))
label.attributedText = attributedText
label.applyLinearGradient(colors: colors, startPoint: startPoint, endPoint: endPoint)
```
通过上述代码,你可以将UILabel的文本设置为富文本,并应用线性渐变背景效果。请注意,这个代码示例是使用Swift编写的,所以你需要在你的iOS项目中创建一个适当的代码文件,并将其添加到你的项目中。
<main-content :ifDetail="true"> <div class="two-side"> <div class="main-left"> <el-form :model="form" :rules="rules" ref="form" label-width="120px"> <el-form-item label="选择下载模块" prop="accountName"> <el-input v-model.trim="form.accountName" :maxlength="50"></el-input> </el-form-item> <el-form-item label="倾斜度"> <el-slider v-model.number="form.rotate" :min="-180" :max="180"></el-slider> </el-form-item> <el-form-item label="文字"> <el-input type="textarea" v-model="form.text"></el-input> </el-form-item> <el-form-item label="文字大小"> <el-input-number v-model.number="form.fontSize" :min="10" :max="50"></el-input-number> px </el-form-item> <el-form-item label="位置"> <el-select placeholder="请选择位置" v-model="form.alignment"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option> </el-select> </el-form-item> <el-form-item> <el-select v-if="form.alignment === 2" placeholder="请选择位置" v-model="form.textPosition"> <el-option v-for="item in textPositionOptions" :key="item.value" :label="item.label" :value="item.value" ></el-option> </el-select> </el-form-item> </el-form> {{ watermarkStyle }} </div> <div class="main-right" id="show"> <div class="watermark"> <span :style="watermarkStyle" ref="showText" style="word-break:break-all;display: inline-block">{{ form.text }}</span> </div> </div> </div> </main-content> 左边来控制右边div里水印展示,代码怎么写
您可以在 `<el-form>` 标签上绑定 `@input` 事件,当表单数据发生改变时,触发该事件,然后在事件处理函数中计算出水印的样式,并将样式绑定到 `<span>` 标签上。具体实现代码如下:
```
<template>
<main-content :ifDetail="true">
<div class="two-side">
<div class="main-left">
<el-form :model="form" :rules="rules" ref="form" label-width="120px" @input="handleInput">
<!-- 表单项省略 -->
</el-form>
</div>
<div class="main-right" id="show">
<div class="watermark">
<span :style="watermarkStyle" ref="showText" style="word-break:break-all;display: inline-block">{{ form.text }}</span>
</div>
</div>
</div>
</main-content>
</template>
<script>
export default {
data() {
return {
form: {
accountName: '',
rotate: 0,
text: '',
fontSize: 16,
alignment: 1,
textPosition: 1
},
options: [
{ label: '左上', value: 1 },
{ label: '居中', value: 2 },
{ label: '右下', value: 3 }
],
textPositionOptions: [
{ label: '正常', value: 1 },
{ label: '斜体', value: 2 }
]
}
},
computed: {
watermarkStyle() {
const { rotate, fontSize, alignment, textPosition } = this.form
const deg = rotate + (textPosition === 2 ? -45 : 0)
const translateX =
alignment === 1 ? '-10%' : alignment === 2 ? '-50%' : '90%'
const translateY =
alignment === 1 ? '-10%' : alignment === 2 ? '-50%' : '90%'
const transform = `rotate(${deg}deg)`
const style = {
position: 'absolute',
top: 0,
left: 0,
bottom: 0,
right: 0,
fontSize: `${fontSize}px`,
transform: transform,
'-webkit-transform': transform,
'-ms-transform': transform,
'-moz-transform': transform,
'-o-transform': transform,
opacity: '0.2',
'pointer-events': 'none',
'text-align': 'center',
'z-index': 9999,
transformOrigin: '50% 50%',
'-webkit-transform-origin': '50% 50%',
'-ms-transform-origin': '50% 50%',
'-moz-transform-origin': '50% 50%',
'-o-transform-origin': '50% 50%',
color: '#000',
'word-break': 'break-all',
'white-space': 'pre-wrap',
'max-height': '100%',
'max-width': '100%',
overflow: 'hidden',
'text-overflow': 'ellipsis',
'-webkit-text-fill-color': 'transparent',
'-webkit-background-clip': 'text',
'background-clip': 'text',
'-webkit-user-select': 'none',
'-moz-user-select': 'none',
'-ms-user-select': 'none',
userSelect: 'none',
'-webkit-line-clamp': '1',
display: 'flex',
'align-items': 'center',
'justify-content': 'center',
'transform-style': 'preserve-3d'
}
if (textPosition === 2) {
style.padding = '0.5rem'
style.background =
'linear-gradient(to right bottom, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.2) 45%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.2) 55%, rgba(255, 255, 255, 0.2) 100%)'
}
style.transform += ` translate(${translateX}, ${translateY})`
style['-webkit-transform'] += ` translate(${translateX}, ${translateY})`
style['-moz-transform'] += ` translate(${translateX}, ${translateY})`
style['-ms-transform'] += ` translate(${translateX}, ${translateY})`
style['-o-transform'] += ` translate(${translateX}, ${translateY})`
return style
}
},
methods: {
handleInput() {
this.$nextTick(() => {
const { width, height } = this.$refs.show.getBoundingClientRect()
const { offsetWidth, offsetHeight } = this.$refs.showText
if (width === 0 || height === 0 || offsetWidth === 0 || offsetHeight === 0) {
return
}
const scaleX = width / offsetWidth
const scaleY = height / offsetHeight
const scale = Math.min(scaleX, scaleY)
this.$refs.showText.style.transform += `scale(${scale})`
this.$refs.showText.style['-webkit-transform'] += `scale(${scale})`
this.$refs.showText.style['-moz-transform'] += `scale(${scale})`
this.$refs.showText.style['-ms-transform'] += `scale(${scale})`
this.$refs.showText.style['-o-transform'] += `scale(${scale})`
})
}
}
}
</script>
```
代码中的 `watermarkStyle` 计算属性用于计算水印的样式,`handleInput` 方法用于在计算出水印样式后,将水印按照比例缩小并居中显示。注意,为了保证水印样式的正确性,需要在表单项加载完成之后计算水印样式,因此需要在 `handleInput` 方法中使用 `$nextTick` 方法等待表单项加载完成再进行计算。
阅读全文