2015-10-27 9 views
5

Sto provando a visualizzare l'immagine usando la simulazione cover su tela. Ho trovato alcuni interessanti answer su come farlo.Ottenere immagini sgradevoli mentre si simula la copertina in tela

Il fatto è che quando lo faccio con un'immagine grande, viene visualizzato brutto. Come risolverlo?

Ecco la mia Codepen

HTML

<canvas id="canvas"></canvas> 

CSS

canvas { 
     width: 100%; 
     height: 100vh; 
    } 

JS

var ctx = canvas.getContext('2d'), 
    img = new Image; 

img.onload = draw; 
img.src = 'https://upload.wikimedia.org/wikipedia/commons/0/0f/2010-02-19_3000x2000_chicago_skyline.jpg'; 

function draw() { 
    drawImageProp(ctx, this, 0, 0, canvas.width, canvas.height); 
    //drawImageProp(ctx, this, 0, 0, canvas.width, canvas.height, 0.5, 0.5); 
} 

/** 
* By Ken Fyrstenberg 
* 
* drawImageProp(context, image [, x, y, width, height [,offsetX, offsetY]]) 
* 
* If image and context are only arguments rectangle will equal canvas 
*/ 
function drawImageProp(ctx, img, x, y, w, h, offsetX, offsetY) { 

    if (arguments.length === 2) { 
     x = y = 0; 
     w = ctx.canvas.width; 
     h = ctx.canvas.height; 
    } 

    /// default offset is center 
    offsetX = offsetX ? offsetX : 0.5; 
    offsetY = offsetY ? offsetY : 0.5; 

    /// keep bounds [0.0, 1.0] 
    if (offsetX < 0) offsetX = 0; 
    if (offsetY < 0) offsetY = 0; 
    if (offsetX > 1) offsetX = 1; 
    if (offsetY > 1) offsetY = 1; 

    var iw = img.width, 
     ih = img.height, 
     r = Math.min(w/iw, h/ih), 
     nw = iw * r, /// new prop. width 
     nh = ih * r, /// new prop. height 
     cx, cy, cw, ch, ar = 1; 

    /// decide which gap to fill  
    if (nw < w) ar = w/nw; 
    if (nh < h) ar = h/nh; 
    nw *= ar; 
    nh *= ar; 

    /// calc source rectangle 
    cw = iw/(nw/w); 
    ch = ih/(nh/h); 

    cx = (iw - cw) * offsetX; 
    cy = (ih - ch) * offsetY; 

    /// make sure source rectangle is valid 
    if (cx < 0) cx = 0; 
    if (cy < 0) cy = 0; 
    if (cw > iw) cw = iw; 
    if (ch > ih) ch = ih; 

    /// fill image in dest. rectangle 
    ctx.drawImage(img, cx, cy, cw, ch, x, y, w, h); 
} 
+0

Nel primo caso, qual è il motivo per cui si desidera visualizzare un'immagine su tela e non solo con html/css di base? Tipo: 'background-size: cover;' Esempi di questo possono essere trovati [qui] (https://css-tricks.com/perfect-full-page-background-image/) e molto altro .. –

risposta

3

Per fare ciò, è possibile utilizzare diverse tecniche come HTML/CSS, Solo CSS, Jquery o JS/Canvas. Per ulteriori informazioni su questo look here.

non impostare la larghezza e l'altezza della tela in HTML come menzionato da David Skx. Devi cancellare il tuo CSS, rimuoverlo completamente.

Nei tuoi JS si dovrebbe impostare la dimensione della tela (basta definire in 1 posto, non lasciate diverse lingue interferiscono):

var canvas = document.getElementById('canvas'); 
canvas.width = window.innerWidth; 
canvas.height = window.innerHeight; 

Finestra significa l'intero browser, utilizzano pixel qui se si vuole limitarlo solo a una tela e non all'intero sfondo

Questo è tutto.

+0

Riesci a riscrivere la mia codepan? –

+0

Non è necessario ridimensionare se stesso in modo proporzionale. –

+0

incolla semplicemente 'canvas.width = window.innerWidth; canvas.height = window.innerHeight; 'sulla riga 3 del tuo JS e il gioco è fatto, a meno che tu non voglia una tela di dimensioni specifiche, come 500 × 900 usi' canvas.width = 500; canvas.height = 900; ' E non dimenticare di rimuovere il tuo css .. –

2

è necessario specificare la larghezza e l'altezza in pixel direttamente sul <canvas> -Element, altrimenti sarà distorcere:

<canvas id="canvas" width="500" height="500"></canvas> 

Usa JavaScript per misurare la larghezza della finestra e l'altezza e impostare in modo dinamico. Qualcosa di simile:

var canvas = document.getElementById('canvas'); 
canvas.setAttribute('width', window.innerWidth); 
canvas.setAttribute('height', window.innerHeight); 

UPDATE: Come Matthijs van Hest ha sottolineato, la larghezza e l'altezza attributi sul <canvas> -element sono solo opzionale.

+1

You don ' t devono specificare larghezza e altezza, può solo aiutare a impedire alla vista del browser di inciampare da quella frazione di secondo dalla creazione del DOM all'esecuzione del JS. Inoltre; il tuo JS dovrebbe essere più breve e più leggibile come nella mia risposta .. mantienilo sotto –

+0

Naturalmente il tuo diritto. Volevo solo sottolineare che se viene utilizzata una proprietà width e height, deve essere pixel assoluti. – misantronic

+0

Bene, la tua cosa ha funzionato, ma tu non hai menzionato tutto e il tuo codice potrebbe essere migliorato, ecco perché ho fatto la mia risposta alla domanda. E comunque è bene sottolineare le cose, non dimenticare mai che l'obiettivo principale è rispondere a una domanda <3 –

Problemi correlati